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