From 852732a9b16f620cbda0b6971edf301760edc734 Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Fri, 24 Feb 2012 17:47:42 +0000 Subject: [PATCH] libimg: tiff fix (packbits); pcx old code optimizing and fix (even byte) git-svn-id: svn://kolibrios.org@2397 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/libs-dev/libimg/pcx/pcx.asm | 214 +++++++----------- .../libraries/libs-dev/libimg/tiff/tiff.asm | 2 +- 2 files changed, 82 insertions(+), 134 deletions(-) diff --git a/programs/develop/libraries/libs-dev/libimg/pcx/pcx.asm b/programs/develop/libraries/libs-dev/libimg/pcx/pcx.asm index 07f87869d2..4f42fcedad 100644 --- a/programs/develop/libraries/libs-dev/libimg/pcx/pcx.asm +++ b/programs/develop/libraries/libs-dev/libimg/pcx/pcx.asm @@ -36,13 +36,13 @@ proc img.is.pcx _data, _length ;//////////////////////////////////////////////// mov edi, [_data] - cmp [edi + pcx_header.magic_number], 10 + cmp byte[edi + pcx_header.magic_number], 0x0A jne .is_not_pcx - cmp [edi + pcx_header.version], 5 + cmp byte[edi + pcx_header.version], 5 jne .is_not_pcx - cmp [edi + pcx_header.encoding], 1 + cmp byte[edi + pcx_header.encoding], 1 jne .is_not_pcx - cmp [edi + pcx_header.reserved], 0 + cmp byte[edi + pcx_header.reserved], 0 jne .is_not_pcx add edi, pcx_header.filler @@ -74,9 +74,9 @@ proc img.decode.pcx _data, _length, _options ;////////////////////////////////// ;;================================================================================================;; locals nplanes rd 1 - xsize rw 1 - ysize rw 1 - bpl rw 1 + xsize rd 1 + ysize rd 1 + bpl rd 1 total_bpl rd 1 line_begin rd 1 retvalue rd 1 ; 0 (error) or pointer to image @@ -87,24 +87,20 @@ endl mov esi, [_data] movzx eax, byte[esi + pcx_header.nplanes] mov [nplanes], eax - mov bx, word[esi + pcx_header.bpl] - mov [bpl], bx - mul bx - shl eax, 16 - mov ax, dx - ror eax, 16 + movzx ebx, word[esi + pcx_header.bpl] + mov [bpl], ebx + imul eax, ebx mov [total_bpl], eax movzx eax, word[esi + pcx_header.xmax] - inc ax sub ax, word[esi + pcx_header.xmin] - mov [xsize], ax + inc eax + mov [xsize], eax movzx ebx, word[esi + pcx_header.ymax] - inc bx sub bx, word[esi + pcx_header.ymin] - mov [ysize], bx - + inc ebx + mov [ysize], ebx cmp [esi + pcx_header.bpp], 1 jz .monochrome @@ -112,60 +108,52 @@ endl jnz .indexed - ._24bit: + .24bit: stdcall img.create, eax, ebx, Image.bpp24 mov [retvalue], eax test eax, eax 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] - add esi, 128 -; mov edi, [retvalue] + add esi, 128 ; skip header mov edi, [eax + Image.Data] add edi, 2 mov [line_begin], edi + + .24bit.scanline: mov ebx, [total_bpl] - - ._24bit.begin: - mov ax, word[bpl] - ._24bit.decode: + .24bit.color_line: + mov edx, [bpl] + .24bit.next_byte: call pcx._.get_byte - ._24bit.write_sequence: - mov [edi], dl - dec ax + sub edx, ecx + @@: + mov [edi], al add edi, [nplanes] - dec dh - jnz ._24bit.write_sequence + dec ecx + jnz @b - test ax, ax - jz ._24bit.end_color_line - jmp ._24bit.decode + test edx, edx + jnz .24bit.next_byte - ._24bit.end_color_line: + .24bit.end_color_line: test ebx, ebx - jz ._24bit.end_full_line + jz .24bit.end_full_line dec [line_begin] mov edi, [line_begin] - jmp ._24bit.begin + jmp .24bit.color_line - ._24bit.end_full_line: - dec word[ysize] + .24bit.end_full_line: + dec [ysize] jz .quit - mov ebx, [total_bpl] add edi, 2 + bt [xsize], 0 + jnc @f + sub edi, 3 + @@: mov [line_begin], edi - jmp ._24bit.begin + jmp .24bit.scanline .indexed: @@ -175,54 +163,40 @@ endl test eax, eax 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 ebx, eax mov esi, [_data] add esi, [_length] sub esi, 768 mov edi, [eax + Image.Palette] - mov cx, 256 + mov ecx, 256 + xor eax, eax @@: - mov ebx, [esi] - bswap ebx - shr ebx, 8 - mov [edi], ebx - add edi, 4 - add esi, 3 - dec cx + lodsw + xchg al, ah + shl eax, 8 + lodsb + stosd + dec ecx jnz @b mov esi, [_data] add esi, 128 -; mov edi, [retvalue] - mov edi, [eax + Image.Data] + mov edi, [ebx + Image.Data] - .indexed.begin: - mov ax, word[bpl] - .indexed.decode: + .indexed.line: + mov ebx, [total_bpl] + .indexed.next_byte: call pcx._.get_byte - .indexed.write_sequence: - mov [edi], dl - inc edi - dec ax - dec dh - jnz .indexed.write_sequence + @@: + stosb + dec ecx + jnz @b + test ebx, ebx + jnz .indexed.next_byte - test ax, ax - jz .indexed.end_line - jmp .indexed.decode - - .indexed.end_line: - dec word[ysize] - jz .quit - jmp .indexed.begin + dec [ysize] + jnz .indexed.line + jmp .quit .monochrome: @@ -232,50 +206,28 @@ endl test eax, eax 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 edi, [eax + Image.Palette] - mov [edi], dword 0x00000000 - mov [edi + 4], dword 0x00ffffff + mov [edi], dword 0xff000000 + mov [edi + 4], dword 0xffffffff mov esi, [_data] add esi, 128 -; mov edi, [retvalue] mov edi, [eax + Image.Data] - .monochrome.begin: + .monochrome.line: mov ebx, [total_bpl] - mov ax, [xsize] - - .monochrome.decode: + .monochrome.next_byte: call pcx._.get_byte - .monochrome.write_sequence: - mov [edi], dl - inc edi - cmp ax, 8 - jng .monochrome.is_last_byte_in_line - sub ax, 8 - dec dh - jnz .monochrome.write_sequence - jmp .monochrome.decode - - .monochrome.is_last_byte_in_line: - test ebx, ebx - jng @f - call pcx._.get_byte - jmp .monochrome.is_last_byte_in_line @@: - dec word[ysize] - jnz .monochrome.begin - jmp .quit + stosb + dec ecx + jnz @b + test ebx, ebx + jnz .monochrome.next_byte + dec [ysize] + jnz .monochrome.line +; jmp .quit .quit: @@ -309,19 +261,15 @@ endp ;;================================================================================================;; proc pcx._.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 + xor ecx, ecx + lodsb + cmp al, 0xC0 + setb cl + jb .done + and al, 0x3F + mov cl, al + lodsb + .done: sub ebx, ecx ret endp diff --git a/programs/develop/libraries/libs-dev/libimg/tiff/tiff.asm b/programs/develop/libraries/libs-dev/libimg/tiff/tiff.asm index d38646f7cd..2d68749344 100644 --- a/programs/develop/libraries/libs-dev/libimg/tiff/tiff.asm +++ b/programs/develop/libraries/libs-dev/libimg/tiff/tiff.asm @@ -625,7 +625,7 @@ proc tiff._.decompress.packbits _image .decode: lodsb dec edx - cmp al, 0xff + cmp al, 0x7f jbe .different cmp al, 0x80 jne .identical