kolibrios/programs/media/zsea/plugins/png/interlac.inc

1089 lines
17 KiB
PHP
Raw Normal View History

;*****************************************************************************
; 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
;---------------------------------------------------------------------