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

159 lines
4.7 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.
;---------------------------------------------------------------------
deflate_callback:
cmp [deflate_start_offset],1
je @f
mov [deflate_start_offset],1
jmp .1
@@:
mov eax,[IDAT.pointer]
add eax,[IDAT.size]
mov ebx,[image_file]
add ebx,[file_size]
sub ebx,32
cmp ebx,eax
jbe @f
mov [next_Chunk],eax
call search_IDAT
jmp .1
@@:
xor eax,eax
mov [IDAT.size],eax
mov [IDAT.pointer],eax
.1:
mov ecx, [esp+8]
mov eax,[IDAT.size]
mov [ecx], eax ;length
mov eax,[IDAT.pointer] ; buffer
ret 8
;---------------------------------------------------------------------
search_IHDR:
mov [Chunk_pointer],IHDR_name
call get_Chunk_data_pointer
mov eax,[Chunk_pointer]
cmp eax,0
je .no_png_file
mov [IHDR.pointer],eax
mov ecx,[eax-8]
call convert_NBO_to_PC
mov [IHDR.size],ecx
ret
.no_png_file:
add esp,4
jmp no_png_file
;---------------------------------------------------------------------
search_PLTE:
push eax ecx
mov [Chunk_pointer],PLTE_name
call get_Chunk_data_pointer
mov eax,[Chunk_pointer]
cmp eax,0
je .no_png_file
mov [PLTE.pointer],eax
mov ecx,[eax-8]
call convert_NBO_to_PC
mov [PLTE.size],ecx
pop ecx eax
ret
.no_png_file:
add esp,12
jmp no_png_file
;---------------------------------------------------------------------
search_IDAT:
mov [Chunk_pointer],IDAT_name
call get_Chunk_data_pointer
mov eax,[Chunk_pointer]
cmp eax,0
je .no_IDAT_next
mov [IDAT.pointer],eax
mov ecx,[eax-8]
call convert_NBO_to_PC
mov [IDAT.size],ecx
xor eax,eax
ret
.no_IDAT_next:
; add esp,4
; jmp no_png_file
mov eax,1
ret
;---------------------------------------------------------------------
search_IEND:
mov [Chunk_pointer],IEND_name
call get_Chunk_data_pointer
mov eax,[Chunk_pointer]
cmp eax,0
je .no_png_file
mov [IEND.pointer],eax
mov ecx,[eax-8]
call convert_NBO_to_PC
mov [IEND.size],ecx
ret
.no_png_file:
add esp,4
jmp no_png_file
;---------------------------------------------------------------------
convert_NBO_to_PC: ;network byte order value to PC value
push eax
mov al,ch
mov ah,cl
shl eax,16
shr ecx,16
mov al,ch
mov ah,cl
mov ecx,eax
pop eax
ret
;---------------------------------------------------------------------
get_Chunk_data_pointer:
pushad
mov ebp,4
; mov edi,[image_file]
mov edi,[next_Chunk]
mov edx,[image_file] ;edi
add edx,[file_size]
dec edi
.search_Chunk:
cmp edx,edi
jbe .end
mov esi,[Chunk_pointer]
mov ecx,ebp
inc edi
mov ebx,edi
cld
rep cmpsb
mov edi,ebx
jne .search_Chunk
add edi,ebp
mov [Chunk_pointer],edi
popad
ret
.end:
mov [Chunk_pointer],0
popad
ret
;---------------------------------------------------------------------