libimg: 1bpp (monochrome) images support,

pcx.asm now uses 1bpp functions too, pcx code optimization


git-svn-id: svn://kolibrios.org@1593 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Ivan Baravy 2010-08-25 14:59:27 +00:00
parent ce4a26a80d
commit 23b7fbd318
3 changed files with 438 additions and 248 deletions

View File

@ -503,6 +503,46 @@ align 16
@@: @@:
ret ret
align 16
.bpp1:
push ebx edx
mov ebx, esi
mov esi, [ebx + Image.Data]
mov ecx, [ebx + Image.Height]
.bpp1.pre:
mov edx, [ebx + Image.Width]
mov eax, 7
.bpp1.begin:
push ecx esi
xor cx, cx
bt [esi], eax
setc cl
mov esi, [ebx + Image.Palette]
jcxz @f
add esi, 4
@@:
mov ecx, 3
cld
rep movsb
pop esi ecx
dec edx
jz .bpp1.end_line
dec eax
jns .bpp1.begin
mov eax, 7
inc esi
jmp .bpp1.begin
.bpp1.end_line:
dec ecx
jz .bpp1.quit
inc esi
jmp .bpp1.pre
.bpp1.quit:
pop edx ebx
ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -891,6 +931,61 @@ endl
add edi, [scanline_len] add edi, [scanline_len]
dec ecx dec ecx
jnz .next_line_horz24 jnz .next_line_horz24
jmp .exit
.bpp1_horz:
push eax edx
mov edi, [scanline_len]
mov edx, [ebx+Image.Width]
and edx, 0x07
neg dl
add dl, 8
and dl, 0x07 ; clear if cl=8
.bpp1_horz.begin:
push ebx ecx edx esi
mov eax, 7
add edi, esi
sub edi, 1
mov ebx, [ebx+Image.Width]
shr ebx, 1
.bpp1_horz.flip_line:
xor ecx, ecx
bt [esi], eax
setc cl
bt [edi], edx
jc .bpp1_horz.one
.bpp1_horz.zero:
btr [esi], eax
jmp @f
.bpp1_horz.one:
bts [esi], eax
@@:
jecxz .bpp1_horz.reset
.bpp1_horz.set:
bts [edi], edx
jmp @f
.bpp1_horz.reset:
btr [edi], edx
@@:
inc edx
and edx, 0x07
jnz @f
dec edi
@@:
dec eax
jns @f
mov eax, 7
inc esi
@@:
dec ebx
jnz .bpp1_horz.flip_line
pop esi edx ecx ebx
add esi, [scanline_len]
mov edi, [scanline_len]
dec ecx
jnz .bpp1_horz.begin
pop edx eax
.exit: .exit:
xor eax, eax xor eax, eax
@ -990,6 +1085,8 @@ endl
add eax, [ebx + Image.Data] add eax, [ebx + Image.Data]
mov [pixels_ptr], eax mov [pixels_ptr], eax
cmp [ebx + Image.Type], Image.bpp1
jz .rotate_ccw1
cmp [ebx + Image.Type], Image.bpp8 cmp [ebx + Image.Type], Image.bpp8
jz .rotate_ccw8 jz .rotate_ccw8
cmp [ebx + Image.Type], Image.bpp24 cmp [ebx + Image.Type], Image.bpp24
@ -1182,6 +1279,83 @@ endl
pop ecx pop ecx
jmp .next_column_ccw_low24 jmp .next_column_ccw_low24
.rotate_ccw1:
push ecx edx
mov eax, [ebx+Image.Height]
add eax, 7
shr eax, 3
mul word[ebx+Image.Width]
shl eax, 16
shrd eax, edx, 16
push eax ; save new data size
invoke mem.alloc, eax
or eax, eax
jz .error
push eax ; save pointer to new data
mov ecx, [ebx+Image.Width]
and ecx, 0x07
neg cl
add cl, 8
and cl, 0x07 ; clear if cl=8
mov esi, eax
mov edi, [ebx+Image.Data]
mov eax, 7
mov edx, [scanline_len_old]
dec edx
add edi, edx
.rotate_ccw1.begin:
bt [edi], ecx
jc .rotate_ccw1.one
.rotate_ccw1.zero:
btr [esi], eax
jmp @f
.rotate_ccw1.one:
bts [esi], eax
@@:
add edi, [scanline_len_old]
dec [scanline_pixels_new]
jz .rotate_ccw1.end_of_line
dec eax
jns .rotate_ccw1.begin
mov eax, 7
inc esi
jmp .rotate_ccw1.begin
.rotate_ccw1.end_of_line:
inc esi
mov eax, 7
mov edi, [ebx+Image.Height]
mov [scanline_pixels_new], edi
inc ecx
and cl, 0x07
jz @f
mov edi, [ebx+Image.Data]
add edi, edx
jmp .rotate_ccw1.begin
@@:
dec edx
js .rotate_ccw1.quit
mov edi, [ebx+Image.Data]
add edi, edx
jmp .rotate_ccw1.begin
.rotate_ccw1.quit:
pop eax ; get pointer to new data
mov esi, eax
mov edi, [ebx + Image.Data]
pop ecx ; get new data size
rep movsb
invoke mem.free, eax
pop edx ecx
jmp .exchange_dims
.rotate_cw_low: .rotate_cw_low:
mov eax, [ebx + Image.Height] mov eax, [ebx + Image.Height]
mov [scanline_pixels_new], eax mov [scanline_pixels_new], eax
@ -1203,6 +1377,8 @@ endl
add eax, [ebx + Image.Data] add eax, [ebx + Image.Data]
mov [pixels_ptr], eax mov [pixels_ptr], eax
cmp [ebx + Image.Type], Image.bpp1
jz .rotate_cw1
cmp [ebx + Image.Type], Image.bpp8 cmp [ebx + Image.Type], Image.bpp8
jz .rotate_cw8 jz .rotate_cw8
cmp [ebx + Image.Type], Image.bpp24 cmp [ebx + Image.Type], Image.bpp24
@ -1405,6 +1581,93 @@ endl
pop ecx pop ecx
jmp .next_column_cw_low24 jmp .next_column_cw_low24
.rotate_cw1:
push ecx edx
mov eax, [ebx+Image.Height]
add eax, 7
shr eax, 3
mul word[ebx+Image.Width]
shl eax, 16
shrd eax, edx, 16
push eax ; save new data size
invoke mem.alloc, eax
or eax, eax
jz .error
push eax ; save pointer to new data
mov ecx, 7
mov edx, [ebx+Image.Width]
mov [pixels_ptr], edx ; we don't use pixels_ptr as it do other procedures, we save there [ebx+Image.Width]
mov esi, eax
mov edi, [ebx+Image.Data]
mov eax, [ebx+Image.Height]
dec eax
mul [scanline_len_old]
add edi, eax
mov eax, 7
mov edx, 0
.rotate_cw1.begin:
bt [edi], ecx
jc .rotate_cw1.one
.rotate_cw1.zero:
btr [esi], eax
jmp @f
.rotate_cw1.one:
bts [esi], eax
@@:
sub edi, [scanline_len_old]
dec [scanline_pixels_new]
jz .rotate_cw1.end_of_line
dec eax
jns .rotate_cw1.begin
mov eax, 7
inc esi
jmp .rotate_cw1.begin
.rotate_cw1.end_of_line:
dec [pixels_ptr]
jz .rotate_cw1.quit
inc esi
mov eax, [ebx+Image.Height]
mov [scanline_pixels_new], eax
mov eax, 7
dec ecx
js @f
mov edi, [ebx+Image.Height]
dec edi
imul edi, [scanline_len_old]
add edi, [ebx+Image.Data]
add edi, edx
jmp .rotate_cw1.begin
@@:
mov ecx, 7
inc edx
cmp edx, [scanline_len_old]
je .rotate_cw1.quit
mov edi, [ebx+Image.Height]
dec edi
imul edi, [scanline_len_old]
add edi, [ebx+Image.Data]
add edi, edx
jmp .rotate_cw1.begin
.rotate_cw1.quit:
pop eax ; get pointer to new data
mov esi, eax
mov edi, [ebx + Image.Data]
pop ecx ; get new data size
rep movsb
invoke mem.free, eax
pop edx ecx
jmp .exchange_dims
.flip: .flip:
jmp .exit jmp .exit
@ -1613,6 +1876,8 @@ proc img._.resize_data _img, _width, _height ;//////////////////////////////////
; do not allow images which require too many memory ; do not allow images which require too many memory
cmp eax, 4000000h cmp eax, 4000000h
jae .error jae .error
cmp [ebx + Image.Type], Image.bpp1
jz .bpp1
cmp [ebx + Image.Type], Image.bpp8 cmp [ebx + Image.Type], Image.bpp8
jz .bpp8 jz .bpp8
cmp [ebx + Image.Type], Image.bpp24 cmp [ebx + Image.Type], Image.bpp24
@ -1625,6 +1890,34 @@ proc img._.resize_data _img, _width, _height ;//////////////////////////////////
jmp @f jmp @f
.bpp8: .bpp8:
add eax, 256*4 ; for palette add eax, 256*4 ; for palette
jmp @f
.bpp1:
mov eax, [_width]
add eax, 7
shr eax, 3
mul word[_height]
shl eax, 16
mov ax, dx
ror eax, 16
push ebx
mov ebx, eax
mov eax, [_height]
add eax, 7
shr eax, 3
mul word[_width]
shl eax, 16
mov ax, dx
ror eax, 16
cmp eax, ebx
jge .bpp1.skip
mov eax, ebx
.bpp1.skip:
pop ebx
add eax, 2*4 ; for palette
@@: @@:
mov esi, eax mov esi, eax
invoke mem.realloc, [ebx + Image.Data], eax invoke mem.realloc, [ebx + Image.Data], eax
@ -1637,10 +1930,16 @@ proc img._.resize_data _img, _width, _height ;//////////////////////////////////
push [_height] push [_height]
pop [ebx + Image.Height] pop [ebx + Image.Height]
cmp [ebx + Image.Type], Image.bpp8 cmp [ebx + Image.Type], Image.bpp8
jnz .ret jnz @f
lea esi, [eax + esi - 256*4] lea esi, [eax + esi - 256*4]
mov [ebx + Image.Palette], esi mov [ebx + Image.Palette], esi
jmp .ret jmp .ret
@@:
cmp [ebx + Image.Type], Image.bpp1
jnz .ret
lea esi, [eax + esi - 2*4]
mov [ebx + Image.Palette], esi
jmp .ret
.error: .error:
xor eax, eax xor eax, eax
@ -1658,19 +1957,25 @@ img._.get_scanline_len: ;///////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
cmp [ebx + Image.Type], Image.bpp1
jz .bpp1.1
cmp [ebx + Image.Type], Image.bpp8 cmp [ebx + Image.Type], Image.bpp8
jz .bpp8.1 jz .bpp8.1
cmp [ebx + Image.Type], Image.bpp24 cmp [ebx + Image.Type], Image.bpp24
jz .bpp24.1 jz .bpp24.1
add eax, eax add eax, eax
cmp [ebx + Image.Type], Image.bpp32 cmp [ebx + Image.Type], Image.bpp32
jnz @f jnz .quit
add eax, eax add eax, eax
jmp @f jmp .quit
.bpp24.1: .bpp24.1:
lea eax, [eax*3] lea eax, [eax*3]
jmp .quit
.bpp1.1:
add eax, 7
shr eax, 3
.bpp8.1: .bpp8.1:
@@: .quit:
ret ret
@ -1697,13 +2002,14 @@ img._.formats_table:
dd 0 dd 0
align 4 align 4
type2bpp dd 8, 24, 32, 15, 16 type2bpp dd 8, 24, 32, 15, 16, 1
img._.do_rgb.handlers: img._.do_rgb.handlers:
dd img._.do_rgb.bpp8 dd img._.do_rgb.bpp8
dd img._.do_rgb.bpp24 dd img._.do_rgb.bpp24
dd img._.do_rgb.bpp32 dd img._.do_rgb.bpp32
dd img._.do_rgb.bpp15.amd ; can be overwritten in lib_init dd img._.do_rgb.bpp15.amd ; can be overwritten in lib_init
dd img._.do_rgb.bpp16.amd ; can be overwritten in lib_init dd img._.do_rgb.bpp16.amd ; can be overwritten in lib_init
dd img._.do_rgb.bpp1
img.flip.layer.handlers_horz: img.flip.layer.handlers_horz:
dd img.flip.layer.bpp8_horz dd img.flip.layer.bpp8_horz
@ -1711,6 +2017,7 @@ img.flip.layer.handlers_horz:
dd img.flip.layer.bpp32_horz dd img.flip.layer.bpp32_horz
dd img.flip.layer.bpp1x_horz dd img.flip.layer.bpp1x_horz
dd img.flip.layer.bpp1x_horz dd img.flip.layer.bpp1x_horz
dd img.flip.layer.bpp1_horz
;;================================================================================================;; ;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;; ;;////////////////////////////////////////////////////////////////////////////////////////////////;;

View File

@ -19,7 +19,7 @@
struct FormatsTableEntry struct FormatsTableEntry
Is dd ? Is dd ?
Decode dd ? Decode dd ?
Encode dd ? Encode dd ?
ends ends
@ -28,10 +28,10 @@ struct Image
Checksum dd ? ; ((Width ROL 16) OR Height) XOR Data[0] Checksum dd ? ; ((Width ROL 16) OR Height) XOR Data[0]
Width dd ? Width dd ?
Height dd ? Height dd ?
Next dd ? Next dd ?
Previous dd ? Previous dd ?
Type dd ? ; one of Image.bppN Type dd ? ; one of Image.bppN
Data dd ? Data dd ?
Palette dd ? ; used iff Type eq Image.bpp8 Palette dd ? ; used iff Type eq Image.bpp8
Extended dd ? Extended dd ?
Flags dd ? ; bitfield Flags dd ? ; bitfield
@ -45,6 +45,7 @@ Image.bpp24 = 2
Image.bpp32 = 3 Image.bpp32 = 3
Image.bpp15 = 4 Image.bpp15 = 4
Image.bpp16 = 5 Image.bpp16 = 5
Image.bpp1 = 6
; bits in Image.Flags ; bits in Image.Flags
Image.IsAnimated = 1 Image.IsAnimated = 1
@ -54,9 +55,9 @@ struct ImageDecodeOptions
BackgroundColor dd ? ; used for transparent images as background BackgroundColor dd ? ; used for transparent images as background
ends ends
FLIP_VERTICAL = 0x01 FLIP_VERTICAL = 0x01
FLIP_HORIZONTAL = 0x02 FLIP_HORIZONTAL = 0x02
FLIP_BOTH = FLIP_VERTICAL or FLIP_HORIZONTAL FLIP_BOTH = FLIP_VERTICAL or FLIP_HORIZONTAL
ROTATE_90_CW = 0x01 ROTATE_90_CW = 0x01
ROTATE_180 = 0x02 ROTATE_180 = 0x02

View File

@ -73,38 +73,26 @@ proc img.decode.pcx _data, _length, _options ;//////////////////////////////////
;< eax = 0 (error) or pointer to image ;; ;< eax = 0 (error) or pointer to image ;;
;;================================================================================================;; ;;================================================================================================;;
locals locals
; IMGwidth dd ?
; IMGheight dd ?
; IMGbpp dd ?
buf rb 1
nplanes rd 1 nplanes rd 1
xsize rw 1 xsize rw 1
ysize rw 1 ysize rw 1
stxsize rw 1 bpl rw 1
stysize rw 1
total_bpl rd 1 total_bpl rd 1
total_bpl_tmp rd 1
line_begin rd 1 line_begin rd 1
retvalue rd 1 retvalue rd 1 ; 0 (error) or pointer to image
endl endl
pusha pusha
mov esi, [_data] mov esi, [_data]
movzx eax, byte[esi+pcx_header.nplanes]
cmp [esi+pcx_header.bpp], 1
jz monochrome
cmp byte[esi+pcx_header.nplanes], 3
jnz indexed
_24bit:
xor eax, eax
mov al, byte[esi+pcx_header.nplanes]
mov [nplanes], eax mov [nplanes], eax
mul word[esi+pcx_header.bpl] mov bx, word[esi+pcx_header.bpl]
mov [bpl], bx
mul bx
shl eax, 16
mov ax, dx
ror eax, 16
mov [total_bpl], eax mov [total_bpl], eax
movzx eax, word[esi+pcx_header.xmax] movzx eax, word[esi+pcx_header.xmax]
@ -117,6 +105,15 @@ endl
sub bx, word[esi+pcx_header.ymin] sub bx, word[esi+pcx_header.ymin]
mov [ysize], bx mov [ysize], bx
cmp [esi+pcx_header.bpp], 1
jz .monochrome
cmp byte[esi+pcx_header.nplanes], 3
jnz .indexed
._24bit:
stdcall img.create, eax, ebx, Image.bpp24 stdcall img.create, eax, ebx, Image.bpp24
mov [retvalue], eax mov [retvalue], eax
test eax, eax test eax, eax
@ -134,107 +131,107 @@ endl
mov esi, [_data] mov esi, [_data]
add esi, 128 add esi, 128
mov edi, [retvalue] ; mov edi, [retvalue]
mov edi, [edi+Image.Data] mov edi, [eax+Image.Data]
add edi, 2 add edi, 2
mov [line_begin], edi mov [line_begin], edi
mov ebx, [total_bpl] mov ebx, [total_bpl]
.begin: ._24bit.begin:
mov eax, [_data] mov ax, word[bpl]
mov ax, word[eax+pcx_header.bpl] ._24bit.decode:
.decode: call get_byte
mov dl, byte[esi] ._24bit.write_sequence:
inc esi mov [edi], dl
mov [buf], dl
and dl, 0xC0
cmp dl, 0xC0
jne @f
mov dl, byte[buf]
and dl, 0x3F
mov dh, [esi]
inc esi
.write_sequence:
mov [edi], dh
dec ax dec ax
dec ebx
add edi, [nplanes] add edi, [nplanes]
dec dl dec dh
test dl, dl jnz ._24bit.write_sequence
jnz .write_sequence
test ax, ax test ax, ax
jz .end_color_line jz ._24bit.end_color_line
jmp .decode jmp ._24bit.decode
@@:
mov dl, byte[buf]
mov [edi], dl
add edi, [nplanes]
dec ebx
dec ax
jz .end_color_line
jmp .decode
.end_color_line: ._24bit.end_color_line:
test ebx, ebx test ebx, ebx
jz .end_full_line jz ._24bit.end_full_line
dec [line_begin] dec [line_begin]
mov edi, [line_begin] mov edi, [line_begin]
jmp .begin jmp ._24bit.begin
.end_full_line: ._24bit.end_full_line:
dec word[ysize] dec word[ysize]
jz .quit jz .quit
mov ebx, [total_bpl] mov ebx, [total_bpl]
add edi, 2 add edi, 2
mov [line_begin], edi mov [line_begin], edi
jmp .begin jmp ._24bit.begin
.quit:
popa
mov eax, [retvalue]
ret
indexed: .indexed:
xor eax, eax
mov al, byte[esi+pcx_header.nplanes]
mov [nplanes], eax
mul word[esi+pcx_header.bpl]
mov [total_bpl], eax
movzx eax, word[esi+pcx_header.xmax]
inc ax
sub ax, word[esi+pcx_header.xmin]
mov [xsize], ax
movzx ebx, word[esi+pcx_header.ymax]
inc bx
sub bx, word[esi+pcx_header.ymin]
mov [ysize], bx
stdcall img.create, eax, ebx, Image.bpp8 stdcall img.create, eax, ebx, Image.bpp8
mov [retvalue], eax mov [retvalue], eax
test eax, eax test eax, eax
jz .quit jz .quit
movzx ebx, [xsize]
movzx ecx, [ysize]
mov edx, [eax+Image.Data]
rol ebx, 16
or ebx, ecx
xor ebx, [edx]
mov [eax+Image.Checksum], ebx
mov esi, [_data] mov esi, [_data]
add esi, [_length] add esi, [_length]
sub esi, 768 sub esi, 768
mov edi, [eax+Image.Palette] mov edi, [eax+Image.Palette]
mov ecx, 256 mov cx, 256
@@: @@:
mov ebx, [esi] mov ebx, [esi]
and ebx, 0x00ffffff
bswap ebx bswap ebx
shr ebx, 8 shr ebx, 8
mov [edi], ebx mov [edi], ebx
add edi, 4 add edi, 4
add esi, 3 add esi, 3
dec ecx dec cx
jnz @b jnz @b
mov esi, [_data]
add esi, 128
; mov edi, [retvalue]
mov edi, [eax+Image.Data]
.indexed.begin:
mov ax, word[bpl]
.indexed.decode:
call get_byte
.indexed.write_sequence:
mov [edi], dl
inc edi
dec ax
dec dh
jnz .indexed.write_sequence
test ax, ax
jz .indexed.end_line
jmp .indexed.decode
.indexed.end_line:
dec word[ysize]
jz .quit
jmp .indexed.begin
.monochrome:
stdcall img.create, eax, ebx, Image.bpp1
mov [retvalue], eax
test eax, eax
jz .quit
movzx ebx, [xsize] movzx ebx, [xsize]
movzx ecx, [ysize] movzx ecx, [ysize]
mov edx, [eax+Image.Data] mov edx, [eax+Image.Data]
@ -244,175 +241,42 @@ endl
xor ebx, [edx] xor ebx, [edx]
mov [eax+Image.Checksum], ebx mov [eax+Image.Checksum], ebx
mov esi, [_data]
add esi, 128
mov edi, [retvalue]
mov edi, [edi+Image.Data]
.begin:
mov eax, [_data]
mov ax, word[eax+pcx_header.bpl]
.decode:
mov dl, byte[esi]
inc esi
mov [buf], dl
and dl, 0xC0
cmp dl, 0xC0
jne @f
mov dl, [buf]
and dl, 0x3F
mov dh, [esi]
inc esi
.write_sequence:
mov [edi], dh
inc edi
dec ax
dec dl
jnz .write_sequence
test ax, ax
jz .end_line
jmp .decode
@@:
mov dl, byte[buf]
mov [edi], dl
inc edi
dec ax
jz .end_line
jmp .decode
.end_line:
dec word[ysize]
jz .quit
jmp .begin
.quit:
popa
mov eax, [retvalue]
ret
monochrome:
xor eax, eax
mov ax, word[esi+pcx_header.bpl]
mov [total_bpl], eax
movzx eax, word[esi+pcx_header.xmax]
inc ax
sub ax, word[esi+pcx_header.xmin]
mov [xsize], ax
movzx ebx, word[esi+pcx_header.ymax]
inc bx
sub bx, word[esi+pcx_header.ymin]
mov [ysize], bx
stdcall img.create, eax, ebx, Image.bpp8
mov [retvalue], eax
test eax, eax
jz .quit
mov edi, [eax+Image.Palette] mov edi, [eax+Image.Palette]
mov [edi], dword 0x00000000 mov [edi], dword 0x00000000
mov [edi+4], dword 0x00ffffff mov [edi+4], dword 0x00ffffff
movzx ebx, [xsize]
movzx ecx, [ysize]
mov edx, [eax+Image.Data]
rol ebx, 16
or ebx, ecx
xor ebx, [edx]
mov [eax+Image.Checksum], ebx
mov esi, [_data] mov esi, [_data]
add esi, 128 add esi, 128
mov edi, [retvalue] ; mov edi, [retvalue]
mov edi, [edi+Image.Data] mov edi, [eax+Image.Data]
.begin:
mov eax, [total_bpl] .monochrome.begin:
mov [total_bpl_tmp], eax mov ebx, [total_bpl]
mov ax, [xsize] mov ax, [xsize]
.decode: .monochrome.decode:
call get_byte
mov dh, byte[esi] .monochrome.write_sequence:
inc esi mov [edi], dl
mov [buf], dh
and dh, 0xC0
cmp dh, 0xC0
je .cycle1
mov dh, 1
mov dl, [buf]
jmp .exit1
.cycle1:
mov dh, [buf]
and dh, 0x3F
mov dl, byte[esi]
inc esi
.exit1:
push eax
xor eax, eax
mov al, dh
sub [total_bpl_tmp], eax
pop eax
.write_sequence:
mov ecx, 7
.go:
bt edx, ecx
jnc @f
mov [edi], byte 0x01
jmp .later
@@:
mov [edi], byte 0x00
.later:
inc edi inc edi
dec ax cmp ax, 8
jnz .lol jng .monochrome.is_last_byte_in_line
@@: sub ax, 8
cmp [total_bpl_tmp], 0 dec dh
jnz .monochrome.write_sequence
jmp .monochrome.decode
.monochrome.is_last_byte_in_line:
test ebx, ebx
jng @f jng @f
call get_byte
mov dh, byte[esi] jmp .monochrome.is_last_byte_in_line
inc esi
mov [buf], dh
and dh, 0xC0
cmp dh, 0xC0
je .cycle2
mov dh, 1
mov dl, [buf]
jmp .exit2
.cycle2:
mov dh, [buf]
and dh, 0x3F
mov dl, byte[esi]
inc esi
.exit2:
push eax
xor eax, eax
mov al, dh
sub [total_bpl_tmp], eax
pop eax
jmp @b
@@: @@:
dec word[ysize] dec word[ysize]
jnz .begin jnz .monochrome.begin
jmp .quit jmp .quit
.lol:
dec ecx
cmp ecx, -1
jne .go
dec dh
jnz .write_sequence
jmp .decode
.quit: .quit:
popa popa
@ -445,7 +309,25 @@ endp
;;================================================================================================;; ;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;; ;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;; ;;================================================================================================;;
proc get_byte
mov dh, byte[esi]
inc esi
cmp dh, 0xC0
jnb .cycle1
mov dl, dh
mov dh, 1
jmp .exit1
.cycle1:
and dh, 0x3F
mov dl, byte[esi]
inc esi
.exit1:
movzx ecx, dh
sub ebx, ecx
ret
endp
;;================================================================================================;; ;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;; ;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;; ;;================================================================================================;;