diff --git a/programs/develop/libraries/libs-dev/libimg/libimg.asm b/programs/develop/libraries/libs-dev/libimg/libimg.asm index db9b22069e..e958cdcd85 100644 --- a/programs/develop/libraries/libs-dev/libimg/libimg.asm +++ b/programs/develop/libraries/libs-dev/libimg/libimg.asm @@ -1,21 +1,25 @@ -;;================================================================================================;; -;;//// libimg.asm //// (c) mike.dld, 2007-2008, (c) diamond, 2009, (c) dunkaist, 2011-2013 ///////;; -;;================================================================================================;; -;; ;; -;; This file is part of Common development libraries (Libs-Dev). ;; -;; ;; -;; Libs-Dev is free software: you can redistribute it and/or modify it under the terms of the GNU ;; -;; Lesser General Public License as published by the Free Software Foundation, either version 2.1 ;; -;; of the License, or (at your option) any later version. ;; -;; ;; -;; Libs-Dev is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without ;; -;; even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; -;; Lesser General Public License for more details. ;; -;; ;; -;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev. ;; -;; If not, see . ;; -;; ;; -;;================================================================================================;; +;;============================================================================;; +;;//// libimg.asm //// (c) mike.dld, 2007-2008 ;; +;; //// (c) diamond, 2009, ;; +;; //// (c) dunkaist, 2011-2020 ;; +;;============================================================================;; +;; ;; +;; This file is part of Common development libraries (Libs-Dev). ;; +;; ;; +;; Libs-Dev is free software: you can redistribute it and/or modify it under ;; +;; the terms of the GNU Lesser General Public License as published by the ;; +;; Free Software Foundation, either version 2.1 of the License, or (at your ;; +;; option) any later version. ;; +;; ;; +;; Libs-Dev is distributed in the hope that it will be useful, but WITHOUT ;; +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ;; +;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public ;; +;; License for more details. ;; +;; ;; +;; You should have received a copy of the GNU Lesser General Public License ;; +;; along with Libs-Dev. If not, see . ;; +;; ;; +;;============================================================================;; format MS COFF @@ -58,268 +62,272 @@ COMPOSITE_MODE equ MMX ; SSE | a bit faster, but may be unsupported by some CPUs include 'blend.asm' -;;================================================================================================;; -proc lib_init ;///////////////////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? Library entry point (called after library load) ;; -;;------------------------------------------------------------------------------------------------;; -;> eax = pointer to memory allocation routine ;; -;> ebx = pointer to memory freeing routine ;; -;> ecx = pointer to memory reallocation routine ;; -;> edx = pointer to library loading routine ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 1 (fail) / 0 (ok) (library initialization result) ;; -;;================================================================================================;; - mov [mem.alloc], eax - mov [mem.free], ebx - mov [mem.realloc], ecx - mov [dll.load], edx +;;============================================================================;; +proc lib_init ;///////////////////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Library entry point (called after library load) ;; +;;----------------------------------------------------------------------------;; +;> eax = pointer to memory allocation routine ;; +;> ebx = pointer to memory freeing routine ;; +;> ecx = pointer to memory reallocation routine ;; +;> edx = pointer to library loading routine ;; +;;----------------------------------------------------------------------------;; +;< eax = 1 (fail) / 0 (ok) (library initialization result) ;; +;;============================================================================;; + mov [mem.alloc], eax + mov [mem.free], ebx + mov [mem.realloc], ecx + mov [dll.load], edx - or edx,edx - jz @f - invoke dll.load, @IMPORT - @@: + or edx, edx + jz @f + invoke dll.load, @IMPORT +@@: - call img.initialize.jpeg + call img.initialize.jpeg - xor eax, eax - cpuid - cmp ecx, 'ntel' - jnz @f - mov dword [img._.do_rgb.handlers + (Image.bpp15-1)*4], img._.do_rgb.bpp15.intel - mov dword [img._.do_rgb.handlers + (Image.bpp16-1)*4], img._.do_rgb.bpp16.intel - @@: + xor eax, eax + cpuid + cmp ecx, 'ntel' + jnz @f + mov dword [img._.do_rgb.handlers + (Image.bpp15-1)*4], img._.do_rgb.bpp15.intel + mov dword [img._.do_rgb.handlers + (Image.bpp16-1)*4], img._.do_rgb.bpp16.intel +@@: - .ok: xor eax,eax - ret +.ok: + xor eax, eax + ret endp -;;================================================================================================;; -proc img.is_img _data, _length ;//////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;> --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;< --- TBD --- ;; -;;================================================================================================;; - push ebx - mov ebx, img.formats_table - @@: stdcall [ebx + FormatsTableEntry.Is], [_data], [_length] - or eax, eax - jnz @f - add ebx, sizeof.FormatsTableEntry - cmp dword[ebx], 0 - jnz @b - xor eax, eax - @@: pop ebx - ret +;;============================================================================;; +proc img.is_img _data, _length ;//////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;> --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;< --- TBD --- ;; +;;============================================================================;; + push ebx + mov ebx, img.formats_table +@@: + stdcall [ebx + FormatsTableEntry.Is], [_data], [_length] + or eax, eax + jnz @f + add ebx, sizeof.FormatsTableEntry + cmp dword[ebx], 0 + jnz @b + xor eax, eax +@@: + pop ebx + ret endp -;;================================================================================================;; -proc img.info _data, _length ;////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;> --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;< --- TBD --- ;; -;;================================================================================================;; - xor eax, eax - ret +;;============================================================================;; +proc img.info _data, _length ;////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;> --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;< --- TBD --- ;; +;;============================================================================;; + xor eax, eax + ret endp -;;================================================================================================;; -proc img.from_file _filename ;////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? load file from disk and decode it ;; -;;------------------------------------------------------------------------------------------------;; -;> [_filename] = file name as passed to libio ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to image ;; -;;================================================================================================;; +;;============================================================================;; +proc img.from_file _filename ;////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? load file from disk and decode it ;; +;;----------------------------------------------------------------------------;; +;> [_filename] = file name as passed to libio ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to image ;; +;;============================================================================;; locals - fd dd ? - img_data_len dd ? - img_data dd ? ; raw bytes - img dd ? ; Image pointer + fd dd ? + img_data_len dd ? + img_data dd ? ; raw bytes + img dd ? ; Image pointer endl - push ebx - mov [img], 0 - invoke file.open, [_filename], O_READ - mov [fd], eax - test eax, eax - jz .exit - invoke file.size, [_filename] - test eax, eax - jnz .exit_close - mov [img_data_len], ebx - invoke mem.alloc, ebx - test eax, eax - jz .exit_close - mov [img_data], eax - invoke file.read, [fd], eax, [img_data_len] - cmp eax, -1 - jz .exit_free_close - cmp eax, [img_data_len] - jnz .exit_free_close - stdcall img.decode, [img_data], [img_data_len], 0 - test eax, eax - jz .exit_free_close - mov [img], eax - .exit_free_close: - invoke mem.free, [img_data] - .exit_close: - invoke file.close, [fd] - mov eax, [img] - .exit: - pop ebx - ret + push ebx + mov [img], 0 + invoke file.open, [_filename], O_READ + mov [fd], eax + test eax, eax + jz .exit + invoke file.size, [_filename] + test eax, eax + jnz .exit_close + mov [img_data_len], ebx + invoke mem.alloc, ebx + test eax, eax + jz .exit_close + mov [img_data], eax + invoke file.read, [fd], eax, [img_data_len] + cmp eax, -1 + jz .exit_free_close + cmp eax, [img_data_len] + jnz .exit_free_close + stdcall img.decode, [img_data], [img_data_len], 0 + test eax, eax + jz .exit_free_close + mov [img], eax +.exit_free_close: + invoke mem.free, [img_data] +.exit_close: + invoke file.close, [fd] + mov eax, [img] +.exit: + pop ebx + ret endp -;;================================================================================================;; -proc img.to_file _img, _filename ;////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;> --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = false / true ;; -;;================================================================================================;; - xor eax, eax - ret +;;============================================================================;; +proc img.to_file _img, _filename ;////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;> --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;< eax = false / true ;; +;;============================================================================;; + xor eax, eax + ret endp -;;================================================================================================;; -proc img.from_rgb _rgb_data ;/////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;> --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to image ;; -;;================================================================================================;; - xor eax, eax - ret +;;============================================================================;; +proc img.from_rgb _rgb_data ;/////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;> --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to image ;; +;;============================================================================;; + xor eax, eax + ret endp -;;================================================================================================;; -proc img.to_rgb2 _img, _out ;/////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? decodes image data into RGB triplets and stores them where [_out] points to ;; -;;------------------------------------------------------------------------------------------------;; -;> [_img] = pointer to source image ;; -;> [_out] = where to store RGB triplets ;; -;;------------------------------------------------------------------------------------------------;; -;< none ;; -;;================================================================================================;; - push esi edi - mov esi, [_img] - stdcall img._.validate, esi - or eax, eax - jnz .ret - mov edi, [_out] - call img._.do_rgb +;;============================================================================;; +proc img.to_rgb2 _img, _out ;/////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? decodes image data into RGB triplets and stores them where [_out] points to;; +;;----------------------------------------------------------------------------;; +;> [_img] = pointer to source image ;; +;> [_out] = where to store RGB triplets ;; +;;----------------------------------------------------------------------------;; +;< none ;; +;;============================================================================;; + push esi edi + mov esi, [_img] + stdcall img._.validate, esi + or eax, eax + jnz .ret + mov edi, [_out] + call img._.do_rgb .ret: - pop edi esi - ret + pop edi esi + ret endp -;;================================================================================================;; -proc img.to_rgb _img ;////////////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? decodes image data into RGB triplets and returns pointer to memory area of following structure:;; -;? width dd ? ;; -;? height dd ? ;; -;? rgb triplets ;; -;;------------------------------------------------------------------------------------------------;; -;> [_img] = pointer to source image ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to rgb_data (array of [rgb] triplets) ;; -;;================================================================================================;; - push esi edi - mov esi, [_img] - stdcall img._.validate, esi - or eax, eax - jnz .error +;;============================================================================;; +proc img.to_rgb _img ;////////////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? decodes image data into RGB triplets and returns pointer to memory area of ;; +;? following structure: ;; +;? width dd ? ;; +;? height dd ? ;; +;? rgb triplets ;; +;;----------------------------------------------------------------------------;; +;> [_img] = pointer to source image ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to rgb_data (array of [rgb] triplets) ;; +;;============================================================================;; + push esi edi + mov esi, [_img] + stdcall img._.validate, esi + or eax, eax + jnz .error - mov esi, [_img] - mov ecx, [esi + Image.Width] - imul ecx, [esi + Image.Height] - lea eax, [ecx * 3 + 4 * 3] - invoke mem.alloc, eax - or eax, eax - jz .error + mov esi, [_img] + mov ecx, [esi + Image.Width] + imul ecx, [esi + Image.Height] + lea eax, [ecx * 3 + 4 * 3] + invoke mem.alloc, eax + or eax, eax + jz .error - mov edi, eax - push eax - mov eax, [esi + Image.Width] - stosd - mov eax, [esi + Image.Height] - stosd - call img._.do_rgb - pop eax - pop edi esi - ret + mov edi, eax + push eax + mov eax, [esi + Image.Width] + stosd + mov eax, [esi + Image.Height] + stosd + call img._.do_rgb + pop eax + pop edi esi + ret - .error: - xor eax, eax - pop edi esi - ret +.error: + xor eax, eax + pop edi esi + ret endp -;;================================================================================================;; -proc img._.do_rgb ;///////////////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? decodes [esi + Image.Data] data into RGB triplets and stores them at [edi] ;; -;;------------------------------------------------------------------------------------------------;; -;> esi = pointer to source image ;; -;> edi = pointer to memory to store RGB triplets ;; -;;------------------------------------------------------------------------------------------------;; -;< none ;; -;;================================================================================================;; - mov ecx, [esi + Image.Width] - imul ecx, [esi + Image.Height] - mov eax, [esi + Image.Type] - jmp dword [.handlers + (eax-1)*4] +;;============================================================================;; +proc img._.do_rgb ;///////////////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? decodes [esi + Image.Data] data into RGB triplets and stores them at [edi] ;; +;;----------------------------------------------------------------------------;; +;> esi = pointer to source image ;; +;> edi = pointer to memory to store RGB triplets ;; +;;----------------------------------------------------------------------------;; +;< none ;; +;;============================================================================;; + mov ecx, [esi + Image.Width] + imul ecx, [esi + Image.Height] + mov eax, [esi + Image.Type] + jmp dword [.handlers + (eax-1)*4] align 16 .bpp8i: ; 8 BPP WITH PALETTE -> 24 BPP - push ebx - mov ebx, [esi + Image.Palette] - mov esi, [esi + Image.Data] - sub ecx, 1 - jz .bpp8i.last + push ebx + mov ebx, [esi + Image.Palette] + mov esi, [esi + Image.Data] + sub ecx, 1 + jz .bpp8i.last @@: - movzx eax, byte [esi] - add esi, 1 - mov eax, [ebx + eax*4] - mov [edi], eax - add edi, 3 - sub ecx, 1 - jnz @b + movzx eax, byte [esi] + add esi, 1 + mov eax, [ebx + eax*4] + mov [edi], eax + add edi, 3 + sub ecx, 1 + jnz @b .bpp8i.last: - movzx eax, byte [esi] - mov eax, [ebx + eax*4] - mov [edi], ax - shr eax, 16 - mov [edi+2], al - pop ebx - ret + movzx eax, byte [esi] + mov eax, [ebx + eax*4] + mov [edi], ax + shr eax, 16 + mov [edi+2], al + pop ebx + ret align 16 .bpp8g: ; 8 BPP GRAYSCALE -> 24 BPP - mov esi, [esi + Image.Data] + mov esi, [esi + Image.Data] @@: - lodsb - mov ah, al - stosb - stosw - dec ecx - jnz @b - ret + lodsb + mov ah, al + stosb + stosw + dec ecx + jnz @b + ret ; ;align 16 ;.bpp8a: ; considered application layer, may be changed in the future @@ -336,2493 +344,2527 @@ align 16 ; 15 BPP -> 24 BPP .bpp15.intel: - push ebx ebp - sub ecx, 4 - jb .bpp15.tail + push ebx ebp + sub ecx, 4 + jb .bpp15.tail align 16 .bpp15.intel.loop: repeat 2 - mov ebx, [esi] - mov al, [esi] - mov ah, [esi+1] - add esi, 4 - and al, 0x1F - and ah, 0x1F shl 2 - mov ebp, ebx - mov dl, al - mov dh, ah - shr al, 2 - shr ah, 4 - shl dl, 3 - shl dh, 1 - and ebp, 0x1F shl 5 - add al, dl - add ah, dh - shr ebp, 2 - mov [edi], al - mov [edi+2], ah - mov eax, ebx - mov ebx, ebp - shr eax, 16 - shr ebx, 5 - add ebx, ebp - mov ebp, eax - mov [edi+1], bl - and eax, (0x1F) or (0x1F shl 10) - and ebp, 0x1F shl 5 - lea edx, [eax+eax] - shr al, 2 - mov ebx, ebp - shr ah, 4 - shl dl, 2 - shr ebx, 2 - shr ebp, 7 - add al, dl - add ah, dh - mov [edi+3], al - add ebx, ebp - mov [edi+5], ah - mov [edi+4], bl - add edi, 6 + mov ebx, [esi] + mov al, [esi] + mov ah, [esi+1] + add esi, 4 + and al, 0x1F + and ah, 0x1F shl 2 + mov ebp, ebx + mov dl, al + mov dh, ah + shr al, 2 + shr ah, 4 + shl dl, 3 + shl dh, 1 + and ebp, 0x1F shl 5 + add al, dl + add ah, dh + shr ebp, 2 + mov [edi], al + mov [edi+2], ah + mov eax, ebx + mov ebx, ebp + shr eax, 16 + shr ebx, 5 + add ebx, ebp + mov ebp, eax + mov [edi+1], bl + and eax, (0x1F) or (0x1F shl 10) + and ebp, 0x1F shl 5 + lea edx, [eax+eax] + shr al, 2 + mov ebx, ebp + shr ah, 4 + shl dl, 2 + shr ebx, 2 + shr ebp, 7 + add al, dl + add ah, dh + mov [edi+3], al + add ebx, ebp + mov [edi+5], ah + mov [edi+4], bl + add edi, 6 end repeat - sub ecx, 4 - jnb .bpp15.intel.loop + sub ecx, 4 + jnb .bpp15.intel.loop .bpp15.tail: - add ecx, 4 - jz .bpp15.done + add ecx, 4 + jz .bpp15.done @@: - movzx eax, word [esi] - mov ebx, eax - add esi, 2 - and eax, (0x1F) or (0x1F shl 10) - and ebx, 0x1F shl 5 - lea edx, [eax+eax] - shr al, 2 - mov ebp, ebx - shr ebx, 2 - shr ah, 4 - shl dl, 2 - shr ebp, 7 - add eax, edx - add ebx, ebp - mov [edi], al - mov [edi+1], bl - mov [edi+2], ah - add edi, 3 - sub ecx, 1 - jnz @b + movzx eax, word [esi] + mov ebx, eax + add esi, 2 + and eax, (0x1F) or (0x1F shl 10) + and ebx, 0x1F shl 5 + lea edx, [eax+eax] + shr al, 2 + mov ebp, ebx + shr ebx, 2 + shr ah, 4 + shl dl, 2 + shr ebp, 7 + add eax, edx + add ebx, ebp + mov [edi], al + mov [edi+1], bl + mov [edi+2], ah + add edi, 3 + sub ecx, 1 + jnz @b .bpp15.done: - pop ebp ebx - ret + pop ebp ebx + ret .bpp15.amd: - push ebx ebp - sub ecx, 4 - jb .bpp15.tail + push ebx ebp + sub ecx, 4 + jb .bpp15.tail align 16 .bpp15.amd.loop: repeat 4 if (% mod 2) = 1 - mov eax, dword [esi] - mov ebx, dword [esi] + mov eax, dword [esi] + mov ebx, dword [esi] else - movzx eax, word [esi] - mov ebx, eax + movzx eax, word [esi] + mov ebx, eax end if - add esi, 2 - and eax, (0x1F) or (0x1F shl 10) - and ebx, 0x1F shl 5 - lea edx, [eax+eax] - shr al, 2 - mov ebp, ebx - shr ebx, 2 - shr ah, 4 - shl dl, 2 - shr ebp, 7 - add eax, edx - add ebx, ebp - mov [edi], al - mov [edi+1], bl - mov [edi+2], ah - add edi, 3 + add esi, 2 + and eax, (0x1F) or (0x1F shl 10) + and ebx, 0x1F shl 5 + lea edx, [eax+eax] + shr al, 2 + mov ebp, ebx + shr ebx, 2 + shr ah, 4 + shl dl, 2 + shr ebp, 7 + add eax, edx + add ebx, ebp + mov [edi], al + mov [edi+1], bl + mov [edi+2], ah + add edi, 3 end repeat - sub ecx, 4 - jnb .bpp15.amd.loop - jmp .bpp15.tail + sub ecx, 4 + jnb .bpp15.amd.loop + jmp .bpp15.tail ; 16 BPP -> 24 BPP .bpp16.intel: - push ebx ebp - sub ecx, 4 - jb .bpp16.tail + push ebx ebp + sub ecx, 4 + jb .bpp16.tail align 16 .bpp16.intel.loop: repeat 2 - mov ebx, [esi] - mov al, [esi] - mov ah, [esi+1] - add esi, 4 - and al, 0x1F - and ah, 0x1F shl 3 - mov ebp, ebx - mov dl, al - mov dh, ah - shr al, 2 - shr ah, 5 - shl dl, 3 - and ebp, 0x3F shl 5 - add al, dl - add ah, dh - shr ebp, 3 - mov [edi], al - mov [edi+2], ah - mov eax, ebx - mov ebx, ebp - shr eax, 16 - shr ebx, 6 - add ebx, ebp - mov ebp, eax - mov [edi+1], bl - and eax, (0x1F) or (0x1F shl 11) - and ebp, 0x3F shl 5 - mov edx, eax - shr al, 2 - mov ebx, ebp - shr ah, 5 - shl dl, 3 - shr ebx, 3 - shr ebp, 9 - add al, dl - add ah, dh - mov [edi+3], al - add ebx, ebp - mov [edi+5], ah - mov [edi+4], bl - add edi, 6 + mov ebx, [esi] + mov al, [esi] + mov ah, [esi+1] + add esi, 4 + and al, 0x1F + and ah, 0x1F shl 3 + mov ebp, ebx + mov dl, al + mov dh, ah + shr al, 2 + shr ah, 5 + shl dl, 3 + and ebp, 0x3F shl 5 + add al, dl + add ah, dh + shr ebp, 3 + mov [edi], al + mov [edi+2], ah + mov eax, ebx + mov ebx, ebp + shr eax, 16 + shr ebx, 6 + add ebx, ebp + mov ebp, eax + mov [edi+1], bl + and eax, (0x1F) or (0x1F shl 11) + and ebp, 0x3F shl 5 + mov edx, eax + shr al, 2 + mov ebx, ebp + shr ah, 5 + shl dl, 3 + shr ebx, 3 + shr ebp, 9 + add al, dl + add ah, dh + mov [edi+3], al + add ebx, ebp + mov [edi+5], ah + mov [edi+4], bl + add edi, 6 end repeat - sub ecx, 4 - jnb .bpp16.intel.loop + sub ecx, 4 + jnb .bpp16.intel.loop .bpp16.tail: - add ecx, 4 - jz .bpp16.done + add ecx, 4 + jz .bpp16.done @@: - movzx eax, word [esi] - mov ebx, eax - add esi, 2 - and eax, (0x1F) or (0x1F shl 11) - and ebx, 0x3F shl 5 - mov edx, eax - shr al, 2 - mov ebp, ebx - shr ebx, 3 - shr ah, 5 - shl dl, 3 - shr ebp, 9 - add eax, edx - add ebx, ebp - mov [edi], al - mov [edi+1], bl - mov [edi+2], ah - add edi, 3 - sub ecx, 1 - jnz @b + movzx eax, word [esi] + mov ebx, eax + add esi, 2 + and eax, (0x1F) or (0x1F shl 11) + and ebx, 0x3F shl 5 + mov edx, eax + shr al, 2 + mov ebp, ebx + shr ebx, 3 + shr ah, 5 + shl dl, 3 + shr ebp, 9 + add eax, edx + add ebx, ebp + mov [edi], al + mov [edi+1], bl + mov [edi+2], ah + add edi, 3 + sub ecx, 1 + jnz @b .bpp16.done: - pop ebp ebx - ret + pop ebp ebx + ret .bpp16.amd: - push ebx ebp - sub ecx, 4 - jb .bpp16.tail + push ebx ebp + sub ecx, 4 + jb .bpp16.tail align 16 .bpp16.amd.loop: repeat 4 if (% mod 2) = 1 - mov eax, dword [esi] - mov ebx, dword [esi] + mov eax, dword [esi] + mov ebx, dword [esi] else - movzx eax, word [esi] - mov ebx, eax + movzx eax, word [esi] + mov ebx, eax end if - add esi, 2 - and eax, (0x1F) or (0x1F shl 11) - and ebx, 0x3F shl 5 - mov edx, eax - shr al, 2 - mov ebp, ebx - shr ebx, 3 - shr ah, 5 - shl dl, 3 - shr ebp, 9 - add eax, edx - add ebx, ebp - mov [edi], al - mov [edi+1], bl - mov [edi+2], ah - add edi, 3 + add esi, 2 + and eax, (0x1F) or (0x1F shl 11) + and ebx, 0x3F shl 5 + mov edx, eax + shr al, 2 + mov ebp, ebx + shr ebx, 3 + shr ah, 5 + shl dl, 3 + shr ebp, 9 + add eax, edx + add ebx, ebp + mov [edi], al + mov [edi+1], bl + mov [edi+2], ah + add edi, 3 end repeat - sub ecx, 4 - jnb .bpp16.amd.loop - jmp .bpp16.tail + sub ecx, 4 + jnb .bpp16.amd.loop + jmp .bpp16.tail align 16 .bpp24: ; 24 BPP -> 24 BPP - lea ecx, [ecx*3 + 3] - mov esi, [esi + Image.Data] - shr ecx, 2 - rep movsd - ret + lea ecx, [ecx*3 + 3] + mov esi, [esi + Image.Data] + shr ecx, 2 + rep movsd + ret align 16 .bpp32: ; 32 BPP -> 24 BPP - mov esi, [esi + Image.Data] + mov esi, [esi + Image.Data] - @@: - mov eax, [esi] - mov [edi], ax - shr eax, 16 - mov [edi+2], al - add esi, 4 - add edi, 3 - sub ecx, 1 - jnz @b +@@: + mov eax, [esi] + mov [edi], ax + shr eax, 16 + mov [edi+2], al + add esi, 4 + add edi, 3 + sub ecx, 1 + jnz @b - @@: - ret +@@: + ret align 16 .bpp1: - push ebx ebp - mov ebp, [esi + Image.Width] - mov edx, [esi + Image.Height] - shl edx, 16 - mov ebx, [esi + Image.Palette] - mov esi, [esi + Image.Data] - .bpp1.pre: - mov dx, bp - mov ecx, 7 - .bpp1.begin: - xor eax, eax - bt [esi], ecx - adc eax, 0 - mov eax, [ebx + eax*4] - mov [edi], ax - shr eax, 16 - mov [edi + 2], al - add edi, 3 - dec dx - jz .bpp1.end_line - dec ecx - jns .bpp1.begin - mov ecx, 7 - inc esi - jmp .bpp1.begin - .bpp1.end_line: - sub edx, 0x10000 - jz .bpp1.quit - inc esi - jmp .bpp1.pre - .bpp1.quit: - pop ebp ebx - ret + push ebx ebp + mov ebp, [esi + Image.Width] + mov edx, [esi + Image.Height] + shl edx, 16 + mov ebx, [esi + Image.Palette] + mov esi, [esi + Image.Data] +.bpp1.pre: + mov dx, bp + mov ecx, 7 +.bpp1.begin: + xor eax, eax + bt [esi], ecx + adc eax, 0 + mov eax, [ebx + eax*4] + mov [edi], ax + shr eax, 16 + mov [edi + 2], al + add edi, 3 + dec dx + jz .bpp1.end_line + dec ecx + jns .bpp1.begin + mov ecx, 7 + inc esi + jmp .bpp1.begin +.bpp1.end_line: + sub edx, 0x10000 + jz .bpp1.quit + inc esi + jmp .bpp1.pre +.bpp1.quit: + pop ebp ebx + ret align 16 .bpp2i: - push ebx ebp - mov ebp, [esi + Image.Width] - mov edx, [esi + Image.Height] - shl edx, 16 - mov ebx, [esi + Image.Palette] - mov esi, [esi + Image.Data] - .bpp2i.pre: - mov dx, bp - mov ecx, 3 - .bpp2i.begin: - mov eax, 3 - shl ecx, 1 - shl eax, cl - and al, [esi] - shr eax, cl - shr ecx, 1 - mov eax, [ebx + eax*4] - mov [edi], ax - shr eax, 16 - mov [edi + 2], al - add edi, 3 - dec dx - jz .bpp2i.end_line - dec ecx - jns .bpp2i.begin - mov ecx, 3 - inc esi - jmp .bpp2i.begin - .bpp2i.end_line: - sub edx, 0x10000 - jz .bpp2i.quit - inc esi - jmp .bpp2i.pre - .bpp2i.quit: - pop ebp ebx - ret + push ebx ebp + mov ebp, [esi + Image.Width] + mov edx, [esi + Image.Height] + shl edx, 16 + mov ebx, [esi + Image.Palette] + mov esi, [esi + Image.Data] +.bpp2i.pre: + mov dx, bp + mov ecx, 3 +.bpp2i.begin: + mov eax, 3 + shl ecx, 1 + shl eax, cl + and al, [esi] + shr eax, cl + shr ecx, 1 + mov eax, [ebx + eax*4] + mov [edi], ax + shr eax, 16 + mov [edi + 2], al + add edi, 3 + dec dx + jz .bpp2i.end_line + dec ecx + jns .bpp2i.begin + mov ecx, 3 + inc esi + jmp .bpp2i.begin +.bpp2i.end_line: + sub edx, 0x10000 + jz .bpp2i.quit + inc esi + jmp .bpp2i.pre +.bpp2i.quit: + pop ebp ebx + ret align 16 .bpp4i: - push ebx ebp - mov ebp, [esi + Image.Width] - mov edx, [esi + Image.Height] - shl edx, 16 - mov ebx, [esi + Image.Palette] - mov esi, [esi + Image.Data] - .bpp4i.pre: - mov dx, bp - mov ecx, 1 - .bpp4i.begin: - mov eax, 15 - shl ecx, 2 - shl eax, cl - and al, [esi] - shr eax, cl - shr ecx, 2 - mov eax, [ebx + eax*4] - mov [edi], ax - shr eax, 16 - mov [edi + 2], al - add edi, 3 - dec dx - jz .bpp4i.end_line - dec ecx - jns .bpp4i.begin - mov ecx, 1 - inc esi - jmp .bpp4i.begin - .bpp4i.end_line: - sub edx, 0x10000 - jz .bpp4i.quit - inc esi - jmp .bpp4i.pre - .bpp4i.quit: - pop ebp ebx - ret + push ebx ebp + mov ebp, [esi + Image.Width] + mov edx, [esi + Image.Height] + shl edx, 16 + mov ebx, [esi + Image.Palette] + mov esi, [esi + Image.Data] +.bpp4i.pre: + mov dx, bp + mov ecx, 1 +.bpp4i.begin: + mov eax, 15 + shl ecx, 2 + shl eax, cl + and al, [esi] + shr eax, cl + shr ecx, 2 + mov eax, [ebx + eax*4] + mov [edi], ax + shr eax, 16 + mov [edi + 2], al + add edi, 3 + dec dx + jz .bpp4i.end_line + dec ecx + jns .bpp4i.begin + mov ecx, 1 + inc esi + jmp .bpp4i.begin +.bpp4i.end_line: + sub edx, 0x10000 + jz .bpp4i.quit + inc esi + jmp .bpp4i.pre +.bpp4i.quit: + pop ebp ebx + ret endp -;;================================================================================================;; -proc img.decode _data, _length, _options ;////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? decodes loaded into memory graphic file ;; -;;------------------------------------------------------------------------------------------------;; -;> [_data] = pointer to file in memory ;; -;> [_length] = size in bytes of memory area pointed to by [_data] ;; -;> [_options] = 0 / pointer to the structure of additional options ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to image ;; -;;================================================================================================;; - push ebx - mov ebx, [_length] - or ebx,ebx - jz .fail - mov ebx, img.formats_table - @@: stdcall [ebx + FormatsTableEntry.Is], [_data], [_length] - or eax, eax - jnz @f - add ebx, sizeof.FormatsTableEntry - cmp dword[ebx], eax ;0 - jnz @b - .fail: - xor eax, eax - pop ebx - ret - @@: mov eax, [ebx + FormatsTableEntry.Decode] - pop ebx - leave - jmp eax -endp - -;;================================================================================================;; -proc img.encode uses ebx, _img, _common, _specific ;////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? encode image to some format ;; -;;------------------------------------------------------------------------------------------------;; -;> [_img] = pointer to input image ;; -;> [_common] = some most important/common options ;; -; 0x00 : byte : format id (defined in libimg.inc) ;; -; 0x01 : byte : fast encoding (0) / best compression ratio (255) ;; -; 0 : store uncompressed data (if supported both by the format and libimg) ;; -; 1 - 255 : use compression, if supported ;; -; this option may be ignored if any format specific options are defined ;; -; i.e. 0 here will be ignored if particular compression algorithm is specified ;; -; 0x02 : byte : flags (bitfield) ;; -; 0x01 : return an error if format specific conditions cannot be met ;; -; 0x02 : preserve current bit depth. means 8bpp/16bpp/24bpp and so on ;; -; 0x04 : delete alpha channel, if any ;; -; 0x08 : flush alpha channel with 0xff, if any; add it if none ;; -; 0x03 : byte : reserved, must be 0 ;; -;> [_specific] = 0 / pointer to the structure of format specific options ;; -; see .inc for description ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to encoded data ;; -;< ecx = error code / the size of encoded data ;; -; 1 : out of memory ;; -; 2 : format is not supported ;; -; 3 : specific conditions cannot be satisfied ;; -; 4 : bit depth cannot be preserved ;; -;;================================================================================================;; - mov ebx, [_img] - - movzx eax, byte[_common] - dec eax - imul eax, sizeof.FormatsTableEntry - add eax, FormatsTableEntry.Capabilities - add eax, img.formats_table - mov eax, [eax] - test eax, 1 ; is encoding to this format supported at all? - jnz @f - mov ecx, LIBIMG_ERROR_FORMAT - jmp .error - @@: - mov ecx, [ebx + Image.Type] - mov edx, 1 - shl edx, cl - test eax, edx - jnz .bit_depth_ok - test byte[_common+2], LIBIMG_ENCODE_STRICT_BIT_DEPTH - jz @f - mov ecx, LIBIMG_ERROR_BIT_DEPTH - jmp .error - @@: - mov edx, 1 SHL Image.bpp24 - test eax, edx - jnz @f - mov ecx, LIBIMG_ERROR_BIT_DEPTH - jmp .error - @@: - stdcall img.create, [ebx + Image.Width], [ebx + Image.Height], Image.bpp24 - test eax, eax - jnz @f - mov ecx, LIBIMG_ERROR_OUT_OF_MEMORY - jmp .error - @@: - push eax - stdcall img.to_rgb2, ebx, [eax + Image.Data] - pop ebx - - .bit_depth_ok: - movzx eax, byte[_common] - dec eax - imul eax, sizeof.FormatsTableEntry - add eax, FormatsTableEntry.Encode - add eax, img.formats_table - mov eax, [eax] - stdcall eax, [_img], [_common], [_specific] - push eax ecx - cmp ebx, [_img] - je @f - stdcall img.destroy, ebx - @@: - pop ecx eax - jmp .quit - - .error: - xor eax, eax - .quit: - ret -endp - -;;================================================================================================;; -proc img.create _width, _height, _type ;//////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? creates an Image structure and initializes some its fields ;; -;;------------------------------------------------------------------------------------------------;; -;> [_width] = width of an image in pixels ;; -;> [_height] = height of an image in pixels ;; -;> [_type] = one of the Image.bppN constants from libimg.inc ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to image ;; -;;================================================================================================;; - push ecx - - stdcall img._.new - or eax, eax - jz .error - - mov ecx, [_type] - mov [eax + Image.Type], ecx - - push eax - - stdcall img.resize_data, eax, [_width], [_height] - or eax, eax - jz .error.2 - - pop eax - jmp .ret - - .error.2: -; pop eax - stdcall img._.delete; eax - xor eax, eax - - .error: - .ret: - pop ecx - ret -endp - -;;================================================================================================;; -proc img.destroy.layer _img ;/////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? frees memory occupied by an image and all the memory regions its fields point to ;; -;? for image sequences deletes only one frame and fixes Previous/Next pointers ;; -;;------------------------------------------------------------------------------------------------;; -;> [_img] = pointer to image ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 (fail) / 1 (success) ;; -;;================================================================================================;; - mov eax, [_img] - mov edx, [eax + Image.Previous] - test edx, edx - jz @f - push [eax + Image.Next] - pop [edx + Image.Next] +;;============================================================================;; +proc img.decode _data, _length, _options ;////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? decodes loaded into memory graphic file ;; +;;----------------------------------------------------------------------------;; +;> [_data] = pointer to file in memory ;; +;> [_length] = size in bytes of memory area pointed to by [_data] ;; +;> [_options] = 0 / pointer to the structure of additional options ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to image ;; +;;============================================================================;; + push ebx + mov ebx, [_length] + or ebx, ebx + jz .fail + mov ebx, img.formats_table @@: - mov edx, [eax + Image.Next] - test edx, edx - jz @f - push [eax + Image.Previous] - pop [edx + Image.Previous] + stdcall [ebx + FormatsTableEntry.Is], [_data], [_length] + or eax, eax + jnz @f + add ebx, sizeof.FormatsTableEntry + cmp dword[ebx], eax ;0 + jnz @b +.fail: + xor eax, eax + pop ebx + ret @@: - stdcall img._.delete, eax - ret + mov eax, [ebx + FormatsTableEntry.Decode] + pop ebx + leave + jmp eax endp -;;================================================================================================;; -proc img.destroy _img ;///////////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? frees memory occupied by an image and all the memory regions its fields point to ;; -;? follows Previous/Next pointers and deletes all the images in sequence ;; -;;------------------------------------------------------------------------------------------------;; -;> [_img] = pointer to image ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 (fail) / 1 (success) ;; -;;================================================================================================;; - push 1 - mov eax, [_img] - mov eax, [eax + Image.Previous] +;;============================================================================;; +proc img.encode uses ebx, _img, _common, _specific ;//////////////////////////;; +;;----------------------------------------------------------------------------;; +;? encode image to some format ;; +;;----------------------------------------------------------------------------;; +;> [_img] = pointer to input image ;; +;> [_common] = some most important/common options ;; +; 0x00 : byte : format id (defined in libimg.inc) ;; +; 0x01 : byte : fast encoding (0) / best compression ratio (255) ;; +; 0 : store uncompressed data (if supported both by the ;; +; format and libimg) ;; +; 1 - 255 : use compression, if supported ;; +; this option may be ignored if any format specific ;; +; options are defined, i.e. 0 here will be ignored if ;; +; particular compression algorithm is specified ;; +; 0x02 : byte : flags (bitfield) ;; +; 0x01 : return an error if format specific conditions ;; +; cannot be met ;; +; 0x02 : preserve current bit depth. means 8bpp/16bpp/ ;; +; 24bpp and so on ;; +; 0x04 : delete alpha channel, if any ;; +; 0x08 : flush alpha channel with 0xff, if any; add it if ;; +; none ;; +; 0x03 : byte : reserved, must be 0 ;; +;> [_specific] = 0 / pointer to the structure of format specific options ;; +; see .inc for description ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to encoded data ;; +;< ecx = error code / the size of encoded data ;; +; 1 : out of memory ;; +; 2 : format is not supported ;; +; 3 : specific conditions cannot be satisfied ;; +; 4 : bit depth cannot be preserved ;; +;;============================================================================;; + mov ebx, [_img] + + movzx eax, byte[_common] + dec eax + imul eax, sizeof.FormatsTableEntry + add eax, FormatsTableEntry.Capabilities + add eax, img.formats_table + mov eax, [eax] + test eax, 1 ; is encoding to this format supported at all? + jnz @f + mov ecx, LIBIMG_ERROR_FORMAT + jmp .error +@@: + mov ecx, [ebx + Image.Type] + mov edx, 1 + shl edx, cl + test eax, edx + jnz .bit_depth_ok + test byte[_common+2], LIBIMG_ENCODE_STRICT_BIT_DEPTH + jz @f + mov ecx, LIBIMG_ERROR_BIT_DEPTH + jmp .error +@@: + mov edx, 1 SHL Image.bpp24 + test eax, edx + jnz @f + mov ecx, LIBIMG_ERROR_BIT_DEPTH + jmp .error +@@: + stdcall img.create, [ebx + Image.Width], [ebx + Image.Height], Image.bpp24 + test eax, eax + jnz @f + mov ecx, LIBIMG_ERROR_OUT_OF_MEMORY + jmp .error +@@: + push eax + stdcall img.to_rgb2, ebx, [eax + Image.Data] + pop ebx + +.bit_depth_ok: + movzx eax, byte[_common] + dec eax + imul eax, sizeof.FormatsTableEntry + add eax, FormatsTableEntry.Encode + add eax, img.formats_table + mov eax, [eax] + stdcall eax, [_img], [_common], [_specific] + push eax ecx + cmp ebx, [_img] + je @f + stdcall img.destroy, ebx +@@: + pop ecx eax + jmp .quit + +.error: + xor eax, eax +.quit: + ret +endp + +;;============================================================================;; +proc img.create _width, _height, _type ;//////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? creates an Image structure and initializes some its fields ;; +;;----------------------------------------------------------------------------;; +;> [_width] = width of an image in pixels ;; +;> [_height] = height of an image in pixels ;; +;> [_type] = one of the Image.bppN constants from libimg.inc ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to image ;; +;;============================================================================;; + push ecx + + stdcall img._.new + or eax, eax + jz .error + + mov ecx, [_type] + mov [eax + Image.Type], ecx + + push eax + + stdcall img.resize_data, eax, [_width], [_height] + or eax, eax + jz .error.2 + + pop eax + jmp .ret + +.error.2: +; pop eax + stdcall img._.delete; eax + xor eax, eax + +.error: +.ret: + pop ecx + ret +endp + +;;============================================================================;; +proc img.destroy.layer _img ;/////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Frees memory occupied by an image and all the memory regions its fields ;; +;? point to. For image sequences deletes only one frame and fixes Previous/ ;; +;? Next pointers. ;; +;;----------------------------------------------------------------------------;; +;> [_img] = pointer to image ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 (fail) / 1 (success) ;; +;;============================================================================;; + mov eax, [_img] + mov edx, [eax + Image.Previous] + test edx, edx + jz @f + push [eax + Image.Next] + pop [edx + Image.Next] +@@: + mov edx, [eax + Image.Next] + test edx, edx + jz @f + push [eax + Image.Previous] + pop [edx + Image.Previous] +@@: + stdcall img._.delete, eax + ret +endp + +;;============================================================================;; +proc img.destroy _img ;///////////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Frees memory occupied by an image and all the memory regions its fields ;; +;? point to. Follows Previous/Next pointers and deletes all the images in ;; +;? sequence. ;; +;;----------------------------------------------------------------------------;; +;> [_img] = pointer to image ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 (fail) / 1 (success) ;; +;;============================================================================;; + push 1 + mov eax, [_img] + mov eax, [eax + Image.Previous] .destroy_prev_loop: - test eax, eax - jz .destroy_prev_done - pushd [eax + Image.Previous] - stdcall img._.delete, eax - test eax, eax - jnz @f - mov byte [esp+4], 0 + test eax, eax + jz .destroy_prev_done + pushd [eax + Image.Previous] + stdcall img._.delete, eax + test eax, eax + jnz @f + mov byte [esp+4], 0 @@: - pop eax - jmp .destroy_prev_loop + pop eax + jmp .destroy_prev_loop .destroy_prev_done: - mov eax, [_img] + mov eax, [_img] .destroy_next_loop: - pushd [eax + Image.Next] - stdcall img._.delete, eax - test eax, eax - jnz @f - mov byte [esp+4], 0 + pushd [eax + Image.Next] + stdcall img._.delete, eax + test eax, eax + jnz @f + mov byte [esp+4], 0 @@: - pop eax - test eax, eax - jnz .destroy_next_loop - pop eax - ret + pop eax + test eax, eax + jnz .destroy_next_loop + pop eax + ret endp -;;================================================================================================;; -proc img.count _img ;/////////////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? Get number of images in the list (e.g. in animated GIF file) ;; -;;------------------------------------------------------------------------------------------------;; -;> _img = pointer to image ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = -1 (fail) / >0 (ok) ;; -;;================================================================================================;; - push ecx edx - mov edx, [_img] - stdcall img._.validate, edx - or eax, eax - jnz .error +;;============================================================================;; +proc img.count _img ;/////////////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Get number of images in the list (e.g. in animated GIF file) ;; +;;----------------------------------------------------------------------------;; +;> _img = pointer to image ;; +;;----------------------------------------------------------------------------;; +;< eax = -1 (fail) / >0 (ok) ;; +;;============================================================================;; + push ecx edx + mov edx, [_img] + stdcall img._.validate, edx + or eax, eax + jnz .error - @@: mov eax, [edx + Image.Previous] - or eax, eax - jz @f - mov edx, eax - jmp @b +@@: + mov eax, [edx + Image.Previous] + or eax, eax + jz @f + mov edx, eax + jmp @b - @@: xor ecx, ecx - @@: inc ecx - mov eax, [edx + Image.Next] - or eax, eax - jz .exit - mov edx, eax - jmp @b +@@: + xor ecx, ecx +@@: + inc ecx + mov eax, [edx + Image.Next] + or eax, eax + jz .exit + mov edx, eax + jmp @b - .exit: - mov eax, ecx - pop edx ecx - ret +.exit: + mov eax, ecx + pop edx ecx + ret - .error: - or eax, -1 - pop edx ecx - ret +.error: + or eax, -1 + pop edx ecx + ret endp -;;//// image processing //////////////////////////////////////////////////////////////////////////;; +;;//// image processing //////////////////////////////////////////////////////;; -;;================================================================================================;; -proc img.lock_bits _img, _start_line, _end_line ;/////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;> --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to bits ;; -;;================================================================================================;; - xor eax, eax - ret +;;============================================================================;; +proc img.lock_bits _img, _start_line, _end_line ;/////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;> --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to bits ;; +;;============================================================================;; + xor eax, eax + ret endp -;;================================================================================================;; -proc img.unlock_bits _img, _lock ;////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;> --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = false / true ;; -;;================================================================================================;; - xor eax, eax - ret +;;============================================================================;; +proc img.unlock_bits _img, _lock ;////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;> --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;< eax = false / true ;; +;;============================================================================;; + xor eax, eax + ret endp -;;================================================================================================;; -proc img.flip.layer _img, _flip_kind ;////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? Flip image layer ;; -;;------------------------------------------------------------------------------------------------;; -;> _img = pointer to image ;; -;> _flip_kind = one of FLIP_* constants ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = false / true ;; -;;================================================================================================;; +;;============================================================================;; +proc img.flip.layer _img, _flip_kind ;////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Flip image layer ;; +;;----------------------------------------------------------------------------;; +;> _img = pointer to image ;; +;> _flip_kind = one of FLIP_* constants ;; +;;----------------------------------------------------------------------------;; +;< eax = false / true ;; +;;============================================================================;; locals scanline_len dd ? endl - push ebx esi edi - mov ebx, [_img] - stdcall img._.validate, ebx - or eax, eax - jnz .error + push ebx esi edi + mov ebx, [_img] + stdcall img._.validate, ebx + or eax, eax + jnz .error - mov ecx, [ebx + Image.Height] - mov eax, [ebx + Image.Width] - call img._.get_scanline_len - mov [scanline_len], eax + mov ecx, [ebx + Image.Height] + mov eax, [ebx + Image.Width] + call img._.get_scanline_len + mov [scanline_len], eax - test [_flip_kind], FLIP_VERTICAL - jz .dont_flip_vert + test [_flip_kind], FLIP_VERTICAL + jz .dont_flip_vert - imul eax, ecx - sub eax, [scanline_len] - shr ecx, 1 - mov esi, [ebx + Image.Data] - lea edi, [esi + eax] + imul eax, ecx + sub eax, [scanline_len] + shr ecx, 1 + mov esi, [ebx + Image.Data] + lea edi, [esi + eax] - .next_line_vert: - push ecx +.next_line_vert: + push ecx - mov ecx, [scanline_len] - push ecx - shr ecx, 2 - @@: - dec ecx - js @f - mov eax, [esi] - xchg eax, [edi] - mov [esi], eax - add esi, 4 - add edi, 4 - jmp @b - @@: + mov ecx, [scanline_len] + push ecx + shr ecx, 2 +@@: + dec ecx + js @f + mov eax, [esi] + xchg eax, [edi] + mov [esi], eax + add esi, 4 + add edi, 4 + jmp @b +@@: - pop ecx - and ecx, 3 - jz .cont_line_vert - @@: - mov al, [esi] - xchg al, [edi] - mov [esi], al - add esi, 1 - add edi, 1 - dec ecx - jnz @b - .cont_line_vert: + pop ecx + and ecx, 3 + jz .cont_line_vert +@@: + mov al, [esi] + xchg al, [edi] + mov [esi], al + add esi, 1 + add edi, 1 + dec ecx + jnz @b +.cont_line_vert: - pop ecx - mov eax, [scanline_len] - shl eax, 1 - sub edi, eax - dec ecx - jnz .next_line_vert + pop ecx + mov eax, [scanline_len] + shl eax, 1 + sub edi, eax + dec ecx + jnz .next_line_vert - .dont_flip_vert: +.dont_flip_vert: - test [_flip_kind], FLIP_HORIZONTAL - jz .exit + test [_flip_kind], FLIP_HORIZONTAL + jz .exit - mov ecx, [ebx + Image.Height] - mov eax, [ebx + Image.Type] - mov esi, [ebx + Image.Data] - mov edi, [scanline_len] - add edi, esi - jmp dword [.handlers_horz + (eax-1)*4] + mov ecx, [ebx + Image.Height] + mov eax, [ebx + Image.Type] + mov esi, [ebx + Image.Data] + mov edi, [scanline_len] + add edi, esi + jmp dword [.handlers_horz + (eax-1)*4] .bpp32_horz: - sub edi, 4 + sub edi, 4 - .next_line_horz: - push ecx esi edi +.next_line_horz: + push ecx esi edi - mov ecx, [scanline_len] - shr ecx, 3 - @@: mov eax, [esi] - xchg eax, [edi] - mov [esi], eax - add esi, 4 - add edi, -4 - sub ecx, 1 - jnz @b + mov ecx, [scanline_len] + shr ecx, 3 +@@: + mov eax, [esi] + xchg eax, [edi] + mov [esi], eax + add esi, 4 + add edi, -4 + sub ecx, 1 + jnz @b - pop edi esi ecx - add esi, [scanline_len] - add edi, [scanline_len] - dec ecx - jnz .next_line_horz - jmp .exit + pop edi esi ecx + add esi, [scanline_len] + add edi, [scanline_len] + dec ecx + jnz .next_line_horz + jmp .exit .bpp1x_horz: - sub edi, 2 - .next_line_horz1x: - push ecx esi edi + sub edi, 2 +.next_line_horz1x: + push ecx esi edi - mov ecx, [ebx + Image.Width] - @@: mov ax, [esi] - mov dx, [edi] - mov [edi], ax - mov [esi], dx - add esi, 2 - sub edi, 2 - sub ecx, 2 - ja @b + mov ecx, [ebx + Image.Width] +@@: + mov ax, [esi] + mov dx, [edi] + mov [edi], ax + mov [esi], dx + add esi, 2 + sub edi, 2 + sub ecx, 2 + ja @b - pop edi esi ecx - add esi, [scanline_len] - add edi, [scanline_len] - dec ecx - jnz .next_line_horz1x - jmp .exit + pop edi esi ecx + add esi, [scanline_len] + add edi, [scanline_len] + dec ecx + jnz .next_line_horz1x + jmp .exit .bpp8ig_horz: - dec edi - .next_line_horz8ig: - push ecx esi edi + dec edi +.next_line_horz8ig: + push ecx esi edi - mov ecx, [scanline_len] - shr ecx, 1 - @@: mov al, [esi] - mov dl, [edi] - mov [edi], al - mov [esi], dl - add esi, 1 - sub edi, 1 - sub ecx, 1 - jnz @b + mov ecx, [scanline_len] + shr ecx, 1 +@@: + mov al, [esi] + mov dl, [edi] + mov [edi], al + mov [esi], dl + add esi, 1 + sub edi, 1 + sub ecx, 1 + jnz @b - pop edi esi ecx - add esi, [scanline_len] - add edi, [scanline_len] - dec ecx - jnz .next_line_horz8ig - jmp .exit + pop edi esi ecx + add esi, [scanline_len] + add edi, [scanline_len] + dec ecx + jnz .next_line_horz8ig + jmp .exit .bpp24_horz: - sub edi, 3 - .next_line_horz24: - push ecx esi edi + sub edi, 3 +.next_line_horz24: + push ecx esi edi - mov ecx, [ebx + Image.Width] - @@: - mov al, [esi] - mov dl, [edi] - mov [edi], al - mov [esi], dl - mov al, [esi+1] - mov dl, [edi+1] - mov [edi+1], al - mov [esi+1], dl - mov al, [esi+2] - mov dl, [edi+2] - mov [edi+2], al - mov [esi+2], dl - add esi, 3 - sub edi, 3 - sub ecx, 2 - ja @b + mov ecx, [ebx + Image.Width] +@@: + mov al, [esi] + mov dl, [edi] + mov [edi], al + mov [esi], dl + mov al, [esi+1] + mov dl, [edi+1] + mov [edi+1], al + mov [esi+1], dl + mov al, [esi+2] + mov dl, [edi+2] + mov [edi+2], al + mov [esi+2], dl + add esi, 3 + sub edi, 3 + sub ecx, 2 + ja @b - pop edi esi ecx - add esi, [scanline_len] - add edi, [scanline_len] - dec ecx - jnz .next_line_horz24 - jmp .exit + pop edi esi ecx + add esi, [scanline_len] + add edi, [scanline_len] + dec ecx + jnz .next_line_horz24 + jmp .exit .bpp1_horz: - mov edi, [scanline_len] - mov edx, [ebx + Image.Width] - and edx, 7 - neg edx - add edx, 8 - and edx, 7 + mov edi, [scanline_len] + mov edx, [ebx + Image.Width] + and edx, 7 + neg edx + add edx, 8 + and edx, 7 .bpp1_horz.begin: - push ebx edx esi - mov eax, 7 - add edi, esi - sub edi, 1 - mov ebx, [ebx + Image.Width] - shr ebx, 1 + push ebx edx esi + mov eax, 7 + add edi, esi + sub edi, 1 + mov ebx, [ebx + Image.Width] + shr ebx, 1 .bpp1_horz.bit: - bt [edi], edx - jc @f - btr [esi], eax - jmp .bpp1_horz.right - @@: - bts [esi], eax - .bpp1_horz.right: - jnc @f - bts [edi], edx - jmp .bpp1_horz.bit_done - @@: - btr [edi], edx - .bpp1_horz.bit_done: - inc edx - and edx, 7 - jnz @f - dec edi - @@: - dec eax - jns @f - mov eax, 7 - inc esi - @@: - dec ebx - jnz .bpp1_horz.bit + bt [edi], edx + jc @f + btr [esi], eax + jmp .bpp1_horz.right +@@: + bts [esi], eax +.bpp1_horz.right: + jnc @f + bts [edi], edx + jmp .bpp1_horz.bit_done +@@: + btr [edi], edx +.bpp1_horz.bit_done: + inc edx + and edx, 7 + jnz @f + dec edi +@@: + dec eax + jns @f + mov eax, 7 + inc esi +@@: + dec ebx + jnz .bpp1_horz.bit - pop esi edx ebx - add esi, [scanline_len] - mov edi, [scanline_len] - dec ecx - jnz .bpp1_horz.begin - jmp .exit + pop esi edx ebx + add esi, [scanline_len] + mov edi, [scanline_len] + dec ecx + jnz .bpp1_horz.begin + jmp .exit .bpp2i_horz: - mov edi, [scanline_len] - mov edx, [ebx + Image.Width] - and edx, 3 - neg edx - add edx, 4 - and edx, 3 + mov edi, [scanline_len] + mov edx, [ebx + Image.Width] + and edx, 3 + neg edx + add edx, 4 + and edx, 3 .bpp2i_horz.begin: - push ebx edx esi - mov eax, 3 - add edi, esi - sub edi, 1 - mov ebx, [ebx + Image.Width] - shr ebx, 1 + push ebx edx esi + mov eax, 3 + add edi, esi + sub edi, 1 + mov ebx, [ebx + Image.Width] + shr ebx, 1 .bpp2i_horz.pixel: - push ebx ecx - mov ebx, 3 - mov ecx, edx - shl ebx, cl - shl ebx, cl - and bl, [edi] - shr ebx, cl - shr ebx, cl - mov bh, 3 - mov ecx, eax - shl ebx, cl - shl ebx, cl - not bh - and bh, [esi] - or bl, bh - mov bh, [esi] - mov [esi], bl - shr ebx, 8 - shr ebx, cl - shr ebx, cl - and ebx, 3 - mov bh, 3 - mov ecx, edx - shl ebx, cl - shl ebx, cl - not bh - and bh, [edi] - or bl, bh - mov [edi], bl - pop ecx ebx - .bpp2i_horz.pixel_done: - inc edx - and edx, 3 - jnz @f - dec edi - @@: - dec eax - jns @f - mov eax, 3 - inc esi - @@: - dec ebx - jnz .bpp2i_horz.pixel + push ebx ecx + mov ebx, 3 + mov ecx, edx + shl ebx, cl + shl ebx, cl + and bl, [edi] + shr ebx, cl + shr ebx, cl + mov bh, 3 + mov ecx, eax + shl ebx, cl + shl ebx, cl + not bh + and bh, [esi] + or bl, bh + mov bh, [esi] + mov [esi], bl + shr ebx, 8 + shr ebx, cl + shr ebx, cl + and ebx, 3 + mov bh, 3 + mov ecx, edx + shl ebx, cl + shl ebx, cl + not bh + and bh, [edi] + or bl, bh + mov [edi], bl + pop ecx ebx +.bpp2i_horz.pixel_done: + inc edx + and edx, 3 + jnz @f + dec edi +@@: + dec eax + jns @f + mov eax, 3 + inc esi +@@: + dec ebx + jnz .bpp2i_horz.pixel - pop esi edx ebx - add esi, [scanline_len] - mov edi, [scanline_len] - dec ecx - jnz .bpp2i_horz.begin - jmp .exit + pop esi edx ebx + add esi, [scanline_len] + mov edi, [scanline_len] + dec ecx + jnz .bpp2i_horz.begin + jmp .exit .bpp4i_horz: - mov edi, [scanline_len] - mov edx, [ebx + Image.Width] - and edx, 1 - neg edx - add edx, 2 - and edx, 1 + mov edi, [scanline_len] + mov edx, [ebx + Image.Width] + and edx, 1 + neg edx + add edx, 2 + and edx, 1 .bpp4i_horz.begin: - push ebx edx esi - mov eax, 1 - add edi, esi - sub edi, 1 - mov ebx, [ebx + Image.Width] - shr ebx, 1 + push ebx edx esi + mov eax, 1 + add edi, esi + sub edi, 1 + mov ebx, [ebx + Image.Width] + shr ebx, 1 .bpp4i_horz.pixel: - push ebx ecx - mov ebx, 15 - mov ecx, edx - shl ecx, 2 - shl ebx, cl - and bl, [edi] - shr ebx, cl - mov bh, 15 - mov ecx, eax - shl ecx, 2 - shl ebx, cl - not bh - and bh, [esi] - or bl, bh - mov bh, [esi] - mov [esi], bl - shr ebx, 8 - shr ebx, cl - and ebx, 15 - mov bh, 15 - mov ecx, edx - shl ecx, 2 - shl ebx, cl - not bh - and bh, [edi] - or bl, bh - mov [edi], bl - pop ecx ebx - .bpp4i_horz.pixel_done: - inc edx - and edx, 1 - jnz @f - dec edi - @@: - dec eax - jns @f - mov eax, 1 - inc esi - @@: - dec ebx - jnz .bpp4i_horz.pixel + push ebx ecx + mov ebx, 15 + mov ecx, edx + shl ecx, 2 + shl ebx, cl + and bl, [edi] + shr ebx, cl + mov bh, 15 + mov ecx, eax + shl ecx, 2 + shl ebx, cl + not bh + and bh, [esi] + or bl, bh + mov bh, [esi] + mov [esi], bl + shr ebx, 8 + shr ebx, cl + and ebx, 15 + mov bh, 15 + mov ecx, edx + shl ecx, 2 + shl ebx, cl + not bh + and bh, [edi] + or bl, bh + mov [edi], bl + pop ecx ebx +.bpp4i_horz.pixel_done: + inc edx + and edx, 1 + jnz @f + dec edi +@@: + dec eax + jns @f + mov eax, 1 + inc esi +@@: + dec ebx + jnz .bpp4i_horz.pixel - pop esi edx ebx - add esi, [scanline_len] - mov edi, [scanline_len] - dec ecx - jnz .bpp4i_horz.begin - jmp .exit + pop esi edx ebx + add esi, [scanline_len] + mov edi, [scanline_len] + dec ecx + jnz .bpp4i_horz.begin + jmp .exit - .exit: - xor eax, eax - inc eax - pop edi esi ebx - ret +.exit: + xor eax, eax + inc eax + pop edi esi ebx + ret - .error: - xor eax, eax - pop edi esi ebx - ret +.error: + xor eax, eax + pop edi esi ebx + ret endp -;;================================================================================================;; -proc img.flip _img, _flip_kind ;//////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? Flip all layers of image ;; -;;------------------------------------------------------------------------------------------------;; -;> _img = pointer to image ;; -;> _flip_kind = one of FLIP_* constants ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = false / true ;; -;;================================================================================================;; - push 1 - mov ebx, [_img] +;;============================================================================;; +proc img.flip _img, _flip_kind ;//////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Flip all layers of image ;; +;;----------------------------------------------------------------------------;; +;> _img = pointer to image ;; +;> _flip_kind = one of FLIP_* constants ;; +;;----------------------------------------------------------------------------;; +;< eax = false / true ;; +;;============================================================================;; + push 1 + mov ebx, [_img] @@: - mov eax, [ebx + Image.Previous] - test eax, eax - jz .loop - mov ebx, eax - jmp @b + mov eax, [ebx + Image.Previous] + test eax, eax + jz .loop + mov ebx, eax + jmp @b .loop: - stdcall img.flip.layer, ebx, [_flip_kind] - test eax, eax - jnz @f - mov byte [esp], 0 + stdcall img.flip.layer, ebx, [_flip_kind] + test eax, eax + jnz @f + mov byte [esp], 0 @@: - mov ebx, [ebx + Image.Next] - test ebx, ebx - jnz .loop - pop eax - ret + mov ebx, [ebx + Image.Next] + test ebx, ebx + jnz .loop + pop eax + ret endp -;;================================================================================================;; -proc img.rotate.layer _img, _rotate_kind ;////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? Rotate image layer ;; -;;------------------------------------------------------------------------------------------------;; -;> _img = pointer to image ;; -;> _rotate_kind = one of ROTATE_* constants ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = false / true ;; -;;================================================================================================;; +;;============================================================================;; +proc img.rotate.layer _img, _rotate_kind ;////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Rotate image layer ;; +;;----------------------------------------------------------------------------;; +;> _img = pointer to image ;; +;> _rotate_kind = one of ROTATE_* constants ;; +;;----------------------------------------------------------------------------;; +;< eax = false / true ;; +;;============================================================================;; locals scanline_len_old dd ? scanline_len_new dd ? scanline_pixels_new dd ? - line_buffer dd ? - pixels_ptr dd ? + line_buffer dd ? + pixels_ptr dd ? endl - mov [line_buffer], 0 + mov [line_buffer], 0 - push ebx esi edi - mov ebx, [_img] - stdcall img._.validate, ebx - or eax, eax - jnz .error + push ebx esi edi + mov ebx, [_img] + stdcall img._.validate, ebx + or eax, eax + jnz .error - cmp [_rotate_kind], ROTATE_90_CCW - je .rotate_ccw_low - cmp [_rotate_kind], ROTATE_90_CW - je .rotate_cw_low - cmp [_rotate_kind], ROTATE_180 - je .flip - jmp .exit + cmp [_rotate_kind], ROTATE_90_CCW + je .rotate_ccw_low + cmp [_rotate_kind], ROTATE_90_CW + je .rotate_cw_low + cmp [_rotate_kind], ROTATE_180 + je .flip + jmp .exit - .rotate_ccw_low: - mov eax, [ebx + Image.Height] - mov [scanline_pixels_new], eax - call img._.get_scanline_len - mov [scanline_len_new], eax +.rotate_ccw_low: + mov eax, [ebx + Image.Height] + mov [scanline_pixels_new], eax + call img._.get_scanline_len + mov [scanline_len_new], eax - invoke mem.alloc, eax - or eax, eax - jz .error - mov [line_buffer], eax + invoke mem.alloc, eax + or eax, eax + jz .error + mov [line_buffer], eax - mov eax, [ebx + Image.Width] - mov ecx, eax - call img._.get_scanline_len - mov [scanline_len_old], eax + mov eax, [ebx + Image.Width] + mov ecx, eax + call img._.get_scanline_len + mov [scanline_len_old], eax - mov eax, [scanline_len_new] - imul eax, ecx - add eax, [ebx + Image.Data] - mov [pixels_ptr], eax + mov eax, [scanline_len_new] + imul eax, ecx + add eax, [ebx + Image.Data] + mov [pixels_ptr], eax - cmp [ebx + Image.Type], Image.bpp1 - jz .rotate_ccw1 - cmp [ebx + Image.Type], Image.bpp2i - jz .rotate_ccw2i - cmp [ebx + Image.Type], Image.bpp4i - jz .rotate_ccw4i - cmp [ebx + Image.Type], Image.bpp8i - jz .rotate_ccw8ig - cmp [ebx + Image.Type], Image.bpp8g - jz .rotate_ccw8ig - cmp [ebx + Image.Type], Image.bpp24 - jz .rotate_ccw24 - cmp [ebx + Image.Type], Image.bpp32 - jz .rotate_ccw32 + cmp [ebx + Image.Type], Image.bpp1 + jz .rotate_ccw1 + cmp [ebx + Image.Type], Image.bpp2i + jz .rotate_ccw2i + cmp [ebx + Image.Type], Image.bpp4i + jz .rotate_ccw4i + cmp [ebx + Image.Type], Image.bpp8i + jz .rotate_ccw8ig + cmp [ebx + Image.Type], Image.bpp8g + jz .rotate_ccw8ig + cmp [ebx + Image.Type], Image.bpp24 + jz .rotate_ccw24 + cmp [ebx + Image.Type], Image.bpp32 + jz .rotate_ccw32 - .next_column_ccw_low1x: - dec ecx - js .exchange_dims - push ecx +.next_column_ccw_low1x: + dec ecx + js .exchange_dims + push ecx - mov edx, [scanline_len_old] - add [scanline_len_old], -2 + mov edx, [scanline_len_old] + add [scanline_len_old], -2 - mov ecx, [scanline_pixels_new] - mov esi, [ebx + Image.Data] - mov edi, [line_buffer] - @@: mov ax, [esi] - mov [edi], ax - add esi, edx - add edi, 2 - sub ecx, 1 - jnz @b + mov ecx, [scanline_pixels_new] + mov esi, [ebx + Image.Data] + mov edi, [line_buffer] +@@: + mov ax, [esi] + mov [edi], ax + add esi, edx + add edi, 2 + sub ecx, 1 + jnz @b - mov eax, [scanline_pixels_new] - mov edi, [ebx + Image.Data] - lea esi, [edi + 2] - mov edx, [scanline_len_old] - @@: mov ecx, edx - shr ecx, 2 - rep movsd - mov ecx, edx - and ecx, 3 - rep movsb - add esi, 1 - sub eax, 1 - jnz @b + mov eax, [scanline_pixels_new] + mov edi, [ebx + Image.Data] + lea esi, [edi + 2] + mov edx, [scanline_len_old] +@@: + mov ecx, edx + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 + rep movsb + add esi, 1 + sub eax, 1 + jnz @b - mov eax, [scanline_len_new] - sub [pixels_ptr], eax - mov ecx, [scanline_pixels_new] - mov esi, [line_buffer] - mov edi, [pixels_ptr] - mov edx, ecx - shr ecx, 2 - rep movsd - mov ecx, edx - and ecx, 3 - rep movsb + mov eax, [scanline_len_new] + sub [pixels_ptr], eax + mov ecx, [scanline_pixels_new] + mov esi, [line_buffer] + mov edi, [pixels_ptr] + mov edx, ecx + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 + rep movsb - pop ecx - jmp .next_column_ccw_low1x + pop ecx + jmp .next_column_ccw_low1x .rotate_ccw32: - .next_column_ccw_low: - dec ecx - js .exchange_dims - push ecx +.next_column_ccw_low: + dec ecx + js .exchange_dims + push ecx - mov edx, [scanline_len_old] - add [scanline_len_old], -4 + mov edx, [scanline_len_old] + add [scanline_len_old], -4 - mov ecx, [scanline_pixels_new] - mov esi, [ebx + Image.Data] - mov edi, [line_buffer] - @@: mov eax, [esi] - stosd - add esi, edx - dec ecx - jnz @b + mov ecx, [scanline_pixels_new] + mov esi, [ebx + Image.Data] + mov edi, [line_buffer] +@@: + mov eax, [esi] + stosd + add esi, edx + dec ecx + jnz @b - mov eax, [scanline_pixels_new] - mov edi, [ebx + Image.Data] - lea esi, [edi + 4] - mov edx, [scanline_len_old] - shr edx, 2 - @@: mov ecx, edx - rep movsd - add esi, 4 - dec eax - jnz @b + mov eax, [scanline_pixels_new] + mov edi, [ebx + Image.Data] + lea esi, [edi + 4] + mov edx, [scanline_len_old] + shr edx, 2 +@@: + mov ecx, edx + rep movsd + add esi, 4 + dec eax + jnz @b - mov eax, [scanline_len_new] - sub [pixels_ptr], eax - mov ecx, [scanline_pixels_new] - mov esi, [line_buffer] - mov edi, [pixels_ptr] - rep movsd + mov eax, [scanline_len_new] + sub [pixels_ptr], eax + mov ecx, [scanline_pixels_new] + mov esi, [line_buffer] + mov edi, [pixels_ptr] + rep movsd - pop ecx - jmp .next_column_ccw_low + pop ecx + jmp .next_column_ccw_low .rotate_ccw8ig: - .next_column_ccw_low8ig: - dec ecx - js .exchange_dims - push ecx +.next_column_ccw_low8ig: + dec ecx + js .exchange_dims + push ecx - mov edx, [scanline_len_old] - add [scanline_len_old], -1 + mov edx, [scanline_len_old] + add [scanline_len_old], -1 - mov ecx, [scanline_pixels_new] - mov esi, [ebx + Image.Data] - mov edi, [line_buffer] - @@: mov al, [esi] - mov [edi], al - add esi, edx - add edi, 1 - sub ecx, 1 - jnz @b + mov ecx, [scanline_pixels_new] + mov esi, [ebx + Image.Data] + mov edi, [line_buffer] +@@: + mov al, [esi] + mov [edi], al + add esi, edx + add edi, 1 + sub ecx, 1 + jnz @b - mov eax, [scanline_pixels_new] - mov edi, [ebx + Image.Data] - lea esi, [edi + 1] - mov edx, [scanline_len_old] - @@: mov ecx, edx - shr ecx, 2 - rep movsd - mov ecx, edx - and ecx, 3 - rep movsb - add esi, 1 - sub eax, 1 - jnz @b + mov eax, [scanline_pixels_new] + mov edi, [ebx + Image.Data] + lea esi, [edi + 1] + mov edx, [scanline_len_old] +@@: + mov ecx, edx + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 + rep movsb + add esi, 1 + sub eax, 1 + jnz @b - mov eax, [scanline_len_new] - sub [pixels_ptr], eax - mov ecx, [scanline_pixels_new] - mov esi, [line_buffer] - mov edi, [pixels_ptr] - mov edx, ecx - shr ecx, 2 - rep movsd - mov ecx, edx - and ecx, 3 - rep movsb + mov eax, [scanline_len_new] + sub [pixels_ptr], eax + mov ecx, [scanline_pixels_new] + mov esi, [line_buffer] + mov edi, [pixels_ptr] + mov edx, ecx + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 + rep movsb - pop ecx - jmp .next_column_ccw_low8ig + pop ecx + jmp .next_column_ccw_low8ig .rotate_ccw24: - .next_column_ccw_low24: - dec ecx - js .exchange_dims - push ecx +.next_column_ccw_low24: + dec ecx + js .exchange_dims + push ecx - mov edx, [scanline_len_old] - add [scanline_len_old], -3 + mov edx, [scanline_len_old] + add [scanline_len_old], -3 - mov ecx, [scanline_pixels_new] - mov esi, [ebx + Image.Data] - mov edi, [line_buffer] - @@: mov al, [esi] - mov [edi], al - mov al, [esi+1] - mov [edi+1], al - mov al, [esi+2] - mov [edi+2], al - add esi, edx - add edi, 3 - sub ecx, 1 - jnz @b + mov ecx, [scanline_pixels_new] + mov esi, [ebx + Image.Data] + mov edi, [line_buffer] +@@: + mov al, [esi] + mov [edi], al + mov al, [esi+1] + mov [edi+1], al + mov al, [esi+2] + mov [edi+2], al + add esi, edx + add edi, 3 + sub ecx, 1 + jnz @b - mov eax, [scanline_pixels_new] - mov edi, [ebx + Image.Data] - lea esi, [edi + 3] - mov edx, [scanline_len_old] - @@: mov ecx, edx - shr ecx, 2 - rep movsd - mov ecx, edx - and ecx, 3 - rep movsb - add esi, 3 - sub eax, 1 - jnz @b + mov eax, [scanline_pixels_new] + mov edi, [ebx + Image.Data] + lea esi, [edi + 3] + mov edx, [scanline_len_old] +@@: + mov ecx, edx + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 + rep movsb + add esi, 3 + sub eax, 1 + jnz @b - mov eax, [scanline_len_new] - sub [pixels_ptr], eax - mov ecx, eax - mov esi, [line_buffer] - mov edi, [pixels_ptr] - shr ecx, 2 - rep movsd - mov ecx, eax - and ecx, 3 - rep movsb + mov eax, [scanline_len_new] + sub [pixels_ptr], eax + mov ecx, eax + mov esi, [line_buffer] + mov edi, [pixels_ptr] + shr ecx, 2 + rep movsd + mov ecx, eax + and ecx, 3 + rep movsb - pop ecx - jmp .next_column_ccw_low24 + pop ecx + jmp .next_column_ccw_low24 .rotate_ccw1: - push ecx edx + push ecx edx - mov eax, [ebx + Image.Height] - add eax, 7 - shr eax, 3 - imul eax, [ebx + Image.Width] - push eax ; save new data size + mov eax, [ebx + Image.Height] + add eax, 7 + shr eax, 3 + imul eax, [ebx + Image.Width] + push eax ; save new data size - invoke mem.alloc, eax - or eax, eax - jz .error - push eax ; save pointer to new data + invoke mem.alloc, eax + or eax, eax + jz .error + push eax ; save pointer to new data - mov ecx, [ebx + Image.Width] - and ecx, 7 - neg ecx - add ecx, 8 - and ecx, 7 + mov ecx, [ebx + Image.Width] + and ecx, 7 + neg ecx + add ecx, 8 + and ecx, 7 - mov edi, eax - mov esi, [ebx + Image.Data] - mov eax, 7 - mov edx, [scanline_len_old] - dec edx - add esi, edx + mov edi, eax + mov esi, [ebx + Image.Data] + mov eax, 7 + mov edx, [scanline_len_old] + dec edx + add esi, edx - .rotate_ccw1.begin: - bt [esi], ecx - jc .rotate_ccw1.one - .rotate_ccw1.zero: - btr [edi], eax - jmp @f - .rotate_ccw1.one: - bts [edi], eax - @@: - add esi, [scanline_len_old] - dec [scanline_pixels_new] - jz .rotate_ccw1.end_of_line - sub eax, 1 - adc edi, 0 - and eax, 7 - jmp .rotate_ccw1.begin - .rotate_ccw1.end_of_line: - inc edi - mov eax, [ebx + Image.Height] - mov [scanline_pixels_new], eax - mov eax, 7 - inc ecx - and ecx, 7 - jz @f - mov esi, [ebx + Image.Data] - add esi, edx - jmp .rotate_ccw1.begin - @@: - dec edx - js .rotate_ccw1.quit - mov esi, [ebx + Image.Data] - add esi, edx - jmp .rotate_ccw1.begin - .rotate_ccw1.quit: - pop esi ; get pointer to new data - mov edi, [ebx + Image.Data] - pop ecx ; get new data size - rep movsb - invoke mem.free, esi - pop edx ecx - jmp .exchange_dims +.rotate_ccw1.begin: + bt [esi], ecx + jc .rotate_ccw1.one +.rotate_ccw1.zero: + btr [edi], eax + jmp @f +.rotate_ccw1.one: + bts [edi], eax +@@: + add esi, [scanline_len_old] + dec [scanline_pixels_new] + jz .rotate_ccw1.end_of_line + sub eax, 1 + adc edi, 0 + and eax, 7 + jmp .rotate_ccw1.begin +.rotate_ccw1.end_of_line: + inc edi + mov eax, [ebx + Image.Height] + mov [scanline_pixels_new], eax + mov eax, 7 + inc ecx + and ecx, 7 + jz @f + mov esi, [ebx + Image.Data] + add esi, edx + jmp .rotate_ccw1.begin +@@: + dec edx + js .rotate_ccw1.quit + mov esi, [ebx + Image.Data] + add esi, edx + jmp .rotate_ccw1.begin +.rotate_ccw1.quit: + pop esi ; get pointer to new data + mov edi, [ebx + Image.Data] + pop ecx ; get new data size + rep movsb + invoke mem.free, esi + pop edx ecx + jmp .exchange_dims .rotate_ccw2i: - push ecx edx + push ecx edx - mov eax, [ebx + Image.Height] - add eax, 3 - shr eax, 2 - imul eax, [ebx + Image.Width] - push eax ; save new data size + mov eax, [ebx + Image.Height] + add eax, 3 + shr eax, 2 + imul eax, [ebx + Image.Width] + push eax ; save new data size - invoke mem.alloc, eax - or eax, eax - jz .error - push eax ; save pointer to new data + invoke mem.alloc, eax + or eax, eax + jz .error + push eax ; save pointer to new data - mov ecx, [ebx + Image.Width] - and ecx, 3 - neg ecx - add ecx, 4 - and ecx, 3 + mov ecx, [ebx + Image.Width] + and ecx, 3 + neg ecx + add ecx, 4 + and ecx, 3 - mov edi, eax - mov esi, [ebx + Image.Data] - mov eax, 3 - mov edx, [scanline_len_old] - dec edx - add esi, edx + mov edi, eax + mov esi, [ebx + Image.Data] + mov eax, 3 + mov edx, [scanline_len_old] + dec edx + add esi, edx - .rotate_ccw2i.begin: - push ebx ecx - mov ebx, 3 - shl ebx, cl - shl ebx, cl - and bl, [esi] - shr ebx, cl - shr ebx, cl - mov bh, 3 - mov ecx, eax - shl ebx, cl - shl ebx, cl - not bh - and bh, [edi] - or bl, bh - mov [edi], bl - pop ecx ebx +.rotate_ccw2i.begin: + push ebx ecx + mov ebx, 3 + shl ebx, cl + shl ebx, cl + and bl, [esi] + shr ebx, cl + shr ebx, cl + mov bh, 3 + mov ecx, eax + shl ebx, cl + shl ebx, cl + not bh + and bh, [edi] + or bl, bh + mov [edi], bl + pop ecx ebx - add esi, [scanline_len_old] - dec [scanline_pixels_new] - jz .rotate_ccw2i.end_of_line - sub eax, 1 - adc edi, 0 - and eax, 3 - jmp .rotate_ccw2i.begin - .rotate_ccw2i.end_of_line: - inc edi - mov eax, 3 - mov esi, [ebx + Image.Height] - mov [scanline_pixels_new], esi - inc ecx - and ecx, 3 - jz @f - mov esi, [ebx + Image.Data] - add esi, edx - jmp .rotate_ccw2i.begin - @@: - dec edx - js .rotate_ccw2i.quit - mov esi, [ebx + Image.Data] - add esi, edx - jmp .rotate_ccw2i.begin - .rotate_ccw2i.quit: - pop esi ; get pointer to new data - mov edi, [ebx + Image.Data] - pop ecx ; get new data size - rep movsb - invoke mem.free, esi - pop edx ecx - jmp .exchange_dims + add esi, [scanline_len_old] + dec [scanline_pixels_new] + jz .rotate_ccw2i.end_of_line + sub eax, 1 + adc edi, 0 + and eax, 3 + jmp .rotate_ccw2i.begin +.rotate_ccw2i.end_of_line: + inc edi + mov eax, 3 + mov esi, [ebx + Image.Height] + mov [scanline_pixels_new], esi + inc ecx + and ecx, 3 + jz @f + mov esi, [ebx + Image.Data] + add esi, edx + jmp .rotate_ccw2i.begin +@@: + dec edx + js .rotate_ccw2i.quit + mov esi, [ebx + Image.Data] + add esi, edx + jmp .rotate_ccw2i.begin +.rotate_ccw2i.quit: + pop esi ; get pointer to new data + mov edi, [ebx + Image.Data] + pop ecx ; get new data size + rep movsb + invoke mem.free, esi + pop edx ecx + jmp .exchange_dims .rotate_ccw4i: - push ecx edx + push ecx edx - mov eax, [ebx + Image.Height] - add eax, 1 - shr eax, 1 - imul eax, [ebx + Image.Width] - push eax ; save new data size + mov eax, [ebx + Image.Height] + add eax, 1 + shr eax, 1 + imul eax, [ebx + Image.Width] + push eax ; save new data size - invoke mem.alloc, eax - or eax, eax - jz .error - push eax ; save pointer to new data + invoke mem.alloc, eax + or eax, eax + jz .error + push eax ; save pointer to new data - mov ecx, [ebx + Image.Width] - and ecx, 1 - neg ecx - add ecx, 2 - and ecx, 1 + mov ecx, [ebx + Image.Width] + and ecx, 1 + neg ecx + add ecx, 2 + and ecx, 1 - mov edi, eax - mov esi, [ebx + Image.Data] - mov eax, 1 - mov edx, [scanline_len_old] - dec edx - add esi, edx + mov edi, eax + mov esi, [ebx + Image.Data] + mov eax, 1 + mov edx, [scanline_len_old] + dec edx + add esi, edx - .rotate_ccw4i.begin: - push ebx ecx - mov ebx, 15 - shl ecx, 2 - shl ebx, cl - and bl, [esi] - shr ebx, cl - mov bh, 15 - mov ecx, eax - shl ecx, 2 - shl ebx, cl - not bh - and bh, [edi] - or bl, bh - mov [edi], bl - pop ecx ebx +.rotate_ccw4i.begin: + push ebx ecx + mov ebx, 15 + shl ecx, 2 + shl ebx, cl + and bl, [esi] + shr ebx, cl + mov bh, 15 + mov ecx, eax + shl ecx, 2 + shl ebx, cl + not bh + and bh, [edi] + or bl, bh + mov [edi], bl + pop ecx ebx - add esi, [scanline_len_old] - dec [scanline_pixels_new] - jz .rotate_ccw4i.end_of_line - sub eax, 1 - adc edi, 0 - and eax, 1 - jmp .rotate_ccw4i.begin - .rotate_ccw4i.end_of_line: - inc edi - mov eax, 1 - mov esi, [ebx + Image.Height] - mov [scanline_pixels_new], esi - inc ecx - and ecx, 1 - jz @f - mov esi, [ebx + Image.Data] - add esi, edx - jmp .rotate_ccw4i.begin - @@: - dec edx - js .rotate_ccw4i.quit - mov esi, [ebx + Image.Data] - add esi, edx - jmp .rotate_ccw4i.begin - .rotate_ccw4i.quit: - pop esi ; get pointer to new data - mov edi, [ebx + Image.Data] - pop ecx ; get new data size - rep movsb - invoke mem.free, esi - pop edx ecx - jmp .exchange_dims + add esi, [scanline_len_old] + dec [scanline_pixels_new] + jz .rotate_ccw4i.end_of_line + sub eax, 1 + adc edi, 0 + and eax, 1 + jmp .rotate_ccw4i.begin +.rotate_ccw4i.end_of_line: + inc edi + mov eax, 1 + mov esi, [ebx + Image.Height] + mov [scanline_pixels_new], esi + inc ecx + and ecx, 1 + jz @f + mov esi, [ebx + Image.Data] + add esi, edx + jmp .rotate_ccw4i.begin +@@: + dec edx + js .rotate_ccw4i.quit + mov esi, [ebx + Image.Data] + add esi, edx + jmp .rotate_ccw4i.begin +.rotate_ccw4i.quit: + pop esi ; get pointer to new data + mov edi, [ebx + Image.Data] + pop ecx ; get new data size + rep movsb + invoke mem.free, esi + pop edx ecx + jmp .exchange_dims - .rotate_cw_low: - mov eax, [ebx + Image.Height] - mov [scanline_pixels_new], eax - call img._.get_scanline_len - mov [scanline_len_new], eax +.rotate_cw_low: + mov eax, [ebx + Image.Height] + mov [scanline_pixels_new], eax + call img._.get_scanline_len + mov [scanline_len_new], eax - invoke mem.alloc, eax - or eax, eax - jz .error - mov [line_buffer], eax + invoke mem.alloc, eax + or eax, eax + jz .error + mov [line_buffer], eax - mov eax, [ebx + Image.Width] - mov ecx, eax - call img._.get_scanline_len - mov [scanline_len_old], eax + mov eax, [ebx + Image.Width] + mov ecx, eax + call img._.get_scanline_len + mov [scanline_len_old], eax - mov eax, [scanline_len_new] - imul eax, ecx - add eax, [ebx + Image.Data] - mov [pixels_ptr], eax + mov eax, [scanline_len_new] + imul eax, ecx + add eax, [ebx + Image.Data] + mov [pixels_ptr], eax - cmp [ebx + Image.Type], Image.bpp1 - jz .rotate_cw1 - cmp [ebx + Image.Type], Image.bpp2i - jz .rotate_cw2i - cmp [ebx + Image.Type], Image.bpp4i - jz .rotate_cw4i - cmp [ebx + Image.Type], Image.bpp8i - jz .rotate_cw8ig - cmp [ebx + Image.Type], Image.bpp8g - jz .rotate_cw8ig - cmp [ebx + Image.Type], Image.bpp24 - jz .rotate_cw24 - cmp [ebx + Image.Type], Image.bpp32 - jz .rotate_cw32 + cmp [ebx + Image.Type], Image.bpp1 + jz .rotate_cw1 + cmp [ebx + Image.Type], Image.bpp2i + jz .rotate_cw2i + cmp [ebx + Image.Type], Image.bpp4i + jz .rotate_cw4i + cmp [ebx + Image.Type], Image.bpp8i + jz .rotate_cw8ig + cmp [ebx + Image.Type], Image.bpp8g + jz .rotate_cw8ig + cmp [ebx + Image.Type], Image.bpp24 + jz .rotate_cw24 + cmp [ebx + Image.Type], Image.bpp32 + jz .rotate_cw32 - .next_column_cw_low1x: - dec ecx - js .exchange_dims - push ecx +.next_column_cw_low1x: + dec ecx + js .exchange_dims + push ecx - mov edx, [scanline_len_old] - add [scanline_len_old], -2 + mov edx, [scanline_len_old] + add [scanline_len_old], -2 - mov ecx, [scanline_pixels_new] - mov esi, [pixels_ptr] - add esi, -2 - mov edi, [line_buffer] - @@: mov ax, [esi] - mov [edi], ax - sub esi, edx - add edi, 2 - sub ecx, 1 - jnz @b + mov ecx, [scanline_pixels_new] + mov esi, [pixels_ptr] + add esi, -2 + mov edi, [line_buffer] +@@: + mov ax, [esi] + mov [edi], ax + sub esi, edx + add edi, 2 + sub ecx, 1 + jnz @b - mov eax, [scanline_pixels_new] - dec eax - mov edi, [ebx + Image.Data] - add edi, [scanline_len_old] - lea esi, [edi + 2] - mov edx, [scanline_len_old] - @@: mov ecx, edx - shr ecx, 2 - rep movsd - mov ecx, edx - and ecx, 3 - rep movsb - add esi, 3 - sub eax, 1 - jnz @b + mov eax, [scanline_pixels_new] + dec eax + mov edi, [ebx + Image.Data] + add edi, [scanline_len_old] + lea esi, [edi + 2] + mov edx, [scanline_len_old] +@@: + mov ecx, edx + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 + rep movsb + add esi, 3 + sub eax, 1 + jnz @b - mov eax, [scanline_len_new] - sub [pixels_ptr], eax - mov ecx, eax - mov esi, [line_buffer] - mov edi, [pixels_ptr] - shr ecx, 2 - rep movsd - mov ecx, eax - and ecx, 3 - rep movsb + mov eax, [scanline_len_new] + sub [pixels_ptr], eax + mov ecx, eax + mov esi, [line_buffer] + mov edi, [pixels_ptr] + shr ecx, 2 + rep movsd + mov ecx, eax + and ecx, 3 + rep movsb - pop ecx - jmp .next_column_cw_low1x + pop ecx + jmp .next_column_cw_low1x .rotate_cw32: - .next_column_cw_low: - dec ecx - js .exchange_dims - push ecx +.next_column_cw_low: + dec ecx + js .exchange_dims + push ecx - mov edx, [scanline_len_old] - add [scanline_len_old], -4 + mov edx, [scanline_len_old] + add [scanline_len_old], -4 - mov ecx, [scanline_pixels_new] - mov esi, [pixels_ptr] - add esi, -4 - mov edi, [line_buffer] - @@: mov eax, [esi] - stosd - sub esi, edx - dec ecx - jnz @b + mov ecx, [scanline_pixels_new] + mov esi, [pixels_ptr] + add esi, -4 + mov edi, [line_buffer] +@@: + mov eax, [esi] + stosd + sub esi, edx + dec ecx + jnz @b - mov eax, [scanline_pixels_new] - dec eax - mov edi, [ebx + Image.Data] - add edi, [scanline_len_old] - lea esi, [edi + 4] - mov edx, [scanline_len_old] - shr edx, 2 - @@: mov ecx, edx - rep movsd - add esi, 4 - dec eax - jnz @b + mov eax, [scanline_pixels_new] + dec eax + mov edi, [ebx + Image.Data] + add edi, [scanline_len_old] + lea esi, [edi + 4] + mov edx, [scanline_len_old] + shr edx, 2 +@@: + mov ecx, edx + rep movsd + add esi, 4 + dec eax + jnz @b - mov eax, [scanline_len_new] - sub [pixels_ptr], eax - mov ecx, [scanline_pixels_new] - mov esi, [line_buffer] - mov edi, [pixels_ptr] - rep movsd + mov eax, [scanline_len_new] + sub [pixels_ptr], eax + mov ecx, [scanline_pixels_new] + mov esi, [line_buffer] + mov edi, [pixels_ptr] + rep movsd - pop ecx - jmp .next_column_cw_low + pop ecx + jmp .next_column_cw_low .rotate_cw8ig: - .next_column_cw_low8ig: - dec ecx - js .exchange_dims - push ecx +.next_column_cw_low8ig: + dec ecx + js .exchange_dims + push ecx - mov edx, [scanline_len_old] - add [scanline_len_old], -1 + mov edx, [scanline_len_old] + add [scanline_len_old], -1 - mov ecx, [scanline_pixels_new] - mov esi, [pixels_ptr] - add esi, -1 - mov edi, [line_buffer] - @@: mov al, [esi] - mov [edi], al - sub esi, edx - add edi, 1 - sub ecx, 1 - jnz @b + mov ecx, [scanline_pixels_new] + mov esi, [pixels_ptr] + add esi, -1 + mov edi, [line_buffer] +@@: + mov al, [esi] + mov [edi], al + sub esi, edx + add edi, 1 + sub ecx, 1 + jnz @b - mov eax, [scanline_pixels_new] - dec eax - mov edi, [ebx + Image.Data] - add edi, [scanline_len_old] - lea esi, [edi + 1] - mov edx, [scanline_len_old] - @@: mov ecx, edx - shr ecx, 2 - rep movsd - mov ecx, edx - and ecx, 3 - rep movsb - add esi, 1 - sub eax, 1 - jnz @b + mov eax, [scanline_pixels_new] + dec eax + mov edi, [ebx + Image.Data] + add edi, [scanline_len_old] + lea esi, [edi + 1] + mov edx, [scanline_len_old] +@@: + mov ecx, edx + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 + rep movsb + add esi, 1 + sub eax, 1 + jnz @b - mov eax, [scanline_len_new] - sub [pixels_ptr], eax - mov ecx, eax - mov esi, [line_buffer] - mov edi, [pixels_ptr] - shr ecx, 2 - rep movsd - mov ecx, eax - and ecx, 3 - rep movsb + mov eax, [scanline_len_new] + sub [pixels_ptr], eax + mov ecx, eax + mov esi, [line_buffer] + mov edi, [pixels_ptr] + shr ecx, 2 + rep movsd + mov ecx, eax + and ecx, 3 + rep movsb - pop ecx - jmp .next_column_cw_low8ig + pop ecx + jmp .next_column_cw_low8ig .rotate_cw24: - .next_column_cw_low24: - dec ecx - js .exchange_dims - push ecx +.next_column_cw_low24: + dec ecx + js .exchange_dims + push ecx - mov edx, [scanline_len_old] - add [scanline_len_old], -3 + mov edx, [scanline_len_old] + add [scanline_len_old], -3 - mov ecx, [scanline_pixels_new] - mov esi, [pixels_ptr] - add esi, -3 - mov edi, [line_buffer] - @@: mov al, [esi] - mov [edi], al - mov al, [esi+1] - mov [edi+1], al - mov al, [esi+2] - mov [edi+2], al - sub esi, edx - add edi, 3 - sub ecx, 1 - jnz @b + mov ecx, [scanline_pixels_new] + mov esi, [pixels_ptr] + add esi, -3 + mov edi, [line_buffer] +@@: + mov al, [esi] + mov [edi], al + mov al, [esi+1] + mov [edi+1], al + mov al, [esi+2] + mov [edi+2], al + sub esi, edx + add edi, 3 + sub ecx, 1 + jnz @b - mov eax, [scanline_pixels_new] - dec eax - mov edi, [ebx + Image.Data] - add edi, [scanline_len_old] - lea esi, [edi + 3] - mov edx, [scanline_len_old] - @@: mov ecx, edx - shr ecx, 2 - rep movsd - mov ecx, edx - and ecx, 3 - rep movsb - add esi, 3 - sub eax, 1 - jnz @b + mov eax, [scanline_pixels_new] + dec eax + mov edi, [ebx + Image.Data] + add edi, [scanline_len_old] + lea esi, [edi + 3] + mov edx, [scanline_len_old] +@@: + mov ecx, edx + shr ecx, 2 + rep movsd + mov ecx, edx + and ecx, 3 + rep movsb + add esi, 3 + sub eax, 1 + jnz @b - mov eax, [scanline_len_new] - sub [pixels_ptr], eax - mov ecx, eax - mov esi, [line_buffer] - mov edi, [pixels_ptr] - shr ecx, 2 - rep movsd - mov ecx, eax - and ecx, 3 - rep movsb + mov eax, [scanline_len_new] + sub [pixels_ptr], eax + mov ecx, eax + mov esi, [line_buffer] + mov edi, [pixels_ptr] + shr ecx, 2 + rep movsd + mov ecx, eax + and ecx, 3 + rep movsb - pop ecx - jmp .next_column_cw_low24 + pop ecx + jmp .next_column_cw_low24 .rotate_cw1: - push ecx edx + push ecx edx - mov eax, [ebx + Image.Height] - add eax, 7 - shr eax, 3 - imul [ebx + Image.Width] - push eax ; save new data size + mov eax, [ebx + Image.Height] + add eax, 7 + shr eax, 3 + imul [ebx + Image.Width] + push eax ; save new data size - invoke mem.alloc, eax - or eax, eax - jz .error - push eax ; save pointer to new data + invoke mem.alloc, eax + or eax, eax + jz .error + push eax ; save pointer to new data - mov edi, eax - mov esi, [ebx + Image.Data] - mov eax, [ebx + Image.Height] - dec eax - imul eax, [scanline_len_old] - add esi, eax - mov eax, 7 - mov ecx, 7 - mov edx, 0 + mov edi, eax + mov esi, [ebx + Image.Data] + mov eax, [ebx + Image.Height] + dec eax + imul eax, [scanline_len_old] + add esi, eax + mov eax, 7 + mov ecx, 7 + mov edx, 0 - .rotate_cw1.begin: - bt [esi], ecx - jc .rotate_cw1.one - .rotate_cw1.zero: - btr [edi], eax - jmp @f - .rotate_cw1.one: - bts [edi], eax - @@: - sub esi, [scanline_len_old] - dec [scanline_pixels_new] - jz .rotate_cw1.end_of_line - sub eax, 1 - adc edi, 0 - and eax, 7 - jmp .rotate_cw1.begin - .rotate_cw1.end_of_line: - inc edi - mov eax, [ebx + Image.Height] - mov [scanline_pixels_new], eax - mov eax, 7 - dec ecx - jns @f - mov ecx, 7 - inc edx - cmp edx, [scanline_len_old] - je .rotate_cw1.quit - @@: - mov esi, [ebx + Image.Height] - dec esi - imul esi, [scanline_len_old] - add esi, [ebx + Image.Data] - add esi, 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 +.rotate_cw1.begin: + bt [esi], ecx + jc .rotate_cw1.one +.rotate_cw1.zero: + btr [edi], eax + jmp @f +.rotate_cw1.one: + bts [edi], eax +@@: + sub esi, [scanline_len_old] + dec [scanline_pixels_new] + jz .rotate_cw1.end_of_line + sub eax, 1 + adc edi, 0 + and eax, 7 + jmp .rotate_cw1.begin +.rotate_cw1.end_of_line: + inc edi + mov eax, [ebx + Image.Height] + mov [scanline_pixels_new], eax + mov eax, 7 + dec ecx + jns @f + mov ecx, 7 + inc edx + cmp edx, [scanline_len_old] + je .rotate_cw1.quit +@@: + mov esi, [ebx + Image.Height] + dec esi + imul esi, [scanline_len_old] + add esi, [ebx + Image.Data] + add esi, 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 .rotate_cw2i: - push ecx edx + push ecx edx - mov eax, [ebx + Image.Height] - add eax, 3 - shr eax, 2 - imul [ebx + Image.Width] - push eax ; save new data size + mov eax, [ebx + Image.Height] + add eax, 3 + shr eax, 2 + imul [ebx + Image.Width] + push eax ; save new data size - invoke mem.alloc, eax - or eax, eax - jz .error - push eax ; save pointer to new data + invoke mem.alloc, eax + or eax, eax + jz .error + push eax ; save pointer to new data - mov edi, eax - mov esi, [ebx + Image.Data] - mov eax, [ebx + Image.Height] - dec eax - imul eax, [scanline_len_old] - add esi, eax - mov eax, 3 - mov ecx, 3 - mov edx, 0 + mov edi, eax + mov esi, [ebx + Image.Data] + mov eax, [ebx + Image.Height] + dec eax + imul eax, [scanline_len_old] + add esi, eax + mov eax, 3 + mov ecx, 3 + mov edx, 0 - .rotate_cw2i.begin: - push ebx ecx - mov ebx, 3 - shl ebx, cl - shl ebx, cl - and bl, [esi] - shr ebx, cl - shr ebx, cl - mov bh, 3 - mov ecx, eax - shl ebx, cl - shl ebx, cl - not bh - and bh, [edi] - or bl, bh - mov [edi], bl - pop ecx ebx +.rotate_cw2i.begin: + push ebx ecx + mov ebx, 3 + shl ebx, cl + shl ebx, cl + and bl, [esi] + shr ebx, cl + shr ebx, cl + mov bh, 3 + mov ecx, eax + shl ebx, cl + shl ebx, cl + not bh + and bh, [edi] + or bl, bh + mov [edi], bl + pop ecx ebx - sub esi, [scanline_len_old] - dec [scanline_pixels_new] - jz .rotate_cw2i.end_of_line - sub eax, 1 - adc edi, 0 - and eax, 3 - jmp .rotate_cw2i.begin - .rotate_cw2i.end_of_line: - inc edi - mov eax, [ebx + Image.Height] - mov [scanline_pixels_new], eax - mov eax, 3 - dec ecx - jns @f - mov ecx, 3 - inc edx - cmp edx, [scanline_len_old] - je .rotate_cw2i.quit - @@: - mov esi, [ebx + Image.Height] - dec esi - imul esi, [scanline_len_old] - add esi, [ebx + Image.Data] - add esi, edx - jmp .rotate_cw2i.begin - .rotate_cw2i.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 + sub esi, [scanline_len_old] + dec [scanline_pixels_new] + jz .rotate_cw2i.end_of_line + sub eax, 1 + adc edi, 0 + and eax, 3 + jmp .rotate_cw2i.begin +.rotate_cw2i.end_of_line: + inc edi + mov eax, [ebx + Image.Height] + mov [scanline_pixels_new], eax + mov eax, 3 + dec ecx + jns @f + mov ecx, 3 + inc edx + cmp edx, [scanline_len_old] + je .rotate_cw2i.quit +@@: + mov esi, [ebx + Image.Height] + dec esi + imul esi, [scanline_len_old] + add esi, [ebx + Image.Data] + add esi, edx + jmp .rotate_cw2i.begin +.rotate_cw2i.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_cw4i: - push ecx edx + push ecx edx - mov eax, [ebx + Image.Height] - add eax, 1 - shr eax, 1 - imul [ebx + Image.Width] - push eax ; save new data size + mov eax, [ebx + Image.Height] + add eax, 1 + shr eax, 1 + imul [ebx + Image.Width] + push eax ; save new data size - invoke mem.alloc, eax - or eax, eax - jz .error - push eax ; save pointer to new data + invoke mem.alloc, eax + or eax, eax + jz .error + push eax ; save pointer to new data - mov edi, eax - mov esi, [ebx + Image.Data] - mov eax, [ebx + Image.Height] - dec eax - imul eax, [scanline_len_old] - add esi, eax - mov eax, 1 - mov ecx, 1 - mov edx, 0 + mov edi, eax + mov esi, [ebx + Image.Data] + mov eax, [ebx + Image.Height] + dec eax + imul eax, [scanline_len_old] + add esi, eax + mov eax, 1 + mov ecx, 1 + mov edx, 0 - .rotate_cw4i.begin: - push ebx ecx - mov ebx, 15 - shl ecx, 2 - shl ebx, cl - and bl, [esi] - shr ebx, cl - mov bh, 15 - mov ecx, eax - shl ecx, 2 - shl ebx, cl - not bh - and bh, [edi] - or bl, bh - mov [edi], bl - pop ecx ebx +.rotate_cw4i.begin: + push ebx ecx + mov ebx, 15 + shl ecx, 2 + shl ebx, cl + and bl, [esi] + shr ebx, cl + mov bh, 15 + mov ecx, eax + shl ecx, 2 + shl ebx, cl + not bh + and bh, [edi] + or bl, bh + mov [edi], bl + pop ecx ebx - sub esi, [scanline_len_old] - dec [scanline_pixels_new] - jz .rotate_cw4i.end_of_line - sub eax, 1 - adc edi, 0 - and eax, 1 - jmp .rotate_cw4i.begin - .rotate_cw4i.end_of_line: - inc edi - mov eax, [ebx + Image.Height] - mov [scanline_pixels_new], eax - mov eax, 1 - dec ecx - jns @f - mov ecx, 1 - inc edx - cmp edx, [scanline_len_old] - je .rotate_cw4i.quit - @@: - mov esi, [ebx + Image.Height] - dec esi - imul esi, [scanline_len_old] - add esi, [ebx + Image.Data] - add esi, edx - jmp .rotate_cw4i.begin - .rotate_cw4i.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 + sub esi, [scanline_len_old] + dec [scanline_pixels_new] + jz .rotate_cw4i.end_of_line + sub eax, 1 + adc edi, 0 + and eax, 1 + jmp .rotate_cw4i.begin +.rotate_cw4i.end_of_line: + inc edi + mov eax, [ebx + Image.Height] + mov [scanline_pixels_new], eax + mov eax, 1 + dec ecx + jns @f + mov ecx, 1 + inc edx + cmp edx, [scanline_len_old] + je .rotate_cw4i.quit +@@: + mov esi, [ebx + Image.Height] + dec esi + imul esi, [scanline_len_old] + add esi, [ebx + Image.Data] + add esi, edx + jmp .rotate_cw4i.begin +.rotate_cw4i.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: - stdcall img.flip.layer, [_img], FLIP_VERTICAL - test eax, eax - jz .error - jmp .exit +.flip: + stdcall img.flip.layer, [_img], FLIP_VERTICAL + test eax, eax + jz .error + jmp .exit - .exchange_dims: - push [ebx + Image.Width] [ebx + Image.Height] - pop [ebx + Image.Width] [ebx + Image.Height] +.exchange_dims: + push [ebx + Image.Width] [ebx + Image.Height] + pop [ebx + Image.Width] [ebx + Image.Height] - .exit: - invoke mem.free, [line_buffer] - xor eax, eax - inc eax - pop edi esi ebx - ret +.exit: + invoke mem.free, [line_buffer] + xor eax, eax + inc eax + pop edi esi ebx + ret - .error: - invoke mem.free, [line_buffer] - xor eax, eax - pop edi esi ebx - ret +.error: + invoke mem.free, [line_buffer] + xor eax, eax + pop edi esi ebx + ret endp -;;================================================================================================;; -proc img.rotate _img, _rotate_kind ;//////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? Rotate all layers of image ;; -;;------------------------------------------------------------------------------------------------;; -;> _img = pointer to image ;; -;> _rotate_kind = one of ROTATE_* constants ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = false / true ;; -;;================================================================================================;; - push 1 - mov ebx, [_img] +;;============================================================================;; +proc img.rotate _img, _rotate_kind ;//////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Rotate all layers of image ;; +;;----------------------------------------------------------------------------;; +;> _img = pointer to image ;; +;> _rotate_kind = one of ROTATE_* constants ;; +;;----------------------------------------------------------------------------;; +;< eax = false / true ;; +;;============================================================================;; + push 1 + mov ebx, [_img] @@: - mov eax, [ebx + Image.Previous] - test eax, eax - jz .loop - mov ebx, eax - jmp @b + mov eax, [ebx + Image.Previous] + test eax, eax + jz .loop + mov ebx, eax + jmp @b .loop: - stdcall img.rotate.layer, ebx, [_rotate_kind] - test eax, eax - jnz @f - mov byte [esp], 0 + stdcall img.rotate.layer, ebx, [_rotate_kind] + test eax, eax + jnz @f + mov byte [esp], 0 @@: - mov ebx, [ebx + Image.Next] - test ebx, ebx - jnz .loop - pop eax - ret + mov ebx, [ebx + Image.Next] + test ebx, ebx + jnz .loop + pop eax + ret endp -;;================================================================================================;; -proc img.draw _img, _x, _y, _width, _height, _xpos, _ypos ;///////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? Draw image in the window ;; -;;------------------------------------------------------------------------------------------------;; -;> _img = pointer to image ;; -;>_x = x-coordinate in the window ;; -;>_y = y-coordinate in the window ;; -;>_width = maximum width to draw ;; -;>_height = maximum height to draw ;; -;>_xpos = offset in image by x-axis ;; -;>_ypos = offset in image by y-axis ;; -;;------------------------------------------------------------------------------------------------;; -;< no return value ;; -;;================================================================================================;; - push ebx esi edi - mov ebx, [_img] - stdcall img._.validate, ebx - test eax, eax - jnz .done - mov ecx, [ebx + Image.Width] - sub ecx, [_xpos] - jbe .done - cmp ecx, [_width] - jb @f - mov ecx, [_width] +;;============================================================================;; +proc img.draw _img, _x, _y, _width, _height, _xpos, _ypos ;///////////////////;; +;;----------------------------------------------------------------------------;; +;? Draw image in the window ;; +;;----------------------------------------------------------------------------;; +;> _img = pointer to image ;; +;>_x = x-coordinate in the window ;; +;>_y = y-coordinate in the window ;; +;>_width = maximum width to draw ;; +;>_height = maximum height to draw ;; +;>_xpos = offset in image by x-axis ;; +;>_ypos = offset in image by y-axis ;; +;;----------------------------------------------------------------------------;; +;< no return value ;; +;;============================================================================;; + push ebx esi edi + mov ebx, [_img] + stdcall img._.validate, ebx + test eax, eax + jnz .done + mov ecx, [ebx + Image.Width] + sub ecx, [_xpos] + jbe .done + cmp ecx, [_width] + jb @f + mov ecx, [_width] @@: - mov edx, [ebx + Image.Height] - sub edx, [_ypos] - jbe .done - cmp edx, [_height] - jb @f - mov edx, [_height] + mov edx, [ebx + Image.Height] + sub edx, [_ypos] + jbe .done + cmp edx, [_height] + jb @f + mov edx, [_height] @@: - mov eax, [ebx + Image.Width] - sub eax, ecx - call img._.get_scanline_len - shl ecx, 16 - add ecx, edx - push eax - mov eax, [ebx + Image.Width] - imul eax, [_ypos] - add eax, [_xpos] - call img._.get_scanline_len - add eax, [ebx + Image.Data] - mov edx, [_x - 2] - mov dx, word [_y] - mov esi, [ebx + Image.Type] - mov esi, [type2bpp + (esi-1)*4] - mov edi, [ebx + Image.Palette] - xchg eax, ebx - pop eax - push ebp - push 65 - pop ebp - xchg eax, ebp - int 40h - pop ebp + mov eax, [ebx + Image.Width] + sub eax, ecx + call img._.get_scanline_len + shl ecx, 16 + add ecx, edx + push eax + mov eax, [ebx + Image.Width] + imul eax, [_ypos] + add eax, [_xpos] + call img._.get_scanline_len + add eax, [ebx + Image.Data] + mov edx, [_x - 2] + mov dx, word [_y] + mov esi, [ebx + Image.Type] + mov esi, [type2bpp + (esi-1)*4] + mov edi, [ebx + Image.Palette] + xchg eax, ebx + pop eax + push ebp + push 65 + pop ebp + xchg eax, ebp + int 40h + pop ebp .done: - pop edi esi ebx - ret + pop edi esi ebx + ret endp align 4 img.formats_table: - .bmp dd LIBIMG_FORMAT_BMP, img.is.bmp, img.decode.bmp, img.encode.bmp, 1 + (1 SHL Image.bpp24) + (1 SHL Image.bpp32) - .ico dd LIBIMG_FORMAT_ICO, img.is.ico, img.decode.ico_cur, img.encode.ico, 0 - .cur dd LIBIMG_FORMAT_CUR, img.is.cur, img.decode.ico_cur, img.encode.cur, 0 - .gif dd LIBIMG_FORMAT_GIF, img.is.gif, img.decode.gif, img.encode.gif, 0 - .png dd LIBIMG_FORMAT_PNG, img.is.png, img.decode.png, img.encode.png, 1 + (1 SHL Image.bpp24) - .jpg dd LIBIMG_FORMAT_JPEG, img.is.jpg, img.decode.jpg, img.encode.jpg, 0 - .tga dd LIBIMG_FORMAT_TGA, img.is.tga, img.decode.tga, img.encode.tga, 0 - .pcx dd LIBIMG_FORMAT_PCX, img.is.pcx, img.decode.pcx, img.encode.pcx, 0 - .xcf dd LIBIMG_FORMAT_XCF, img.is.xcf, img.decode.xcf, img.encode.xcf, 0 - .tiff dd LIBIMG_FORMAT_TIFF, img.is.tiff, img.decode.tiff, img.encode.tiff,0 - .pnm dd LIBIMG_FORMAT_PNM, img.is.pnm, img.decode.pnm, img.encode.pnm, 1 + (1 SHL Image.bpp1) + (1 SHL Image.bpp8g) + (1 SHL Image.bpp24) - .wbmp dd LIBIMG_FORMAT_WBMP, img.is.wbmp, img.decode.wbmp, img.encode.wbmp,0 - .xbm dd LIBIMG_FORMAT_XBM, img.is.xbm, img.decode.xbm, img.encode.xbm, 0 - .z80 dd LIBIMG_FORMAT_Z80, img.is.z80, img.decode.z80, img.encode.z80, 0 ;this must be the last entry as there are no signatures in z80 screens at all - dd 0 + .bmp dd LIBIMG_FORMAT_BMP, img.is.bmp, img.decode.bmp, img.encode.bmp, 1 + (1 SHL Image.bpp24) + (1 SHL Image.bpp32) + .ico dd LIBIMG_FORMAT_ICO, img.is.ico, img.decode.ico_cur, img.encode.ico, 0 + .cur dd LIBIMG_FORMAT_CUR, img.is.cur, img.decode.ico_cur, img.encode.cur, 0 + .gif dd LIBIMG_FORMAT_GIF, img.is.gif, img.decode.gif, img.encode.gif, 0 + .png dd LIBIMG_FORMAT_PNG, img.is.png, img.decode.png, img.encode.png, 1 + (1 SHL Image.bpp24) + .jpg dd LIBIMG_FORMAT_JPEG, img.is.jpg, img.decode.jpg, img.encode.jpg, 0 + .tga dd LIBIMG_FORMAT_TGA, img.is.tga, img.decode.tga, img.encode.tga, 0 + .pcx dd LIBIMG_FORMAT_PCX, img.is.pcx, img.decode.pcx, img.encode.pcx, 0 + .xcf dd LIBIMG_FORMAT_XCF, img.is.xcf, img.decode.xcf, img.encode.xcf, 0 + .tiff dd LIBIMG_FORMAT_TIFF, img.is.tiff, img.decode.tiff, img.encode.tiff,0 + .pnm dd LIBIMG_FORMAT_PNM, img.is.pnm, img.decode.pnm, img.encode.pnm, 1 + (1 SHL Image.bpp1) + (1 SHL Image.bpp8g) + (1 SHL Image.bpp24) + .wbmp dd LIBIMG_FORMAT_WBMP, img.is.wbmp, img.decode.wbmp, img.encode.wbmp,0 + .xbm dd LIBIMG_FORMAT_XBM, img.is.xbm, img.decode.xbm, img.encode.xbm, 0 + .z80 dd LIBIMG_FORMAT_Z80, img.is.z80, img.decode.z80, img.encode.z80, 0 ;this must be the last entry as there are no signatures in z80 screens at all + dd 0 -;;================================================================================================;; -;;////////////////////////////////////////////////////////////////////////////////////////////////;; -;;================================================================================================;; -;! Below are private procs you should never call directly from your code ;; -;;================================================================================================;; -;;////////////////////////////////////////////////////////////////////////////////////////////////;; -;;================================================================================================;; +;;============================================================================;; +;;////////////////////////////////////////////////////////////////////////////;; +;;============================================================================;; +;! Below are private procs you should never call directly from your code ;; +;;============================================================================;; +;;////////////////////////////////////////////////////////////////////////////;; +;;============================================================================;; -;;================================================================================================;; -proc img._.validate, _img ;///////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;> --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;< --- TBD --- ;; -;;================================================================================================;; - xor eax, eax - ret +;;============================================================================;; +proc img._.validate, _img ;///////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;> --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;< --- TBD --- ;; +;;============================================================================;; + xor eax, eax + ret endp -;;================================================================================================;; -proc img._.new ;//////////////////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;> --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to image ;; -;;================================================================================================;; - invoke mem.alloc, sizeof.Image - test eax, eax - jz @f - push ecx - xor ecx, ecx - mov [eax + Image.Data], ecx - mov [eax + Image.Type], ecx - mov [eax + Image.Flags], ecx - mov [eax + Image.Extended], ecx - mov [eax + Image.Previous], ecx - mov [eax + Image.Next], ecx - pop ecx +;;============================================================================;; +proc img._.new ;//////////////////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;> --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to image ;; +;;============================================================================;; + invoke mem.alloc, sizeof.Image + test eax, eax + jz @f + push ecx + xor ecx, ecx + mov [eax + Image.Data], ecx + mov [eax + Image.Type], ecx + mov [eax + Image.Flags], ecx + mov [eax + Image.Extended], ecx + mov [eax + Image.Previous], ecx + mov [eax + Image.Next], ecx + pop ecx @@: - ret + ret endp -;;================================================================================================;; -proc img._.delete _img ;//////////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;> --- TBD --- ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = false / true ;; -;;================================================================================================;; - push edx - mov edx, [_img] - cmp [edx + Image.Data], 0 - je @f - invoke mem.free, [edx + Image.Data] - @@: cmp [edx + Image.Extended], 0 - je @f - invoke mem.free, [edx + Image.Extended] - @@: invoke mem.free, edx - pop edx - ret +;;============================================================================;; +proc img._.delete _img ;//////////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;> --- TBD --- ;; +;;----------------------------------------------------------------------------;; +;< eax = false / true ;; +;;============================================================================;; + push edx + mov edx, [_img] + cmp [edx + Image.Data], 0 + je @f + invoke mem.free, [edx + Image.Data] +@@: + cmp [edx + Image.Extended], 0 + je @f + invoke mem.free, [edx + Image.Extended] +@@: + invoke mem.free, edx + pop edx + ret endp -;;================================================================================================;; -proc img.resize_data _img, _width, _height ;//////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? Resize data block of image. New size is calculated from _width and _height params and internal ;; -;? Image.Type value. All the internal fields are updated iff succeeded. ;; -;? This function does not scale images, use img.scale if you need to. ;; -;;------------------------------------------------------------------------------------------------;; -;> _img = pointer to image ;; -;> _width = new width ;; -;> _height = new height ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 (fail) / pointer to the new pixels data ;; -;;================================================================================================;; - push ebx esi - mov ebx, [_img] - mov eax, [_height] +;;============================================================================;; +proc img.resize_data _img, _width, _height ;//////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Resize data block of image. New size is calculated from _width and _height ;; +;? params and internal Image.Type value. All the internal fields are updated ;; +;? iff succeeded. This function does not scale images, use img.scale if you ;; +;? need to. ;; +;;----------------------------------------------------------------------------;; +;> _img = pointer to image ;; +;> _width = new width ;; +;> _height = new height ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 (fail) / pointer to the new pixels data ;; +;;============================================================================;; + push ebx esi + mov ebx, [_img] + mov eax, [_height] ; our memory is limited, [_width]*[_height] must not overflow ; image with width or height greater than 65535 is most likely bogus - cmp word [_width+2], 0 - jnz .error - cmp word [_height+2], 0 - jnz .error - imul eax, [_width] - test eax, eax - jz .error - cmp [ebx + Image.Type], Image.bpp1 - jz .bpp1 - cmp [ebx + Image.Type], Image.bpp2i - jz .bpp2i - cmp [ebx + Image.Type], Image.bpp4i - jz .bpp4i - cmp [ebx + Image.Type], Image.bpp8i - jz .bpp8i - cmp [ebx + Image.Type], Image.bpp8g - jz .bpp8g - cmp [ebx + Image.Type], Image.bpp8a - jz .bpp8a - cmp [ebx + Image.Type], Image.bpp24 - jz .bpp24 + cmp word [_width+2], 0 + jnz .error + cmp word [_height+2], 0 + jnz .error + imul eax, [_width] + test eax, eax + jz .error + cmp [ebx + Image.Type], Image.bpp1 + jz .bpp1 + cmp [ebx + Image.Type], Image.bpp2i + jz .bpp2i + cmp [ebx + Image.Type], Image.bpp4i + jz .bpp4i + cmp [ebx + Image.Type], Image.bpp8i + jz .bpp8i + cmp [ebx + Image.Type], Image.bpp8g + jz .bpp8g + cmp [ebx + Image.Type], Image.bpp8a + jz .bpp8a + cmp [ebx + Image.Type], Image.bpp24 + jz .bpp24 .bpp32: - shl eax, 2 - jmp @f + shl eax, 2 + jmp @f .bpp24: - lea eax, [eax*3] - jmp @f + lea eax, [eax*3] + jmp @f .bpp8i: - add eax, 256*4 ; for palette + add eax, 256*4 ; for palette .bpp8g: - jmp @f + jmp @f .bpp8a: - shl eax, 1 - jmp @f + shl eax, 1 + jmp @f .bpp4i: - mov eax, [_width] - add eax, 1 - shr eax, 1 - imul eax, [_height] - mov ecx, eax - mov eax, [_height] - add eax, 1 - shr eax, 1 - imul eax, [_width] - cmp eax, ecx - jge .bpp4i.skip - mov eax, ecx - .bpp4i.skip: - add eax, 16*4 ; for palette - jmp @f + mov eax, [_width] + add eax, 1 + shr eax, 1 + imul eax, [_height] + mov ecx, eax + mov eax, [_height] + add eax, 1 + shr eax, 1 + imul eax, [_width] + cmp eax, ecx + jge .bpp4i.skip + mov eax, ecx +.bpp4i.skip: + add eax, 16*4 ; for palette + jmp @f .bpp2i: - mov eax, [_width] - add eax, 3 - shr eax, 2 - imul eax, [_height] - mov ecx, eax - mov eax, [_height] - add eax, 3 - shr eax, 2 - imul eax, [_width] - cmp eax, ecx - jge .bpp2i.skip - mov eax, ecx - .bpp2i.skip: - add eax, 4*4 ; for palette - jmp @f + mov eax, [_width] + add eax, 3 + shr eax, 2 + imul eax, [_height] + mov ecx, eax + mov eax, [_height] + add eax, 3 + shr eax, 2 + imul eax, [_width] + cmp eax, ecx + jge .bpp2i.skip + mov eax, ecx +.bpp2i.skip: + add eax, 4*4 ; for palette + jmp @f .bpp1: - mov eax, [_width] - add eax, 7 - shr eax, 3 - imul eax, [_height] - mov ecx, eax - mov eax, [_height] - add eax, 7 - shr eax, 3 - imul eax, [_width] - cmp eax, ecx - jge .bpp1.skip - mov eax, ecx - .bpp1.skip: + mov eax, [_width] + add eax, 7 + shr eax, 3 + imul eax, [_height] + mov ecx, eax + mov eax, [_height] + add eax, 7 + shr eax, 3 + imul eax, [_width] + cmp eax, ecx + jge .bpp1.skip + mov eax, ecx +.bpp1.skip: - add eax, 2*4 ; for palette + add eax, 2*4 ; for palette @@: - mov esi, eax - invoke mem.realloc, [ebx + Image.Data], eax - or eax, eax - jz .error + mov esi, eax + invoke mem.realloc, [ebx + Image.Data], eax + or eax, eax + jz .error - mov [ebx + Image.Data], eax - push [_width] - pop [ebx + Image.Width] - push [_height] - pop [ebx + Image.Height] - cmp [ebx + Image.Type], Image.bpp8i - jnz @f - lea esi, [eax + esi - 256*4] - mov [ebx + Image.Palette], esi - jmp .ret + mov [ebx + Image.Data], eax + push [_width] + pop [ebx + Image.Width] + push [_height] + pop [ebx + Image.Height] + cmp [ebx + Image.Type], Image.bpp8i + jnz @f + lea esi, [eax + esi - 256*4] + mov [ebx + Image.Palette], esi + jmp .ret @@: - cmp [ebx + Image.Type], Image.bpp1 - jnz @f - lea esi, [eax + esi - 2*4] - mov [ebx + Image.Palette], esi - jmp .ret + cmp [ebx + Image.Type], Image.bpp1 + jnz @f + lea esi, [eax + esi - 2*4] + mov [ebx + Image.Palette], esi + jmp .ret @@: - cmp [ebx + Image.Type], Image.bpp2i - jnz @f - lea esi, [eax + esi - 4*4] - mov [ebx + Image.Palette], esi - jmp .ret + cmp [ebx + Image.Type], Image.bpp2i + jnz @f + lea esi, [eax + esi - 4*4] + mov [ebx + Image.Palette], esi + jmp .ret @@: - cmp [ebx + Image.Type], Image.bpp4i - jnz .ret - lea esi, [eax + esi - 16*4] - mov [ebx + Image.Palette], esi - jmp .ret + cmp [ebx + Image.Type], Image.bpp4i + jnz .ret + lea esi, [eax + esi - 16*4] + mov [ebx + Image.Palette], esi + jmp .ret .error: - xor eax, eax + xor eax, eax .ret: - pop esi ebx - ret + pop esi ebx + ret endp -;;================================================================================================;; -img._.get_scanline_len: ;/////////////////////////////////////////////////////////////////////////;; -;;------------------------------------------------------------------------------------------------;; -;? Get scanline length of image in bytes ;; -;;------------------------------------------------------------------------------------------------;; -;> eax = width of image in pixels ;; -;> ebx = image ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = scanline length in bytes ;; -;;================================================================================================;; - cmp [ebx + Image.Type], Image.bpp1 - jz .bpp1.1 - cmp [ebx + Image.Type], Image.bpp2i - jz .bpp2i.1 - cmp [ebx + Image.Type], Image.bpp4i - jz .bpp4i.1 - cmp [ebx + Image.Type], Image.bpp8i - jz .bpp8.1 - cmp [ebx + Image.Type], Image.bpp8g - jz .bpp8.1 - cmp [ebx + Image.Type], Image.bpp8a - jz .bpp8a.1 - cmp [ebx + Image.Type], Image.bpp24 - jz .bpp24.1 - add eax, eax - cmp [ebx + Image.Type], Image.bpp32 - jnz .quit - add eax, eax - jmp .quit +;;============================================================================;; +img._.get_scanline_len: ;/////////////////////////////////////////////////////;; +;;----------------------------------------------------------------------------;; +;? Get scanline length of image in bytes ;; +;;----------------------------------------------------------------------------;; +;> eax = width of image in pixels ;; +;> ebx = image ;; +;;----------------------------------------------------------------------------;; +;< eax = scanline length in bytes ;; +;;============================================================================;; + cmp [ebx + Image.Type], Image.bpp1 + jz .bpp1.1 + cmp [ebx + Image.Type], Image.bpp2i + jz .bpp2i.1 + cmp [ebx + Image.Type], Image.bpp4i + jz .bpp4i.1 + cmp [ebx + Image.Type], Image.bpp8i + jz .bpp8.1 + cmp [ebx + Image.Type], Image.bpp8g + jz .bpp8.1 + cmp [ebx + Image.Type], Image.bpp8a + jz .bpp8a.1 + cmp [ebx + Image.Type], Image.bpp24 + jz .bpp24.1 + add eax, eax + cmp [ebx + Image.Type], Image.bpp32 + jnz .quit + add eax, eax + jmp .quit .bpp24.1: - lea eax, [eax*3] - jmp .quit + lea eax, [eax*3] + jmp .quit .bpp1.1: - add eax, 7 - shr eax, 3 - jmp .quit + add eax, 7 + shr eax, 3 + jmp .quit .bpp2i.1: - add eax, 3 - shr eax, 2 - jmp .quit + add eax, 3 + shr eax, 2 + jmp .quit .bpp4i.1: - add eax, 1 - shr eax, 1 - jmp .quit + add eax, 1 + shr eax, 1 + jmp .quit .bpp8a.1: - shl eax, 1 + shl eax, 1 .bpp8.1: .quit: - ret + ret -;;================================================================================================;; -;;////////////////////////////////////////////////////////////////////////////////////////////////;; -;;================================================================================================;; -;! Below is private data you should never use directly from your code ;; -;;================================================================================================;; -;;////////////////////////////////////////////////////////////////////////////////////////////////;; -;;================================================================================================;; +;;============================================================================;; +;;////////////////////////////////////////////////////////////////////////////;; +;;============================================================================;; +;! Below is private data you should never use directly from your code ;; +;;============================================================================;; +;;////////////////////////////////////////////////////////////////////////////;; +;;============================================================================;; section '.data' data readable writable align 16 ;include_debug_strings align 4 -type2bpp dd 8, 24, 32, 15, 16, 1, 9, 2, 4 +type2bpp dd 8, 24, 32, 15, 16, 1, 9, 2, 4 img._.do_rgb.handlers: - dd img._.do_rgb.bpp8i - dd img._.do_rgb.bpp24 - dd img._.do_rgb.bpp32 - 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.bpp1 - dd img._.do_rgb.bpp8g - dd img._.do_rgb.bpp2i - dd img._.do_rgb.bpp4i + dd img._.do_rgb.bpp8i + dd img._.do_rgb.bpp24 + dd img._.do_rgb.bpp32 + 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.bpp1 + dd img._.do_rgb.bpp8g + dd img._.do_rgb.bpp2i + dd img._.do_rgb.bpp4i img.flip.layer.handlers_horz: - dd img.flip.layer.bpp8ig_horz - dd img.flip.layer.bpp24_horz - dd img.flip.layer.bpp32_horz - dd img.flip.layer.bpp1x_horz - dd img.flip.layer.bpp1x_horz - dd img.flip.layer.bpp1_horz - dd img.flip.layer.bpp8ig_horz - dd img.flip.layer.bpp2i_horz - dd img.flip.layer.bpp4i_horz + dd img.flip.layer.bpp8ig_horz + dd img.flip.layer.bpp24_horz + dd img.flip.layer.bpp32_horz + dd img.flip.layer.bpp1x_horz + dd img.flip.layer.bpp1x_horz + dd img.flip.layer.bpp1_horz + dd img.flip.layer.bpp8ig_horz + dd img.flip.layer.bpp2i_horz + dd img.flip.layer.bpp4i_horz -;;================================================================================================;; -;;////////////////////////////////////////////////////////////////////////////////////////////////;; -;;================================================================================================;; -;! Exported functions section ;; -;;================================================================================================;; -;;////////////////////////////////////////////////////////////////////////////////////////////////;; -;;================================================================================================;; +;;============================================================================;; +;;////////////////////////////////////////////////////////////////////////////;; +;;============================================================================;; +;! Exported functions section ;; +;;============================================================================;; +;;////////////////////////////////////////////////////////////////////////////;; +;;============================================================================;; align 4 @EXPORT: -export \ - lib_init , 'lib_init' , \ - 0x00050007 , 'version' , \ - img.is_img , 'img_is_img' , \ - img.info , 'img_info' , \ +export \ + lib_init , 'lib_init' , \ + 0x00050007 , 'version' , \ + img.is_img , 'img_is_img' , \ + img.info , 'img_info' , \ img.from_file , 'img_from_file' , \ - img.to_file , 'img_to_file' , \ + img.to_file , 'img_to_file' , \ img.from_rgb , 'img_from_rgb' , \ - img.to_rgb , 'img_to_rgb' , \ - img.to_rgb2 , 'img_to_rgb2' , \ - img.decode , 'img_decode' , \ - img.encode , 'img_encode' , \ - img.create , 'img_create' , \ - img.destroy , 'img_destroy' , \ + img.to_rgb , 'img_to_rgb' , \ + img.to_rgb2 , 'img_to_rgb2' , \ + img.decode , 'img_decode' , \ + img.encode , 'img_encode' , \ + img.create , 'img_create' , \ + img.destroy , 'img_destroy' , \ img.destroy.layer , 'img_destroy_layer' , \ - img.count , 'img_count' , \ + img.count , 'img_count' , \ img.lock_bits , 'img_lock_bits' , \ img.unlock_bits , 'img_unlock_bits' , \ - img.flip , 'img_flip' , \ + img.flip , 'img_flip' , \ img.flip.layer , 'img_flip_layer' , \ - img.rotate , 'img_rotate' , \ + img.rotate , 'img_rotate' , \ img.rotate.layer , 'img_rotate_layer' , \ - img.draw , 'img_draw' , \ - img.scale , 'img_scale' , \ + img.draw , 'img_draw' , \ + img.scale , 'img_scale' , \ img.get_scaled_size, 'img_get_scaled_size', \ - img.convert , 'img_convert' , \ - img.blend , 'img_blend' , \ + img.convert , 'img_convert' , \ + img.blend , 'img_blend' , \ img.resize_data , 'img_resize_data' , \ img.formats_table , 'img_formats_table' @@ -2831,32 +2873,32 @@ export \ align 16 @IMPORT: -library \ - archiver, 'archiver.obj', \ - libio , 'libio.obj' +library \ + archiver, 'archiver.obj', \ + libio , 'libio.obj' -import archiver, \ - deflate_unpack2, 'deflate_unpack2',\ - deflateInit2, 'deflateInit2',\ - deflateReset, 'deflateReset',\ - deflate, 'deflate',\ - deflateEnd, 'deflateEnd',\ - calc_crc32, 'calc_crc32' +import archiver, \ + deflate_unpack2, 'deflate_unpack2',\ + deflateInit2, 'deflateInit2',\ + deflateReset, 'deflateReset',\ + deflate, 'deflate',\ + deflateEnd, 'deflateEnd',\ + calc_crc32, 'calc_crc32' -import libio , \ - file.size , 'file_size' , \ - file.open , 'file_open' , \ - file.read , 'file_read' , \ - file.close, 'file_close' +import libio , \ + file.size , 'file_size' , \ + file.open , 'file_open' , \ + file.read , 'file_read' , \ + file.close, 'file_close' align 4 ; mutex for unpacker loading -deflate_loader_mutex dd 0 +deflate_loader_mutex dd 0 ; default palette for GIF - b&w gif_default_palette: - db 0, 0, 0 - db 0xFF, 0xFF, 0xFF + db 0, 0, 0 + db 0xFF, 0xFF, 0xFF ; uninitialized data - global constant tables mem.alloc dd ? @@ -2865,7 +2907,7 @@ mem.realloc dd ? dll.load dd ? ; data for YCbCr -> RGB translation -color_table_1 rd 256 -color_table_2 rd 256 -color_table_3 rd 256 -color_table_4 rd 256 +color_table_1 rd 256 +color_table_2 rd 256 +color_table_3 rd 256 +color_table_4 rd 256 diff --git a/programs/media/kiv/trunk/kiv.asm b/programs/media/kiv/trunk/kiv.asm index e1867cc3db..d6915ce319 100644 --- a/programs/media/kiv/trunk/kiv.asm +++ b/programs/media/kiv/trunk/kiv.asm @@ -37,7 +37,8 @@ START: mcall SF_SYSTEM, SSF_MOUSE_SETTINGS, SSSF_SET_SPEEDUP, 5 mcall SF_SYS_MISC, SSF_HEAP_INIT mcall SF_KEYBOARD, SSF_SET_INPUT_MODE, 1 ; set kbd mode to scancodes - mcall SF_SET_EVENTS_MASK, EVM_REDRAW or EVM_KEY or EVM_BUTTON or EVM_MOUSE or EVM_MOUSE_FILTER + mcall SF_SET_EVENTS_MASK, EVM_REDRAW or EVM_KEY or EVM_BUTTON or \ + EVM_MOUSE or EVM_MOUSE_FILTER stdcall dll.Load, @IMPORT or eax, eax @@ -57,7 +58,7 @@ START: mov esi, __params mov edi, path mov ecx, 4096/4 - rep movsd + rep movsd mov byte[edi-1], 0 @@: ; OpenDialog initialisation @@ -73,7 +74,7 @@ START: mov [slide_key], eax invoke ini_get_shortcut, inifilename, aKivSection, aTglbar, -1, tglbar_mod mov [tglbar_key], eax - + invoke ini_get_int, inifilename, aKivSection, aWinX, 100 mov [window.left], eax invoke ini_get_int, inifilename, aKivSection, aWinY, 150 @@ -100,7 +101,7 @@ START: mov esi, path mov edi, __params mov ecx, 4096/4 - rep movsd + rep movsd mov byte[edi-1], 0 jmp params_given @@ -148,7 +149,7 @@ still: @@: movi eax, SF_WAIT_EVENT_TIMEOUT .wait_event: - mcall + mcall dec eax jns @f call red_update_frame @@ -470,7 +471,7 @@ button: invoke img.rotate, [cur_image] @@: invoke img.rotate, [orig_image] - mov [bNewImage], 1 + mov [bNewImage], 1 jmp redraw_all ; rotate right @@ -497,14 +498,14 @@ button: mov edi, __params push edi mov ecx, 4096/4 - rep movsd + rep movsd mov byte[edi-1], 0 pop esi push esi call find_last_name_component - pop eax + pop eax push [cur_image] stdcall load_image, eax jc .restore_old @@ -831,7 +832,7 @@ load_directory: sub ecx, esi dec ecx js @f - rep movsb + rep movsb @@: mov byte[edi], 0 mcall 68, 12, 0x1000 @@ -935,7 +936,7 @@ load_directory: .copy: mov esi, [esp] mov ecx, 304 / 4 - rep movsd + rep movsd inc dword[esp+4] .nocopy: .noext: @@ -1051,7 +1052,7 @@ proc draw_window @@: test eax, eax jz @f - mcall SF_CHANGE_WINDOW, -1, -1, , + mcall SF_CHANGE_WINDOW, -1, -1, , @@: .min_size_ok: @@ -1059,36 +1060,36 @@ proc draw_window jz @f call generate_window_header @@: - cmp [window.width], 0 - jne @f - mcall SF_GET_SCREEN_SIZE - mov ebx,eax ; - shr ebx,16 ; ebx = width - movzx esi,ax ; esi = height - - mov eax, ebx - xor edx, edx - mov ebx, 3 - div ebx - imul eax, 2 - mov [window.width], eax + cmp [window.width], 0 + jne @f + mcall SF_GET_SCREEN_SIZE + mov ebx, eax + shr ebx, 16 ; ebx = width + movzx esi, ax ; esi = height - xor edx, edx - mov ebx, 4 - div ebx - mov [window.left], eax - - mov eax, esi - xor edx, edx - mov ebx, 3 - div ebx - imul eax, 2 - mov [window.height], eax - - xor edx, edx - mov ebx, 4 - div ebx - mov [window.top], eax + mov eax, ebx + xor edx, edx + mov ebx, 3 + div ebx + imul eax, 2 + mov [window.width], eax + + xor edx, edx + mov ebx, 4 + div ebx + mov [window.left], eax + + mov eax, esi + xor edx, edx + mov ebx, 3 + div ebx + imul eax, 2 + mov [window.height], eax + + xor edx, edx + mov ebx, 4 + div ebx + mov [window.top], eax @@: mcall SF_REDRAW, SSF_BEGIN_DRAW @@ -1234,11 +1235,11 @@ proc draw_toolbar uses ebx esi edi mcall mov ebx, [toolbar_abs_left] add ebx, [toolbar.width] - sub ebx, 25*5+10 + sub ebx, 25*5+10 shl ebx, 16 add ebx, [toolbar_abs_left] add ebx, [toolbar.width] - sub ebx, 25*5+10 + sub ebx, 25*5+10 mcall mov ebx, [toolbar_abs_left] @@ -1260,7 +1261,7 @@ proc draw_toolbar uses ebx esi edi mcall , , , 'scl'+40000000h mov ebx, [toolbar_abs_left] add ebx, [toolbar.width] - sub ebx, 25*5+10 + sub ebx, 25*5+10 add ebx, 5 shl ebx, 16 mov bl, 21 @@ -1308,7 +1309,7 @@ proc draw_toolbar uses ebx esi edi mcall , buttons+rotccwbtn*20 add edx, 25*65536 mcall , buttons+rot180btn*20 - + .quit: ret endp @@ -1529,7 +1530,7 @@ proc draw_fullscreen_controls add edx, [canvas.top] mcall 65, buttons+backbtn*20, <20, 20>, , 8, palette add edx, 25 SHL 16 - mcall 65, buttons+forwardbtn*20, , , 8, + mcall 65, buttons+forwardbtn*20, , , 8, pop esi ret endp @@ -1630,7 +1631,7 @@ proc generate_window_header push eax ebx esi edi mov esi, [last_name_component] mov edi, window_header - mov [window_header_len], 4 ; [,/,], + mov [window_header_len], 4 ; [,/,], mov byte[edi], '[' inc edi @@ -1968,7 +1969,7 @@ proc merge_icons_to_single_img _img mov edi, [ebx+Image.Data] mov ecx, [ebx+Image.Width] imul ecx, [ebx+Image.Height] - rep stosd + rep stosd mov eax, [_img] cmp [eax+Image.Type], Image.bpp32 @@ -2022,7 +2023,7 @@ endl add edi, eax .next_line: mov ecx, [edx+Image.Width] - rep movsd + rep movsd mov eax, [ebx+Image.Width] sub eax, [edx+Image.Width] shl eax, 2 @@ -2093,7 +2094,7 @@ proc recalc_client stdcall copy_box, work, work_prev xor ecx, ecx - test [bShowToolbar], 1 + test [bShowToolbar], 1 jz @f mov ecx, [toolbar.height] @@: @@ -2527,7 +2528,7 @@ db 'XBM',0 db 0 draw_window_fake: - ret + ret ;------------------------------------------------------------------------------ scale_mode_calc dd scale_none_calc, 0, 0, 0, scale_fit_min_calc