Subversion Repositories Kolibri OS

Rev

Rev 6327 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;***************************************************************************
  2. ;*******************CODING BMP FILE(1,4,8,24 bits)**************************
  3. ;***************************************************************************
  4.  
  5. ;-------------------------autor andrew_programmer---------------------------
  6.  
  7. coding_bmp:
  8.  
  9.          mov [PointerToImage],ebx
  10.          mov [WhereCodingBMP],ecx
  11.          mov [BmpPalette],edx
  12.          mov [Bmp_SizeX],esi
  13.          mov [Bmp_SizeY],edi
  14.          ;**********************************************
  15.          ;******************1 bit BMP*******************
  16.          ;**********************************************
  17.          cmp eax,2
  18.          ja no_monohrom_colors
  19.          mov esi,[BmpPalette]
  20.          mov edi,[WhereCodingBMP]
  21.          add edi,54
  22.          mov eax,[esi]   ;first color
  23.          mov ebx,[esi+4] ;second color
  24.          mov [edi],eax
  25.          mov [edi+4],ebx
  26.  
  27.          ;coding image to bmp 1 bit format
  28.          mov esi,[PointerToImage]
  29.          mov edx,[WhereCodingBMP]
  30.          mov ebx,[Bmp_SizeX]
  31.          add ebx,31                ;picture_size_x+31
  32.          shr ebx,5                 ;((picture_size_x)+31)/32
  33.          mov [Bmp_doublewords],ebx ;double words in string
  34.          shl ebx,2
  35.          mov [Bmp_bytes_per_string],ebx ;bytes per string
  36.          mov ecx,[Bmp_SizeY]
  37.          dec ecx
  38.          imul ebx,ecx
  39.          add edx,54+8
  40.          add edx,ebx                ;in edx pointer to area for coding
  41.  
  42.          mov ebp,[Bmp_bytes_per_string]
  43.  
  44.          mov ebx,[Bmp_SizeY]
  45.          mov esi,[PointerToImage]
  46.          mov edi,edx
  47.  
  48.          mov edx,[Bmp_SizeX]
  49.          lea edx,[edx+edx*2]
  50.  
  51.          mov [Bmp_Counter],7
  52.          and [Bmp_Counter2],0
  53.          copy_lines_1:
  54.  
  55.            push esi
  56.            mov ecx,[Bmp_bytes_per_string]
  57.            shl ecx,3          ;(Bmp_bytes_per_string)*8
  58.  
  59.            rep_movsb_1:
  60.  
  61.               mov eax,[esi]
  62.               and eax,0xffffff
  63.               push esi
  64.               push ecx
  65.               push ebx
  66.               mov esi,[BmpPalette]
  67.               xor ecx,ecx
  68.                 find_color_in_palette_1:
  69.                    mov ebx,[esi]
  70.                    and ebx,0xffffff
  71.                    cmp eax,ebx           ;color fined ?
  72.                    je color_fined_1
  73.                    add esi,4
  74.                    inc ecx
  75.                    cmp ecx,256
  76.                    jl find_color_in_palette_1
  77.                    color_fined_1:
  78.               mov [Bmp_Counter3],ecx     ;number color in palette
  79.               pop ebx
  80.               pop ecx
  81.               pop esi
  82.               mov eax,[Bmp_Counter3]
  83.  
  84.               test eax,eax
  85.               jz no_change_bit_in_byte
  86.  
  87.               push ecx
  88.               mov ecx,[Bmp_Counter]
  89.               bts [Bmp_Counter2],ecx
  90.               pop ecx
  91.  
  92.               no_change_bit_in_byte:
  93.  
  94.               dec [Bmp_Counter]
  95.               jns no_minus_in_counter
  96.  
  97.               push eax
  98.               mov eax,[Bmp_Counter2]
  99.               mov [edi],al
  100.               inc edi
  101.               mov [Bmp_Counter],7
  102.               and [Bmp_Counter2],0     ;obnulyaem byte
  103.               pop eax
  104.  
  105.               no_minus_in_counter:
  106.  
  107.               add esi,3
  108.            dec ecx
  109.            jnz rep_movsb_1
  110.            pop esi
  111.  
  112.          add esi,edx
  113.          sub edi,ebp
  114.          sub edi,ebp
  115.  
  116.          dec ebx
  117.          jnz copy_lines_1
  118.  
  119.          mov edi,[WhereCodingBMP]
  120.          mov ebx,[Bmp_bytes_per_string]
  121.          imul ebx,[Bmp_SizeY]
  122.          add ebx,(54+8)
  123.  
  124.          ;crate list of bmp description
  125.          mov [edi],word 'BM'
  126.          mov [edi+2],ebx
  127.          mov [edi+10],dword 54+8 ;where bigin bmp imige
  128.          mov [edi+14],dword 40
  129.          mov edx,[Bmp_SizeX]
  130.          mov ecx,[Bmp_SizeY]
  131.          mov [edi+18],edx    ;picture size x
  132.          mov [edi+22],ecx    ;picture size y
  133.          mov [edi+26],word 1
  134.          mov [edi+28],word 1 ;bits per pixel
  135.          mov [edi+30],dword 0
  136.          mov edx,[Bmp_bytes_per_string]
  137.          imul edx,ecx
  138.          mov [edi+34],edx
  139.          mov [edi+38],dword 0
  140.          mov [edi+42],dword 0
  141.          mov [edi+46],dword 0
  142.  
  143.          ret
  144.  
  145.          no_monohrom_colors:
  146.  
  147.          ;**********************************************
  148.          ;*****************4 bits BMP*******************
  149.          ;**********************************************
  150.          cmp eax,16
  151.          ja no_16_colors
  152.          ;copy 16 colors palette
  153.          mov esi,[BmpPalette]
  154.          mov edi,[WhereCodingBMP]
  155.          add edi,54
  156.          mov ecx,16
  157.          rep movsd
  158.  
  159.          ;coding image to bmp 4 bits format
  160.          mov esi,[PointerToImage]
  161.          mov edx,[WhereCodingBMP]
  162.          mov ebx,[Bmp_SizeX]
  163.          shl ebx,2             ;4*(picture_size_x)
  164.          add ebx,31            ;4*(picture_size_x)+31
  165.          shr ebx,5             ;(4*(picture_size_x)+31)/32
  166.          mov [Bmp_doublewords],ebx ;double words in string
  167.          shl ebx,2
  168.          mov [Bmp_bytes_per_string],ebx ;bytes per string
  169.          mov ecx,[Bmp_SizeY]
  170.          dec ecx
  171.          imul ebx,ecx
  172.          add edx,54+64
  173.          add edx,ebx
  174.  
  175.          mov ebp,[Bmp_bytes_per_string]
  176.  
  177.          mov ebx,[Bmp_SizeY]
  178.          mov [Bmp_Counter2],ebx
  179.  
  180.          mov edi,edx
  181.  
  182.          xor ebx,ebx
  183.          copy_lines_4:
  184.  
  185.          mov ecx,[Bmp_bytes_per_string]
  186.          shl ecx,1
  187.  
  188.          and [Bmp_Counter3],0
  189.          push esi
  190.  
  191.           rep_movsb_4:
  192.           mov eax,[esi]
  193.           and eax,0xffffff
  194.  
  195.             mov [Bmp_save1],esi
  196.             mov [Bmp_save2],ecx
  197.             mov [Bmp_save3],ebx
  198.             mov esi,[BmpPalette]
  199.             xor ecx,ecx
  200.              find_color_in_palette_:
  201.                mov ebx,[esi]
  202.                and ebx,0xffffff
  203.                cmp eax,ebx           ;color fined ?
  204.                je color_fined_
  205.                  add esi,4
  206.                  inc ecx
  207.                cmp ecx,16
  208.                jl find_color_in_palette_
  209.                color_fined_:
  210.               mov [Bmp_Counter],ecx     ;number color in palette
  211.             mov esi,[Bmp_save1]
  212.             mov ecx,[Bmp_save2]
  213.             mov ebx,[Bmp_save3]
  214.  
  215.           xor eax,eax
  216.           mov eax,[Bmp_Counter]
  217.           shl bl,4
  218.           add bl,al
  219.  
  220.            mov eax,[Bmp_Counter3]
  221.            and eax,1b
  222.            test eax,eax              ;next block ready ?
  223.            jz no_ready
  224.             mov [edi],bl              ;4 bit color
  225.             inc edi
  226.            no_ready:
  227.  
  228.           add esi,3
  229.           inc [Bmp_Counter3]
  230.  
  231.           dec ecx
  232.           jnz rep_movsb_4
  233.  
  234.          pop esi
  235.  
  236.          add esi,[Bmp_SizeX]
  237.          add esi,[Bmp_SizeX]
  238.          add esi,[Bmp_SizeX]
  239.  
  240.          sub edi,ebp
  241.          sub edi,ebp
  242.  
  243.          dec [Bmp_Counter2]
  244.          jnz copy_lines_4
  245.  
  246.          ;total size of bmp file
  247.          mov edi,[WhereCodingBMP]
  248.          mov ebx,[Bmp_bytes_per_string]
  249.          imul ebx,[Bmp_SizeY]
  250.          add ebx,(54+64)
  251.  
  252.          ;crate list of bmp description
  253.          mov [edi],word 'BM'
  254.          mov [edi+2],ebx
  255.          mov [edi+10],dword 54+64
  256.          mov [edi+14],dword 40
  257.          mov edx,[Bmp_SizeX]
  258.          mov ecx,[Bmp_SizeY]
  259.          mov [edi+18],edx
  260.          mov [edi+22],ecx
  261.          mov [edi+26],word 1
  262.          mov [edi+28],word 4
  263.          mov [edi+30],dword 0
  264.          mov edx,[Bmp_bytes_per_string]
  265.          imul edx,ecx
  266.          mov [edi+34],edx
  267.          mov [edi+38],dword 0
  268.          mov [edi+42],dword 0
  269.          mov [edi+46],dword 0
  270.  
  271.          ret
  272.          no_16_colors:
  273.  
  274.          ;**********************************************
  275.          ;******************8 bits BMP******************
  276.          ;**********************************************
  277.  
  278.          cmp eax,256
  279.          ja no_8_bits_per_pixel
  280.          ;copy palette
  281.          mov esi,[BmpPalette]
  282.          mov edi,[WhereCodingBMP]
  283.          add edi,54
  284.          mov ecx,256
  285.          rep movsd
  286.  
  287.          ;coding image to bmp 8 bits format
  288.          mov esi,[PointerToImage]
  289.          mov edx,[WhereCodingBMP]
  290.          mov ebx,[Bmp_SizeX]
  291.          shl ebx,3             ;8*(picture_size_x)
  292.          add ebx,31            ;8*(picture_size_x)+31
  293.          shr ebx,5             ;(8*(picture_size_x)+31)/32
  294.          mov [Bmp_doublewords],ebx ;double words in string
  295.          shl ebx,2
  296.          mov [Bmp_bytes_per_string],ebx ;bytes per string
  297.  
  298.          mov ecx,[Bmp_SizeY]
  299.          dec ecx
  300.          imul ebx,ecx
  301.          add edx,(1024+54)
  302.          add edx,ebx           ;in edx pointer to copy bitmap arrea
  303.  
  304.          mov ebp,[Bmp_bytes_per_string]
  305.          shl ebp,1
  306.  
  307.          mov ebx,[Bmp_SizeY]
  308.          mov edi,edx
  309.  
  310.          copy_lines_8:
  311.  
  312.          mov ecx,[Bmp_bytes_per_string]
  313.          mov [Bmp_save1],esi
  314.           rep_movsb_8:
  315.           mov eax,[esi]
  316.           and eax,0xffffff
  317.           push esi
  318.           push ecx
  319.           push ebx
  320.            mov esi,[BmpPalette]
  321.            xor ecx,ecx
  322.             find_color_in_palette:
  323.             mov ebx,[esi]
  324.             and ebx,0xffffff
  325.             cmp eax,ebx           ;color fined ?
  326.             je color_fined
  327.             add esi,4
  328.             inc ecx
  329.             cmp ecx,256
  330.             jl find_color_in_palette
  331.             color_fined:
  332.             mov [Bmp_Counter],ecx     ;number color in palette
  333.           pop ebx
  334.           pop ecx
  335.           pop esi
  336.           mov eax,[Bmp_Counter]
  337.           mov [edi],al            ;8 bit color
  338.           add esi,3
  339.           inc edi
  340.  
  341.           dec ecx
  342.           jnz rep_movsb_8
  343.  
  344.          mov esi,[Bmp_save1]
  345.  
  346.          add esi,[Bmp_SizeX]
  347.          add esi,[Bmp_SizeX]
  348.          add esi,[Bmp_SizeX]
  349.  
  350.          sub edi,ebp
  351.          dec ebx
  352.          jnz copy_lines_8
  353.  
  354.          ;total size of bmp file
  355.          mov edi,[WhereCodingBMP]
  356.          mov ebx,[Bmp_bytes_per_string]
  357.          imul ebx,[Bmp_SizeY]
  358.          add ebx,54+1024
  359.  
  360.          ;crate list of bmp description
  361.          mov [edi],word 'BM'
  362.          mov [edi+2],ebx
  363.          mov [edi+10],dword 54+1024
  364.          mov [edi+14],dword 40
  365.          mov edx,[Bmp_SizeX]
  366.          mov ecx,[Bmp_SizeY]
  367.          mov [edi+18],edx
  368.          mov [edi+22],ecx
  369.          mov [edi+26],word 1
  370.          mov [edi+28],word 8
  371.          mov [edi+30],dword 0
  372.          mov edx,[Bmp_bytes_per_string]
  373.          imul edx,ecx
  374.          mov [edi+34],edx
  375.          mov [edi+38],dword 0
  376.          mov [edi+42],dword 0
  377.          mov [edi+46],dword 0
  378.  
  379.          ret
  380.          no_8_bits_per_pixel:
  381.  
  382.          ;**********************************************
  383.          ;*******************24 bit BMP*****************
  384.          ;**********************************************
  385.  
  386.          cmp eax,256
  387.          jle no_32_bits_per_pixel
  388.          ;copy picture
  389.          mov esi,[PointerToImage]
  390.          mov edx,[WhereCodingBMP]
  391.          mov ebx,[Bmp_SizeX]
  392.          shl ebx,3             ;8*(picture_size_x)
  393.          lea ebx,[ebx+ebx*2]   ;3*8*(picture_size_x)
  394.          add ebx,31            ;3*8*(picture_size_x)+31
  395.          shr ebx,5             ;(3*8*(picture_size_x)+31)/32
  396.          mov [Bmp_doublewords],ebx ;double words in string
  397.          shl ebx,2
  398.          mov [Bmp_bytes_per_string],ebx ;bytes per string
  399.          mov ecx,[Bmp_SizeY]
  400.          dec ecx
  401.          imul ebx,ecx
  402.          add edx,54
  403.          add edx,ebx         ;in edx pointer to start of copy bit map
  404.  
  405.          mov ebp,[Bmp_bytes_per_string]
  406.          shl ebp,1
  407.  
  408.          mov ebx,[Bmp_SizeY]
  409.  
  410.          mov esi,[PointerToImage]
  411.          mov edi,edx
  412.  
  413.          mov edx,[Bmp_SizeX]
  414.          lea edx,[edx+edx*2]
  415.  
  416.          copy_lines_24:
  417.  
  418.            push esi
  419.            mov ecx,[Bmp_doublewords]
  420.            rep_movsb_24:
  421.               mov eax,[esi]
  422.               mov [edi],eax
  423.            add esi,4
  424.            add edi,4
  425.            dec ecx
  426.            jnz rep_movsb_24
  427.            pop esi
  428.  
  429.          add esi,edx
  430.          sub edi,ebp
  431.          dec ebx
  432.          jnz copy_lines_24
  433.  
  434.          ;total size of bmp fille
  435.          mov edi,[WhereCodingBMP]
  436.          mov ebx,[Bmp_bytes_per_string]
  437.          imul ebx,[Bmp_SizeY]
  438.          add ebx,54
  439.  
  440.          ;write info to structure of bmp file
  441.          mov [edi],word 'BM'
  442.          mov [edi+2],ebx
  443.          mov [edi+10],dword 54    ;where begin bmp imige
  444.          mov [edi+14],dword 40    ;total size of structure number two
  445.          mov edx,[Bmp_SizeX]
  446.          mov ecx,[Bmp_SizeY]
  447.          mov [edi+18],edx
  448.          mov [edi+22],ecx
  449.          mov [edi+26],word 1
  450.          mov [edi+28],word 24     ;bytes per pixel
  451.          mov [edi+30],dword 0
  452.          mov edx,[Bmp_bytes_per_string]
  453.          imul edx,ecx
  454.          mov [edi+34],edx         ;size of bmp image
  455.          mov [edi+38],dword 0
  456.          mov [edi+42],dword 0
  457.          mov [edi+46],dword 0
  458.          ret
  459.          no_32_bits_per_pixel:
  460.  
  461.  
  462.          ret
  463.  
  464. PointerToImage       dd 0
  465. WhereCodingBMP       dd 0
  466. BmpPalette           dd 0
  467. Bmp_SizeX            dd 0
  468. Bmp_SizeY            dd 0
  469. Bmp_Counter          dd 0
  470. Bmp_Counter2         dd 0
  471. Bmp_Counter3         dd 0
  472. Bmp_save1            dd 0
  473. Bmp_save2            dd 0
  474. Bmp_save3            dd 0
  475. Bmp_bytes_per_string dd 0
  476. Bmp_doublewords      dd 0