img.scale and img.convert fix for multiframe images

new function: img.get_scaled_size


git-svn-id: svn://kolibrios.org@6807 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Ivan Baravy 2016-12-22 23:29:25 +00:00
parent c299820b03
commit 741b6ad89c
4 changed files with 3721 additions and 3519 deletions

View File

@ -17,15 +17,70 @@
;; ;; ;; ;;
;;================================================================================================;; ;;================================================================================================;;
;;================================================================================================;; ;;================================================================================================;;
proc img.convert _src, _dst, _dst_type, _flags, _param ;; proc img.convert _src, _dst, _dst_type, _flags, _param ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? scale _image ;; ;? convert _image ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> [_src] = pointer to source 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 ;; ;> [_flags] = see libimg.inc ;;
;> [_dst_type] = the Image.Type of converted image ;; ;> [_param] = depends on _flags fields, see libimg.inc ;;
;> [_dst] = pointer to destination image, if any ;; ;;------------------------------------------------------------------------------------------------;;
;< eax = 0 / pointer to converted image ;;
;< ecx = error code / undefined ;;
;;================================================================================================;;
push ebx esi edi 0 0
mov ebx, [_src]
@@:
mov eax, [ebx + Image.Previous]
test eax, eax
jz .loop
mov ebx, eax
jmp @b
.loop:
stdcall img.convert.layer, ebx, [_dst], [_dst_type], [_flags], [_param]
test eax, eax
jz .error
cmp dword[esp + 4], 0
jnz @f
mov [esp + 4], eax
@@:
mov ecx, [esp]
jecxz @f
mov [ecx + Image.Next], eax
@@:
push [ebx + Image.Flags]
pop [eax + Image.Flags]
push [ebx + Image.Delay]
pop [eax + Image.Delay]
mov [eax + Image.Previous], ecx
mov [esp], eax
mov ebx, [ebx + Image.Next]
test ebx, ebx
jnz .loop
.quit:
pop eax eax edi esi ebx
ret
.error:
pop eax eax 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 ;; ;< eax = 0 / pointer to converted image ;;
;< ecx = error code / undefined ;; ;< ecx = error code / undefined ;;
@ -34,6 +89,8 @@ locals
width rd 1 width rd 1
height rd 1 height rd 1
endl endl
push ebx esi edi
mov ebx, [_src] mov ebx, [_src]
mov eax, 1 mov eax, 1
mov ecx, [_dst_type] mov ecx, [_dst_type]
@ -151,6 +208,13 @@ endl
mov eax, [_dst] mov eax, [_dst]
jmp .quit jmp .quit
.bpp8g_to_bpp8g:
mov ecx, [ebx + Image.Width]
imul ecx, [ebx + Image.Height]
rep movsb
mov eax, [_dst]
jmp .quit
.bpp8g_to_bpp24: .bpp8g_to_bpp24:
mov ecx, [ebx + Image.Width] mov ecx, [ebx + Image.Width]
imul ecx, [ebx + Image.Height] imul ecx, [ebx + Image.Height]
@ -199,6 +263,19 @@ endl
jnz @b jnz @b
mov eax, [_dst] mov eax, [_dst]
jmp .quit jmp .quit
.bpp24_to_bpp32:
mov ecx, [ebx + Image.Width]
imul ecx, [ebx + Image.Height]
@@:
lodsw
ror eax, 16
lodsb
rol eax, 16
stosd
dec ecx
jnz @b
mov eax, [_dst]
jmp .quit
.bpp32: .bpp32:
@ -561,25 +638,28 @@ end repeat
.error: .error:
xor eax, eax xor eax, eax
.quit: .quit:
pop edi esi ebx
ret ret
endp endp
img.convert.bpp8i.table: img.convert.bpp8i.table:
dd Image.bpp24, img.convert.bpp8i_to_bpp24 dd Image.bpp24, img.convert.layer.bpp8i_to_bpp24
img.convert.bpp8g.table: img.convert.bpp8g.table:
dd Image.bpp24, img.convert.bpp8g_to_bpp24 dd Image.bpp24, img.convert.layer.bpp8g_to_bpp24
dd Image.bpp1, img.convert.bpp8g_to_bpp1 dd Image.bpp8g, img.convert.layer.bpp8g_to_bpp8g
dd Image.bpp1, img.convert.layer.bpp8g_to_bpp1
img.convert.bpp24.table: img.convert.bpp24.table:
dd Image.bpp24, img.convert.bpp24_to_bpp24 dd Image.bpp24, img.convert.layer.bpp24_to_bpp24
dd Image.bpp8g, img.convert.bpp24_to_bpp8g dd Image.bpp8g, img.convert.layer.bpp24_to_bpp8g
dd Image.bpp32, img.convert.layer.bpp24_to_bpp32
img.convert.bpp32.table: img.convert.bpp32.table:
dd Image.bpp24, img.convert.bpp32_to_bpp24 dd Image.bpp24, img.convert.layer.bpp32_to_bpp24
img.convert.bpp15.table: img.convert.bpp15.table:
dd Image.bpp24, img.convert.bpp15_to_bpp24 dd Image.bpp24, img.convert.layer.bpp15_to_bpp24
img.convert.bpp16.table: img.convert.bpp16.table:
dd Image.bpp24, img.convert.bpp16_to_bpp24 dd Image.bpp24, img.convert.layer.bpp16_to_bpp24
img.convert.bpp1.table: img.convert.bpp1.table:
dd Image.bpp24, img.convert.bpp1_to_bpp24 dd Image.bpp24, img.convert.layer.bpp1_to_bpp24
img.convert.bpp8a.table: img.convert.bpp8a.table:
dd Image.bpp24, img.convert.bpp8a_to_bpp24 dd Image.bpp24, img.convert.layer.bpp8a_to_bpp24

File diff suppressed because it is too large Load Diff

View File

@ -1,124 +1,127 @@
;;================================================================================================;; ;;================================================================================================;;
;;//// libimg.inc //// (c) mike.dld, 2007-2008, (c) diamond, 2009, (c) dunkaist, 2011-2013 ///////;; ;;//// libimg.inc //// (c) mike.dld, 2007-2008, (c) diamond, 2009, (c) dunkaist, 2011-2013 ///////;;
;;================================================================================================;; ;;================================================================================================;;
;; ;; ;; ;;
;; This file is part of Common development libraries (Libs-Dev). ;; ;; 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 ;; ;; 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 ;; ;; 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. ;; ;; 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 ;; ;; 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 ;; ;; even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;
;; Lesser General Public License for more details. ;; ;; Lesser General Public License for more details. ;;
;; ;; ;; ;;
;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev. ;; ;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev. ;;
;; If not, see <http://www.gnu.org/licenses/>. ;; ;; If not, see <http://www.gnu.org/licenses/>. ;;
;; ;; ;; ;;
;;================================================================================================;; ;;================================================================================================;;
; list of format id's ; list of format id's
LIBIMG_FORMAT_BMP = 1 LIBIMG_FORMAT_BMP = 1
LIBIMG_FORMAT_ICO = 2 LIBIMG_FORMAT_ICO = 2
LIBIMG_FORMAT_CUR = 3 LIBIMG_FORMAT_CUR = 3
LIBIMG_FORMAT_GIF = 4 LIBIMG_FORMAT_GIF = 4
LIBIMG_FORMAT_PNG = 5 LIBIMG_FORMAT_PNG = 5
LIBIMG_FORMAT_JPEG = 6 LIBIMG_FORMAT_JPEG = 6
LIBIMG_FORMAT_TGA = 7 LIBIMG_FORMAT_TGA = 7
LIBIMG_FORMAT_PCX = 8 LIBIMG_FORMAT_PCX = 8
LIBIMG_FORMAT_XCF = 9 LIBIMG_FORMAT_XCF = 9
LIBIMG_FORMAT_TIFF = 10 LIBIMG_FORMAT_TIFF = 10
LIBIMG_FORMAT_PNM = 11 LIBIMG_FORMAT_PNM = 11
LIBIMG_FORMAT_WBMP = 12 LIBIMG_FORMAT_WBMP = 12
LIBIMG_FORMAT_XBM = 13 LIBIMG_FORMAT_XBM = 13
LIBIMG_FORMAT_Z80 = 14 LIBIMG_FORMAT_Z80 = 14
; scale type ; corresponding img.scale params ; scale type ; corresponding img.scale params
LIBIMG_SCALE_INTEGER = 1 ; scale factor ; reserved 0 LIBIMG_SCALE_NONE = 0 ; do not scale
LIBIMG_SCALE_TILE = 2 ; new width ; new height LIBIMG_SCALE_INTEGER = 1 ; scale factor ; reserved 0
LIBIMG_SCALE_STRETCH = 3 ; new width ; new height LIBIMG_SCALE_TILE = 2 ; new width ; new height
LIBIMG_SCALE_FIT_RECT = 4 ; new width ; new height LIBIMG_SCALE_STRETCH = 3 ; new width ; new height
LIBIMG_SCALE_FIT_WIDTH = 5 ; new width ; new height LIBIMG_SCALE_FIT_BOTH = LIBIMG_SCALE_STRETCH
LIBIMG_SCALE_FIT_HEIGHT = 6 ; new width ; new height LIBIMG_SCALE_FIT_MIN = 4 ; new width ; new height
LIBIMG_SCALE_FIT_MAX = 7 ; new width ; new height LIBIMG_SCALE_FIT_RECT = LIBIMG_SCALE_FIT_MIN
LIBIMG_SCALE_FIT_WIDTH = 5 ; new width ; new height
; interpolation algorithm LIBIMG_SCALE_FIT_HEIGHT = 6 ; new width ; new height
LIBIMG_INTER_NONE = 0 ; use it with LIBIMG_SCALE_INTEGER, LIBIMG_SCALE_TILE, etc LIBIMG_SCALE_FIT_MAX = 7 ; new width ; new height
LIBIMG_INTER_BILINEAR = 1
;LIBIMG_INTER_BICUBIC = 2 ; interpolation algorithm
;LIBIMG_INTER_LANCZOS = 3 LIBIMG_INTER_NONE = 0 ; use it with LIBIMG_SCALE_INTEGER, LIBIMG_SCALE_TILE, etc
LIBIMG_INTER_DEFAULT = LIBIMG_INTER_BILINEAR LIBIMG_INTER_BILINEAR = 1
;LIBIMG_INTER_BICUBIC = 2
; error codes ;LIBIMG_INTER_LANCZOS = 3
LIBIMG_ERROR_OUT_OF_MEMORY = 1 LIBIMG_INTER_DEFAULT = LIBIMG_INTER_BILINEAR
LIBIMG_ERROR_FORMAT = 2
LIBIMG_ERROR_CONDITIONS = 3 ; error codes
LIBIMG_ERROR_BIT_DEPTH = 4 LIBIMG_ERROR_OUT_OF_MEMORY = 1
LIBIMG_ERROR_ENCODER = 5 LIBIMG_ERROR_FORMAT = 2
LIBIMG_ERROR_SRC_TYPE = 6 LIBIMG_ERROR_CONDITIONS = 3
LIBIMG_ERROR_SCALE = 7 LIBIMG_ERROR_BIT_DEPTH = 4
LIBIMG_ERROR_INTER = 8 LIBIMG_ERROR_ENCODER = 5
LIBIMG_ERROR_NOT_INPLEMENTED = 9 LIBIMG_ERROR_SRC_TYPE = 6
LIBIMG_ERROR_INVALID_INPUT = 10 LIBIMG_ERROR_SCALE = 7
LIBIMG_ERROR_INTER = 8
; encode flags (byte 0x02 of _common option) LIBIMG_ERROR_NOT_INPLEMENTED = 9
LIBIMG_ENCODE_STRICT_SPECIFIC = 0x01 LIBIMG_ERROR_INVALID_INPUT = 10
LIBIMG_ENCODE_STRICT_BIT_DEPTH = 0x02
LIBIMG_ENCODE_DELETE_ALPHA = 0x08 ; encode flags (byte 0x02 of _common option)
LIBIMG_ENCODE_FLUSH_ALPHA = 0x10 ;LIBIMG_ENCODE_STRICT_SPECIFIC = 0x01
LIBIMG_ENCODE_STRICT_BIT_DEPTH = 0x02
; convert flags ;LIBIMG_ENCODE_DELETE_ALPHA = 0x08
; TBD ;LIBIMG_ENCODE_FLUSH_ALPHA = 0x10
struct FormatsTableEntry ; convert flags
Format_id dd ? ; none so far
Is dd ?
Decode dd ? struct FormatsTableEntry
Encode dd ? Format_id dd ?
Capabilities dd ? Is dd ?
ends Decode dd ?
Encode dd ?
struct Image Capabilities dd ?
Checksum dd ? ; ((Width ROL 16) OR Height) XOR Data[0] ; ignored so far ends
Width dd ?
Height dd ? struct Image
Next dd ? Checksum dd ? ; ((Width ROL 16) OR Height) XOR Data[0] ; ignored so far
Previous dd ? Width dd ?
Type dd ? ; one of Image.bppN Height dd ?
Data dd ? Next dd ?
Palette dd ? ; used iff Type eq Image.bpp1, Image.bpp2, Image.bpp4 or Image.bpp8i Previous dd ?
Extended dd ? Type dd ? ; one of Image.bppN
Flags dd ? ; bitfield Data dd ?
Delay dd ? ; used iff Image.IsAnimated is set in Flags Palette dd ? ; used iff Type eq Image.bpp1, Image.bpp2, Image.bpp4 or Image.bpp8i
ends Extended dd ?
Flags dd ? ; bitfield
; values for Image.Type Delay dd ? ; used iff Image.IsAnimated is set in Flags
; must be consecutive to allow fast switch on Image.Type in support functions ends
Image.bpp8i = 1 ; indexed
Image.bpp24 = 2 ; values for Image.Type
Image.bpp32 = 3 ; must be consecutive to allow fast switch on Image.Type in support functions
Image.bpp15 = 4 Image.bpp8i = 1 ; indexed
Image.bpp16 = 5 Image.bpp24 = 2
Image.bpp1 = 6 Image.bpp32 = 3
Image.bpp8g = 7 ; grayscale Image.bpp15 = 4
Image.bpp2i = 8 Image.bpp16 = 5
Image.bpp4i = 9 Image.bpp1 = 6
Image.bpp8a = 10 ; grayscale with alpha channel; application layer only!!! kernel doesn't handle this image type, libimg can only create and destroy such images Image.bpp8g = 7 ; grayscale
Image.bpp2i = 8
; bits in Image.Flags Image.bpp4i = 9
Image.IsAnimated = 1 Image.bpp8a = 10 ; grayscale with alpha channel; application layer only!!! kernel doesn't handle this image type, libimg can only create and destroy such images
struct ImageDecodeOptions ; bits in Image.Flags
UsedSize dd ? ; if >=8, the field BackgroundColor is valid, and so on Image.IsAnimated = 1
BackgroundColor dd ? ; used for transparent images as background
ends struct ImageDecodeOptions
UsedSize dd ? ; if >=8, the field BackgroundColor is valid, and so on
FLIP_VERTICAL = 0x01 BackgroundColor dd ? ; used for transparent images as background
FLIP_HORIZONTAL = 0x02 ends
FLIP_BOTH = FLIP_VERTICAL or FLIP_HORIZONTAL
FLIP_VERTICAL = 0x01
ROTATE_90_CW = 0x01 FLIP_HORIZONTAL = 0x02
ROTATE_180 = 0x02 FLIP_BOTH = FLIP_VERTICAL or FLIP_HORIZONTAL
ROTATE_270_CW = 0x03
ROTATE_90_CCW = ROTATE_270_CW ROTATE_90_CW = 0x01
ROTATE_270_CCW = ROTATE_90_CW ROTATE_180 = 0x02
ROTATE_270_CW = 0x03
ROTATE_90_CCW = ROTATE_270_CW
ROTATE_270_CCW = ROTATE_90_CW

File diff suppressed because it is too large Load Diff