forked from KolibriOS/kolibrios
137 lines
3.7 KiB
PHP
137 lines
3.7 KiB
PHP
|
; pcx.inc
|
||
|
; Copyright (c) 2002 Thomas Mathys
|
||
|
; killer@vantage.ch
|
||
|
;
|
||
|
; This program is free software; you can redistribute it and/or modify
|
||
|
; it under the terms of the GNU General Public License as published by
|
||
|
; the Free Software Foundation; either version 2 of the License, or
|
||
|
; (at your option) any later version.
|
||
|
;
|
||
|
; This program is distributed in the hope that it will be useful,
|
||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
; GNU General Public License for more details.
|
||
|
;
|
||
|
; You should have received a copy of the GNU General Public License
|
||
|
; along with this program; if not, write to the Free Software
|
||
|
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
||
|
%ifndef _PCX_INC
|
||
|
%define _PCX_INC
|
||
|
|
||
|
|
||
|
;**********************************************************
|
||
|
; pcx header
|
||
|
;**********************************************************
|
||
|
|
||
|
PCXHEADER_SIZE equ 128
|
||
|
struc PCXHEADER
|
||
|
.id: resb 1 ; id, should be 10
|
||
|
.version: resb 1 ; pcx version
|
||
|
.encoding: resb 1 ; 1 = rle
|
||
|
.bpp: resb 1 ; bits per pixel
|
||
|
.xmin: resw 1 ; image dimensions
|
||
|
.ymin: resw 1
|
||
|
.xmax: resw 1
|
||
|
.ymax: resw 1
|
||
|
.hdpi: resw 1 ; horizontal resolution in dpi
|
||
|
.vdpi: resw 1 ; verttical resolution in dpi
|
||
|
.colormap: resb 48 ; 16 color palette
|
||
|
.reserved1: resb 1
|
||
|
.nplanes: resb 1 ; # of color planes
|
||
|
.bytesperline: resw 1 ; # of bytes per scanline. always even
|
||
|
.palinfo: resw 1 ; 1 = color/bw, 2 = grayscale
|
||
|
.hscreensize: resw 1 ; horizontal screen size
|
||
|
.vscreensize: resw 1 ; vertical screen size
|
||
|
.reserved2: resb 54
|
||
|
endstruc
|
||
|
|
||
|
|
||
|
section .text
|
||
|
|
||
|
|
||
|
|
||
|
;**********************************************************
|
||
|
; lousy pcx decoder. reads only 8 bit rle packed color images (pcx version 5)
|
||
|
; oh, and yes, currently it can't read images with an odd width.
|
||
|
;
|
||
|
; the routine does not only decode the image data, it converts
|
||
|
; it also to a menuetos putimage compatible format (24 bit, rrggbb)
|
||
|
;
|
||
|
; input : esi address of the pcx file in memory
|
||
|
; edi pointer to the memory where the depacked
|
||
|
; image data should go. (width*height*3 bytes)
|
||
|
; ebx file size in bytes
|
||
|
;
|
||
|
; output : decoded image in [edi]
|
||
|
;
|
||
|
; destroys : nothing
|
||
|
;
|
||
|
;**********************************************************
|
||
|
|
||
|
loadPCX:
|
||
|
pushad
|
||
|
pushfd
|
||
|
|
||
|
; calculate number of pixels to decode.
|
||
|
; this is actually wrong, because if the image has an odd
|
||
|
; width, there will be an unused pixel at the end of each
|
||
|
; scanline.
|
||
|
movzx eax,word [esi+PCXHEADER.xmax] ; eax = image width
|
||
|
sub ax,[esi+PCXHEADER.xmin]
|
||
|
inc eax
|
||
|
movzx ecx,word [esi+PCXHEADER.ymax] ; ecx = image height
|
||
|
sub cx,[esi+PCXHEADER.ymin]
|
||
|
inc ecx
|
||
|
mul ecx
|
||
|
mov ebp,eax ; ebp = # of pixels to decode
|
||
|
|
||
|
; move ebx to beginning of palette and
|
||
|
; esi to beginning of packed image data
|
||
|
sub ebx,768
|
||
|
add ebx,esi
|
||
|
add esi,PCXHEADER_SIZE
|
||
|
|
||
|
; decode image data
|
||
|
xor ecx,ecx ; clear bits 8..31 !
|
||
|
xor eax,eax ; "
|
||
|
.decode:
|
||
|
lodsb ; read byte from input stream
|
||
|
cmp al,192 ; encoded/unencoded byte ?
|
||
|
jae short .encoded
|
||
|
lea edx,[eax*2+eax] ; read color values from
|
||
|
mov al,[ebx+edx+2] ; palette and store them
|
||
|
stosb ; in the destination image
|
||
|
mov al,[ebx+edx+1]
|
||
|
stosb
|
||
|
mov al,[ebx+edx+0]
|
||
|
stosb
|
||
|
dec ebp ; one less to go...
|
||
|
jmp short .continue
|
||
|
.encoded:
|
||
|
and al,00111111b ; calc # of times to repeat
|
||
|
mov cl,al
|
||
|
lodsb ; read data byte
|
||
|
lea edx,[eax*2+eax] ; read color values from palette
|
||
|
mov al,[ebx+edx+2]
|
||
|
mov ah,[ebx+edx+1]
|
||
|
mov dl,[ebx+edx+0]
|
||
|
.bla: ; write color values
|
||
|
stosb
|
||
|
mov [edi],ah
|
||
|
inc edi
|
||
|
mov [edi],dl
|
||
|
inc edi
|
||
|
dec ebp ; one less to go...
|
||
|
loop .bla
|
||
|
xor ah,ah ; reset ah to 0 !
|
||
|
.continue:
|
||
|
or ebp,ebp ; all pixels decoded ?
|
||
|
jnz short .decode
|
||
|
|
||
|
popfd
|
||
|
popad
|
||
|
ret
|
||
|
|
||
|
|
||
|
%endif
|