;************************************************************************** ;**********************DECODING BMP FILE(1,4,8,24 bits)********************* ;*************************************************************************** ; BMPTOIMG -Convert BMP format TO IMG format ;*************************************************************************** bmptoimg: mov [bmp_load_area],esi mov [img_dest_area],edi xor eax,eax mov ax,word[esi+28] mov ebx,[esi+14] mov ecx,[esi+18] mov edx,[esi+22] mov [bmp_bits_per_pixel],ax mov [bmp_first_structure_size],ebx mov [Bmp_SizeY],edx mov [Bmp_SizeX],ecx xor eax,eax mov ax,[esi+28] mul dword [esi+18] add eax,31 shr eax,5 mov dword [bmptoimg_data_area_dwps],eax ;dwps-doublewords per string shl eax,2 mov dword [bmptoimg_data_area_bps],eax ;bps-bytes per string cmp dword [esi+34],0 jne yespicsize ;if picture size is defined mul dword [esi+22] mov dword [esi+34],eax yespicsize: mov eax,[bmp_load_area] add eax, [esi+10] ;how mach bytes to begin bitmap add eax, [esi+34] ;size of bitmap in BMP file mov dword [bmptoimg_data_area_eop],eax ;eop-end of picture in file ;calculate bytes per string mov eax, [esi+18] lea eax,[eax+2*eax] ;3x pixels in eax mov [bmp_bytes_per_string],eax mov esi,dword [bmptoimg_data_area_eop] sub esi,dword [bmptoimg_data_area_bps] mov ebp,[img_dest_area] mov edi,[img_dest_area] mov ebx,[bmp_load_area] add ebx, [bmp_first_structure_size] add ebx,14 ;in ebx start of color table cmp [bmp_bits_per_pixel],24 je convert_to_24bpp cmp [bmp_bits_per_pixel],8 je convert_to_8bpp cmp [bmp_bits_per_pixel],4 je convert_to_4bpp cmp [bmp_bits_per_pixel],1 je convert_to_1bpp jmp end_bmp ;-------------------------------------------------- ;-----------Decoding 24 bit BMP file--------------- ;-------------------------------------------------- convert_to_24bpp: mov ebx,[Bmp_SizeY] loop_convert_to_24bpp_y: mov edi,ebp mov ecx,[bmptoimg_data_area_dwps] cld rep movsd sub esi,[bmptoimg_data_area_bps] sub esi,[bmptoimg_data_area_bps] add ebp,eax dec ebx jnz loop_convert_to_24bpp_y jmp end_bmp ;----------------------------------------------------- ;--------------Decoding 8 bits BMP file--------------- ;----------------------------------------------------- convert_to_8bpp: mov ebp,[Bmp_SizeY] loop_convert_8bpp_y: mov ecx,[bmptoimg_data_area_bps] push edi loop_convert_8bpp_x: xor eax,eax mov al,byte [esi] call converttable inc esi add edi,3 dec ecx jnz loop_convert_8bpp_x pop edi add edi,[bmp_bytes_per_string] sub esi,[bmptoimg_data_area_bps] sub esi,[bmptoimg_data_area_bps] dec ebp jnz loop_convert_8bpp_y jmp end_bmp ;----------------------------------------------------- ;--------------Decoding 4 bits BMP file--------------- ;----------------------------------------------------- convert_to_4bpp: mov ebp,[Bmp_SizeY] loop_convert_4bpp_y: mov ecx,[bmptoimg_data_area_bps] push edi loop_convert_4bpp_x: mov [Bmp_save1],ecx xor eax,eax mov al,byte [esi] xor ecx,ecx mov cl,al shr al,4 ;first pixel in byte and cl,0xf ;second pixel in byte call converttable ;draw first pixel of byte mov eax,ecx ;move second pixel to register al and draw add edi,3 call converttable ;draw second pixel of byte add edi,3 mov ecx,[Bmp_save1] inc esi dec ecx jnz loop_convert_4bpp_x pop edi add edi,[bmp_bytes_per_string] sub esi,[bmptoimg_data_area_bps] sub esi,[bmptoimg_data_area_bps] dec ebp jnz loop_convert_4bpp_y jmp end_bmp ;----------------------------------------------------- ;---------------Decoding 1 bit BMP file--------------- ;----------------------------------------------------- convert_to_1bpp: mov ebp,[Bmp_SizeY] loop_convert_1bpp_y: mov ecx,[bmptoimg_data_area_bps] push edi loop_convert_1bpp_x: xor eax,eax mov al,byte [esi] mov [Bmp_save1],ecx mov ecx,eax mov edx,7 nextbit: xor eax,eax bt ecx,edx jnc noaddelem inc eax noaddelem: push edx call converttable pop edx add edi,3 dec edx jns nextbit mov ecx,[Bmp_save1] inc esi dec ecx jnz loop_convert_1bpp_x pop edi add edi,[bmp_bytes_per_string] sub esi,[bmptoimg_data_area_bps] sub esi,[bmptoimg_data_area_bps] dec ebp jnz loop_convert_1bpp_y jmp end_bmp ;----------------------------------------------------- converttable: shl eax,2 add eax,ebx mov edx, dword [eax] mov [edi],edx ret ;----------------------------------------------------- ; DATA AREA bmptoimg_data_area_bps dd 0 bmptoimg_data_area_dwps dd 0 bmptoimg_data_area_eop dd 0 bmp_load_area dd 0 img_dest_area dd 0 bmp_bits_per_pixel dw 0 bmp_first_structure_size dd 0 bmp_bytes_per_string dd 0 end_bmp: ret ;*************************************************************************** ;*******************CODING BMP FILE(1,4,8,24 bits)************************** ;*************************************************************************** ;-------------------------autor andrew_programmer--------------------------- coding_bmp: mov [PointerToImage],ebx mov [WhereCodingBMP],ecx mov [BmpPalette],edx mov [Bmp_SizeX],esi mov [Bmp_SizeY],edi ;********************************************** ;******************1 bit BMP******************* ;********************************************** cmp eax,2 ja no_monohrom_colors mov esi,[BmpPalette] mov edi,[WhereCodingBMP] add edi,54 mov eax,[esi] ;first color mov ebx,[esi+4] ;second color mov [edi],eax mov [edi+4],ebx ;coding image to bmp 1 bit format mov esi,[PointerToImage] mov edx,[WhereCodingBMP] mov ebx,[Bmp_SizeX] add ebx,31 ;picture_size_x+31 shr ebx,5 ;((picture_size_x)+31)/32 mov [Bmp_doublewords],ebx ;double words in string shl ebx,2 mov [Bmp_bytes_per_string],ebx ;bytes per string mov ecx,[Bmp_SizeY] dec ecx imul ebx,ecx add edx,54+8 add edx,ebx ;in edx pointer to area for coding mov ebp,[Bmp_bytes_per_string] mov ebx,[Bmp_SizeY] mov esi,[PointerToImage] mov edi,edx mov edx,[Bmp_SizeX] lea edx,[edx+edx*2] mov [Bmp_Counter],7 and [Bmp_Counter2],0 copy_lines_1: push esi mov ecx,[Bmp_bytes_per_string] shl ecx,3 ;(Bmp_bytes_per_string)*8 rep_movsb_1: mov eax,[esi] and eax,0xffffff push esi push ecx push ebx mov esi,[BmpPalette] xor ecx,ecx find_color_in_palette_1: mov ebx,[esi] and ebx,0xffffff cmp eax,ebx ;color fined ? je color_fined_1 add esi,4 inc ecx cmp ecx,256 jl find_color_in_palette_1 color_fined_1: mov [Bmp_Counter3],ecx ;number color in palette pop ebx pop ecx pop esi mov eax,[Bmp_Counter3] test eax,eax jz no_change_bit_in_byte push ecx mov ecx,[Bmp_Counter] bts [Bmp_Counter2],ecx pop ecx no_change_bit_in_byte: dec [Bmp_Counter] jns no_minus_in_counter push eax mov eax,[Bmp_Counter2] mov [edi],al inc edi mov [Bmp_Counter],7 and [Bmp_Counter2],0 ;obnulyaem byte pop eax no_minus_in_counter: add esi,3 dec ecx jnz rep_movsb_1 pop esi add esi,edx sub edi,ebp sub edi,ebp dec ebx jnz copy_lines_1 mov edi,[WhereCodingBMP] mov ebx,[Bmp_bytes_per_string] imul ebx,[Bmp_SizeY] add ebx,(54+8) ;crate list of bmp description mov [edi],word 'BM' mov [edi+2],ebx mov [edi+10],dword 54+8 ;where bigin bmp imige mov [edi+14],dword 40 mov edx,[Bmp_SizeX] mov ecx,[Bmp_SizeY] mov [edi+18],edx ;picture size x mov [edi+22],ecx ;picture size y mov [edi+26],word 1 mov [edi+28],word 1 ;bits per pixel mov [edi+30],dword 0 mov edx,[Bmp_bytes_per_string] imul edx,ecx mov [edi+34],edx mov [edi+38],dword 0 mov [edi+42],dword 0 mov [edi+46],dword 0 ret no_monohrom_colors: ;********************************************** ;*****************4 bits BMP******************* ;********************************************** cmp eax,16 ja no_16_colors ;copy 16 colors palette mov esi,[BmpPalette] mov edi,[WhereCodingBMP] add edi,54 mov ecx,16 rep movsd ;coding image to bmp 4 bits format mov esi,[PointerToImage] mov edx,[WhereCodingBMP] mov ebx,[Bmp_SizeX] shl ebx,2 ;4*(picture_size_x) add ebx,31 ;4*(picture_size_x)+31 shr ebx,5 ;(4*(picture_size_x)+31)/32 mov [Bmp_doublewords],ebx ;double words in string shl ebx,2 mov [Bmp_bytes_per_string],ebx ;bytes per string mov ecx,[Bmp_SizeY] dec ecx imul ebx,ecx add edx,54+64 add edx,ebx mov ebp,[Bmp_bytes_per_string] mov ebx,[Bmp_SizeY] mov [Bmp_Counter2],ebx mov edi,edx xor ebx,ebx copy_lines_4: mov ecx,[Bmp_bytes_per_string] shl ecx,1 and [Bmp_Counter3],0 push esi rep_movsb_4: mov eax,[esi] and eax,0xffffff mov [Bmp_save1],esi mov [Bmp_save2],ecx mov [Bmp_save3],ebx mov esi,[BmpPalette] xor ecx,ecx find_color_in_palette_: mov ebx,[esi] and ebx,0xffffff cmp eax,ebx ;color fined ? je color_fined_ add esi,4 inc ecx cmp ecx,16 jl find_color_in_palette_ color_fined_: mov [Bmp_Counter],ecx ;number color in palette mov esi,[Bmp_save1] mov ecx,[Bmp_save2] mov ebx,[Bmp_save3] xor eax,eax mov eax,[Bmp_Counter] shl bl,4 add bl,al mov eax,[Bmp_Counter3] and eax,1b test eax,eax ;next block ready ? jz no_ready mov [edi],bl ;4 bit color inc edi no_ready: add esi,3 inc [Bmp_Counter3] dec ecx jnz rep_movsb_4 pop esi add esi,[Bmp_SizeX] add esi,[Bmp_SizeX] add esi,[Bmp_SizeX] sub edi,ebp sub edi,ebp dec [Bmp_Counter2] jnz copy_lines_4 ;total size of bmp file mov edi,[WhereCodingBMP] mov ebx,[Bmp_bytes_per_string] imul ebx,[Bmp_SizeY] add ebx,(54+64) ;crate list of bmp description mov [edi],word 'BM' mov [edi+2],ebx mov [edi+10],dword 54+64 mov [edi+14],dword 40 mov edx,[Bmp_SizeX] mov ecx,[Bmp_SizeY] mov [edi+18],edx mov [edi+22],ecx mov [edi+26],word 1 mov [edi+28],word 4 mov [edi+30],dword 0 mov edx,[Bmp_bytes_per_string] imul edx,ecx mov [edi+34],edx mov [edi+38],dword 0 mov [edi+42],dword 0 mov [edi+46],dword 0 ret no_16_colors: ;********************************************** ;******************8 bits BMP****************** ;********************************************** cmp eax,256 ja no_8_bits_per_pixel ;copy palette mov esi,[BmpPalette] mov edi,[WhereCodingBMP] add edi,54 mov ecx,256 rep movsd ;coding image to bmp 8 bits format mov esi,[PointerToImage] mov edx,[WhereCodingBMP] mov ebx,[Bmp_SizeX] shl ebx,3 ;8*(picture_size_x) add ebx,31 ;8*(picture_size_x)+31 shr ebx,5 ;(8*(picture_size_x)+31)/32 mov [Bmp_doublewords],ebx ;double words in string shl ebx,2 mov [Bmp_bytes_per_string],ebx ;bytes per string mov ecx,[Bmp_SizeY] dec ecx imul ebx,ecx add edx,(1024+54) add edx,ebx ;in edx pointer to copy bitmap arrea mov ebp,[Bmp_bytes_per_string] shl ebp,1 mov ebx,[Bmp_SizeY] mov edi,edx copy_lines_8: mov ecx,[Bmp_bytes_per_string] mov [Bmp_save1],esi rep_movsb_8: mov eax,[esi] and eax,0xffffff push esi push ecx push ebx mov esi,[BmpPalette] xor ecx,ecx find_color_in_palette: mov ebx,[esi] and ebx,0xffffff cmp eax,ebx ;color fined ? je color_fined add esi,4 inc ecx cmp ecx,256 jl find_color_in_palette color_fined: mov [Bmp_Counter],ecx ;number color in palette pop ebx pop ecx pop esi mov eax,[Bmp_Counter] mov [edi],al ;8 bit color add esi,3 inc edi dec ecx jnz rep_movsb_8 mov esi,[Bmp_save1] add esi,[Bmp_SizeX] add esi,[Bmp_SizeX] add esi,[Bmp_SizeX] sub edi,ebp dec ebx jnz copy_lines_8 ;total size of bmp file mov edi,[WhereCodingBMP] mov ebx,[Bmp_bytes_per_string] imul ebx,[Bmp_SizeY] add ebx,54+1024 ;crate list of bmp description mov [edi],word 'BM' mov [edi+2],ebx mov [edi+10],dword 54+1024 mov [edi+14],dword 40 mov edx,[Bmp_SizeX] mov ecx,[Bmp_SizeY] mov [edi+18],edx mov [edi+22],ecx mov [edi+26],word 1 mov [edi+28],word 8 mov [edi+30],dword 0 mov edx,[Bmp_bytes_per_string] imul edx,ecx mov [edi+34],edx mov [edi+38],dword 0 mov [edi+42],dword 0 mov [edi+46],dword 0 ret no_8_bits_per_pixel: ;********************************************** ;*******************24 bit BMP***************** ;********************************************** cmp eax,256 jle no_32_bits_per_pixel ;copy picture mov esi,[PointerToImage] mov edx,[WhereCodingBMP] mov ebx,[Bmp_SizeX] shl ebx,3 ;8*(picture_size_x) lea ebx,[ebx+ebx*2] ;3*8*(picture_size_x) add ebx,31 ;3*8*(picture_size_x)+31 shr ebx,5 ;(3*8*(picture_size_x)+31)/32 mov [Bmp_doublewords],ebx ;double words in string shl ebx,2 mov [Bmp_bytes_per_string],ebx ;bytes per string mov ecx,[Bmp_SizeY] dec ecx imul ebx,ecx add edx,54 add edx,ebx ;in edx pointer to start of copy bit map mov ebp,[Bmp_bytes_per_string] shl ebp,1 mov ebx,[Bmp_SizeY] mov esi,[PointerToImage] mov edi,edx mov edx,[Bmp_SizeX] lea edx,[edx+edx*2] copy_lines_24: push esi mov ecx,[Bmp_doublewords] rep_movsb_24: mov eax,[esi] mov [edi],eax add esi,4 add edi,4 dec ecx jnz rep_movsb_24 pop esi add esi,edx sub edi,ebp dec ebx jnz copy_lines_24 ;total size of bmp fille mov edi,[WhereCodingBMP] mov ebx,[Bmp_bytes_per_string] imul ebx,[Bmp_SizeY] add ebx,54 ;write info to structure of bmp file mov [edi],word 'BM' mov [edi+2],ebx mov [edi+10],dword 54 ;where begin bmp imige mov [edi+14],dword 40 ;total size of structure number two mov edx,[Bmp_SizeX] mov ecx,[Bmp_SizeY] mov [edi+18],edx mov [edi+22],ecx mov [edi+26],word 1 mov [edi+28],word 24 ;bytes per pixel mov [edi+30],dword 0 mov edx,[Bmp_bytes_per_string] imul edx,ecx mov [edi+34],edx ;size of bmp image mov [edi+38],dword 0 mov [edi+42],dword 0 mov [edi+46],dword 0 ret no_32_bits_per_pixel: ret PointerToImage dd 0 WhereCodingBMP dd 0 BmpPalette dd 0 Bmp_SizeX dd 0 Bmp_SizeY dd 0 Bmp_Counter dd 0 Bmp_Counter2 dd 0 Bmp_Counter3 dd 0 Bmp_save1 dd 0 Bmp_save2 dd 0 Bmp_save3 dd 0 Bmp_bytes_per_string dd 0 Bmp_doublewords dd 0