forked from KolibriOS/kolibrios
libimg: begin of PCX image format support (version 3.0 24bit only for now)
git-svn-id: svn://kolibrios.org@1569 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
5990ba6772
commit
a01a8d3da4
File diff suppressed because it is too large
Load Diff
232
programs/develop/libraries/libs-dev/libimg/pcx/pcx.asm
Normal file
232
programs/develop/libraries/libs-dev/libimg/pcx/pcx.asm
Normal file
@ -0,0 +1,232 @@
|
||||
;;================================================================================================;;
|
||||
;;//// pcx.asm //// (c) dunkaist, 2010 ///////////////////////////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
;; ;;
|
||||
;; This file is part of Common development libraries (Libs-Dev). ;;
|
||||
;; ;;
|
||||
;; Libs-Dev is free software: you can redistribute it and/or modify it under the terms of the GNU ;;
|
||||
;; Lesser General Public License as published by the Free Software Foundation, either version 2.1 ;;
|
||||
;; of the License, or (at your option) any later version. ;;
|
||||
;; ;;
|
||||
;; Libs-Dev 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 ;;
|
||||
;; Lesser General Public License for more details. ;;
|
||||
;; ;;
|
||||
;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev. ;;
|
||||
;; If not, see <http://www.gnu.org/licenses/>. ;;
|
||||
;; ;;
|
||||
;;================================================================================================;;
|
||||
|
||||
include 'pcx.inc'
|
||||
;include '../../../../system/board/trunk/debug.inc'
|
||||
|
||||
;;================================================================================================;;
|
||||
proc img.is.pcx _data, _length ;//////////////////////////////////////////////////////////////////;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? Determine if raw data could be decoded (is in Targa format) ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> _data = raw data as read from file/stream ;;
|
||||
;> _length = data length ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< eax = false / true ;;
|
||||
;;================================================================================================;;
|
||||
|
||||
push ecx edi
|
||||
xor eax, eax
|
||||
|
||||
mov edi, [_data]
|
||||
|
||||
cmp [edi+pcx_header.magic_number], 10
|
||||
jne .is_not_pcx
|
||||
cmp [edi+pcx_header.version], 5
|
||||
jne .is_not_pcx
|
||||
cmp [edi+pcx_header.encoding], 1
|
||||
jne .is_not_pcx
|
||||
; cmp [esi+pcx_header.reserved], 1
|
||||
; jne .is_not_pcx
|
||||
|
||||
add edi, pcx_header.filler
|
||||
xor al, al
|
||||
mov ecx, 58
|
||||
cld
|
||||
repe scasb
|
||||
test ecx, ecx
|
||||
jnz .is_not_pcx
|
||||
|
||||
.is_pcx:
|
||||
;pusha
|
||||
;dps 'is_pcx'
|
||||
;newline
|
||||
;popa
|
||||
inc eax
|
||||
pop edi ecx
|
||||
ret
|
||||
|
||||
.is_not_pcx:
|
||||
;pusha
|
||||
;dps 'is_not_pcx'
|
||||
;newline
|
||||
;popa
|
||||
pop edi ecx
|
||||
ret
|
||||
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
proc img.decode.pcx _data, _length, _options ;////////////////////////////////////////////////////;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? Decode data into image if it contains correctly formed raw data in Targa format ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> _data = raw data as read from file/stream ;;
|
||||
;> _length = data length ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< eax = 0 (error) or pointer to image ;;
|
||||
;;================================================================================================;;
|
||||
locals
|
||||
; IMGwidth dd ?
|
||||
; IMGheight dd ?
|
||||
; IMGbpp dd ?
|
||||
buf rb 1
|
||||
nplanes rd 1
|
||||
xsize rw 1
|
||||
ysize rw 1
|
||||
stxsize rw 1
|
||||
stysize rw 1
|
||||
total_bpl rd 1
|
||||
line_begin rd 1
|
||||
retvalue rd 1
|
||||
|
||||
endl
|
||||
|
||||
pusha
|
||||
|
||||
mov esi, [_data]
|
||||
|
||||
xor eax, eax
|
||||
mov al, byte[esi+pcx_header.nplanes]
|
||||
mov [nplanes], eax
|
||||
mul word[esi+pcx_header.bpl]
|
||||
mov [total_bpl], eax
|
||||
|
||||
movzx eax, word[esi+pcx_header.xmax]
|
||||
inc ax
|
||||
sub ax, word[esi+pcx_header.xmin]
|
||||
mov [xsize], ax
|
||||
|
||||
movzx ebx, word[esi+pcx_header.ymax]
|
||||
inc bx
|
||||
sub bx, word[esi+pcx_header.ymin]
|
||||
mov [ysize], bx
|
||||
|
||||
stdcall img.create, eax, ebx, Image.bpp24
|
||||
mov [retvalue], eax
|
||||
test eax, eax
|
||||
jz .quit
|
||||
|
||||
movzx ebx, [xsize]
|
||||
movzx ecx, [ysize]
|
||||
mov edx, [eax+Image.Data]
|
||||
|
||||
rol ebx, 16
|
||||
or ebx, ecx
|
||||
xor ebx, [edx]
|
||||
mov [eax+Image.Checksum], ebx
|
||||
|
||||
|
||||
mov esi, [_data]
|
||||
add esi, 128
|
||||
mov edi, [retvalue]
|
||||
mov edi, [edi+Image.Data]
|
||||
add edi, 2
|
||||
mov [line_begin], edi
|
||||
mov ebx, [total_bpl]
|
||||
|
||||
.begin:
|
||||
mov eax, [_data]
|
||||
mov ax, word[eax+pcx_header.bpl]
|
||||
.decode:
|
||||
mov dl, byte[esi]
|
||||
inc esi
|
||||
mov [buf], dl
|
||||
and dl, 0xC0
|
||||
cmp dl, 0xC0
|
||||
jne @f
|
||||
mov dl, byte[buf]
|
||||
and dl, 0x3F
|
||||
mov dh, [esi]
|
||||
inc esi
|
||||
|
||||
.write_sequence:
|
||||
mov [edi], dh
|
||||
dec ax
|
||||
dec ebx
|
||||
add edi, [nplanes]
|
||||
dec dl
|
||||
test dl, dl
|
||||
jnz .write_sequence
|
||||
|
||||
test ax, ax
|
||||
jz .end_color_line
|
||||
jmp .decode
|
||||
@@:
|
||||
mov dl, byte[buf]
|
||||
mov [edi], dl
|
||||
add edi, [nplanes]
|
||||
dec ebx
|
||||
dec ax
|
||||
jz .end_color_line
|
||||
jmp .decode
|
||||
|
||||
.end_color_line:
|
||||
test ebx, ebx
|
||||
jz .end_full_line
|
||||
dec [line_begin]
|
||||
mov edi, [line_begin]
|
||||
jmp .begin
|
||||
|
||||
.end_full_line:
|
||||
dec word[ysize]
|
||||
jz .quit
|
||||
mov ebx, [total_bpl]
|
||||
add edi, 2
|
||||
mov [line_begin], edi
|
||||
jmp .begin
|
||||
|
||||
.quit:
|
||||
popa
|
||||
mov eax, [retvalue]
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
proc img.encode.pcx _img, _p_length, _options ;///////////////////////////////////////////////////;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? Encode image into raw data in Targa format ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> _img = pointer to image ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< eax = 0 (error) or pointer to encoded data ;;
|
||||
;< _p_length = encoded data length ;;
|
||||
;;================================================================================================;;
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
;;================================================================================================;;
|
||||
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
;! Below are private procs you should never call directly from your code ;;
|
||||
;;================================================================================================;;
|
||||
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
|
||||
;;================================================================================================;;
|
||||
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
;! Below is private data you should never use directly from your code ;;
|
||||
;;================================================================================================;;
|
||||
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
|
||||
;
|
37
programs/develop/libraries/libs-dev/libimg/pcx/pcx.inc
Normal file
37
programs/develop/libraries/libs-dev/libimg/pcx/pcx.inc
Normal file
@ -0,0 +1,37 @@
|
||||
;;================================================================================================;;
|
||||
;;//// pcx.inc //// (c) dunkaist, 2010 ///////////////////////////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
;; ;;
|
||||
;; This file is part of Common development libraries (Libs-Dev). ;;
|
||||
;; ;;
|
||||
;; Libs-Dev is free software: you can redistribute it and/or modify it under the terms of the GNU ;;
|
||||
;; Lesser General Public License as published by the Free Software Foundation, either version 2.1 ;;
|
||||
;; of the License, or (at your option) any later version. ;;
|
||||
;; ;;
|
||||
;; Libs-Dev 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 ;;
|
||||
;; Lesser General Public License for more details. ;;
|
||||
;; ;;
|
||||
;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev. ;;
|
||||
;; If not, see <http://www.gnu.org/licenses/>. ;;
|
||||
;; ;;
|
||||
;;================================================================================================;;
|
||||
|
||||
struct pcx_header
|
||||
magic_number rb 1
|
||||
version rb 1
|
||||
encoding rb 1
|
||||
bpp rb 1
|
||||
xmin rw 1
|
||||
ymin rw 1
|
||||
xmax rw 1
|
||||
ymax rw 1
|
||||
hres rw 1
|
||||
vres rw 1
|
||||
colormap rb 48
|
||||
reserved rb 1
|
||||
nplanes rb 1
|
||||
bpl rw 1
|
||||
palette_info rw 1
|
||||
filler rb 58
|
||||
ends
|
Loading…
Reference in New Issue
Block a user