libimg, version 4:

* decoder for animated GIFs
* some fixes in PNG and JPEG decoders
* internal image representation now allows 15 and 16 bpp
  (without conversions in decoders)
* decoder for TGA, Z80 from Nable

git-svn-id: svn://kolibrios.org@1079 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Evgeny Grechnikov (Diamond) 2009-05-24 16:47:14 +00:00
parent 3c09ef7d96
commit 1b6868a022
11 changed files with 2353 additions and 188 deletions

View File

@ -102,8 +102,7 @@ endl
jnz .error jnz .error
; convert images with <= 8 bpp to 8bpp, other - to 32 bpp ; convert images with <= 8 bpp to 8bpp, other - to 32 bpp
.normal: .normal:
xor eax, eax m2m eax, Image.bpp8
inc eax ; Image.bpp8
cmp [ebx + bmp.Header.info.BitCount], 8 cmp [ebx + bmp.Header.info.BitCount], 8
jbe @f jbe @f
mov al, Image.bpp32 mov al, Image.bpp32
@ -119,8 +118,7 @@ endl
pushd [ebx + bmp.Header.info.Width] pushd [ebx + bmp.Header.info.Width]
jmp .create jmp .create
.old1: .old1:
xor eax, eax m2m eax, Image.bpp8
inc eax ; Image.bpp8
cmp [ebx + bmp.Header.info.OldBitCount], 8 cmp [ebx + bmp.Header.info.OldBitCount], 8
jbe @f jbe @f
mov al, Image.bpp32 mov al, Image.bpp32

File diff suppressed because it is too large Load Diff

View File

@ -61,7 +61,9 @@ gif.Block.Introducer.ImageDescriptor = 0x2C
gif.Block.Introducer.EndOfFile = 0x3B gif.Block.Introducer.EndOfFile = 0x3B
struct gif.ImageDescriptor ; GIF87a struct gif.ImageDescriptor ; GIF87a
b gif.Block ; Introducer = 2Ch (',') ; we read Introducer before parsing gif.ImageDescriptor,
; so it is convenient to not include it in struct
; b gif.Block ; Introducer = 2Ch (',')
Left dw ? ; X position of image on the display Left dw ? ; X position of image on the display
Top dw ? ; Y position of image on the display Top dw ? ; Y position of image on the display
Width dw ? ; Width of the image in pixels Width dw ? ; Width of the image in pixels
@ -89,8 +91,8 @@ gif.Extension.Label.Comment = 0xFE
gif.Extension.Label.Application = 0xFF gif.Extension.Label.Application = 0xFF
struct gif.PlainTextExtension ; GIF89a struct gif.PlainTextExtension ; GIF89a
e gif.Extension ; Label = 01h ; e gif.Extension ; Label = 01h
BlockSize db ? ; Size of Extension Block (always 0Ch) ; BlockSize db ? ; Size of Extension Block (always 0Ch)
TextGridLeft dw ? ; X position of text grid in pixels TextGridLeft dw ? ; X position of text grid in pixels
TextGridTop dw ? ; Y position of text grid in pixels TextGridTop dw ? ; Y position of text grid in pixels
TextGridWidth dw ? ; Width of the text grid in pixels TextGridWidth dw ? ; Width of the text grid in pixels
@ -104,8 +106,10 @@ struct gif.PlainTextExtension ; GIF89a
ends ends
struct gif.GraphicsControlExtension ; GIF89a struct gif.GraphicsControlExtension ; GIF89a
e gif.Extension ; Label = F9h ; e gif.Extension ; Label = F9h
BlockSize db ? ; Size of remaining fields (always 04h) ; BlockSize db ? ; Size of remaining fields (always 04h)
; previous fields are not included in this structure for convenience
; (they are parsed before this)
Packed db ? ; Method of graphics disposal to use Packed db ? ; Method of graphics disposal to use
DelayTime dw ? ; Hundredths of seconds to wait DelayTime dw ? ; Hundredths of seconds to wait
ColorIndex db ? ; Transparent Color Index ColorIndex db ? ; Transparent Color Index
@ -130,8 +134,9 @@ ends
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
struct gif.Image struct gif.Image
gce gif.GraphicsControlExtension
info gif.ImageDescriptor info gif.ImageDescriptor
gce gif.GraphicsControlExtension
; lsd gif.LogicalScreenDescriptor ; saved only in first image
ends ends
gif.Null equ 0x1000 gif.Null equ 0x1000

View File

@ -474,8 +474,8 @@ img.decode.jpg:
; image type: 8 bpp for grayscale JPEGs, 24 bpp for normal, ; image type: 8 bpp for grayscale JPEGs, 24 bpp for normal,
; 32 bpp for Adobe YCCK ; 32 bpp for Adobe YCCK
push Image.bpp8 push Image.bpp8
pop eax pop eax ; Image.bpp8 = 1
cmp edi, 1 cmp edi, eax
jz @f jz @f
inc eax ; Image.bpp24 = 2 inc eax ; Image.bpp24 = 2
cmp edi, 3 cmp edi, 3
@ -1621,9 +1621,9 @@ handle_progressive:
stosd ; dd VFactor_i+1 - (height % VFactor_i) stosd ; dd VFactor_i+1 - (height % VFactor_i)
pop ecx pop ecx
xor eax, eax xor eax, eax
cmp ebp, 1 test ebp, ebp
cmc setnp al
rcr eax, 1 ror eax, 1
stosd ; dd DCPrediction stosd ; dd DCPrediction
mov eax, ebp mov eax, ebp
stosd ; dd ComponentOffset stosd ; dd ComponentOffset

View File

@ -35,11 +35,8 @@ include 'bmp/bmp.asm'
include 'gif/gif.asm' include 'gif/gif.asm'
include 'jpeg/jpeg.asm' include 'jpeg/jpeg.asm'
include 'png/png.asm' include 'png/png.asm'
include 'tga/tga.asm'
mem.alloc dd ? include 'z80/z80.asm'
mem.free dd ?
mem.realloc dd ?
dll.load dd ?
;;================================================================================================;; ;;================================================================================================;;
proc lib_init ;///////////////////////////////////////////////////////////////////////////////////;; proc lib_init ;///////////////////////////////////////////////////////////////////////////////////;;
@ -60,6 +57,14 @@ proc lib_init ;/////////////////////////////////////////////////////////////////
call img.initialize.jpeg call img.initialize.jpeg
xor eax, eax
cpuid
cmp ecx, 'ntel'
jnz @f
mov dword [img._.do_rgb.handlers + (Image.bpp15-1)*4], img._.do_rgb.bpp15.intel
mov dword [img._.do_rgb.handlers + (Image.bpp16-1)*4], img._.do_rgb.bpp16.intel
@@:
.ok: xor eax,eax .ok: xor eax,eax
ret ret
endp endp
@ -211,10 +216,267 @@ proc img._.do_rgb ;/////////////////////////////////////////////////////////////
mov ecx, [esi + Image.Width] mov ecx, [esi + Image.Width]
imul ecx, [esi + Image.Height] imul ecx, [esi + Image.Height]
mov eax, [esi + Image.Type] mov eax, [esi + Image.Type]
dec eax jmp dword [.handlers + (eax-1)*4]
jz .bpp8
dec eax align 16
jz .bpp24 .bpp8:
; 8 BPP -> 24 BPP
push ebx
mov ebx, [esi + Image.Palette]
mov esi, [esi + Image.Data]
@@:
movzx eax, byte [esi]
add esi, 1
mov eax, [ebx + eax*4]
mov [edi], eax
add edi, 3
sub ecx, 1
jnz @b
pop ebx
ret
; 15 BPP -> 24 BPP
.bpp15.intel:
push ebx ebp
sub ecx, 4
jb .bpp15.tail
align 16
.bpp15.intel.loop:
repeat 2
mov ebx, [esi]
mov al, [esi]
mov ah, [esi+1]
add esi, 4
and al, 0x1F
and ah, 0x1F shl 2
mov ebp, ebx
mov dl, al
mov dh, ah
shr al, 2
shr ah, 4
shl dl, 3
shl dh, 1
and ebp, 0x1F shl 5
add al, dl
add ah, dh
shr ebp, 2
mov [edi], al
mov [edi+2], ah
mov eax, ebx
mov ebx, ebp
shr eax, 16
shr ebx, 5
add ebx, ebp
mov ebp, eax
mov [edi+1], bl
and eax, (0x1F) or (0x1F shl 10)
and ebp, 0x1F shl 5
lea edx, [eax+eax]
shr al, 2
mov ebx, ebp
shr ah, 4
shl dl, 2
shr ebx, 2
shr ebp, 7
add al, dl
add ah, dh
mov [edi+3], al
add ebx, ebp
mov [edi+5], ah
mov [edi+4], bl
add edi, 6
end repeat
sub ecx, 4
jnb .bpp15.intel.loop
.bpp15.tail:
add ecx, 4
jz .bpp15.done
@@:
movzx eax, word [esi]
mov ebx, eax
add esi, 2
and eax, (0x1F) or (0x1F shl 10)
and ebx, 0x1F shl 5
lea edx, [eax+eax]
shr al, 2
mov ebp, ebx
shr ebx, 2
shr ah, 4
shl dl, 2
shr ebp, 7
add eax, edx
add ebx, ebp
mov [edi], al
mov [edi+1], bl
mov [edi+2], ah
add edi, 3
sub ecx, 1
jnz @b
.bpp15.done:
pop ebp ebx
ret
.bpp15.amd:
push ebx ebp
sub ecx, 4
jb .bpp15.tail
align 16
.bpp15.amd.loop:
repeat 4
if (% mod 2) = 1
mov eax, dword [esi]
mov ebx, dword [esi]
else
movzx eax, word [esi]
mov ebx, eax
end if
add esi, 2
and eax, (0x1F) or (0x1F shl 10)
and ebx, 0x1F shl 5
lea edx, [eax+eax]
shr al, 2
mov ebp, ebx
shr ebx, 2
shr ah, 4
shl dl, 2
shr ebp, 7
add eax, edx
add ebx, ebp
mov [edi], al
mov [edi+1], bl
mov [edi+2], ah
add edi, 3
end repeat
sub ecx, 4
jnb .bpp15.amd.loop
jmp .bpp15.tail
; 16 BPP -> 24 BPP
.bpp16.intel:
push ebx ebp
sub ecx, 4
jb .bpp16.tail
align 16
.bpp16.intel.loop:
repeat 2
mov ebx, [esi]
mov al, [esi]
mov ah, [esi+1]
add esi, 4
and al, 0x1F
and ah, 0x1F shl 3
mov ebp, ebx
mov dl, al
mov dh, ah
shr al, 2
shr ah, 5
shl dl, 3
and ebp, 0x3F shl 5
add al, dl
add ah, dh
shr ebp, 3
mov [edi], al
mov [edi+2], ah
mov eax, ebx
mov ebx, ebp
shr eax, 16
shr ebx, 6
add ebx, ebp
mov ebp, eax
mov [edi+1], bl
and eax, (0x1F) or (0x1F shl 11)
and ebp, 0x3F shl 5
mov edx, eax
shr al, 2
mov ebx, ebp
shr ah, 5
shl dl, 3
shr ebx, 3
shr ebp, 9
add al, dl
add ah, dh
mov [edi+3], al
add ebx, ebp
mov [edi+5], ah
mov [edi+4], bl
add edi, 6
end repeat
sub ecx, 4
jnb .bpp16.intel.loop
.bpp16.tail:
add ecx, 4
jz .bpp16.done
@@:
movzx eax, word [esi]
mov ebx, eax
add esi, 2
and eax, (0x1F) or (0x1F shl 11)
and ebx, 0x3F shl 5
mov edx, eax
shr al, 2
mov ebp, ebx
shr ebx, 3
shr ah, 5
shl dl, 3
shr ebp, 9
add eax, edx
add ebx, ebp
mov [edi], al
mov [edi+1], bl
mov [edi+2], ah
add edi, 3
sub ecx, 1
jnz @b
.bpp16.done:
pop ebp ebx
ret
.bpp16.amd:
push ebx ebp
sub ecx, 4
jb .bpp16.tail
align 16
.bpp16.amd.loop:
repeat 4
if (% mod 2) = 1
mov eax, dword [esi]
mov ebx, dword [esi]
else
movzx eax, word [esi]
mov ebx, eax
end if
add esi, 2
and eax, (0x1F) or (0x1F shl 11)
and ebx, 0x3F shl 5
mov edx, eax
shr al, 2
mov ebp, ebx
shr ebx, 3
shr ah, 5
shl dl, 3
shr ebp, 9
add eax, edx
add ebx, ebp
mov [edi], al
mov [edi+1], bl
mov [edi+2], ah
add edi, 3
end repeat
sub ecx, 4
jnb .bpp16.amd.loop
jmp .bpp16.tail
align 16
.bpp24:
; 24 BPP -> 24 BPP
lea ecx, [ecx*3 + 3]
mov esi, [esi + Image.Data]
shr ecx, 2
rep movsd
ret
align 16
.bpp32:
; 32 BPP -> 24 BPP ; 32 BPP -> 24 BPP
mov esi, [esi + Image.Data] mov esi, [esi + Image.Data]
@ -231,31 +493,6 @@ proc img._.do_rgb ;/////////////////////////////////////////////////////////////
@@: @@:
ret ret
.bpp24:
; 24 BPP -> 24 BPP
lea ecx, [ecx*3 + 3]
mov esi, [esi + Image.Data]
shr ecx, 2
rep movsd
ret
.bpp8:
; 8 BPP -> 24 BPP
push ebx
mov ebx, [esi + Image.Palette]
mov esi, [esi + Image.Data]
@@:
movzx eax, byte [esi]
add esi, 1
mov eax, [ebx + eax*4]
mov [edi], ax
shr eax, 16
mov [edi+2], al
add edi, 3
sub ecx, 1
jnz @b
pop ebx
ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -334,6 +571,32 @@ proc img.create _width, _height, _type ;////////////////////////////////////////
ret ret
endp endp
;;================================================================================================;;
proc img.destroy.layer _img ;/////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = false / true ;;
;;================================================================================================;;
mov eax, [_img]
mov edx, [eax + Image.Previous]
test edx, edx
jz @f
push [eax + Image.Next]
pop [edx + Image.Next]
@@:
mov edx, [eax + Image.Next]
test edx, edx
jz @f
push [eax + Image.Previous]
pop [edx + Image.Previous]
@@:
stdcall img._.delete, eax
ret
endp
;;================================================================================================;; ;;================================================================================================;;
proc img.destroy _img ;///////////////////////////////////////////////////////////////////////////;; proc img.destroy _img ;///////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
@ -343,8 +606,33 @@ proc img.destroy _img ;/////////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = false / true ;; ;< eax = false / true ;;
;;================================================================================================;; ;;================================================================================================;;
;TODO: link Next and Previous push 1
stdcall img._.delete, [_img] mov eax, [_img]
mov eax, [eax + Image.Previous]
.destroy_prev_loop:
test eax, eax
jz .destroy_prev_done
pushd [eax + Image.Previous]
stdcall img._.delete, eax
test eax, eax
jnz @f
mov byte [esp+4], 0
@@:
pop eax
jmp .destroy_prev_loop
.destroy_prev_done:
mov eax, [_img]
.destroy_next_loop:
pushd [eax + Image.Next]
stdcall img._.delete, eax
test eax, eax
jnz @f
mov byte [esp+4], 0
@@:
pop eax
test eax, eax
jnz .destroy_next_loop
pop eax
ret ret
endp endp
@ -417,9 +705,9 @@ proc img.unlock_bits _img, _lock ;//////////////////////////////////////////////
endp endp
;;================================================================================================;; ;;================================================================================================;;
proc img.flip _img, _flip_kind ;//////////////////////////////////////////////////////////////////;; proc img.flip.layer _img, _flip_kind ;////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? Flip image ;; ;? Flip image layer ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> _img = pointer to image ;; ;> _img = pointer to image ;;
;> _flip_kind = one of FLIP_* constants ;; ;> _flip_kind = one of FLIP_* constants ;;
@ -493,12 +781,9 @@ endl
mov esi, [ebx + Image.Data] mov esi, [ebx + Image.Data]
mov edi, [scanline_len] mov edi, [scanline_len]
add edi, esi add edi, esi
jmp dword [.handlers_horz + (eax-1)*4]
dec eax .bpp32_horz:
jz .bpp8.2
dec eax
jz .bpp24.2
sub edi, 4 sub edi, 4
.next_line_horz: .next_line_horz:
@ -521,7 +806,29 @@ endl
jnz .next_line_horz jnz .next_line_horz
jmp .exit jmp .exit
.bpp8.2: .bpp1x_horz:
sub edi, 2
.next_line_horz1x:
push ecx esi edi
mov ecx, [ebx + Image.Width]
@@: mov ax, [esi]
mov dx, [edi]
mov [edi], ax
mov [esi], dx
add esi, 2
sub edi, 2
sub ecx, 2
ja @b
pop edi esi ecx
add esi, [scanline_len]
add edi, [scanline_len]
dec ecx
jnz .next_line_horz1x
jmp .exit
.bpp8_horz:
dec edi dec edi
.next_line_horz8: .next_line_horz8:
push ecx esi edi push ecx esi edi
@ -544,13 +851,12 @@ endl
jnz .next_line_horz8 jnz .next_line_horz8
jmp .exit jmp .exit
.bpp24.2: .bpp24_horz:
sub edi, 3 sub edi, 3
.next_line_horz32: .next_line_horz24:
push ecx esi edi push ecx esi edi
mov ecx, [ebx + Image.Width] mov ecx, [ebx + Image.Width]
shr ecx, 1
@@: @@:
mov al, [esi] mov al, [esi]
mov dl, [edi] mov dl, [edi]
@ -566,14 +872,14 @@ endl
mov [esi+2], dl mov [esi+2], dl
add esi, 3 add esi, 3
sub edi, 3 sub edi, 3
sub ecx, 1 sub ecx, 2
jnz @b ja @b
pop edi esi ecx pop edi esi ecx
add esi, [scanline_len] add esi, [scanline_len]
add edi, [scanline_len] add edi, [scanline_len]
dec ecx dec ecx
jnz .next_line_horz32 jnz .next_line_horz24
.exit: .exit:
xor eax, eax xor eax, eax
@ -588,9 +894,40 @@ endl
endp endp
;;================================================================================================;; ;;================================================================================================;;
proc img.rotate _img, _rotate_kind ;//////////////////////////////////////////////////////////////;; proc img.flip _img, _flip_kind ;//////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;? Rotate image ;; ;? Flip all layers of image ;;
;;------------------------------------------------------------------------------------------------;;
;> _img = pointer to image ;;
;> _flip_kind = one of FLIP_* constants ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = false / true ;;
;;================================================================================================;;
push 1
mov ebx, [_img]
@@:
mov eax, [ebx + Image.Previous]
test eax, eax
jz .loop
mov ebx, eax
jmp @b
.loop:
stdcall img.flip.layer, ebx, [_flip_kind]
test eax, eax
jnz @f
mov byte [esp], 0
@@:
mov ebx, [ebx + Image.Next]
test ebx, ebx
jnz .loop
pop eax
ret
endp
;;================================================================================================;;
proc img.rotate.layer _img, _rotate_kind ;////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Rotate image layer ;;
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;> _img = pointer to image ;; ;> _img = pointer to image ;;
;> _rotate_kind = one of ROTATE_* constants ;; ;> _rotate_kind = one of ROTATE_* constants ;;
@ -646,7 +983,57 @@ endl
jz .rotate_ccw8 jz .rotate_ccw8
cmp [ebx + Image.Type], Image.bpp24 cmp [ebx + Image.Type], Image.bpp24
jz .rotate_ccw24 jz .rotate_ccw24
cmp [ebx + Image.Type], Image.bpp32
jz .rotate_ccw32
.next_column_ccw_low1x:
dec ecx
js .exchange_dims
push ecx
mov edx, [scanline_len_old]
add [scanline_len_old], -2
mov ecx, [scanline_pixels_new]
mov esi, [ebx + Image.Data]
mov edi, [line_buffer]
@@: mov ax, [esi]
mov [edi], ax
add esi, edx
add edi, 2
sub ecx, 1
jnz @b
mov eax, [scanline_pixels_new]
mov edi, [ebx + Image.Data]
lea esi, [edi + 2]
mov edx, [scanline_len_old]
@@: mov ecx, edx
shr ecx, 2
rep movsd
mov ecx, edx
and ecx, 3
rep movsb
add esi, 1
sub eax, 1
jnz @b
mov eax, [scanline_len_new]
sub [pixels_ptr], eax
mov ecx, [scanline_pixels_new]
mov esi, [line_buffer]
mov edi, [pixels_ptr]
mov edx, ecx
shr ecx, 2
rep movsd
mov ecx, edx
and ecx, 3
rep movsb
pop ecx
jmp .next_column_ccw_low1x
.rotate_ccw32:
.next_column_ccw_low: .next_column_ccw_low:
dec ecx dec ecx
js .exchange_dims js .exchange_dims
@ -809,7 +1196,59 @@ endl
jz .rotate_cw8 jz .rotate_cw8
cmp [ebx + Image.Type], Image.bpp24 cmp [ebx + Image.Type], Image.bpp24
jz .rotate_cw24 jz .rotate_cw24
cmp [ebx + Image.Type], Image.bpp32
jz .rotate_cw32
.next_column_cw_low1x:
dec ecx
js .exchange_dims
push ecx
mov edx, [scanline_len_old]
add [scanline_len_old], -2
mov ecx, [scanline_pixels_new]
mov esi, [pixels_ptr]
add esi, -2
mov edi, [line_buffer]
@@: mov ax, [esi]
mov [edi], ax
sub esi, edx
add edi, 2
sub ecx, 1
jnz @b
mov eax, [scanline_pixels_new]
dec eax
mov edi, [ebx + Image.Data]
add edi, [scanline_len_old]
lea esi, [edi + 2]
mov edx, [scanline_len_old]
@@: mov ecx, edx
shr ecx, 2
rep movsd
mov ecx, edx
and ecx, 3
rep movsb
add esi, 3
sub eax, 1
jnz @b
mov eax, [scanline_len_new]
sub [pixels_ptr], eax
mov ecx, eax
mov esi, [line_buffer]
mov edi, [pixels_ptr]
shr ecx, 2
rep movsd
mov ecx, eax
and ecx, 3
rep movsb
pop ecx
jmp .next_column_cw_low1x
.rotate_cw32:
.next_column_cw_low: .next_column_cw_low:
dec ecx dec ecx
js .exchange_dims js .exchange_dims
@ -976,6 +1415,92 @@ endl
ret ret
endp endp
;;================================================================================================;;
proc img.rotate _img, _rotate_kind ;//////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Rotate all layers of image ;;
;;------------------------------------------------------------------------------------------------;;
;> _img = pointer to image ;;
;> _rotate_kind = one of ROTATE_* constants ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = false / true ;;
;;================================================================================================;;
push 1
mov ebx, [_img]
@@:
mov eax, [ebx + Image.Previous]
test eax, eax
jz .loop
mov ebx, eax
jmp @b
.loop:
stdcall img.rotate.layer, ebx, [_rotate_kind]
test eax, eax
jnz @f
mov byte [esp], 0
@@:
mov ebx, [ebx + Image.Next]
test ebx, ebx
jnz .loop
pop eax
ret
endp
;;================================================================================================;;
proc img.draw _img, _x, _y, _width, _height, _xpos, _ypos ;///////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Draw image in the window ;;
;;------------------------------------------------------------------------------------------------;;
;> _img = pointer to image ;;
;>_x = x-coordinate in the window ;;
;>_y = y-coordinate in the window ;;
;>_width = maximum width to draw ;;
;>_height = maximum height to draw ;;
;>_xpos = offset in image by x-axis ;;
;>_ypos = offset in image by y-axis ;;
;;------------------------------------------------------------------------------------------------;;
;< no return value ;;
;;================================================================================================;;
push ebx esi edi
mov ebx, [_img]
stdcall img._.validate, ebx
test eax, eax
jnz .done
mov ecx, [ebx + Image.Width]
sub ecx, [_xpos]
jbe .done
cmp ecx, [_width]
jb @f
mov ecx, [_width]
@@:
mov edx, [ebx + Image.Height]
sub edx, [_ypos]
jbe .done
cmp edx, [_height]
jb @f
mov edx, [_height]
@@:
mov eax, [ebx + Image.Width]
sub eax, ecx
call img._.get_scanline_len
shl ecx, 16
add ecx, edx
mov edx, [_x - 2]
mov dx, word [_y]
mov esi, [ebx + Image.Type]
mov esi, [type2bpp + (esi-1)*4]
mov edi, [ebx + Image.Palette]
mov ebx, [ebx + Image.Data]
push ebp
push 65
pop ebp
xchg eax, ebp
int 40h
pop ebp
.done:
pop edi esi ebx
ret
endp
;;================================================================================================;; ;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;; ;;////////////////////////////////////////////////////////////////////////////////////////////////;;
@ -1015,6 +1540,7 @@ proc img._.new ;////////////////////////////////////////////////////////////////
xor ecx, ecx xor ecx, ecx
mov [eax + Image.Data], ecx mov [eax + Image.Data], ecx
mov [eax + Image.Type], ecx mov [eax + Image.Type], ecx
mov [eax + Image.Flags], ecx
mov [eax + Image.Extended], ecx mov [eax + Image.Extended], ecx
mov [eax + Image.Previous], ecx mov [eax + Image.Previous], ecx
mov [eax + Image.Next], ecx mov [eax + Image.Next], ecx
@ -1118,7 +1644,10 @@ img._.get_scanline_len: ;///////////////////////////////////////////////////////
jz .bpp8.1 jz .bpp8.1
cmp [ebx + Image.Type], Image.bpp24 cmp [ebx + Image.Type], Image.bpp24
jz .bpp24.1 jz .bpp24.1
shl eax, 2 add eax, eax
cmp [ebx + Image.Type], Image.bpp32
jnz @f
add eax, eax
jmp @f jmp @f
.bpp24.1: .bpp24.1:
lea eax, [eax*3] lea eax, [eax*3]
@ -1135,7 +1664,7 @@ img._.get_scanline_len: ;///////////////////////////////////////////////////////
;;////////////////////////////////////////////////////////////////////////////////////////////////;; ;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;; ;;================================================================================================;;
align 4
img._.formats_table: img._.formats_table:
.bmp dd img.is.bmp, img.decode.bmp, img.encode.bmp .bmp dd img.is.bmp, img.decode.bmp, img.encode.bmp
; .ico dd img.is.ico, img.decode.ico, img.encode.ico ; .ico dd img.is.ico, img.decode.ico, img.encode.ico
@ -1143,8 +1672,26 @@ img._.formats_table:
.gif dd img.is.gif, img.decode.gif, img.encode.gif .gif dd img.is.gif, img.decode.gif, img.encode.gif
.png dd img.is.png, img.decode.png, img.encode.png .png dd img.is.png, img.decode.png, img.encode.png
.jpg dd img.is.jpg, img.decode.jpg, img.encode.jpg .jpg dd img.is.jpg, img.decode.jpg, img.encode.jpg
.tga dd img.is.tga, img.decode.tga, img.encode.tga
.z80 dd img.is.z80, img.decode.z80, img.encode.z80 ;this must be the last entry as there are no
;signatures in z80 screens at all
dd 0 dd 0
align 4
type2bpp dd 8, 24, 32, 15, 16
img._.do_rgb.handlers:
dd img._.do_rgb.bpp8
dd img._.do_rgb.bpp24
dd img._.do_rgb.bpp32
dd img._.do_rgb.bpp15.amd ; can be overwritten in lib_init
dd img._.do_rgb.bpp16.amd ; can be overwritten in lib_init
img.flip.layer.handlers_horz:
dd img.flip.layer.bpp8_horz
dd img.flip.layer.bpp24_horz
dd img.flip.layer.bpp32_horz
dd img.flip.layer.bpp1x_horz
dd img.flip.layer.bpp1x_horz
;;================================================================================================;; ;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;; ;;////////////////////////////////////////////////////////////////////////////////////////////////;;
@ -1160,23 +1707,27 @@ align 4
export \ export \
lib_init , 'lib_init' , \ lib_init , 'lib_init' , \
0x00010003 , 'version' , \ 0x00010004 , 'version' , \
img.is_img , 'img.is_img' , \ img.is_img , 'img.is_img' , \
img.info , 'img.info' , \ img.info , 'img.info' , \
img.from_file , 'img.from_file' , \ img.from_file , 'img.from_file' , \
img.to_file , 'img.to_file' , \ img.to_file , 'img.to_file' , \
img.from_rgb , 'img.from_rgb' , \ img.from_rgb , 'img.from_rgb' , \
img.to_rgb , 'img.to_rgb' , \ img.to_rgb , 'img.to_rgb' , \
img.to_rgb2 , 'img.to_rgb2' , \ img.to_rgb2 , 'img.to_rgb2' , \
img.decode , 'img.decode' , \ img.decode , 'img.decode' , \
img.encode , 'img.encode' , \ img.encode , 'img.encode' , \
img.create , 'img.create' , \ img.create , 'img.create' , \
img.destroy , 'img.destroy' , \ img.destroy , 'img.destroy' , \
img.destroy.layer, 'img.destroy.layer', \
img.count , 'img.count' , \ img.count , 'img.count' , \
img.lock_bits , 'img.lock_bits' , \ img.lock_bits , 'img.lock_bits' , \
img.unlock_bits , 'img.unlock_bits' , \ img.unlock_bits , 'img.unlock_bits' , \
img.flip , 'img.flip' , \ img.flip , 'img.flip' , \
img.rotate , 'img.rotate' img.flip.layer , 'img.flip.layer' , \
img.rotate , 'img.rotate' , \
img.rotate.layer, 'img.rotate.layer', \
img.draw , 'img.draw'
; import from deflate unpacker ; import from deflate unpacker
; is initialized only when PNG loading is requested ; is initialized only when PNG loading is requested
@ -1187,11 +1738,21 @@ library kfar_arc, '../File Managers/kfar_arc.obj'
import kfar_arc, \ import kfar_arc, \
deflate_unpack2, 'deflate_unpack2' deflate_unpack2, 'deflate_unpack2'
align 4
; mutex for unpacker loading ; mutex for unpacker loading
deflate_loader_mutex dd 0 deflate_loader_mutex dd 0
; default palette for GIF - b&w
gif_default_palette:
db 0, 0, 0
db 0xFF, 0xFF, 0xFF
section '.data' data readable writable align 16 section '.data' data readable writable align 16
; uninitialized data - global constant tables ; uninitialized data - global constant tables
mem.alloc dd ?
mem.free dd ?
mem.realloc dd ?
dll.load dd ?
; data for YCbCr -> RGB translation ; data for YCbCr -> RGB translation
color_table_1 rd 256 color_table_1 rd 256

View File

@ -34,11 +34,20 @@ struct Image
Data dd ? Data dd ?
Palette dd ? ; used iff Type eq Image.bpp8 Palette dd ? ; used iff Type eq Image.bpp8
Extended dd ? Extended dd ?
Flags dd ? ; bitfield
Delay dd ? ; used iff Image.IsAnimated is set in Flags
ends ends
Image.bpp8 = 1 ; values for Image.Type
; must be consecutive to allow fast switch on Image.Type in support functions
Image.bpp8 = 1
Image.bpp24 = 2 Image.bpp24 = 2
Image.bpp32 = 3 Image.bpp32 = 3
Image.bpp15 = 4
Image.bpp16 = 5
; bits in Image.Flags
Image.IsAnimated = 1
FLIP_VERTICAL = 0x01 FLIP_VERTICAL = 0x01
FLIP_HORIZONTAL = 0x02 FLIP_HORIZONTAL = 0x02

View File

@ -515,6 +515,8 @@ align 4
mov [edi+2], al mov [edi+2], al
mov al, [esi+3] mov al, [esi+3]
mov [edi+3], al mov [edi+3], al
add esi, 4
add edi, 4
sub ecx, 4 sub ecx, 4
jnz @b jnz @b
sub edx, 1 sub edx, 1
@ -737,8 +739,10 @@ end repeat
sub ebx, ecx sub ebx, ecx
jc .convert_done jc .convert_done
@@: @@:
convert_16_to_8 mov ax, [esi]
add esi, 2 add esi, 2
convert_16_to_8
mov [edi], al
add edi, 1 add edi, 1
sub ecx, 2 sub ecx, 2
jnz @b jnz @b
@ -821,8 +825,10 @@ end repeat
sub ebx, ecx sub ebx, ecx
jc .convert_done jc .convert_done
@@: @@:
convert_16_to_8 mov ax, [esi]
add esi, 4 add esi, 4
convert_16_to_8
mov [edi], al
add edi, 1 add edi, 1
sub ecx, 4 sub ecx, 4
jnz @b jnz @b

View File

@ -0,0 +1,250 @@
;;================================================================================================;;
;;//// tga.asm //// (c) Nable, 2007-2008 /////////////////////////////////////////////////////////;;
;;================================================================================================;;
;; ;;
;; 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/>. ;;
;; ;;
;;================================================================================================;;
;; ;;
;; References: ;;
;; 1. Hiview 1.2 by Mohammad A. REZAEI ;;
;; ;;
;;================================================================================================;;
include 'tga.inc'
;;================================================================================================;;
proc img.is.tga _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 ;;
;;================================================================================================;;
cmp [_length], 18
jbe .nope
mov eax, [_data]
push ebx
mov ebx,[eax+1] ;bl=cmatype,bh=subtype
cmp bl,1 ;cmatype is in [0..1]
ja .nope
cmp bh,11 ;subtype is in [1..3] (non-rle) or in [9..11] (rle)
ja .nope
cmp bh,9
jae .cont1
cmp bh,3
ja .nope
.cont1: ;continue testing
mov ebx,[eax+16] ;bl=bpp, bh=flags //image descriptor
test ebx,111b ;bpp must be 8, 15, 16, 24 or 32
jnz .maybe15
shr bl,3
cmp bl,4
ja .nope
jmp .cont2
.maybe15:
cmp bl,15
jne .nope
.cont2: ;continue testing
test bh,tga.flags.interlace_type ;deinterlacing is not supported yet
jnz .nope
cmp byte[eax+7],24 ;test palette bpp - only 24 and 32 are supported
je .yep
cmp byte[eax+7],32 ;test palette bpp - only 24 and 32 are supported
je .yep
.nope:
xor eax, eax
pop ebx
ret
.yep:
xor eax, eax
inc eax
pop ebx
ret
endp
;;================================================================================================;;
proc img.decode.tga _data, _length ;//////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? 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 ?
DupPixelCount dd ?
TgaBlockCount dd ?
endl
pushad
cld ;paranoia
and [DupPixelCount],0 ;prepare variables
and [TgaBlockCount],0 ;prepare variables
mov eax,[_data]
movzx esi,byte[eax]
lea esi,[esi+eax+18] ;skip comment and header
mov ebx,[eax+12]
movzx ecx,bx ;ecx=width
shr ebx,16 ;ebx=height
mov [IMGwidth],ecx
mov [IMGheight],ebx
movzx edx,byte[eax+16]
cmp edx,16
jnz @f
dec edx ;16bpp tga images are really 15bpp ARGB
@@:
sub edx, 16 - Image.bpp16 ; 15 -> Image.bpp15, 16 -> Image.bpp16
mov [IMGbpp],edx
stdcall img.create,ecx,ebx,edx
mov [esp+28],eax ;save return value
test eax,eax ;failed to allocate?
jz .locret ;then exit
cmp edx,8
jne .palette_parsed
mov edi,[eax+Image.Palette]
mov ecx,[_data]
cmp byte[ecx+2],3 ;we also have grayscale subtype
jz .write_grayscale_palette ;that don't hold palette in file
cmp byte[ecx+2],11
jz .write_grayscale_palette
mov dh,[ecx+7] ;size of colormap entries in bits
movzx ecx,word[ecx+5] ;number of colormap entries
cmp dh,24
jz .skip_24bpp_palette ;test if colormap entries are 24bpp
rep movsd ;else they are 32 bpp
jmp .palette_parsed
.write_grayscale_palette:
push eax
mov ecx,0x100
xor eax,eax
@@:
stosd
add eax,0x010101
loop @b
pop eax
jmp .palette_parsed
.skip_24bpp_palette:
push eax
@@:
lodsd
dec esi
and eax,0xFFFFFF
; bswap eax
; shr eax,8
stosd
loop @b
pop eax
.palette_parsed:
mov edi,[eax+Image.Data]
imul ebx,[IMGwidth] ;ebx=width*height
mov edx,[IMGbpp]
add edx,7
shr edx,3 ;edx=bytes per pixel
mov dh,dl ;dh=dl=bytes per pixel
mov eax,[_data]
cmp byte[eax+2],9
jb .not_an_rle
.tga_read_rle_pixel:
cmp [DupPixelCount],0 ;Duplicate previously read pixel?
jg .duplicate_previously_read_pixel
dec [TgaBlockCount] ;Decrement pixels remaining in block
jns .read_non_rle_pixel
xor eax,eax
lodsb
test al,al ;Start of duplicate-pixel block?
jns .2
and al,0x7f
mov [DupPixelCount],eax ;Number of duplications after this one
and [TgaBlockCount],0 ;Then read new block header
jmp .read_non_rle_pixel
.2:
mov dword[TgaBlockCount],eax
.read_non_rle_pixel:
xor eax,eax
mov dl,dh
@@:
shl eax,8
lodsb
dec dl
jnz @b
cmp dh,3
jne .put_pixel
bswap eax
shr eax,8
jmp .put_pixel
.duplicate_previously_read_pixel:
dec [DupPixelCount]
.put_pixel:
mov dl,dh
push eax
@@:
stosb
shr eax,8
dec dl
jnz @b
pop eax
dec ebx
jnz .tga_read_rle_pixel
jmp .locret
.not_an_rle:
movzx edx,dl ;dh contains bpp too (for decoding needs)
imul edx,ebx
mov ecx,edx
rep movsb ;just copy the image
.locret:
popad
ret
endp
;;================================================================================================;;
proc img.encode.tga _img, _p_length ;/////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? 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 ;;
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
;

View File

@ -0,0 +1,35 @@
;;================================================================================================;;
;;//// tga.inc //// (c) Nable, 2007-2008 /////////////////////////////////////////////////////////;;
;;================================================================================================;;
;; ;;
;; 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 tga.FileHeader
CommentLength db ?
ColormapType db ?
SubType db ?
DontKnow1 dw ?
ColormapSize dw ?
ColormapBpp db ?
DontKnow2 dd ?
Width dw ?
Height dw ?
BitPerPixel db ?
DontKnow3 db ?
ends
tga.flags.top_down_row_order equ 32 ;bit5
tga.flags.interlace_type equ 192;bits6/7

View File

@ -0,0 +1,257 @@
;;================================================================================================;;
;;//// z80.asm //// (c) Nable, 2007-2008 /////////////////////////////////////////////////////////;;
;;================================================================================================;;
;; ;;
;; 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/>. ;;
;; ;;
;;================================================================================================;;
;; ;;
;; References: ;;
;; 1. ;;
;; ;;
;;================================================================================================;;
include 'z80.inc'
;;================================================================================================;;
proc img.is.z80 _data, _length ;//////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Determine if raw data could be decoded (is in z80 screen format) ;;
;;------------------------------------------------------------------------------------------------;;
;> _data = raw data as read from file/stream ;;
;> _length = data length ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = false / true ;;
;;================================================================================================;;
xor eax,eax
cmp [_length],6929
setz al
je @f
cmp [_length],6912
setz al
@@:
ret
endp
;;================================================================================================;;
proc img.decode.z80 _data, _length ;//////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Decode data into image if it contains correctly formed raw data in z80 screen format ;;
;;------------------------------------------------------------------------------------------------;;
;> _data = raw data as read from file/stream ;;
;> _length = data length ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) or pointer to image ;;
;;================================================================================================;;
;---------------------------------------------------------------------------------------------------
;During the decoding:
;bl - PixelLeft (this means how much pixels left to put in current string)
;bh - CurrentString
;High half of ebx - use DualStos (two frames per one pixel_write)
;cl - PixelColorIndexInPalette
;ch - BackgroundColorIndexInPalette
;High half of ecx - blinking flag
;edx - address of current attribute byte
;---------------------------------------------------------------------------------------------------
locals
frame1 dd ?
OffsetIn2ndFrame dd ?
endl
xor eax,eax
pushad
cld ;paranoia
stdcall img.create,256,192,Image.bpp8
test eax,eax
jz img.decode.z80.locret ;test if allocation failed
mov [frame1],eax
mov esi,z80._._16color_palette
mov ecx,16
mov edi,[eax+Image.Palette]
rep movsd ;write palette for the first frame
mov esi,[_data]
cmp [_length],6929
jne @f
add esi,17 ;in case of 6929 byte files we just skip the info in the begininning.
@@:
;---------------------------------------------------------------------------------------------------
;At first we'll determine if there are any blinking pixels
;if no - we'll produce statical single image
mov ecx,768
lea edx,[esi+6912-768];edx points to attribute area
xor ebx,ebx ;begin from <0,0> (for further decoding)
@@:
test byte[edx+ecx-1],z80.BlinkFlag ;such addressing is a good optimisation
;(as I hope), edx is unchanged
jnz .decode_z80_with_blinking
loop @b
.decode_z80_without_blinking:
jmp .decode_z80_main_stage
.decode_z80_with_blinking:
or ebx,0xFFFF0000 ;use DualStos
mov ecx,eax ;eax still points to the first frame
stdcall img.create,256,192,Image.bpp8
test eax,eax
jz img.decode.z80.failed
mov [eax+Image.Previous],ecx
mov [ecx+Image.Next],eax
mov esi,z80._._16color_palette
mov ecx,16
mov edi,[eax+Image.Palette]
rep movsd ;write palette for the second frame
mov eax,[eax+Image.Data]
mov [OffsetIn2ndFrame],eax
;-------------------------------------------------------------------------------
.decode_z80_main_stage:
;2nd stage - convert z80 screen to 8bpp image with palette
.decode_z80_main_stage_main_loop:
test bl,7
jnz .decode_z80_main_stage_put_now
._z80_update_attributes:
movsx ecx,byte[edx] ;note that BlinkFlag is the highest bit in attribute
;byte, so ecx's highest bit is set automatically
shl ecx,5
shr cl,5
and ch,0xF
test ch,1000b
jz @f
or ecx,1000b ;it has the same size with 'or cl,1000b' but could be faster
@@:
inc edx
lodsb
mov ah,al
.decode_z80_main_stage_put_now:
shl ah,1
;-------------------------------------------------------------------------------
._z80_put_pixel:
;In: CF - put pixel with color CL, !CF - pixel with color CH
;High parts of ebx and ecx - as described above
mov al,cl ;'mov' doesn't affect flags
jc @f
mov al,ch
@@:
stosb ;'stosb' doesn't affect flags
test ebx,ebx
jns @f
test ecx,ecx
jns .1
mov al,ch
.1:
xchg [OffsetIn2ndFrame],edi
stosb
xchg [OffsetIn2ndFrame],edi
@@:
inc bl ;next pixel
jz .decode_z80_main_stage_row_finished
jmp .decode_z80_main_stage_main_loop
;-------------------------------------------------------------------------------
.decode_z80_main_stage_row_finished:
cmp bh,191 ;is image finished?
jb .decode_z80_main_stage_image_not_finished ;no.
.decode_z80_finish:
jmp .locret ;now really finished
;-------------------------------------------------------------------------------
;or not finished yet. Branch according to a row number (see documentation)
.decode_z80_main_stage_next_third:
sub bh,7
sub edi,256*(8-1)
jmp .decode_z80_main_stage_main_loop
.decode_z80_main_stage_image_not_finished:
;next row
add bh,8 ;refer to documentation
add edi,256*(8-1)
;if finished row is 63 or 127 then we process next third of the image
cmp bh,63+8
je .decode_z80_main_stage_next_third
cmp bh,127+8
je .decode_z80_main_stage_next_third
cmp bh,56+8 ;if finished row in [56;63) or [120;127) or [184;191)
jb .decode_z80_main_stage_main_loop
cmp bh,63+8
jb .4
cmp bh,120+8
jb .decode_z80_main_stage_main_loop
cmp bh,127+8
jb .4
cmp bh,184+8
jb .decode_z80_main_stage_main_loop
;note that if we are here then bh is < 191 (see label .2) but >= 184+8
.4:
;and if we here then bh is in [56;63) or [120;127) or [184;191)
sub bh,(8+56-1)
sub edi,256*(8+56-1)
sub edx,z80.AttrString*8
jmp .decode_z80_main_stage_main_loop
img.decode.z80.locret:
popad
ret
img.decode.z80.failed:
stdcall img.destroy,[frame1]
jmp img.decode.z80.locret
endp
;;================================================================================================;;
proc img.encode.z80 _img, _p_length ;/////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Encode image into raw data in z80 screen 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 ;;
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
z80._._16color_palette:
dd 0 ; black
dd 0x000000b0 ; blue
dd 0x00b00000 ; red
dd 0x00b000b0 ; magenta
dd 0x0000b000 ; green
dd 0x0000b0b0 ; cyan
dd 0x00b0b000 ; yellow
dd 0x00b0b0b0 ; gray
dd 0 ; black
dd 0x000000ff ; light blue
dd 0x00ff0000 ; light red
dd 0x00ff00ff ; light magenta
dd 0x0000ff00 ; light green
dd 0x0000ffff ; light cyan
dd 0x00ffff00 ; light yellow
dd 0x00ffffff ; white

View File

@ -0,0 +1,23 @@
;;================================================================================================;;
;;//// z80.inc //// (c) Nable, 2007-2008 /////////////////////////////////////////////////////////;;
;;================================================================================================;;
;; ;;
;; 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/>. ;;
;; ;;
;;================================================================================================;;
z80.PixColor equ 000111b
z80.BgrColor equ 111000b
z80.BrightFlag equ (1 shl 6)
z80.BlinkFlag equ (1 shl 7)
z80.AttrString equ 32