d7b0867c02
v.1.0 rс3 12.06.2011 git-svn-id: svn://kolibrios.org@1951 a494cfbc-eb01-0410-851d-a64ba20cac60
897 lines
22 KiB
NASM
897 lines
22 KiB
NASM
;*****************************************************************************
|
||
; PNG to RAW convert plugin - for zSea image viewer
|
||
; Copyright (c) 2008-2011, Marat Zakiyanov aka Mario79, aka Mario
|
||
; All rights reserved.
|
||
;
|
||
; Redistribution and use in source and binary forms, with or without
|
||
; modification, are permitted provided that the following conditions are met:
|
||
; * Redistributions of source code must retain the above copyright
|
||
; notice, this list of conditions and the following disclaimer.
|
||
; * Redistributions in binary form must reproduce the above copyright
|
||
; notice, this list of conditions and the following disclaimer in the
|
||
; documentation and/or other materials provided with the distribution.
|
||
; * Neither the name of the <organization> nor the
|
||
; names of its contributors may be used to endorse or promote products
|
||
; derived from this software without specific prior written permission.
|
||
;
|
||
; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
|
||
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
;*****************************************************************************
|
||
|
||
format MS COFF
|
||
|
||
public EXPORTS
|
||
|
||
section '.flat' code readable align 16
|
||
|
||
;include 'macros.inc'
|
||
include '../../../../macros.inc'
|
||
;---------------------------------------------------------------------
|
||
START:
|
||
pushad
|
||
mov eax,dword [esp+36]
|
||
call check_header_1
|
||
je header_OK
|
||
;---------------------------------------------------------------------
|
||
no_png_file:
|
||
xor eax,eax
|
||
mov [raw_area],eax
|
||
inc eax ; data corrupt eax = 1
|
||
jmp header_OK.ret
|
||
;---------------------------------------------------------------------
|
||
check_header_1:
|
||
mov [pointer],eax
|
||
mov ebx,[eax]
|
||
mov [image_file],ebx
|
||
cmp [ebx],dword 0x474E5089 ; check main label p.1
|
||
jne @f ;no_png_file
|
||
cmp [ebx+4],dword 0x0A1A0A0D ; check main label p.2
|
||
ret
|
||
@@:
|
||
add esp,4
|
||
jmp no_png_file
|
||
;---------------------------------------------------------------------
|
||
header_OK:
|
||
mov ebx,[eax+12] ; file size
|
||
mov [file_size],ebx
|
||
;---------------------------------------------------------------------
|
||
mov ebx,[eax+16]
|
||
mov [deflate_unpack],ebx
|
||
;---------------------------------------------------------------------
|
||
mov ebx,[pointer]
|
||
;---------------------------------------------------------------------
|
||
xor eax,eax
|
||
; mov [IDAT.pointer],eax
|
||
; mov [IDAT.size],eax
|
||
mov [deflate_start_offset],eax
|
||
mov eax,[image_file]
|
||
mov [next_Chunk],eax
|
||
call search_IHDR
|
||
call search_IDAT
|
||
; call search_IEND
|
||
;---------------------------------------------------------------------
|
||
mov eax,[IHDR.pointer]
|
||
mov ecx,[eax] ; get width PNG
|
||
call convert_NBO_to_PC
|
||
mov [IHDR_data.Width],ecx ; store width PNG
|
||
mov [Image_Width],ecx
|
||
mov ecx,[eax+4] ; get height PNG
|
||
call convert_NBO_to_PC
|
||
mov [IHDR_data.Height],ecx ; store height PNG
|
||
mov [Image_Height],ecx
|
||
mov ecx,[eax+9] ; Color type
|
||
; Compression method
|
||
; Filter method
|
||
; Interlace method
|
||
mov [IHDR_data.Color_type],ecx
|
||
xor ecx,ecx
|
||
mov cl,[eax+8] ; Bit depth
|
||
mov [IHDR_data.Bit_depth],cl
|
||
;---------------------------------------------------------------------
|
||
mov al,[eax+9] ; check Color type
|
||
cmp al,byte 0 ; Each pixel is a grayscale sample.
|
||
je .resolution
|
||
cmp al,byte 2 ; Each pixel is an R,G,B triple.
|
||
je .Bit_depth_2
|
||
cmp al,byte 3 ; Each pixel is a palette index
|
||
; a PLTE chunk must appear.
|
||
jne .no_PLTE
|
||
call search_PLTE
|
||
jmp .resolution
|
||
.no_PLTE:
|
||
cmp al,byte 4 ; Each pixel is a grayscale sample,
|
||
; followed by an alpha sample.
|
||
je .Bit_depth_4
|
||
cmp al,byte 6 ; Each pixel is an R,G,B triple,
|
||
; followed by an alpha sample.
|
||
jne no_png_file
|
||
;---------------------------------------------------------------------
|
||
.Bit_depth_6:
|
||
shl ecx,1
|
||
|
||
.Bit_depth_4:
|
||
shl ecx,1
|
||
jmp .resolution
|
||
|
||
.Bit_depth_2:
|
||
lea ecx,[ecx*3]
|
||
|
||
.resolution:
|
||
;---------------------------------------------------------------------
|
||
cmp [IHDR_data.Compression_method], byte 0 ; check Compression method
|
||
jne no_png_file
|
||
|
||
cmp [IHDR_data.Filter_method], byte 0 ; check Filtering method
|
||
jne no_png_file
|
||
|
||
cmp [IHDR_data.Interlace_method], byte 0 ; No Interlaced
|
||
je @f
|
||
cmp [IHDR_data.Interlace_method], byte 1 ; Interlaced
|
||
jne no_png_file
|
||
@@:
|
||
;---------------------------------------------------------------------
|
||
mov [resolution],ecx
|
||
imul ecx,[IHDR_data.Width]
|
||
mov edi,ecx
|
||
shr ecx,3
|
||
test edi,7
|
||
jz @f
|
||
inc ecx
|
||
@@:
|
||
imul ecx,[IHDR_data.Height]
|
||
cmp [IHDR_data.Color_type],byte 3
|
||
jne @f
|
||
mov eax,[PLTE.size]
|
||
mov ebx,3
|
||
xor edx,edx
|
||
div ebx
|
||
shl eax,2
|
||
add ecx,eax ; PLTE table area
|
||
jmp .RAW_header
|
||
;--------------------------------------
|
||
@@:
|
||
cmp [IHDR_data.Color_type],byte 0
|
||
je @f
|
||
cmp [IHDR_data.Color_type],byte 4
|
||
jne .RAW_header
|
||
@@:
|
||
push ecx
|
||
mov eax,1
|
||
movzx ecx,byte [IHDR_data.Bit_depth]
|
||
cmp ecx,16
|
||
jne @f
|
||
shr ecx,1
|
||
@@:
|
||
shl eax,cl
|
||
shl eax,2
|
||
pop ecx
|
||
add ecx,eax
|
||
; mov ebx,[pointer]
|
||
; mov [ebx+20],eax
|
||
;--------------------------------------
|
||
.RAW_header:
|
||
add ecx,44 ; RAW header
|
||
; mov ebx,[pointer]
|
||
; mov [ebx+24],ecx
|
||
; shl ecx,1
|
||
mcall 68, 12
|
||
cmp eax,0
|
||
jne @f
|
||
xor eax,eax
|
||
mov [raw_area],eax ; store pointer of image area
|
||
mov eax,2 ; not enough memory
|
||
jmp .ret
|
||
@@:
|
||
mov [raw_area],eax
|
||
; mov ebx,[pointer]
|
||
; mov [ebx+28],eax
|
||
;---------------------------------------------------------------------
|
||
mov edi,eax
|
||
xor eax,eax
|
||
shr ecx,2
|
||
cld
|
||
rep stosd ; clear memory
|
||
;---------------------------------------------------------------------
|
||
; Create RAW header
|
||
;---------------------------------------------------------------------
|
||
mov eax,[raw_area]
|
||
mov [eax],dword 'RAW '
|
||
;---------------------------------------------------------------------
|
||
mov ecx,[IHDR_data.Width] ; width BMP
|
||
mov [eax+4],ecx ; width RAW
|
||
;---------------------------------------------------------------------
|
||
mov ecx,[IHDR_data.Height] ; high BMP
|
||
mov [eax+8],ecx ;high RAW
|
||
;---------------------------------------------------------------------
|
||
mov ecx,[resolution] ; color resolution BMP
|
||
mov [eax+12],ecx ;color resolution RAW
|
||
;---------------------------------------------------------------------
|
||
xor ecx,ecx
|
||
mov cl,[IHDR_data.Bit_depth]
|
||
mov [eax+16],cx ;channel color resolution RAW
|
||
;---------------------------------------------------------------------
|
||
mov ecx,[IHDR_data.Color_type]
|
||
xor ebx,ebx
|
||
inc ebx
|
||
cmp cl,byte 0 ; Each pixel is a grayscale sample.
|
||
je .1
|
||
cmp cl,byte 2 ; Each pixel is an R,G,B triple.
|
||
je .Bit_depth_2_1
|
||
cmp cl,byte 3 ; Each pixel is a palette index
|
||
; a PLTE chunk must appear.
|
||
je .1
|
||
cmp cl,byte 4 ; Each pixel is a grayscale sample,
|
||
; followed by an alpha sample.
|
||
je .Bit_depth_4_1
|
||
cmp cl,byte 6
|
||
jne no_png_file
|
||
.Bit_depth_6_1:
|
||
shl ebx,1
|
||
.Bit_depth_4_1:
|
||
shl ebx,1
|
||
jmp .1
|
||
.Bit_depth_2_1:
|
||
lea ebx,[ebx*3]
|
||
.1:
|
||
mov [eax+18],bx ; channels amount RAW
|
||
;---------------------------------------------------------------------
|
||
xor edx,edx
|
||
cmp cl,byte 3 ; Each pixel is a palette index
|
||
; a PLTE chunk must appear.
|
||
je @f
|
||
cmp cl,0
|
||
je @f
|
||
cmp cl,4
|
||
jne .no_PLTE_1
|
||
@@:
|
||
add edx,44
|
||
mov [eax+20],edx ; palette pointer (offset from file start)
|
||
;---------------------------------------------------------------------
|
||
cmp cl,0
|
||
je @f
|
||
cmp cl,4
|
||
jne .PLTE
|
||
@@:
|
||
mov ecx,256*4
|
||
jmp .PLTE_1
|
||
.PLTE:
|
||
push eax
|
||
mov eax,[PLTE.size]
|
||
xor edx,edx
|
||
mov ebx,3
|
||
div ebx
|
||
shl eax,2
|
||
mov ecx,eax
|
||
pop eax
|
||
.PLTE_1:
|
||
mov [eax+24],ecx ; palette area size
|
||
jmp @f
|
||
.no_PLTE_1:
|
||
xor ecx,ecx
|
||
@@:
|
||
;---------------------------------------------------------------------
|
||
add ecx,dword 44
|
||
mov [eax+28],ecx ; pixels pointer (offset from file start)
|
||
; mov ebx,[pointer]
|
||
; mov [ebx+44],ecx
|
||
;---------------------------------------------------------------------
|
||
mov ecx, [IHDR_data.Width] ; width BMP
|
||
imul ecx,[resolution]
|
||
mov edi,ecx
|
||
shr ecx,3
|
||
test edi,7
|
||
jz @f
|
||
inc ecx
|
||
@@:
|
||
imul ecx,[IHDR_data.Height] ; high BMP
|
||
mov [eax+32],ecx ; pixels area size
|
||
;---------------------------------------------------------------------
|
||
xor ecx,ecx ; Stub!!!
|
||
mov [eax+36],ecx ;Transparency pointer (offset from file start)
|
||
mov [eax+40],ecx ;Transparency area size
|
||
|
||
;---------------------------------------------------------------------
|
||
; Finish create RAW header
|
||
;---------------------------------------------------------------------
|
||
|
||
mov eax,[raw_area]
|
||
mov edi,[eax+20] ; palette pointer (offset from file start)
|
||
add edi,eax
|
||
|
||
mov esi,[PLTE.pointer]
|
||
mov eax,[PLTE.size]
|
||
xor edx,edx
|
||
mov ebx,3
|
||
div ebx
|
||
mov ecx,eax
|
||
mov eax,[IHDR_data.Color_type]
|
||
cmp al,byte 0
|
||
je .grayscale_palette
|
||
cmp al,byte 4
|
||
je .grayscale_palette
|
||
cmp al,byte 3 ; Each pixel is a palette index
|
||
; a PLTE chunk must appear.
|
||
jne .no_palette
|
||
@@:
|
||
cld
|
||
lodsd
|
||
dec esi
|
||
and eax,0xffffff
|
||
|
||
mov bl,al
|
||
shr eax,8
|
||
xchg ah,bl
|
||
shl eax,8
|
||
mov al,bl
|
||
|
||
cld
|
||
stosd
|
||
dec ecx
|
||
jnz @r
|
||
jmp .no_palette
|
||
;-------------------------------
|
||
.grayscale_palette:
|
||
; cmp [IHDR_data.Bit_depth], dword 1
|
||
; jne @f
|
||
; xor eax,eax
|
||
; cld
|
||
; stosd
|
||
; dec eax
|
||
; and eax,0xffffff
|
||
; cld
|
||
; stosd
|
||
; jmp .no_palette
|
||
@@:
|
||
mov eax,1
|
||
mov ecx,[resolution]
|
||
cmp ecx,8
|
||
jbe @f
|
||
mov ecx,8
|
||
@@:
|
||
shl eax,cl
|
||
mov ecx,eax
|
||
mov eax,256
|
||
; mov ebx,[resolution]
|
||
xor edx,edx
|
||
div ecx ;ebx
|
||
mov edx,eax
|
||
cmp edx,0
|
||
jne @f
|
||
inc edx
|
||
@@:
|
||
xor eax,eax
|
||
; mov eax,0xffffff
|
||
; mov ecx,256
|
||
|
||
@@:
|
||
cld
|
||
stosd
|
||
; inc ah
|
||
add ah,dl
|
||
; inc al
|
||
add al,dl
|
||
shl eax,8
|
||
mov al,ah
|
||
|
||
; dec ah
|
||
; dec al
|
||
; shl eax,8
|
||
; mov al,ah
|
||
|
||
and eax,0xffffff
|
||
dec ecx
|
||
jnz @r
|
||
|
||
sub edi,4
|
||
xor eax,eax
|
||
dec eax
|
||
and eax,0xffffff
|
||
cld
|
||
stosd
|
||
;-------------------------------
|
||
.no_palette:
|
||
|
||
;---------------------------------------------------------------------
|
||
mov ebx,[IDAT.pointer]
|
||
mov al,[ebx]
|
||
mov [IDAT_CMF],al ; Compression Method and flags
|
||
mov ah,al
|
||
and al,1111b
|
||
mov [IDAT_<EFBFBD><EFBFBD>],al ; Compression method
|
||
shr ah,4
|
||
mov [IDAT_CINFO],ah ; Compression info
|
||
mov al,[ebx+1]
|
||
mov [IDAT_FLG],al ; FLaGs
|
||
mov ah,al
|
||
and al,11111b
|
||
mov [IDAT_FCHECK],al
|
||
mov al,ah
|
||
and al,100000b
|
||
shr al,5
|
||
mov [IDAT_FDICT],al ; Preset dictionary
|
||
shr ah,6
|
||
mov [IDAT_FLEVEL],ah ; Compression level
|
||
mov al,[IDAT_<EFBFBD><EFBFBD>]
|
||
; test al,1000b ; Compression method = 8 ?
|
||
cmp al,8
|
||
jnz no_png_file
|
||
add [IDAT.pointer],2
|
||
sub [IDAT.size],2
|
||
; xor eax,eax
|
||
; mov ah,[IDAT_FLG]
|
||
; mov al,[IDAT_CMF]
|
||
; imul eax,31
|
||
; shr eax,16
|
||
; cmp [IDAT_FCHECK],al
|
||
; jne no_png_file
|
||
|
||
;
|
||
; cmp [IDAT_FDICT],1
|
||
; jne .no_IDAT_FDICT
|
||
; mov ecx,[ebx+2]
|
||
; jmp .IDAT_DICT
|
||
;.no_IDAT_FDICT:
|
||
; mov eax,[IDAT.pointer]
|
||
; add eax,[IDAT.size]
|
||
; mov ecx,[eax]
|
||
;.IDAT_DICT:
|
||
; call convert_NBO_to_PC
|
||
; mov [IDAT_DICT],ecx
|
||
; jmp .ret_ok
|
||
|
||
; jmp no_png_file
|
||
|
||
; mov ecx,[file_size]
|
||
; mcall 68, 12
|
||
; mov [IDAT_raw_area],eax ; store pointer of image area
|
||
;---------------------------------------------------------------------
|
||
.start_Deflate_unpack:
|
||
push eax ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> *pUnpackedLength
|
||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> push <<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
|
||
push esp ; <20> <20><><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pUnpackedLength
|
||
push esi ; <20><><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
push deflate_callback
|
||
call [deflate_unpack]
|
||
pop ecx ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UnpackedLength
|
||
; <20><><EFBFBD> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, eax = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ecx = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
mov [unpacked_data],eax
|
||
mov esi,eax
|
||
;---------------------------------------------------------------------
|
||
mov eax,[raw_area]
|
||
mov edi,[eax+28] ; pixels pointer (offset from file start)
|
||
add edi,eax
|
||
; mov ecx,edx
|
||
sub ecx,[IHDR_data.Height]
|
||
mov [first_line],byte 1
|
||
cmp [IHDR_data.Color_type],byte 0
|
||
je .PLTE_and_grayscale
|
||
cmp [IHDR_data.Color_type],byte 3
|
||
je .PLTE_and_grayscale
|
||
cmp [IHDR_data.Color_type],byte 4
|
||
je .PLTE_and_grayscale
|
||
;---------------------------------------------------------------------
|
||
; Processing filtering RGB; type 2 and 6, sample 8b
|
||
;---------------------------------------------------------------------
|
||
mov eax,ecx
|
||
; sub eax,[IHDR_data.Height]
|
||
xor edx,edx
|
||
mov ebx,3
|
||
cmp [IHDR_data.Color_type],byte 6
|
||
jne @f
|
||
inc ebx
|
||
@@:
|
||
cmp [IHDR_data.Bit_depth],byte 16
|
||
jne @f
|
||
shl ebx,1
|
||
@@:
|
||
div ebx
|
||
mov ecx,eax
|
||
cmp [IHDR_data.Bit_depth],byte 16
|
||
je .filter_Bit_depth_16
|
||
; jmp .ret_ok
|
||
;---------------------------------------------------------------------
|
||
cmp [IHDR_data.Interlace_method], byte 0 ; Interlaced
|
||
je @f
|
||
call filtering_RGB_Interlaced
|
||
jmp .converting_MSB_to_LSB
|
||
@@:
|
||
;---------------------------------------------------------------------
|
||
push edi
|
||
call filtering_RGB
|
||
pop edi
|
||
;---------------------------------------------------------------------
|
||
; converting MSB to LSB
|
||
; 24b = 1B x 3 sample
|
||
; 32b = 1B x 4 sample
|
||
.converting_MSB_to_LSB:
|
||
call .calculate_all_pixels
|
||
mov ebx,3
|
||
cmp [IHDR_data.Color_type],byte 6
|
||
jne @f
|
||
inc ebx
|
||
@@:
|
||
sub edi,ebx
|
||
@@:
|
||
add edi,ebx
|
||
mov al,[edi]
|
||
mov ah,[edi+2]
|
||
mov [edi+2],al
|
||
mov [edi],ah
|
||
dec ecx
|
||
jnz @r
|
||
jmp .ret_ok
|
||
;---------------------------------------------------------------------
|
||
.calculate_all_pixels:
|
||
mov ecx,[Image_Height]
|
||
imul ecx,[Image_Width]
|
||
ret
|
||
;---------------------------------------------------------------------
|
||
; Processing filtering RGB; type 2 and 6, sample 16b
|
||
;---------------------------------------------------------------------
|
||
.filter_Bit_depth_16:
|
||
cmp [IHDR_data.Interlace_method], byte 0 ; Interlaced
|
||
je @f
|
||
call filtering_RGB_16_Interlaced
|
||
jmp .converting_MSB_to_LSB_16
|
||
@@:
|
||
;---------------------------------------------------------------------
|
||
push edi
|
||
call filtering_RGB_16
|
||
pop edi
|
||
;---------------------------------------------------------------------
|
||
; converting MSB to LSB 48 or 64b
|
||
; 48b = 2B x 3 sample
|
||
; 64b = 2B x 4 sample
|
||
.converting_MSB_to_LSB_16:
|
||
call .calculate_all_pixels
|
||
mov ebx,3
|
||
cmp [IHDR_data.Color_type],byte 6
|
||
jne @f
|
||
inc ebx
|
||
@@:
|
||
shl ebx,1
|
||
|
||
sub edi,ebx
|
||
@@:
|
||
add edi,ebx
|
||
|
||
mov ax,[edi]
|
||
xchg al,ah
|
||
shl eax,16
|
||
mov ax,[edi+4]
|
||
xchg al,ah
|
||
mov [edi],ax
|
||
shr eax,16
|
||
mov [edi+4],ax
|
||
|
||
mov ax,[edi+2]
|
||
xchg al,ah
|
||
mov [edi+2],ax
|
||
|
||
; mov ax,[edi+6]
|
||
; xchg al,ah
|
||
; mov [edi+6],al
|
||
|
||
dec ecx
|
||
jnz @r
|
||
jmp .ret_ok
|
||
;---------------------------------------------------------------------
|
||
; Processing filtering Grayscale and RGB; type 2, 3 and 4, sample 8b
|
||
;---------------------------------------------------------------------
|
||
.PLTE_and_grayscale:
|
||
cmp [IHDR_data.Color_type],byte 4
|
||
jne @f
|
||
shr ecx,1
|
||
@@:
|
||
cmp [IHDR_data.Bit_depth],byte 16
|
||
jne @f
|
||
shr ecx,1
|
||
jmp .filter_grayscale_Bit_depth_16_1
|
||
@@:
|
||
;---------------------------------------------------------------------
|
||
cmp [IHDR_data.Interlace_method], byte 0 ; Interlaced
|
||
je @f
|
||
call filtering_grayscale_Interlaced
|
||
jmp .continue_1
|
||
@@:
|
||
;---------------------------------------------------------------------
|
||
push edi
|
||
call filtering_grayscale
|
||
pop edi
|
||
;---------------------------------------------------------------------
|
||
.continue_1:
|
||
cmp [IHDR_data.Color_type],byte 4
|
||
jne .ret_ok
|
||
;-------------------------------
|
||
; 8b or less
|
||
mov esi,edi
|
||
call .calculate_all_pixels
|
||
.convert_transp_to_notransp:
|
||
cld
|
||
lodsw
|
||
stosb
|
||
dec ecx
|
||
jnz .convert_transp_to_notransp
|
||
|
||
jmp .ret_ok
|
||
;---------------------------------------------------------------------
|
||
; Processing filtering Grayscale and RGB; type 2, 3 and 4, sample 16b
|
||
;---------------------------------------------------------------------
|
||
.filter_grayscale_Bit_depth_16_1:
|
||
cmp [IHDR_data.Interlace_method], byte 0 ; Interlaced
|
||
je @f
|
||
call filtering_grayscale_16_Interlaced
|
||
jmp .continue_2
|
||
@@:
|
||
;---------------------------------------------------------------------
|
||
push edi
|
||
call filtering_grayscale_16
|
||
pop edi
|
||
;---------------------------------------------------------------------
|
||
.continue_2:
|
||
cmp [IHDR_data.Color_type],byte 4
|
||
jne .ret_ok
|
||
;-------------------------------
|
||
; 16b
|
||
mov esi,edi
|
||
call .calculate_all_pixels
|
||
.convert_transp_to_notransp_1:
|
||
cld
|
||
lodsd
|
||
stosw
|
||
dec ecx
|
||
jnz .convert_transp_to_notransp_1
|
||
;---------------------------------------------------------------------
|
||
.ret_ok:
|
||
mov ecx,[unpacked_data]
|
||
mcall 68, 13,
|
||
xor eax,eax
|
||
;---------------------------------------------------------------------
|
||
.ret:
|
||
mov ebx,[pointer]
|
||
mov [ebx+8],eax ; store return code
|
||
mov eax,[raw_area]
|
||
mov [ebx+4],eax ; store RAW pointer
|
||
popad
|
||
ret 4
|
||
;---------------------------------------------------------------------
|
||
include 'filter.inc'
|
||
include 'proced.inc'
|
||
include 'fl_call.inc'
|
||
include 'interlac.inc'
|
||
;---------------------------------------------------------------------
|
||
Check_Header:
|
||
pushad
|
||
mov eax,dword [esp+36]
|
||
call check_header_1
|
||
jne no_png_file
|
||
popad
|
||
ret 4
|
||
;---------------------------------------------------------------------
|
||
Associations:
|
||
dd Associations.end - Associations
|
||
db 'PNG',0
|
||
.end:
|
||
db 0
|
||
;---------------------------------------------------------------------
|
||
align 4
|
||
EXPORTS:
|
||
dd szStart, START
|
||
dd szVersion, 0x00010002
|
||
dd szCheck, Check_Header
|
||
dd szAssoc, Associations
|
||
dd 0
|
||
|
||
szStart db 'START',0
|
||
szVersion db 'version',0
|
||
szCheck db 'Check_Header',0
|
||
szAssoc db 'Associations',0
|
||
|
||
;*****************************************************************************
|
||
; Chunks names
|
||
;*****************************************************************************
|
||
; Critical chunks
|
||
IHDR_name: db 'IHDR' ; Image header
|
||
PLTE_name: db 'PLTE' ; Palette
|
||
IDAT_name: db 'IDAT' ; Image data
|
||
IEND_name: db 'IEND' ; Image trailer
|
||
|
||
; Ancillary chunks
|
||
;tRNS_name: db 'tRNS' ; Transparency
|
||
|
||
;; Color space information
|
||
;gAMA_name: db 'gAMA' ; Image gamma
|
||
;cHRM_name: db 'cHRM' ; Primary chromaticities
|
||
;sRGB_name: db 'sRGB' ; Standard RGB color space
|
||
;iCCP_name: db 'iCCP' ; Embedded ICC profile
|
||
|
||
;; Textual information
|
||
;tEXt_name: db 'tEXt' ; Textual data
|
||
;zTXt_name: db 'zTXt' ; Compressed textual data
|
||
;iTXt_name: db 'iTXt' ; International textual data
|
||
|
||
;; Miscellaneous information
|
||
;bKGD_name: db 'bKGD' ; Background color
|
||
;pHYs_name: db 'pHYs' ; Physical pixel dimensions
|
||
;sBIT_name: db 'sBIT' ; Significant bits
|
||
;sPLT_name: db 'sPLT' ; Suggested palette
|
||
;hIST_name: db 'hIST' ; Palette histogram
|
||
;tIME_name: db 'tIME' ; Imagelast-modification time
|
||
;*****************************************************************************
|
||
calculate_Interlaced_counters:
|
||
.1: dd calculate_Interlaced_1
|
||
.2: dd calculate_Interlaced_2
|
||
.3: dd calculate_Interlaced_3
|
||
.4: dd calculate_Interlaced_4
|
||
.5: dd calculate_Interlaced_5
|
||
.6: dd calculate_Interlaced_6
|
||
.7: dd calculate_Interlaced_7
|
||
|
||
deflate_start_offset dd 0
|
||
|
||
pointer dd 0
|
||
image_file dd 0
|
||
file_size dd 0
|
||
raw_area dd 0
|
||
resolution dd 0
|
||
|
||
Chunk_pointer dd 0
|
||
next_Chunk dd 0
|
||
|
||
deflate_unpack dd 0
|
||
|
||
unpacked_data dd 0
|
||
;IDAT_raw_area dd 0
|
||
;IDAT_raw_counter dd 0
|
||
|
||
Interlaced_area dd 0
|
||
|
||
Starting_Row: dd 0
|
||
Starting_Col: dd 0
|
||
Row_Increment: dd 0
|
||
Col_Increment: dd 0
|
||
|
||
Interlaced_step dd 0
|
||
|
||
|
||
counter_IDAT_Chunk dd 0
|
||
|
||
;CRC32 dd 0
|
||
;CRC32table: rd 256
|
||
;Adler32 dd 0
|
||
|
||
Image_Width dd 0
|
||
Image_Height dd 0
|
||
|
||
IHDR_data:
|
||
.Width dd 0 ;+0
|
||
.Height dd 0 ;+4
|
||
.Bit_depth: db 0 ;+8
|
||
.Color_type: db 0 ;+9
|
||
.Compression_method: db 0 ;+10
|
||
.Filter_method: db 0 ;+11
|
||
.Interlace_method: db 0 ;+12
|
||
|
||
IDAT_CMF db 0 ; Compression Method and flags
|
||
IDAT_<EFBFBD><EFBFBD> db 0 ; Compression method
|
||
IDAT_CINFO db 0 ; Compression info
|
||
IDAT_FLG db 0 ; FLaGs
|
||
IDAT_FCHECK db 0 ;
|
||
IDAT_FDICT db 0 ; Preset dictionary
|
||
IDAT_FLEVEL db 0 ; Compression level
|
||
; "deflate" method (CM = 8) sets these flags:
|
||
; 0 - compressor used fastest algorithm
|
||
; 1 - compressor used fast algorithm
|
||
; 2 - compressor used default algorithm
|
||
; 3 - compressor used maximum compression, slowest algorithm
|
||
IDAT_DICT dd 0 ; dictionary identifier = Adler-32 checksum
|
||
BFINAL db 0 ; set 1 only if this is the last block of the data set
|
||
BTYPE db 0 ; specifies how the data are compressed:
|
||
; 00 - no compression
|
||
; 01 - compressed with fixed Huffman codes
|
||
; 10 - compressed with dynamic Huffman codes
|
||
; 11 - reserved (error)
|
||
|
||
line_filter_type dd 0 ; 0 None
|
||
; 1 Sub
|
||
; 2 Up
|
||
; 3 Averag
|
||
; 4 Paeth
|
||
first_line db 0
|
||
first_pixel db 0
|
||
|
||
previous_pixel_value:
|
||
rb 8
|
||
|
||
Paeth_filter:
|
||
.a: dw 0
|
||
.b: dw 0
|
||
.c: dw 0
|
||
.p dd 0
|
||
.pa dd 0
|
||
.pb dd 0
|
||
.pc dd 0
|
||
;*****************************************************************************
|
||
; Chunks pointer
|
||
;*****************************************************************************
|
||
IHDR:
|
||
.pointer dd 0
|
||
.size dd 0
|
||
|
||
PLTE:
|
||
.pointer dd 0
|
||
.size dd 0
|
||
|
||
IDAT:
|
||
.pointer dd 0
|
||
.size dd 0
|
||
|
||
IEND:
|
||
.pointer dd 0
|
||
.size dd 0
|
||
|
||
;tRNS:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;gAMA:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;cHRM:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;sRGB:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;iCCP:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;tEXt:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;zTXt:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;iTXt:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;bKGD:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;pHYs:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;sBIT:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;sPLT:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;hIST:
|
||
;.pointer dd 0
|
||
;.size dd 0
|
||
|
||
;tIME:
|
||
;.pointer dd 0
|
||
;.size dd 0
|