1089 lines
17 KiB
PHP
1089 lines
17 KiB
PHP
|
;*****************************************************************************
|
||
|
; PNG to RAW convert plugin - for zSea image viewer
|
||
|
; Copyright (c) 2008, 2009, 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.
|
||
|
;---------------------------------------------------------------------
|
||
|
filtering_RGB_Interlaced:
|
||
|
mov edx,dword filtering_RGB
|
||
|
mov ebp,dword move_Interlaced_RGB
|
||
|
jmp filtering_All
|
||
|
;---------------------------------------------------------------------
|
||
|
filtering_RGB_16_Interlaced:
|
||
|
mov edx,dword filtering_RGB_16
|
||
|
mov ebp,dword move_Interlaced_RGB
|
||
|
jmp filtering_All
|
||
|
;---------------------------------------------------------------------
|
||
|
filtering_grayscale_Interlaced:
|
||
|
mov edx,dword filtering_grayscale
|
||
|
mov ebp,dword move_Interlaced_grayscale
|
||
|
jmp filtering_All
|
||
|
;---------------------------------------------------------------------
|
||
|
filtering_grayscale_16_Interlaced:
|
||
|
mov edx,dword filtering_grayscale_16
|
||
|
mov ebp,dword move_Interlaced_grayscale
|
||
|
jmp filtering_All
|
||
|
;---------------------------------------------------------------------
|
||
|
pass dd 0
|
||
|
filtering_All:
|
||
|
push edi
|
||
|
|
||
|
mov ecx,[resolution]
|
||
|
imul ecx,[IHDR_data.Width]
|
||
|
mov eax,ecx
|
||
|
shr ecx,3
|
||
|
test eax,7
|
||
|
jz @f
|
||
|
inc ecx
|
||
|
@@:
|
||
|
mov eax,[IHDR_data.Height]
|
||
|
shr eax,1
|
||
|
inc eax
|
||
|
imul ecx,eax
|
||
|
mcall 68, 12
|
||
|
mov [Interlaced_area],eax
|
||
|
; jmp .3
|
||
|
mov eax,dword calculate_Interlaced_counters
|
||
|
mov ecx,7
|
||
|
@@:
|
||
|
mov [pass],ecx
|
||
|
mov [Interlaced_step],eax
|
||
|
push ecx
|
||
|
push eax edx edi ebp eax
|
||
|
call dword [eax] ;calculate_Interlaced_1
|
||
|
; cmp [pass],1
|
||
|
; jbe .2
|
||
|
call edx
|
||
|
;.2:
|
||
|
pop eax ebp edi
|
||
|
push ebp
|
||
|
; cmp [pass],1
|
||
|
; jbe .1
|
||
|
call ebp
|
||
|
;.1:
|
||
|
pop ebp edx eax
|
||
|
add eax,4
|
||
|
pop ecx
|
||
|
dec ecx
|
||
|
jnz @r
|
||
|
;.3:
|
||
|
mov ecx,[Interlaced_area]
|
||
|
mcall 68, 13
|
||
|
|
||
|
pop edi
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
move_Interlaced_RGB:
|
||
|
push edi esi
|
||
|
mov esi,[Interlaced_area]
|
||
|
|
||
|
mov ecx,[IHDR_data.Height]
|
||
|
test ecx,ecx
|
||
|
jz .end
|
||
|
|
||
|
mov edx,[IHDR_data.Width]
|
||
|
test edx,edx
|
||
|
jz .end
|
||
|
|
||
|
mov ebx,[Image_Width]
|
||
|
imul ebx,[resolution]
|
||
|
shr ebx,3
|
||
|
|
||
|
mov eax,[Starting_Col]
|
||
|
imul eax,[resolution]
|
||
|
shr eax,3
|
||
|
add edi,eax
|
||
|
|
||
|
mov eax,[Starting_Row]
|
||
|
imul eax,ebx
|
||
|
add edi,eax
|
||
|
|
||
|
imul ebx,[Row_Increment]
|
||
|
|
||
|
mov ebp,[resolution]
|
||
|
imul ebp,[Col_Increment]
|
||
|
shr ebp,3
|
||
|
|
||
|
.filter:
|
||
|
mov edx,[IHDR_data.Width]
|
||
|
push edi
|
||
|
|
||
|
.filter_x:
|
||
|
cmp [IHDR_data.Bit_depth],byte 8
|
||
|
jne @f
|
||
|
call .Interlaced_RGB_8
|
||
|
jmp .1
|
||
|
@@:
|
||
|
call .Interlaced_RGB_16
|
||
|
.1:
|
||
|
dec edx
|
||
|
jnz .filter_x
|
||
|
|
||
|
pop edi
|
||
|
|
||
|
add edi,ebx
|
||
|
dec ecx
|
||
|
jnz .filter
|
||
|
.end:
|
||
|
pop esi edi
|
||
|
ret
|
||
|
;-------------------------------------------
|
||
|
.Interlaced_RGB_8:
|
||
|
cld
|
||
|
lodsw
|
||
|
mov [edi],ax
|
||
|
lodsb
|
||
|
mov [edi+2],al
|
||
|
cmp [IHDR_data.Color_type],byte 6
|
||
|
jne @f
|
||
|
lodsb
|
||
|
mov [edi+3],al
|
||
|
@@:
|
||
|
add edi,ebp
|
||
|
ret
|
||
|
;-------------------------------------------
|
||
|
.Interlaced_RGB_16:
|
||
|
cld
|
||
|
lodsd
|
||
|
mov [edi],eax
|
||
|
lodsw
|
||
|
mov [edi+4],ax
|
||
|
cmp [IHDR_data.Color_type],byte 6
|
||
|
jne @f
|
||
|
lodsw
|
||
|
mov [edi+6],al
|
||
|
@@:
|
||
|
add edi,ebp
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
move_Interlaced_grayscale:
|
||
|
; cmp [eax],dword calculate_Interlaced_1
|
||
|
; jne @f
|
||
|
; ret
|
||
|
;@@:
|
||
|
; cmp [eax],dword calculate_Interlaced_2
|
||
|
; jne @f
|
||
|
; ret
|
||
|
;@@:
|
||
|
; cmp [eax],dword calculate_Interlaced_3
|
||
|
; jne @f
|
||
|
; ret
|
||
|
;@@:
|
||
|
; cmp [eax],dword calculate_Interlaced_4
|
||
|
; jne @f
|
||
|
; ret
|
||
|
;@@:
|
||
|
; cmp [eax],dword calculate_Interlaced_5
|
||
|
; jne @f
|
||
|
; ret
|
||
|
;@@:
|
||
|
; cmp [eax],dword calculate_Interlaced_6
|
||
|
; jne @f
|
||
|
; ret
|
||
|
;@@:
|
||
|
; cmp [eax],dword calculate_Interlaced_7
|
||
|
; jne @f
|
||
|
; ret
|
||
|
;@@:
|
||
|
|
||
|
push edi esi
|
||
|
mov esi,[Interlaced_area]
|
||
|
|
||
|
mov ecx,[IHDR_data.Height]
|
||
|
test ecx,ecx
|
||
|
jz .end
|
||
|
|
||
|
mov edx,[IHDR_data.Width]
|
||
|
test edx,edx
|
||
|
jz .end
|
||
|
|
||
|
mov ebx,[Image_Width]
|
||
|
imul ebx,[resolution]
|
||
|
mov eax,ebx
|
||
|
shr ebx,3
|
||
|
test eax,7
|
||
|
jz @f
|
||
|
inc ebx
|
||
|
@@:
|
||
|
; ebx = Width in bytes, need correct for resolution less 4b
|
||
|
|
||
|
mov eax,[Starting_Col]
|
||
|
imul eax,[resolution]
|
||
|
; mov ebp,eax
|
||
|
shr eax,3
|
||
|
; test ebp,7
|
||
|
; jz @f
|
||
|
; inc eax
|
||
|
;@@:
|
||
|
; eax = Starting Colummn in bytes
|
||
|
add edi,eax
|
||
|
|
||
|
mov eax,[Starting_Row]
|
||
|
imul eax,ebx
|
||
|
; eax = Starting Row in bytes, no need correct!
|
||
|
add edi,eax
|
||
|
|
||
|
imul ebx,[Row_Increment]
|
||
|
; ebx = Row Increment in bytes, no need correct!
|
||
|
|
||
|
mov eax,[IHDR_data.Width]
|
||
|
imul eax,[resolution]
|
||
|
mov ebp,eax
|
||
|
shr eax,3
|
||
|
test ebp,7
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
; eax = Width in bytes for Interlaced,
|
||
|
; need correct for resolution less 4b
|
||
|
|
||
|
mov ebp,[resolution]
|
||
|
imul ebp,[Col_Increment]
|
||
|
; mov eax,ebp
|
||
|
shr ebp,3
|
||
|
; test eax,7
|
||
|
; jz @f
|
||
|
; inc ebp
|
||
|
;@@:
|
||
|
; ebp = Column Increment in bytes
|
||
|
|
||
|
.filter_grayscale:
|
||
|
mov edx,[IHDR_data.Width]
|
||
|
cmp [resolution],8
|
||
|
jae .filter_grayscale_1
|
||
|
|
||
|
.resolution_4:
|
||
|
cmp [resolution],4
|
||
|
jne .resolution_2
|
||
|
test edx,1
|
||
|
jnz @f
|
||
|
inc edx
|
||
|
@@:
|
||
|
shr edx,1
|
||
|
jmp .filter_grayscale_1
|
||
|
|
||
|
.resolution_2:
|
||
|
cmp [resolution],2
|
||
|
jne .resolution_1
|
||
|
test edx,3
|
||
|
jnz @f
|
||
|
add edx,4
|
||
|
@@:
|
||
|
shr edx,2
|
||
|
jmp .filter_grayscale_1
|
||
|
|
||
|
.resolution_1:
|
||
|
push eax
|
||
|
mov eax,edx
|
||
|
shr edx,3
|
||
|
test eax,7
|
||
|
jz @f
|
||
|
inc edx
|
||
|
@@:
|
||
|
pop eax
|
||
|
.filter_grayscale_1:
|
||
|
push eax edi esi
|
||
|
|
||
|
.filter_x_grayscale:
|
||
|
cmp [IHDR_data.Bit_depth],byte 16
|
||
|
jne @f
|
||
|
call .Interlaced_grayscale_16
|
||
|
jmp .1
|
||
|
@@:
|
||
|
cmp [IHDR_data.Bit_depth],byte 8
|
||
|
jne @f
|
||
|
call .Interlaced_grayscale_8
|
||
|
jmp .1
|
||
|
@@:
|
||
|
cmp [IHDR_data.Bit_depth],byte 4
|
||
|
jne @f
|
||
|
call .Interlaced_grayscale_4
|
||
|
jmp .1
|
||
|
@@:
|
||
|
cmp [IHDR_data.Bit_depth],byte 2
|
||
|
jne @f
|
||
|
call .Interlaced_grayscale_2
|
||
|
jmp .1
|
||
|
@@:
|
||
|
call .Interlaced_grayscale_1
|
||
|
jmp .1
|
||
|
.1:
|
||
|
|
||
|
dec edx
|
||
|
jnz .filter_x_grayscale
|
||
|
pop esi edi eax
|
||
|
add esi,eax
|
||
|
|
||
|
add edi,ebx
|
||
|
dec ecx
|
||
|
jnz .filter_grayscale
|
||
|
.end:
|
||
|
pop esi edi
|
||
|
ret
|
||
|
;-----------------------------------
|
||
|
.Interlaced_grayscale_1:
|
||
|
mov eax,[Interlaced_step]
|
||
|
cmp eax,calculate_Interlaced_counters.1
|
||
|
je .step_1
|
||
|
cmp eax,calculate_Interlaced_counters.2
|
||
|
je .step_2
|
||
|
cmp eax,calculate_Interlaced_counters.3
|
||
|
je .step_3
|
||
|
cmp eax,calculate_Interlaced_counters.4
|
||
|
je .step_4
|
||
|
cmp eax,calculate_Interlaced_counters.5
|
||
|
je .step_5
|
||
|
cmp eax,calculate_Interlaced_counters.6
|
||
|
je .step_6
|
||
|
cld
|
||
|
movsb
|
||
|
ret
|
||
|
;--------------------
|
||
|
.step_6:
|
||
|
push ebx
|
||
|
cld
|
||
|
lodsb
|
||
|
mov ah,al
|
||
|
|
||
|
call @f
|
||
|
|
||
|
shl ah,4
|
||
|
mov al,ah
|
||
|
|
||
|
call @f
|
||
|
|
||
|
pop ebx
|
||
|
ret
|
||
|
;--------------------
|
||
|
@@:
|
||
|
shr al,1
|
||
|
and al,64
|
||
|
|
||
|
mov bl,ah
|
||
|
shr bl,2
|
||
|
and bl,16
|
||
|
add al,bl
|
||
|
|
||
|
mov bl,ah
|
||
|
shr bl,3
|
||
|
and bl,4
|
||
|
add al,bl
|
||
|
|
||
|
mov bl,ah
|
||
|
shr bl,4
|
||
|
and bl,1
|
||
|
add al,bl
|
||
|
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
ret
|
||
|
;--------------------
|
||
|
.step_5:
|
||
|
push ebx
|
||
|
cld
|
||
|
lodsb
|
||
|
|
||
|
mov ah,al
|
||
|
|
||
|
call @f
|
||
|
|
||
|
shl ah,4
|
||
|
mov al,ah
|
||
|
|
||
|
call @f
|
||
|
|
||
|
pop ebx
|
||
|
ret
|
||
|
;--------------------
|
||
|
@@:
|
||
|
and al,128
|
||
|
|
||
|
mov bl,ah
|
||
|
shr bl,1
|
||
|
and bl,32
|
||
|
add al,bl
|
||
|
|
||
|
mov bl,ah
|
||
|
shr bl,2
|
||
|
and bl,8
|
||
|
add al,bl
|
||
|
|
||
|
mov bl,ah
|
||
|
shr bl,3
|
||
|
and bl,2
|
||
|
add al,bl
|
||
|
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
ret
|
||
|
;--------------------
|
||
|
.step_4:
|
||
|
push ebx
|
||
|
cld
|
||
|
lodsb
|
||
|
|
||
|
mov ah,al
|
||
|
shr al,2
|
||
|
and al,32
|
||
|
mov bl,ah
|
||
|
shr bl,5
|
||
|
call @f
|
||
|
|
||
|
mov al,ah
|
||
|
and al,32
|
||
|
mov bl,ah
|
||
|
shr bl,3
|
||
|
call @f
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,2
|
||
|
and al,32
|
||
|
mov bl,ah
|
||
|
shr bl,1
|
||
|
call @f
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,4
|
||
|
and al,32
|
||
|
mov bl,ah
|
||
|
shl bl,1
|
||
|
call @f
|
||
|
pop ebx
|
||
|
ret
|
||
|
;--------------------
|
||
|
@@:
|
||
|
and bl,2
|
||
|
add al,bl
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
ret
|
||
|
;--------------------
|
||
|
.step_3:
|
||
|
push ebx
|
||
|
cld
|
||
|
lodsb
|
||
|
|
||
|
mov ah,al
|
||
|
and al,128
|
||
|
mov bl,ah
|
||
|
shr bl,3
|
||
|
call @f
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,2
|
||
|
and al,128
|
||
|
mov bl,ah
|
||
|
shr bl,1
|
||
|
call @f
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,4
|
||
|
and al,128
|
||
|
mov bl,ah
|
||
|
shl bl,1
|
||
|
call @f
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,6
|
||
|
and al,128
|
||
|
mov bl,ah
|
||
|
shl bl,3
|
||
|
call @f
|
||
|
pop ebx
|
||
|
ret
|
||
|
;--------------------
|
||
|
@@:
|
||
|
and bl,8
|
||
|
add al,bl
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
ret
|
||
|
;--------------------
|
||
|
.step_2:
|
||
|
cld
|
||
|
lodsb
|
||
|
|
||
|
mov ah,al
|
||
|
shr al,4
|
||
|
and al,8
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shr al,3
|
||
|
and al,8
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shr al,2
|
||
|
and al,8
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shr al,1
|
||
|
and al,8
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
and al,8
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,1
|
||
|
and al,8
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,2
|
||
|
and al,8
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,3
|
||
|
and al,8
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
ret
|
||
|
;--------------------
|
||
|
.step_1:
|
||
|
cld
|
||
|
lodsb
|
||
|
mov ah,al
|
||
|
and al,128
|
||
|
stosb
|
||
|
mov al,ah
|
||
|
shl al,1
|
||
|
and al,128
|
||
|
stosb
|
||
|
mov al,ah
|
||
|
shl al,2
|
||
|
and al,128
|
||
|
stosb
|
||
|
mov al,ah
|
||
|
shl al,3
|
||
|
and al,128
|
||
|
stosb
|
||
|
mov al,ah
|
||
|
shl al,4
|
||
|
and al,128
|
||
|
stosb
|
||
|
mov al,ah
|
||
|
shl al,5
|
||
|
and al,128
|
||
|
stosb
|
||
|
mov al,ah
|
||
|
shl al,6
|
||
|
and al,128
|
||
|
stosb
|
||
|
mov al,ah
|
||
|
shl al,7
|
||
|
and al,128
|
||
|
stosb
|
||
|
ret
|
||
|
;-----------------------------------
|
||
|
.Interlaced_grayscale_2:
|
||
|
mov eax,[Interlaced_step]
|
||
|
cmp eax,calculate_Interlaced_counters.1
|
||
|
je .step_1_1
|
||
|
cmp eax,calculate_Interlaced_counters.2
|
||
|
je .step_2_1
|
||
|
cmp eax,calculate_Interlaced_counters.3
|
||
|
je .step_3_1
|
||
|
cmp eax,calculate_Interlaced_counters.4
|
||
|
je .step_4_1
|
||
|
cmp eax,calculate_Interlaced_counters.5
|
||
|
je .step_5_1
|
||
|
cmp eax,calculate_Interlaced_counters.6
|
||
|
je .step_6_1
|
||
|
cld
|
||
|
movsb
|
||
|
ret
|
||
|
|
||
|
.step_6_1:
|
||
|
push ebx
|
||
|
cld
|
||
|
lodsb
|
||
|
mov ah,al
|
||
|
|
||
|
shr al,2
|
||
|
and al,48
|
||
|
mov bl,ah
|
||
|
shr bl,4
|
||
|
and bl,3
|
||
|
add al,bl
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,2
|
||
|
and al,48
|
||
|
mov bl,ah
|
||
|
and bl,3
|
||
|
add al,bl
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
pop ebx
|
||
|
ret
|
||
|
|
||
|
.step_5_1:
|
||
|
push ebx
|
||
|
cld
|
||
|
lodsb
|
||
|
mov ah,al
|
||
|
|
||
|
and al,192
|
||
|
mov bl,ah
|
||
|
shr bl,2
|
||
|
and bl,12
|
||
|
add al,bl
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,4
|
||
|
and al,192
|
||
|
mov bl,ah
|
||
|
shl bl,2
|
||
|
and bl,12
|
||
|
add al,bl
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
pop ebx
|
||
|
ret
|
||
|
|
||
|
.step_4_1:
|
||
|
cld
|
||
|
lodsb
|
||
|
mov ah,al
|
||
|
|
||
|
shr al,4
|
||
|
and al,12
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shr al,2
|
||
|
and al,12
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
and al,12
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,2
|
||
|
and al,12
|
||
|
add al,[edi]
|
||
|
stosb
|
||
|
|
||
|
ret
|
||
|
|
||
|
.step_3_1:
|
||
|
cld
|
||
|
lodsb
|
||
|
mov ah,al
|
||
|
|
||
|
and al,192
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,2
|
||
|
and al,192
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,4
|
||
|
and al,192
|
||
|
stosb
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,6
|
||
|
and al,192
|
||
|
stosb
|
||
|
|
||
|
ret
|
||
|
|
||
|
.step_2_1:
|
||
|
cld
|
||
|
lodsb
|
||
|
mov ah,al
|
||
|
|
||
|
and al,192
|
||
|
stosb
|
||
|
inc edi
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,2
|
||
|
and al,192
|
||
|
stosb
|
||
|
inc edi
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,4
|
||
|
and al,192
|
||
|
stosb
|
||
|
inc edi
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,6
|
||
|
and al,192
|
||
|
stosb
|
||
|
inc edi
|
||
|
|
||
|
ret
|
||
|
|
||
|
.step_1_1:
|
||
|
cld
|
||
|
lodsb
|
||
|
|
||
|
mov ah,al
|
||
|
and al,192
|
||
|
stosb
|
||
|
inc edi
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,2
|
||
|
and al,192
|
||
|
stosb
|
||
|
inc edi
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,4
|
||
|
and al,192
|
||
|
stosb
|
||
|
inc edi
|
||
|
|
||
|
mov al,ah
|
||
|
shl al,6
|
||
|
and al,192
|
||
|
stosb
|
||
|
inc edi
|
||
|
|
||
|
ret
|
||
|
;-----------------------------------
|
||
|
.Interlaced_grayscale_4:
|
||
|
mov al,[esi]
|
||
|
mov ah,[edi]
|
||
|
test ebp,ebp
|
||
|
jnz @f
|
||
|
call .even_2
|
||
|
jmp .2
|
||
|
@@:
|
||
|
test [Starting_Col],byte 1
|
||
|
jz @f
|
||
|
call .even_1
|
||
|
jmp .2
|
||
|
@@:
|
||
|
call .odd_1
|
||
|
.2:
|
||
|
add al,ah
|
||
|
mov [edi],al
|
||
|
add edi,ebp
|
||
|
|
||
|
mov al,[esi]
|
||
|
mov ah,[edi]
|
||
|
test ebp,ebp
|
||
|
jnz @f
|
||
|
call .odd_1
|
||
|
jmp .3
|
||
|
@@:
|
||
|
test [Starting_Col],byte 1
|
||
|
jz @f
|
||
|
call .even_2
|
||
|
jmp .3
|
||
|
@@:
|
||
|
call .odd_2
|
||
|
.3:
|
||
|
add al,ah
|
||
|
mov [edi],al
|
||
|
add edi,ebp
|
||
|
|
||
|
inc esi
|
||
|
test ebp,ebp
|
||
|
jnz @f
|
||
|
inc edi
|
||
|
@@:
|
||
|
ret
|
||
|
;---------------------
|
||
|
.even_1:
|
||
|
shr al,4
|
||
|
and ah,11110000b
|
||
|
ret
|
||
|
;---------------------
|
||
|
.even_2:
|
||
|
and al,1111b
|
||
|
and ah,11110000b
|
||
|
ret
|
||
|
;---------------------
|
||
|
.odd_1:
|
||
|
and al,11110000b
|
||
|
and ah,1111b
|
||
|
ret
|
||
|
;---------------------
|
||
|
.odd_2:
|
||
|
shl al,4
|
||
|
and ah,1111b
|
||
|
ret
|
||
|
;-----------------------------------
|
||
|
.Interlaced_grayscale_8:
|
||
|
cld
|
||
|
lodsb
|
||
|
mov [edi],al
|
||
|
cmp [IHDR_data.Color_type],byte 4
|
||
|
jne @f
|
||
|
cld
|
||
|
lodsb
|
||
|
mov [edi+1],al
|
||
|
@@:
|
||
|
add edi,ebp
|
||
|
ret
|
||
|
;-----------------------------------
|
||
|
.Interlaced_grayscale_16:
|
||
|
cld
|
||
|
lodsw
|
||
|
mov [edi],ax
|
||
|
cmp [IHDR_data.Color_type],byte 4
|
||
|
jne @f
|
||
|
cld
|
||
|
lodsw
|
||
|
mov [edi+2],ax
|
||
|
@@:
|
||
|
add edi,ebp
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
calculatte_Interlaced_data_1:
|
||
|
mov [first_line],byte 1
|
||
|
mov edi,[Interlaced_area]
|
||
|
mov eax,[Image_Width]
|
||
|
mov ebx,dword Starting_Row
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
calculate_Interlaced_1:
|
||
|
call calculatte_Interlaced_data_1
|
||
|
mov [ebx+0],dword 0 ;Starting_Row
|
||
|
mov [ebx+4],dword 0 ;Starting_Col
|
||
|
mov [ebx+8],dword 8 ;Row_Increment
|
||
|
mov [ebx+12],dword 8 ;Col_Increment
|
||
|
mov ebx,eax
|
||
|
shr eax,3
|
||
|
test ebx,7
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Width],eax
|
||
|
|
||
|
mov eax,[Image_Height]
|
||
|
mov ebx,eax
|
||
|
shr eax,3
|
||
|
test ebx,7
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Height],eax
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
calculate_Interlaced_2:
|
||
|
call calculatte_Interlaced_data_1
|
||
|
mov [ebx+0],dword 0 ;Starting_Row
|
||
|
mov [ebx+4],dword 4 ;Starting_Col
|
||
|
mov [ebx+8],dword 8 ;Row_Increment
|
||
|
mov [ebx+12],dword 8 ;Col_Increment
|
||
|
cmp eax,4
|
||
|
ja @f
|
||
|
mov eax,4
|
||
|
@@:
|
||
|
sub eax,4
|
||
|
mov ebx,eax
|
||
|
shr eax,3
|
||
|
test ebx,7
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Width],eax
|
||
|
|
||
|
mov eax,[Image_Height]
|
||
|
mov ebx,eax
|
||
|
shr eax,3
|
||
|
test ebx,7
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Height],eax
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
calculate_Interlaced_3:
|
||
|
call calculatte_Interlaced_data_1
|
||
|
mov [ebx+0],dword 4 ;Starting_Row
|
||
|
mov [ebx+4],dword 0 ;Starting_Col
|
||
|
mov [ebx+8],dword 8 ;Row_Increment
|
||
|
mov [ebx+12],dword 4 ;Col_Increment
|
||
|
mov ebx,eax
|
||
|
shr eax,2
|
||
|
test ebx,3
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Width],eax
|
||
|
|
||
|
mov eax,[Image_Height]
|
||
|
cmp eax,4
|
||
|
ja @f
|
||
|
mov eax,4
|
||
|
@@:
|
||
|
sub eax,4
|
||
|
mov ebx,eax
|
||
|
shr eax,3
|
||
|
test ebx,7
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Height],eax
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
calculate_Interlaced_4:
|
||
|
call calculatte_Interlaced_data_1
|
||
|
mov [ebx+0],dword 0 ;Starting_Row
|
||
|
mov [ebx+4],dword 2 ;Starting_Col
|
||
|
mov [ebx+8],dword 4 ;Row_Increment
|
||
|
mov [ebx+12],dword 4 ;Col_Increment
|
||
|
cmp eax,2
|
||
|
ja @f
|
||
|
mov eax,2
|
||
|
@@:
|
||
|
sub eax,2
|
||
|
mov ebx,eax
|
||
|
shr eax,2
|
||
|
test ebx,3
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Width],eax
|
||
|
|
||
|
mov eax,[Image_Height]
|
||
|
mov ebx,eax
|
||
|
shr eax,2
|
||
|
test ebx,3
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Height],eax
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
calculate_Interlaced_5:
|
||
|
call calculatte_Interlaced_data_1
|
||
|
mov [ebx+0],dword 2 ;Starting_Row
|
||
|
mov [ebx+4],dword 0 ;Starting_Col
|
||
|
mov [ebx+8],dword 4 ;Row_Increment
|
||
|
mov [ebx+12],dword 2 ;Col_Increment
|
||
|
mov ebx,eax
|
||
|
shr eax,1
|
||
|
test ebx,1
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Width],eax
|
||
|
|
||
|
mov eax,[Image_Height]
|
||
|
cmp eax,2
|
||
|
ja @f
|
||
|
mov eax,2
|
||
|
@@:
|
||
|
sub eax,2
|
||
|
mov ebx,eax
|
||
|
shr eax,2
|
||
|
test ebx,3
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Height],eax
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
calculate_Interlaced_6:
|
||
|
call calculatte_Interlaced_data_1
|
||
|
mov [ebx+0],dword 0 ;Starting_Row
|
||
|
mov [ebx+4],dword 1 ;Starting_Col
|
||
|
mov [ebx+8],dword 2 ;Row_Increment
|
||
|
mov [ebx+12],dword 2 ;Col_Increment
|
||
|
cmp eax,1
|
||
|
ja @f
|
||
|
mov eax,1
|
||
|
@@:
|
||
|
dec eax
|
||
|
mov ebx,eax
|
||
|
shr eax,1
|
||
|
test ebx,1
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Width],eax
|
||
|
|
||
|
mov eax,[Image_Height]
|
||
|
mov ebx,eax
|
||
|
shr eax,1
|
||
|
test ebx,1
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Height],eax
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
calculate_Interlaced_7:
|
||
|
call calculatte_Interlaced_data_1
|
||
|
mov [ebx+0],dword 1 ;Starting_Row
|
||
|
mov [ebx+4],dword 0 ;Starting_Col
|
||
|
mov [ebx+8],dword 2 ;Row_Increment
|
||
|
mov [ebx+12],dword 1 ;Col_Increment
|
||
|
|
||
|
mov [IHDR_data.Width],eax
|
||
|
; mov ebx,[raw_area]
|
||
|
; mov [ebx+4],eax
|
||
|
|
||
|
mov eax,[Image_Height]
|
||
|
cmp eax,1
|
||
|
ja @f
|
||
|
mov eax,1
|
||
|
@@:
|
||
|
dec eax
|
||
|
mov ebx,eax
|
||
|
shr eax,1
|
||
|
test ebx,1
|
||
|
jz @f
|
||
|
inc eax
|
||
|
@@:
|
||
|
mov [IHDR_data.Height],eax
|
||
|
|
||
|
; mov ebx,[raw_area]
|
||
|
; mov eax,[Image_Height]
|
||
|
; mov [ebx+8],eax
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|