libimg: can save 32 bit png

git-svn-id: svn://kolibrios.org@8463 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2020-12-21 13:58:19 +00:00
parent 8b8d6bf12d
commit e532373af8
7 changed files with 610 additions and 606 deletions

View File

@ -8,7 +8,7 @@ dd 1,START,I_END,MEM,STACKTOP,0,cur_dir_path
include '../../../../../proc32.inc'
include '../../../../../macros.inc'
include '../../../../../KOSfuncs.inc'
include '../../../box_lib/load_lib.mac'
include '../../../../../load_lib.mac'
include '../../../../../dll.inc'
include '../../libimg/libimg.inc'
@ -28,7 +28,7 @@ else
end if
}
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
align 4
m1size dd 16*1024
@ -251,18 +251,9 @@ lib_name_0 db 'buf2d.obj',0
system_dir_1 db '/sys/lib/'
lib_name_1 db 'libimg.obj',0
err_message_found_lib0 db 'Sorry I cannot load library buf2d.obj',0
err_message_found_lib1 db 'Sorry I cannot load library libimg.obj',0
head_f_i:
head_f_l db 'System error',0
err_message_import0 db 'Error on load import library buf2d.obj',0
err_message_import1 db 'Error on load import library libimg.obj',0
l_libs_start:
lib0 l_libs lib_name_0, cur_dir_path, library_path, system_dir_0,\
err_message_found_lib0, head_f_l, import_buf2d_lib,err_message_import0, head_f_i
lib1 l_libs lib_name_1, cur_dir_path, library_path, system_dir_1,\
err_message_found_lib1, head_f_l, import_libimg, err_message_import1, head_f_i
lib0 l_libs lib_name_0, library_path, system_dir_0, import_buf2d_lib
lib1 l_libs lib_name_1, library_path, system_dir_1, import_libimg
load_lib_end:
;---------------------------------------------------------------------
@ -270,8 +261,6 @@ align 16
I_END:
rd 4096
STACKTOP:
cur_dir_path:
rb 4096
library_path:
rb 4096
cur_dir_path rb 4096
library_path rb 4096
MEM:

View File

@ -741,7 +741,7 @@ proc img.decode _data, _length, _options ;//////////////////////////////////////
endp
;;================================================================================================;;
proc img.encode _img, _common, _specific ;////////////////////////////////////////////////////////;;
proc img.encode uses ebx, _img, _common, _specific ;////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? encode image to some format ;;
;;------------------------------------------------------------------------------------------------;;

View File

@ -1465,34 +1465,34 @@ PNG_FORMAT_FLAG_AFIRST equ 0x20 ;alpha channel comes first
PNG_FORMAT_GRAY equ 0
PNG_FORMAT_GA equ PNG_FORMAT_FLAG_ALPHA
PNG_FORMAT_AG equ (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST)
PNG_FORMAT_AG equ (PNG_FORMAT_GA or PNG_FORMAT_FLAG_AFIRST)
PNG_FORMAT_RGB equ PNG_FORMAT_FLAG_COLOR
PNG_FORMAT_BGR equ (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR)
PNG_FORMAT_RGBA equ (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA)
PNG_FORMAT_ARGB equ (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST)
PNG_FORMAT_BGRA equ (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA)
PNG_FORMAT_ABGR equ (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST)
PNG_FORMAT_BGR equ (PNG_FORMAT_FLAG_COLOR or PNG_FORMAT_FLAG_BGR)
PNG_FORMAT_RGBA equ (PNG_FORMAT_RGB or PNG_FORMAT_FLAG_ALPHA)
PNG_FORMAT_ARGB equ (PNG_FORMAT_RGBA or PNG_FORMAT_FLAG_AFIRST)
PNG_FORMAT_BGRA equ (PNG_FORMAT_BGR or PNG_FORMAT_FLAG_ALPHA)
PNG_FORMAT_ABGR equ (PNG_FORMAT_BGRA or PNG_FORMAT_FLAG_AFIRST)
; Then the linear 2-byte formats. When naming these "Y" is used to
; indicate a luminance (gray) channel.
PNG_FORMAT_LINEAR_Y equ PNG_FORMAT_FLAG_LINEAR
PNG_FORMAT_LINEAR_Y_ALPHA equ (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA)
PNG_FORMAT_LINEAR_RGB equ (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR)
PNG_FORMAT_LINEAR_Y_ALPHA equ (PNG_FORMAT_FLAG_LINEAR or PNG_FORMAT_FLAG_ALPHA)
PNG_FORMAT_LINEAR_RGB equ (PNG_FORMAT_FLAG_LINEAR or PNG_FORMAT_FLAG_COLOR)
PNG_FORMAT_LINEAR_RGB_ALPHA equ\
(PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA)
(PNG_FORMAT_FLAG_LINEAR or PNG_FORMAT_FLAG_COLOR or PNG_FORMAT_FLAG_ALPHA)
; With color-mapped formats the image data is one byte for each pixel, the byte
; is an index into the color-map which is formatted as above. To obtain a
; color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP
; to one of the above definitions, or you can use one of the definitions below.
PNG_FORMAT_RGB_COLORMAP equ (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_BGR_COLORMAP equ (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_RGBA_COLORMAP equ (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_ARGB_COLORMAP equ (PNG_FORMAT_ARGB|PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_BGRA_COLORMAP equ (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_ABGR_COLORMAP equ (PNG_FORMAT_ABGR|PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_RGB_COLORMAP equ (PNG_FORMAT_RGB or PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_BGR_COLORMAP equ (PNG_FORMAT_BGR or PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_RGBA_COLORMAP equ (PNG_FORMAT_RGBA or PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_ARGB_COLORMAP equ (PNG_FORMAT_ARGB or PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_BGRA_COLORMAP equ (PNG_FORMAT_BGRA or PNG_FORMAT_FLAG_COLORMAP)
PNG_FORMAT_ABGR_COLORMAP equ (PNG_FORMAT_ABGR or PNG_FORMAT_FLAG_COLORMAP)
; PNG_IMAGE macros
@ -1555,8 +1555,8 @@ local .end0
local .end1
mov eax,fmt
and eax,PNG_FORMAT_FLAG_COLORMAP
cmp eax,0
je .end0
or eax,eax
jz .end0
xor eax,eax
inc eax
jmp .end1
@ -1573,9 +1573,11 @@ macro PNG_IMAGE_PIXEL_CHANNELS fmt
; color-mapped image.
;#define PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\
; PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_COMPONENT_SIZE,fmt)
; /* The size, in bytes, of each component in a pixel; 1 for a color-mapped
macro PNG_IMAGE_PIXEL_COMPONENT_SIZE fmt
{
PNG_IMAGE_PIXEL_ PNG_IMAGE_SAMPLE_COMPONENT_SIZE,fmt
}
; The size, in bytes, of each component in a pixel; 1 for a color-mapped
; image.

View File

@ -24,11 +24,11 @@ proc png_set_bKGD uses ecx edi esi, png_ptr:dword, info_ptr:dword, background:dw
cmp dword[png_ptr],0
je .end_f
mov edi,[info_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[background]
cmp esi,0
je .end_f ;if (..==0 || ..==0 || ..==0) return
or esi,esi
jz .end_f ;if (..==0 || ..==0 || ..==0) return
or dword[edi+png_info_def.valid],PNG_INFO_bKGD
add edi,png_info_def.background
@ -87,11 +87,11 @@ proc png_set_cHRM_XYZ_fixed uses edi esi, png_ptr:dword, info_ptr:dword,\
png_debug1 1, 'in %s storage function', 'cHRM XYZ fixed'
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f ;if (..==0 || ..==0) return
or esi,esi
jz .end_f ;if (..==0 || ..==0) return
; XYZ.red_X = int_red_X;
; XYZ.red_Y = int_red_Y;
@ -155,11 +155,11 @@ proc png_set_gAMA_fixed uses eax edi esi, png_ptr:dword, info_ptr:dword, file_ga
png_debug1 1, 'in %s storage function', 'gAMA'
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f ;if (..== 0 || ..== 0) return
or esi,esi
jz .end_f ;if (..== 0 || ..== 0) return
mov eax,esi
add eax,png_info_def.colorspace
@ -186,11 +186,11 @@ proc png_set_hIST uses edi esi, png_ptr:dword, info_ptr:dword, hist:dword
png_debug1 1, 'in %s storage function', 'hIST'
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f ;if (..== 0 || ..== 0) return
or esi,esi
jz .end_f ;if (..== 0 || ..== 0) return
; if (info_ptr->num_palette == 0 || info_ptr->num_palette
; > PNG_MAX_PALETTE_LENGTH)
@ -236,11 +236,11 @@ proc png_set_IHDR, png_ptr:dword, info_ptr:dword,\
png_debug1 1, 'in %s storage function', 'IHDR'
pushad
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f ;if (..== 0 || ..== 0) return
or esi,esi
jz .end_f ;if (..== 0 || ..== 0) return
mov eax,[width]
mov [esi+png_info_def.width],eax
@ -271,8 +271,8 @@ pushad
@@:
mov eax,ebx
and eax,PNG_COLOR_MASK_COLOR
cmp eax,0
je @f ;else if (..!=0)
or eax,eax
jz @f ;else if (..!=0)
mov byte[esi+png_info_def.channels], 3
jmp .end0
@@: ;else
@ -281,8 +281,8 @@ pushad
mov eax,ebx
and eax,PNG_COLOR_MASK_ALPHA
cmp eax,0
je @f ;else if (..!=0)
or eax,eax
jz @f ;else if (..!=0)
inc byte[esi+png_info_def.channels]
@@:
@ -307,8 +307,8 @@ proc png_set_oFFs uses eax esi, png_ptr:dword, info_ptr:dword, offset_x:dword, o
cmp dword[png_ptr],0
je @f
mov esi,[info_ptr]
cmp esi,0
je @f ;if (..==0 || ..==0) return
or esi,esi
jz @f ;if (..==0 || ..==0) return
mov eax,[offset_x]
mov [esi+png_info_def.x_offset],eax
@ -332,11 +332,11 @@ proc png_set_pCAL uses edi esi, png_ptr:dword, info_ptr:dword, purpose:dword, X0
png_debug1 1, 'in %s storage function', 'pCAL'
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f
or esi,esi
jz .end_f
cmp dword[purpose],0
je .end_f
cmp dword[units],0
@ -599,11 +599,11 @@ proc png_set_PLTE uses eax edi esi, png_ptr:dword, info_ptr:dword, palette:dword
png_debug1 1, 'in %s storage function', 'PLTE'
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f ;if (..==0 || ..==0) return
or esi,esi
jz .end_f ;if (..==0 || ..==0) return
; max_palette_length = (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
; (1 << info_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
@ -679,11 +679,11 @@ proc png_set_sRGB uses eax edi esi, png_ptr:dword, info_ptr:dword, srgb_intent:d
png_debug1 1, 'in %s storage function', 'sRGB'
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f ;if (..==0 || ..==0)
or esi,esi
jz .end_f ;if (..==0 || ..==0)
mov eax,esi
add eax,png_info_def.colorspace
@ -790,8 +790,8 @@ proc png_set_text uses eax edi, png_ptr:dword, info_ptr:dword, text_ptr:dword, n
mov edi,[png_ptr]
stdcall png_set_text_2, edi, [info_ptr], [text_ptr], [num_text]
cmp eax,0
je @f ;if (..!=0)
or eax,eax
jz @f ;if (..!=0)
png_error edi, 'Insufficient memory to store text'
@@:
ret
@ -997,18 +997,18 @@ proc png_set_tIME uses eax ebx ecx edi esi, png_ptr:dword, info_ptr:dword, mod_t
png_debug1 1, 'in %s storage function', 'tIME'
mov ebx,[png_ptr]
cmp ebx,0
je .end_f
or ebx,ebx
jz .end_f
mov edi,[info_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[mod_time]
cmp esi,0
je .end_f
or esi,esi
jz .end_f
mov eax,[ebx+png_struct.mode]
and eax,PNG_WROTE_tIME
cmp eax,0
jne .end_f ;if (..==0 || ..==0 || ..==0 || ..!=0) return
or eax,eax
jnz .end_f ;if (..==0 || ..==0 || ..==0 || ..!=0) return
cmp byte[esi+png_time.month],0
je @f
@ -1251,11 +1251,11 @@ proc png_set_unknown_chunks uses edi esi, png_ptr:dword, info_ptr:dword, unknown
; png_unknown_chunkp np;
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f
or esi,esi
jz .end_f
cmp dword[num_unknowns],0
jle .end_f
cmp dword[unknowns],0
@ -1431,8 +1431,8 @@ proc png_set_keep_unknown_chunks uses edi, png_ptr:dword, keep:dword, chunk_list
; uint num_chunks, old_num_chunks;
mov edi,[png_ptr]
cmp edi,0
je .end_f ;if (..== 0) return
or edi,edi
jz .end_f ;if (..== 0) return
; if (keep < 0 || keep >= PNG_HANDLE_CHUNK_LAST)
; {
@ -1588,8 +1588,8 @@ proc png_set_read_user_chunk_fn uses eax edi, png_ptr:dword, user_chunk_ptr:dwor
png_debug 1, 'in png_set_read_user_chunk_fn'
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov eax,[read_user_chunk_fn]
mov [edi+png_struct.read_user_chunk_fn],eax
@ -1605,11 +1605,11 @@ proc png_set_rows uses eax edi esi, png_ptr:dword, info_ptr:dword, row_pointers:
png_debug1 1, 'in %s storage function', 'rows'
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f ;if (..==0 || ..==0) return
or esi,esi
jz .end_f ;if (..==0 || ..==0) return
mov eax,[row_pointers]
cmp dword[esi+png_info_def.row_pointers],0
@ -1620,8 +1620,8 @@ proc png_set_rows uses eax edi esi, png_ptr:dword, info_ptr:dword, row_pointers:
@@:
mov [esi+png_info_def.row_pointers],eax
cmp eax,0
je .end_f ;if (..!=0)
or eax,eax
jz .end_f ;if (..!=0)
or dword[esi+png_info_def.valid],PNG_INFO_IDAT
.end_f:
ret
@ -1631,8 +1631,8 @@ endp
align 4
proc png_set_compression_buffer_size uses edi, png_ptr:dword, size:dword
mov edi,[png_ptr]
cmp edi,0
je .end_f ;if (..==0) return
or edi,edi
jz .end_f ;if (..==0) return
; if (size == 0 || size > PNG_UINT_31_MAX)
; png_error(png_ptr, "invalid compression buffer size");
@ -1707,8 +1707,8 @@ proc png_set_user_limits uses eax edi, png_ptr:dword, user_width_max:dword, user
; regardless of dimensions, set both limits to 0x7fffffff.
mov edi,[png_ptr]
cmp edi,0
je @f
or edi,edi
jz @f
mov eax,[user_width_max]
mov [edi+png_struct.user_width_max],eax
mov eax,[user_height_max]

View File

@ -99,11 +99,11 @@ proc png_write_info_before_PLTE, png_ptr:dword, info_ptr:dword
pushad
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f ;if(..==0 || ..==0) return
or esi,esi
jz .end_f ;if(..==0 || ..==0) return
mov eax,[edi+png_struct.mode]
and eax,PNG_WROTE_INFO_BEFORE_PLTE
@ -256,11 +256,11 @@ pushad
png_debug 1, 'in png_write_info'
mov edi,[png_ptr]
cmp edi,0
je .end_f
or edi,edi
jz .end_f
mov esi,[info_ptr]
cmp esi,0
je .end_f ;if (..==0 || ..==0) return
or esi,esi
jz .end_f ;if (..==0 || ..==0) return
stdcall png_write_info_before_PLTE, edi, esi
@ -1842,7 +1842,6 @@ proc png_image_write_init uses ebx ecx edx edi esi, image:dword
test eax,eax
jz .end0 ;if (..!=0)
mov edi,eax
or dword[eax+png_struct.transformations],PNG_BGR ;transformation rgb for KoliriOS
stdcall png_create_info_struct, edi
;eax = info_ptr
@ -2454,16 +2453,18 @@ endl
; The following four ints are actually booleans
and ecx,PNG_FORMAT_FLAG_COLORMAP
mov [colormap],ecx
mov [colormap],ecx ;colormap = (format & PNG_FORMAT_FLAG_COLORMAP)
not ecx
mov eax,[format]
and eax,PNG_FORMAT_FLAG_LINEAR
mov [linear],eax
mov eax,[format]
and eax,ecx
mov [linear],eax ;linear = !colormap && (format & PNG_FORMAT_FLAG_LINEAR)
mov eax,[format]
and eax,PNG_FORMAT_FLAG_ALPHA
and eax,ecx
mov [alpha],eax
mov [alpha],eax ;alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA)
xor eax,eax ;false
cmp dword[edx+png_image_write_control.convert_to_8bit],0
jne @f
@ -2758,7 +2759,7 @@ end if
; supported by the rest of the libpng write code; call it directly.
.end9: ;else
if 1 ;;; IDAT compress all (only 24 bit)
if 1 ;;; IDAT compress all
cmp dword[ebx+png_image.height],1
jl .end8
mov ecx,[edx+png_image_write_control.row_bytes]
@ -2794,7 +2795,7 @@ locals
endl
pushad
mov edi,[png_ptr]
png_debug 1, 'IDAT compress all'
png_debug1 2, 'IDAT compress all len = %d', [len]
;create buffer with filters
stdcall png_zalloc, edi, 1, [len]
@ -2815,9 +2816,14 @@ png_debug 1, 'IDAT compress all'
;init buffer with filters
mov ebx,[width]
mov edx,[height]
movzx eax,byte[edi+png_struct.color_type]
mov edi,[buf_f]
mov esi,[buf]
.cycle0:
cmp eax,PNG_COLOR_TYPE_RGB_ALPHA
je .cycle5
.cycle0: ;24 bit image
cmp edx,1
jl .cycle0end
mov ecx,ebx
@ -2835,14 +2841,30 @@ align 4
dec edx
jmp .cycle0
.cycle0end:
jmp .cycle5end
.cycle5: ;32 bit image
cmp edx,1
jl .cycle5end
mov ecx,ebx
xor al,al
stosb ;insert filter (0 - none)
align 4
.cycle6:
lodsd
bswap eax
ror eax,8
stosd
loop .cycle6
dec edx
jmp .cycle5
.cycle5end:
;make filters
mov edx,[height]
mov esi,[width]
imul esi,3 ;esi - rowbytes
inc esi
mov edi,[png_ptr]
mov esi,[edi+png_struct.rowbytes]
inc esi
cmp dword[edi+png_struct.try_row],0
jne @f ;if (..==0)
stdcall png_malloc, edi, esi
@ -2938,8 +2960,7 @@ align 4
.cycle3end:
mov edi,[png_ptr]
mov esi,edi
add esi,png_struct.zstream
lea esi,[edi+png_struct.zstream]
stdcall [deflateInit2], esi,\
-1, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY
@ -3095,8 +3116,8 @@ endl
; Write the image to the given buffer, or count the bytes if it is NULL
mov ebx,[image]
cmp ebx,0
je .end0
or ebx,ebx
jz .end0
cmp dword[ebx+png_image.version],PNG_IMAGE_VERSION
jne .end0 ;if (..!=0 && ..==..)
cmp dword[memory_bytes],0
@ -3142,8 +3163,8 @@ endl
stdcall png_image_free, ebx
; write_memory returns true even if we ran out of buffer.
cmp ecx,0 ;if (..)
je .end4
or ecx,ecx ;if (..)
jz .end4
; On out-of-buffer this function returns '0' but still updates
; memory_bytes:
@ -3167,8 +3188,8 @@ endl
std_png_image_error ebx, 'png_image_write_to_memory: invalid argument'
jmp .end_f
.end0:
cmp ebx,0
je .end1 ;else if (..!=0)
or ebx,ebx
jz .end1 ;else if (..!=0)
std_png_image_error ebx, 'png_image_write_to_memory: incorrect PNG_IMAGE_VERSION'
jmp .end_f
.end1: ;else

View File

@ -362,8 +362,7 @@ endl
cmp dword[edi+png_struct.zowner],0
je .end0 ;if (..!=0)
mov ebx,ebp
sub ebx,64
lea ebx,[ebp-64]
if (PNG_WARNINGS_SUPPORTED eq 1) | (PNG_ERROR_TEXT_SUPPORTED eq 1)
mov eax,[owner]
mov [ebx],eax
@ -1012,8 +1011,7 @@ end if
mov [edi+png_struct.usr_channels],al
; Pack the header information into the buffer
mov ebx,ebp
sub ebx,13
lea ebx,[ebp-13]
stdcall png_save_uint_32, ebx, [width]
add ebx,4
stdcall png_save_uint_32, ebx, [height]
@ -1043,8 +1041,7 @@ end if
cmp byte[edi+png_struct.color_type],PNG_COLOR_TYPE_PALETTE
je @f
cmp byte[edi+png_struct.bit_depth],8
jl @f ;if ((..==..)||(..<..))
jmp .els_5
jge .els_5 ;if ((..==..)||(..<..))
@@:
mov byte[edi+png_struct.do_filter], PNG_FILTER_NONE
jmp .end_5
@ -1371,8 +1368,7 @@ endl
png_debug 1, 'in png_write_gAMA'
; file_gamma is saved in 1/100,000ths
mov ebx,ebp
sub ebx,4
lea ebx,[ebp-4]
stdcall png_save_uint_32 ,ebx, [file_gamma]
stdcall png_write_complete_chunk, [png_ptr], png_gAMA, ebx, 4
ret
@ -1441,8 +1437,7 @@ endl
; png_error(png_ptr, "Profile length does not match profile");
; }
mov ebx,ebp
sub ebx,sizeof.compression_state
lea ebx,[ebp-sizeof.compression_state]
mov ecx,ebx ;ecx = &comp
sub ebx,81 ;ebx = &new_name
stdcall png_check_keyword, edi, [name], ebx
@ -1632,8 +1627,7 @@ endl
; Each value is saved in 1/100,000ths
mov eax,[xy]
mov ebx,ebp
sub ebx,32
lea ebx,[ebp-32]
; png_save_int_32(buf, xy->whitex);
; png_save_int_32(buf + 4, xy->whitey);
@ -1691,8 +1685,7 @@ endl
jmp .end_f
@@:
movzx eax,word[ecx+png_color_16.gray]
mov ebx,ebp
sub ebx,6
lea ebx,[ebp-6]
stdcall png_save_uint_16, ebx, eax
stdcall png_write_complete_chunk, edi, png_tRNS, ebx, 2
jmp .end_f
@ -1701,8 +1694,7 @@ endl
cmp dword[color_type],PNG_COLOR_TYPE_RGB
jne .end3 ;else if (..== ..)
; Three 16-bit values
mov ebx,ebp
sub ebx,6
lea ebx,[ebp-6]
mov ecx,[tran]
movzx eax,word[ecx+png_color_16.red]
stdcall png_save_uint_16, ebx, eax
@ -1720,8 +1712,8 @@ end if
mov al,[ebx]
or al,[ebx+2]
or al,[ebx+4]
cmp al,0
je @f ;if (..|..|..!=0)
or al,al
jz @f ;if (..|..|..!=0)
png_app_warning edi, 'Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8'
jmp .end_f
@@:
@ -1947,8 +1939,7 @@ endl
png_debug 1, 'in png_write_iTXt'
pushad
mov edi,[png_ptr]
mov ebx,ebp
sub ebx,82+sizeof.compression_state
lea ebx,[ebp-(82+sizeof.compression_state)]
stdcall png_check_keyword, edi, [key], ebx
mov [key_len],eax
@ -2057,8 +2048,7 @@ endl
png_warning edi, 'Unrecognized unit type for oFFs chunk'
@@:
mov ebx,ebp
sub ebx,9
lea ebx,[ebp-9]
stdcall png_save_int_32, ebx, [x_offset]
add ebx,4
stdcall png_save_int_32, ebx, [y_offset]
@ -2095,8 +2085,7 @@ pushad
png_error edi, 'Unrecognized equation type for pCAL chunk'
@@:
mov ebx,ebp
sub ebx,84 ;ebx = &new_purpose
lea ebx,[ebp-84] ;ebx = &new_purpose
stdcall png_check_keyword, edi, [purpose], ebx
mov [purpose_len],eax
@ -2129,8 +2118,7 @@ pushad
png_debug1 3, 'pCAL total length = %d', [total_len]
stdcall png_write_chunk_header, edi, png_pCAL, [total_len]
stdcall png_write_chunk_data, edi, ebx, [purpose_len]
mov ebx,ebp
sub ebx,94 ;ebx = &buf
lea ebx,[ebp-94] ;ebx = &buf
stdcall png_save_int_32, ebx, [X0]
add ebx,4
stdcall png_save_int_32, ebx, [X1]
@ -2181,8 +2169,7 @@ endl
jmp .end_f
@@:
mov ebx,ebp
sub ebx,64
lea ebx,[ebp-64]
mov eax,[unit]
mov byte[ebx],al
mov ecx,[wlen]
@ -2216,8 +2203,7 @@ endl
png_warning [png_ptr], 'Unrecognized unit type for pHYs chunk'
@@:
mov ebx,ebp
sub ebx,9
lea ebx,[ebp-9]
stdcall png_save_uint_32, ebx, [x_pixels_per_unit]
add ebx,4
stdcall png_save_uint_32, ebx, [y_pixels_per_unit]
@ -2264,8 +2250,7 @@ endl
movzx ebx,word[eax+png_time.year]
push ebx
mov ebx,ebp
sub ebx,7
lea ebx,[ebp-7]
stdcall png_save_uint_16, ebx ;, year
add ebx,2
mov byte[ebx],cl ;month

View File

@ -1178,21 +1178,29 @@ endl
mov eax,[ebx+Image.Type]
cmp eax,Image.bpp24
je @f
cmp eax,Image.bpp32
jne .error
mov ecx,LIBIMG_ERROR_BIT_DEPTH
jmp .error
@@:
mov edx,ebp
sub edx,sizeof.png_image
lea edx,[ebp-sizeof.png_image]
mov dword[edx+png_image.version],PNG_IMAGE_VERSION
mov ecx,[ebx+Image.Width]
mov [edx+png_image.width],ecx ;Image width in pixels (columns)
cmp eax,Image.bpp24
jne @f
mov dword[edx+png_image.format],PNG_FORMAT_RGB
imul ecx,3
@@:
cmp eax,Image.bpp32
jne @f
mov dword[edx+png_image.format],PNG_FORMAT_RGBA
shl ecx,2
@@:
mov eax,[ebx+Image.Height]
mov [edx+png_image.height],eax ;Image height in pixels (rows)
mov dword[edx+png_image.format],PNG_COLOR_TYPE_RGB
;mov dword[edx+png_image.flags],PNG_IMAGE_FLAG_???
imul ecx,3
mov edi,ecx
imul edi,[ebx+Image.Height]
cmp edi,4096
@ -1207,8 +1215,7 @@ endl
jmp .error
@@:
mov [encoded_file],eax
mov edi,edx
sub edi,4
lea edi,[edx-4]
stdcall png_image_write_to_memory, edx,eax,edi,0,[ebx+Image.Data],ecx,0
mov eax,[encoded_file]
mov ecx,[encoded_file_size]