From db0f7a7b77471ffa363b4dfe03d0e44b98363ee8 Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Thu, 10 Feb 2022 00:50:25 +0000 Subject: [PATCH] libimg: Implement more bit depth conversion routines git-svn-id: svn://kolibrios.org@9713 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/libs-dev/.test/005/test005.asm | 230 ++++++------- .../libraries/libs-dev/libimg/convert.asm | 309 ++++++++++++------ 2 files changed, 324 insertions(+), 215 deletions(-) diff --git a/programs/develop/libraries/libs-dev/.test/005/test005.asm b/programs/develop/libraries/libs-dev/.test/005/test005.asm index f40c00d68b..3cb9313c52 100644 --- a/programs/develop/libraries/libs-dev/.test/005/test005.asm +++ b/programs/develop/libraries/libs-dev/.test/005/test005.asm @@ -1,7 +1,7 @@ use32 org 0x0 - db 'MENUET01' - dd 0x01, START, I_END, E_END, E_END, 0, 0 + db 'MENUET01' + dd 0x01, START, I_END, E_END, E_END, 0, 0 ;----------------------------------------------------------------------------- @@ -16,39 +16,39 @@ include '../../libimg/libimg.inc' ;----------------------------------------------------------------------------- START: - mcall 68, 11 + mcall 68, 11 - stdcall dll.Load, @IMPORT - or eax, eax - jnz exit + stdcall dll.Load, @IMPORT + or eax, eax + jnz exit - invoke file.open, input_file, O_READ - or eax, eax - jz exit - mov [fh], eax + invoke file.open, input_file, O_READ + or eax, eax + jz exit + mov [fh], eax - invoke file.size, input_file - mov [img_data_len], ebx + invoke file.size, input_file + mov [img_data_len], ebx - stdcall mem.Alloc, ebx - or eax, eax - jz exit - mov [img_data], eax + stdcall mem.Alloc, ebx + or eax, eax + jz exit + mov [img_data], eax - invoke file.read, [fh], eax, [img_data_len] - cmp eax, -1 - je exit - cmp eax, [img_data_len] - jne exit + invoke file.read, [fh], eax, [img_data_len] + cmp eax, -1 + je exit + cmp eax, [img_data_len] + jne exit - invoke file.close, [fh] - inc eax - jz exit - - invoke img.decode, [img_data], [img_data_len], 0 - or eax, eax - jz exit - mov [image_initial], eax + invoke file.close, [fh] + inc eax + jz exit + + invoke img.decode, [img_data], [img_data_len], 0 + or eax, eax + jz exit + mov [image_initial], eax ;pushfd ;pushad @@ -57,128 +57,132 @@ START: ;newline ;popad ;popfd - stdcall mem.Free, [img_data] - test eax, eax - jz exit + stdcall mem.Free, [img_data] + test eax, eax + jz exit - invoke img.convert, [image_initial], 0, Image.bpp8g, 0, 0 - test eax, eax - jz exit - mov [image_converted], eax + invoke img.convert, [image_initial], 0, Image.bpp8g, 0, 0 + test eax, eax + jz exit + mov [image_converted], eax - invoke img.destroy, [image_initial] + invoke img.destroy, [image_initial] - mov ebx, [image_converted] - mov eax, [ebx + Image.Width] - add eax, 200*0x10000 + 5*2 - 1 ; window x position + 10 pixels width for skin borders - mov [window_width], eax + mov ebx, [image_converted] + mov eax, [ebx + Image.Width] + ; window x position + 10 pixels width for skin borders + add eax, 200*0x10000 + 5*2 - 1 + mov [window_width], eax - mcall 48, 4 ; get skin height - mov ebx, [image_converted] - add eax, [ebx + Image.Height] - add eax, 100*0x10000 + 5 - 1 ; window y position + 5 pixels height for skin bottom border - mov [window_height], eax + mcall 48, 4 ; get skin height + mov ebx, [image_converted] + add eax, [ebx + Image.Height] + ; window y position + 5 pixels height for skin bottom border + add eax, 100*0x10000 + 5 - 1 + mov [window_height], eax ;----------------------------------------------------------------------------- still: - mcall 10 - cmp eax, 1 - je .draw_window - cmp eax, 2 - je .key - cmp eax, 3 - je .button - jmp still + mcall 10 + cmp eax, 1 + je .draw_window + cmp eax, 2 + je .key + cmp eax, 3 + je .button + jmp still .draw_window: - mcall 12, 1 - mcall 0, [window_width], [window_height], 0x74FFFFFF, 0x00000000, window_title - call draw_image - mcall 12, 2 - jmp still + mcall 12, 1 + mcall 0, [window_width], [window_height], 0x74FFFFFF, 0x00000000, \ + window_title + call draw_image + mcall 12, 2 + jmp still .key: - mcall 2 - jmp still + mcall 2 + jmp still .button: - mcall 17 - shr eax, 8 - cmp eax, 1 - jne still + mcall 17 + shr eax, 8 + cmp eax, 1 + jne still exit: - invoke img.destroy, [image_converted] - mcall -1 + invoke img.destroy, [image_converted] + mcall -1 -proc draw_image +proc draw_image - mov ebx, [image_converted] - invoke img.draw, ebx, 0, 0, [ebx + Image.Width], [ebx + Image.Height], 0, 0 + mov ebx, [image_converted] + invoke img.draw, ebx, 0, 0, [ebx + Image.Width], \ + [ebx + Image.Height], 0, 0 - ret + ret endp ;----------------------------------------------------------------------------- -window_title db 'img.convert example',0 +window_title db 'img.convert example',0 input_file: - db '/hd0/1/kolibri_logo.jpg',0 -; db '/hd0/1/tga/CTC16.TGA',0 -; db '/hd0/1/indexed_packbits_le_test_00.tiff',0 -; db '/hd0/1/graya_123x123.tiff',0 -; db '/hd0/1/bilevel_00.wbmp',0 -; db '/hd0/1/rgb_af.jpg',0 -; db '/hd0/1/gray_5x7.tiff',0 -; db '/hd0/1/rgb_lzw_le_2x2.tiff',0 -; db '/hd0/1/grayscale_123x123.tiff',0 -; db '/hd0/1/grayscale_357x357.tiff',0 -; db '/hd0/1/grayscale_620x620.tiff',0 -; db '/hd0/1/rgb_220.jpg',0 -; db '/hd0/1/rgba_217.tiff',0 -; db '/hd0/1/rgb_7x9.tiff',0 -; db '/hd0/1/rgba_7x9.tiff',0 -; db '/hd0/1/gray_7x9.tiff',0 -; db '/hd0/1/rgb_70x90.png',0 + db '/hd0/1/kolibri_logo.jpg',0 +; db '/hd0/1/tga/CTC16.TGA',0 +; db '/hd0/1/indexed_packbits_le_test_00.tiff',0 +; db '/hd0/1/graya_123x123.tiff',0 +; db '/hd0/1/bilevel_00.wbmp',0 +; db '/hd0/1/rgb_af.jpg',0 +; db '/hd0/1/gray_5x7.tiff',0 +; db '/hd0/1/rgb_lzw_le_2x2.tiff',0 +; db '/hd0/1/grayscale_123x123.tiff',0 +; db '/hd0/1/grayscale_357x357.tiff',0 +; db '/hd0/1/grayscale_620x620.tiff',0 +; db '/hd0/1/rgb_220.jpg',0 +; db '/hd0/1/rgba_217.tiff',0 +; db '/hd0/1/rgb_7x9.tiff',0 +; db '/hd0/1/rgba_7x9.tiff',0 +; db '/hd0/1/gray_7x9.tiff',0 +; db '/hd0/1/rgb_70x90.png',0 ;----------------------------------------------------------------------------- align 4 @IMPORT: -library \ - libio , 'libio.obj' , \ - libimg , 'libimg.obj' +library \ + libio , 'libio.obj' , \ + libimg , 'libimg.obj' -import libio , \ - libio.init , 'lib_init' , \ - file.size , 'file_size' , \ - file.open , 'file_open' , \ - file.read , 'file_read' , \ - file.close , 'file_close' +import libio , \ + libio.init , 'lib_init' , \ + file.size , 'file_size' , \ + file.open , 'file_open' , \ + file.read , 'file_read' , \ + file.close , 'file_close' -import libimg , \ - libimg.init , 'lib_init' , \ - img.decode , 'img_decode' , \ - img.destroy , 'img_destroy' , \ - img.draw , 'img_draw' , \ - img.convert , 'img_convert' , \ - img.types_table , 'img_types_table' +import libimg , \ + libimg.init , 'lib_init' , \ + img.decode , 'img_decode' , \ + img.destroy , 'img_destroy' , \ + img.draw , 'img_draw' , \ + img.convert , 'img_convert' , \ + img.types_table , 'img_types_table' ;----------------------------------------------------------------------------- I_END: -fh dd ? -img_data_len dd ? -img_data dd ? +fh dd ? +img_data_len dd ? +img_data dd ? -image_initial dd ? -image_converted dd ? +image_initial dd ? +image_converted dd ? -window_width dd ? -window_height dd ? +window_width dd ? +window_height dd ? -rd 0x1000 ; stack +rd 0x1000 ; stack E_END: diff --git a/programs/develop/libraries/libs-dev/libimg/convert.asm b/programs/develop/libraries/libs-dev/libimg/convert.asm index 6c5f912c22..5d632a8ec3 100644 --- a/programs/develop/libraries/libs-dev/libimg/convert.asm +++ b/programs/develop/libraries/libs-dev/libimg/convert.asm @@ -1,38 +1,41 @@ -;;================================================================================================;; -;;//// convert.asm //// (c) dunkaist, 2012 ///////////////////////////////////////////////////////;; -;;================================================================================================;; -;; ;; -;; 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 . ;; -;; ;; -;;================================================================================================;; +;;============================================================================;; +;;//// convert.asm //// (c) dunkaist, 2012,2016,2017,2020,2022 ///////////////;; +;;============================================================================;; +;; ;; +;; This file is part of Common development libraries (Libs-Dev). ;; +;; ;; +;; SPDX-License-Identifier: LGPL-2.1-or-later ;; +;; ;; +;; 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 . ;; +;; ;; +;;============================================================================;; - -;;================================================================================================;; -proc img.convert _src, _dst, _dst_type, _flags, _param ;; -;;------------------------------------------------------------------------------------------------;; -;? convert _image ;; -;;------------------------------------------------------------------------------------------------;; -;> [_src] = pointer to source image ;; -;> [_dst] = pointer to destination image, or 0 to create a new one ;; -;> [_dst_type] = Image.Type of resulting image ;; -;> [_flags] = see libimg.inc ;; -;> [_param] = depends on _flags fields, see libimg.inc ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to converted image ;; -;< ecx = error code / undefined ;; -;;================================================================================================;; +;;============================================================================;; +proc img.convert _src, _dst, _dst_type, _flags, _param ;; +;;----------------------------------------------------------------------------;; +;? convert _image ;; +;;----------------------------------------------------------------------------;; +;> [_src] = pointer to source image ;; +;> [_dst] = pointer to destination image, or 0 to create a new one ;; +;> [_dst_type] = Image.Type of resulting image ;; +;> [_flags] = see libimg.inc ;; +;> [_param] = depends on _flags fields, see libimg.inc ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to converted image ;; +;< ecx = error code / undefined ;; +;;============================================================================;; locals img dd ? prev dd ? @@ -41,25 +44,25 @@ endl mov [img], 0 mov [prev], 0 mov ebx, [_src] - @@: +@@: mov eax, [ebx + Image.Previous] test eax, eax jz .loop mov ebx, eax jmp @b - .loop: +.loop: stdcall img.convert.layer, ebx, [_dst], [_dst_type], [_flags], [_param] test eax, eax jz .error cmp [img], 0 jnz @f mov [img], eax - @@: +@@: mov ecx, [prev] jecxz @f mov [ecx + Image.Next], eax mov [eax + Image.Previous], ecx - @@: +@@: mov [prev], eax push [ebx + Image.Flags] pop [eax + Image.Flags] @@ -69,26 +72,26 @@ endl test ebx, ebx jnz .loop mov eax, [img] - .error: +.error: pop edi esi ebx ret endp -;;================================================================================================;; -proc img.convert.layer _src, _dst, _dst_type, _flags, _param ;; -;;------------------------------------------------------------------------------------------------;; -;? convert _image layer ;; -;;------------------------------------------------------------------------------------------------;; -;> [_src] = pointer to source image ;; -;> [_dst] = pointer to destination image, or 0 to create a new one ;; -;> [_dst_type] = Image.Type of resulting image ;; -;> [_flags] = see libimg.inc ;; -;> [_param] = depends on _flags fields, see libimg.inc ;; -;;------------------------------------------------------------------------------------------------;; -;< eax = 0 / pointer to converted image ;; -;< ecx = error code / undefined ;; -;;================================================================================================;; +;;============================================================================;; +proc img.convert.layer _src, _dst, _dst_type, _flags, _param ;; +;;----------------------------------------------------------------------------;; +;? convert _image layer ;; +;;----------------------------------------------------------------------------;; +;> [_src] = pointer to source image ;; +;> [_dst] = pointer to destination image, or 0 to create a new one ;; +;> [_dst_type] = Image.Type of resulting image ;; +;> [_flags] = see libimg.inc ;; +;> [_param] = depends on _flags fields, see libimg.inc ;; +;;----------------------------------------------------------------------------;; +;< eax = 0 / pointer to converted image ;; +;< ecx = error code / undefined ;; +;;============================================================================;; locals fun rd 1 endl @@ -97,13 +100,11 @@ endl mov ebx, [_src] mov eax, [ebx + Image.Type] mov esi, [img.convert.table + 4*eax] - .next: + mov ecx, LIBIMG_ERROR_BIT_DEPTH +.next: lodsd test eax, eax - jnz @f - mov ecx, LIBIMG_ERROR_BIT_DEPTH - jmp .exit - @@: + jz .exit cmp eax, [_dst_type] lodsd jnz .next @@ -112,17 +113,18 @@ endl mov eax, [_dst] test eax, eax jnz @f - stdcall img.create, [ebx + Image.Width], [ebx + Image.Height], [_dst_type] + stdcall img.create, [ebx + Image.Width], [ebx + Image.Height], \ + [_dst_type] test eax, eax jz .exit mov [_dst], eax - @@: +@@: mov edi, [eax + Image.Data] mov esi, [ebx + Image.Data] mov eax, [ebx + Image.Type] stdcall [fun], [_src], [_dst] mov eax, [_dst] - .exit: +.exit: pop edi esi ebx ret endp @@ -134,7 +136,7 @@ proc img._.convert.bpp8i_to_bpp24 _src, _dst mov ebx, [ebx + Image.Palette] sub ecx, 1 jz .bpp8i.last - @@: +@@: movzx eax, byte[esi] add esi, 1 mov eax, [ebx + eax*4] @@ -142,7 +144,7 @@ proc img._.convert.bpp8i_to_bpp24 _src, _dst add edi, 3 sub ecx, 1 jnz @b - .bpp8i.last: +.bpp8i.last: movzx eax, byte[esi] mov eax, [ebx + eax*4] mov [edi], ax @@ -151,13 +153,12 @@ proc img._.convert.bpp8i_to_bpp24 _src, _dst ret endp - proc img._.convert.bpp8i_to_bpp32 _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] mov ebx, [ebx + Image.Palette] - @@: +@@: movzx eax, byte[esi] add esi, 1 mov eax, [ebx + eax*4] @@ -168,17 +169,16 @@ proc img._.convert.bpp8i_to_bpp32 _src, _dst ret endp - proc img._.convert.bpp8g_to_bpp1 _src, _dst mov eax, [_dst] mov eax, [eax + Image.Palette] mov dword[eax], 0x00000000 mov dword[eax + 4], 0xffffffff mov edx, [ebx + Image.Height] - .bpp8g_to_bpp1.line: +.bpp8g_to_bpp1.line: mov ax, 0x0800 mov ecx, [ebx + Image.Width] - .bpp8g_to_bpp1.pixel: +.bpp8g_to_bpp1.pixel: shl al, 1 cmp byte[esi], 0x7f cmc @@ -189,7 +189,7 @@ proc img._.convert.bpp8g_to_bpp1 _src, _dst mov byte[edi], al add edi, 1 mov ax, 0x0800 - @@: +@@: dec ecx jnz .bpp8g_to_bpp1.pixel cmp ah, 8 @@ -198,7 +198,7 @@ proc img._.convert.bpp8g_to_bpp1 _src, _dst shl al, cl mov byte[edi], al add edi, 1 - @@: +@@: dec edx jnz .bpp8g_to_bpp1.line ret @@ -207,7 +207,7 @@ endp proc img._.convert.bpp8g_to_bpp24 _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] - @@: +@@: mov al, byte[esi] mov byte[edi + 0], al mov byte[edi + 1], al @@ -219,6 +219,21 @@ proc img._.convert.bpp8g_to_bpp24 _src, _dst ret endp +proc img._.convert.bpp8g_to_bpp32 _src, _dst + mov ecx, [ebx + Image.Width] + imul ecx, [ebx + Image.Height] +@@: + mov al, byte[esi] + mov byte[edi + 0], al + mov byte[edi + 1], al + mov byte[edi + 2], al + mov byte[edi + 3], -1 + add esi, 1 + add edi, 4 + dec ecx + jnz @b + ret +endp proc img._.convert.bpp24_to_bpp24 _src, _dst mov ecx, [ebx + Image.Width] @@ -233,11 +248,10 @@ proc img._.convert.bpp24_to_bpp24 _src, _dst ret endp - proc img._.convert.bpp24_to_bpp8g _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] - @@: +@@: movzx ebx, byte[esi + 0] movzx eax, byte[esi + 1] add ebx, eax @@ -253,11 +267,10 @@ proc img._.convert.bpp24_to_bpp8g _src, _dst ret endp - proc img._.convert.bpp24_to_bpp32 _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] - @@: +@@: lodsw ror eax, 16 lodsb @@ -269,11 +282,22 @@ proc img._.convert.bpp24_to_bpp32 _src, _dst ret endp +proc img._.convert.bpp24_to_bpp1 _src, _dst + stdcall img.convert.layer, [_src], 0, Image.bpp8g, 0, 0 + test eax, eax + jz .exit + push eax + mov ecx, [_dst] + stdcall img.convert.layer, eax, ecx, [ecx+Image.Type], 0, 0 + stdcall img.destroy ; arg pushed +.exit: + ret +endp proc img._.convert.bpp32_to_bpp24 _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] - @@: +@@: mov eax, [esi] mov [edi], ax shr eax, 16 @@ -285,7 +309,6 @@ proc img._.convert.bpp32_to_bpp24 _src, _dst ret endp - proc img._.convert.bpp32_to_bpp32 _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] @@ -293,17 +316,48 @@ proc img._.convert.bpp32_to_bpp32 _src, _dst ret endp +proc img._.convert.bpp32_to_bpp1 _src, _dst + push esi + stdcall img.convert.layer, [_src], 0, Image.bpp24, 0, 0 + test eax, eax + jz .exit + push eax + stdcall img.convert.layer, eax, 0, Image.bpp8g, 0, 0 + mov esi, eax + stdcall img.destroy ; arg pushed + test esi, esi + jz .exit + push esi + mov ecx, [_dst] + stdcall img.convert.layer, esi, ecx, [ecx+Image.Type], 0, 0 + stdcall img.destroy ; arg pushed +.exit: + pop esi + ret +endp + +proc img._.convert.bpp32_to_bpp8g _src, _dst + stdcall img.convert.layer, [_src], 0, Image.bpp24, 0, 0 + test eax, eax + jz .exit + push eax + mov ecx, [_dst] + stdcall img.convert.layer, eax, ecx, [ecx+Image.Type], 0, 0 + stdcall img.destroy ; arg pushed +.exit: + ret +endp proc img._.convert.bpp15_to_bpp24 _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] - .bpp15.intel: ; copypasted from do_rgb +.bpp15.intel: ; copypasted from do_rgb push ebx ebp sub ecx, 4 jb .bpp15.tail align 16 - .bpp15.intel.loop: +.bpp15.intel.loop: repeat 2 mov ebx, [esi] mov al, [esi] @@ -350,7 +404,7 @@ repeat 2 end repeat sub ecx, 4 jnb .bpp15.intel.loop - .bpp15.tail: +.bpp15.tail: add ecx, 4 jz .bpp15.done @@: @@ -374,17 +428,17 @@ end repeat add edi, 3 sub ecx, 1 jnz @b - .bpp15.done: +.bpp15.done: pop ebp ebx mov eax, [_dst] jmp .quit - .bpp15.amd: +.bpp15.amd: push ebx ebp sub ecx, 4 jb .bpp15.tail align 16 - .bpp15.amd.loop: +.bpp15.amd.loop: repeat 4 if (% mod 2) = 1 mov eax, dword[esi] @@ -414,7 +468,7 @@ end repeat jnb .bpp15.amd.loop jmp .bpp15.tail - .quit: +.quit: ret endp @@ -422,12 +476,12 @@ endp proc img._.convert.bpp16_to_bpp24 _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] - .bpp16.intel: +.bpp16.intel: push ebx ebp sub ecx, 4 jb .bpp16.tail align 16 - .bpp16.intel.loop: +.bpp16.intel.loop: repeat 2 mov ebx, [esi] mov al, [esi] @@ -473,7 +527,7 @@ repeat 2 end repeat sub ecx, 4 jnb .bpp16.intel.loop - .bpp16.tail: +.bpp16.tail: add ecx, 4 jz .bpp16.done @@: @@ -497,17 +551,17 @@ end repeat add edi, 3 sub ecx, 1 jnz @b - .bpp16.done: +.bpp16.done: pop ebp ebx mov eax, [_dst] jmp .quit - .bpp16.amd: +.bpp16.amd: push ebx ebp sub ecx, 4 jb .bpp16.tail align 16 - .bpp16.amd.loop: +.bpp16.amd.loop: repeat 4 if (% mod 2) = 1 mov eax, dword[esi] @@ -537,12 +591,12 @@ end repeat jnb .bpp16.amd.loop jmp .bpp16.tail - .quit: +.quit: ret endp -proc img._.convert.bpp1_to_bpp24 _src, _dst +proc img._.convert.bpp1_to_bpp24 uses ebx, _src, _dst locals width rd 1 height rd 1 @@ -552,13 +606,13 @@ endl push [ebx + Image.Height] pop [height] mov edx, [ebx + Image.Palette] - .bpp1_to_bpp24.line: +.bpp1_to_bpp24.line: mov ebx, [width] - .bpp1_to_bpp24.byte: +.bpp1_to_bpp24.byte: mov ah, 8 mov al, byte[esi] add esi, 1 - .bpp1_to_bpp24.bit: +.bpp1_to_bpp24.bit: xor ecx, ecx shl al, 1 adc ecx, 0 @@ -572,14 +626,59 @@ endl sub [height], 1 jnz .bpp1_to_bpp24.line jmp .bpp1.done - @@: +@@: sub ah, 1 jnz .bpp1_to_bpp24.bit jmp .bpp1_to_bpp24.byte - .bpp1.done: +.bpp1.done: ret endp +proc img._.convert.bpp1_to_bpp32 _src, _dst + stdcall img.convert.layer, [_src], 0, Image.bpp24, 0, 0 + test eax, eax + jz .exit + push eax + mov ecx, [_dst] + stdcall img.convert.layer, eax, ecx, [ecx+Image.Type], 0, 0 + stdcall img.destroy ; arg pushed +.exit: + ret +endp + +proc img._.convert.bpp1_to_bpp8g _src, _dst +locals + width rd 1 + height rd 1 +endl + push [ebx + Image.Width] + pop [width] + push [ebx + Image.Height] + pop [height] +.line: + mov edx, [width] +.byte: + mov ah, 8 + mov al, byte[esi] + inc esi +.bit: + xor ecx, ecx + shl al, 1 + sbb ecx, 0 + mov byte[edi], cl + inc edi + dec edx + jnz @f + dec [height] + jnz .line + jmp .done +@@: + dec ah + jnz .bit + jmp .byte +.done: + ret +endp proc img._.convert.bpp8a_to_bpp1 _src, _dst mov eax, [_dst] @@ -587,10 +686,10 @@ proc img._.convert.bpp8a_to_bpp1 _src, _dst mov dword[eax], 0x00000000 mov dword[eax + 4], 0xffffffff mov edx, [ebx + Image.Height] - .bpp8a_to_bpp1.line: +.bpp8a_to_bpp1.line: mov ax, 0x0800 mov ecx, [ebx + Image.Width] - .bpp8a_to_bpp1.pixel: +.bpp8a_to_bpp1.pixel: shl al, 1 cmp byte[esi], 0x7f cmc @@ -601,7 +700,7 @@ proc img._.convert.bpp8a_to_bpp1 _src, _dst mov byte[edi], al add edi, 1 mov ax, 0x0800 - @@: +@@: dec ecx jnz .bpp8a_to_bpp1.pixel cmp ah, 8 @@ -610,7 +709,7 @@ proc img._.convert.bpp8a_to_bpp1 _src, _dst shl al, cl mov byte[edi], al add edi, 1 - @@: +@@: dec edx jnz .bpp8a_to_bpp1.line ret @@ -620,7 +719,7 @@ endp proc img._.convert.bpp8a_to_bpp24 _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] - @@: +@@: mov al, byte[esi] mov byte[edi + 0], al mov byte[edi + 1], al @@ -636,7 +735,7 @@ endp proc img._.convert.bpp8a_to_bpp32 _src, _dst mov ecx, [ebx + Image.Width] imul ecx, [ebx + Image.Height] - @@: +@@: lodsw shl eax, 8 mov al, ah @@ -657,10 +756,13 @@ img.convert.bpp24.table: dd Image.bpp24, img._.convert.bpp24_to_bpp24 dd Image.bpp8g, img._.convert.bpp24_to_bpp8g dd Image.bpp32, img._.convert.bpp24_to_bpp32 + dd Image.bpp1, img._.convert.bpp24_to_bpp1 dd 0 img.convert.bpp32.table: dd Image.bpp24, img._.convert.bpp32_to_bpp24 dd Image.bpp32, img._.convert.bpp32_to_bpp32 + dd Image.bpp1, img._.convert.bpp32_to_bpp1 + dd Image.bpp8g, img._.convert.bpp32_to_bpp8g dd 0 img.convert.bpp15.table: dd Image.bpp24, img._.convert.bpp15_to_bpp24 @@ -670,9 +772,12 @@ img.convert.bpp16.table: dd 0 img.convert.bpp1.table: dd Image.bpp24, img._.convert.bpp1_to_bpp24 + dd Image.bpp32, img._.convert.bpp1_to_bpp32 + dd Image.bpp8g, img._.convert.bpp1_to_bpp8g dd 0 img.convert.bpp8g.table: dd Image.bpp24, img._.convert.bpp8g_to_bpp24 + dd Image.bpp32, img._.convert.bpp8g_to_bpp32 dd Image.bpp1, img._.convert.bpp8g_to_bpp1 dd 0 img.convert.bpp2i.table: