libimg:
introduce img.convert + example update tga decoder img.to_rgb and img.to_rgb2 are deprecated git-svn-id: svn://kolibrios.org@3055 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
5a0f87bd4c
commit
e9998d7f13
@ -75,8 +75,8 @@ START:
|
||||
dec ecx
|
||||
jnz @b
|
||||
|
||||
stdcall [img.encode], [image_to_rgb2], (LIBIMG_FORMAT_ID_PNM), 0
|
||||
; stdcall [img.encode], [image_initial], (LIBIMG_FORMAT_ID_PNM), 0
|
||||
stdcall [img.encode], [image_to_rgb2], (LIBIMG_FORMAT_PNM), 0
|
||||
; stdcall [img.encode], [image_initial], (LIBIMG_FORMAT_PNM), 0
|
||||
test eax, eax
|
||||
jz exit
|
||||
mov [encoded_file], eax
|
||||
|
BIN
programs/develop/libraries/libs-dev/.test/005/kolibri_logo.jpg
Normal file
BIN
programs/develop/libraries/libs-dev/.test/005/kolibri_logo.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
184
programs/develop/libraries/libs-dev/.test/005/test005.asm
Normal file
184
programs/develop/libraries/libs-dev/.test/005/test005.asm
Normal file
@ -0,0 +1,184 @@
|
||||
use32
|
||||
org 0x0
|
||||
db 'MENUET01'
|
||||
dd 0x01, START, I_END, E_END, E_END, 0, 0
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
include '../../../../../proc32.inc'
|
||||
include '../../../../../macros.inc'
|
||||
include '../../../../../dll.inc'
|
||||
;include '../../../../../debug.inc'
|
||||
|
||||
include '../../libio/libio.inc'
|
||||
include '../../libimg/libimg.inc'
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
START:
|
||||
mcall 68, 11
|
||||
|
||||
stdcall dll.Load, @IMPORT
|
||||
or eax, eax
|
||||
jnz exit
|
||||
|
||||
invoke file.open, input_file, O_READ
|
||||
or eax, eax
|
||||
jz exit
|
||||
mov [fh], eax
|
||||
|
||||
invoke file.size, input_file
|
||||
mov [img_data_len], ebx
|
||||
|
||||
stdcall mem.Alloc, ebx
|
||||
or eax, eax
|
||||
jz exit
|
||||
mov [img_data], eax
|
||||
|
||||
invoke file.read, [fh], eax, [img_data_len]
|
||||
cmp eax, -1
|
||||
je exit
|
||||
cmp eax, [img_data_len]
|
||||
jne exit
|
||||
|
||||
invoke file.close, [fh]
|
||||
inc eax
|
||||
jz exit
|
||||
|
||||
invoke img.decode, [img_data], [img_data_len], 0
|
||||
or eax, eax
|
||||
jz exit
|
||||
mov [image_initial], eax
|
||||
|
||||
;pushfd
|
||||
;pushad
|
||||
;mov ebx, [image_initial]
|
||||
;debug_print_dec dword[ebx + Image.Type]
|
||||
;newline
|
||||
;popad
|
||||
;popfd
|
||||
stdcall mem.Free, [img_data]
|
||||
test eax, eax
|
||||
jz exit
|
||||
|
||||
invoke img.convert, [image_initial], 0, Image.bpp8g, 0, 0
|
||||
test eax, eax
|
||||
jz exit
|
||||
mov [image_converted], eax
|
||||
|
||||
invoke img.destroy, [image_initial]
|
||||
|
||||
mov ebx, [image_converted]
|
||||
mov eax, [ebx + Image.Width]
|
||||
add eax, 200*0x10000 + 5*2 - 1 ; window x position + 10 pixels width for skin borders
|
||||
mov [window_width], eax
|
||||
|
||||
mcall 48, 4 ; get skin height
|
||||
mov ebx, [image_converted]
|
||||
add eax, [ebx + Image.Height]
|
||||
add eax, 100*0x10000 + 5 - 1 ; window y position + 5 pixels height for skin bottom border
|
||||
mov [window_height], eax
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
still:
|
||||
mcall 10
|
||||
cmp eax, 1
|
||||
je .draw_window
|
||||
cmp eax, 2
|
||||
je .key
|
||||
cmp eax, 3
|
||||
je .button
|
||||
jmp still
|
||||
|
||||
|
||||
.draw_window:
|
||||
mcall 12, 1
|
||||
mcall 0, [window_width], [window_height], 0x74FFFFFF, 0x00000000, window_title
|
||||
call draw_image
|
||||
mcall 12, 2
|
||||
jmp still
|
||||
|
||||
.key:
|
||||
mcall 2
|
||||
jmp still
|
||||
|
||||
.button:
|
||||
mcall 17
|
||||
shr eax, 8
|
||||
cmp eax, 1
|
||||
jne still
|
||||
|
||||
exit:
|
||||
invoke img.destroy, [image_converted]
|
||||
mcall -1
|
||||
|
||||
|
||||
proc draw_image
|
||||
|
||||
mov ebx, [image_converted]
|
||||
invoke img.draw, ebx, 0, 0, [ebx + Image.Width], [ebx + Image.Height], 0, 0
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
window_title db 'img.convert example',0
|
||||
input_file:
|
||||
db '/hd0/1/kolibri_logo.jpg',0
|
||||
; db '/hd0/1/tga/CTC16.TGA',0
|
||||
; db '/hd0/1/indexed_packbits_le_test_00.tiff',0
|
||||
; db '/hd0/1/graya_123x123.tiff',0
|
||||
; db '/hd0/1/bilevel_00.wbmp',0
|
||||
; db '/hd0/1/rgb_af.jpg',0
|
||||
; db '/hd0/1/gray_5x7.tiff',0
|
||||
; db '/hd0/1/rgb_lzw_le_2x2.tiff',0
|
||||
; db '/hd0/1/grayscale_123x123.tiff',0
|
||||
; db '/hd0/1/grayscale_357x357.tiff',0
|
||||
; db '/hd0/1/grayscale_620x620.tiff',0
|
||||
; db '/hd0/1/rgb_220.jpg',0
|
||||
; db '/hd0/1/rgba_217.tiff',0
|
||||
; db '/hd0/1/rgb_7x9.tiff',0
|
||||
; db '/hd0/1/rgba_7x9.tiff',0
|
||||
; db '/hd0/1/gray_7x9.tiff',0
|
||||
; db '/hd0/1/rgb_70x90.png',0
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
align 4
|
||||
@IMPORT:
|
||||
|
||||
library \
|
||||
libio , 'libio.obj' , \
|
||||
libimg , 'libimg.obj'
|
||||
|
||||
import libio , \
|
||||
libio.init , 'lib_init' , \
|
||||
file.size , 'file_size' , \
|
||||
file.open , 'file_open' , \
|
||||
file.read , 'file_read' , \
|
||||
file.close , 'file_close'
|
||||
|
||||
import libimg , \
|
||||
libimg.init , 'lib_init' , \
|
||||
img.decode , 'img_decode' , \
|
||||
img.destroy , 'img_destroy' , \
|
||||
img.draw , 'img_draw' , \
|
||||
img.convert , 'img_convert' , \
|
||||
img.types_table , 'img_types_table'
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
I_END:
|
||||
|
||||
fh dd ?
|
||||
img_data_len dd ?
|
||||
img_data dd ?
|
||||
|
||||
image_initial dd ?
|
||||
image_converted dd ?
|
||||
|
||||
window_width dd ?
|
||||
window_height dd ?
|
||||
|
||||
rd 0x1000 ; stack
|
||||
E_END:
|
@ -47,7 +47,7 @@ include 'pnm/pnm.asm'
|
||||
include 'wbmp/wbmp.asm'
|
||||
|
||||
include 'scale.asm'
|
||||
;include 'convert.asm'
|
||||
include 'convert.asm'
|
||||
;include 'transform.asm'
|
||||
|
||||
;;================================================================================================;;
|
||||
@ -1929,6 +1929,18 @@ img.formats_table:
|
||||
.z80 dd LIBIMG_FORMAT_Z80, img.is.z80, img.decode.z80, img.encode.z80, 0 ;this must be the last entry as there are no signatures in z80 screens at all
|
||||
dd 0
|
||||
|
||||
align 4
|
||||
img.types_table: ; entries order must correspond to type defnitions in libimg.inc
|
||||
dd 0 ; there is no Image.bpp* = 0
|
||||
.bpp8i dd (1 SHL Image.bpp24)
|
||||
.bpp24 dd (1 SHL Image.bpp24) OR (1 SHL Image.bpp8g)
|
||||
.bpp32 dd (1 SHL Image.bpp24)
|
||||
.bpp15 dd (1 SHL Image.bpp24)
|
||||
.bpp16 dd (1 SHL Image.bpp24)
|
||||
.bpp1 dd (1 SHL Image.bpp24)
|
||||
.bpp8g dd (1 SHL Image.bpp24) OR (1 SHL Image.bpp1 )
|
||||
.bpp8a dd (1 SHL Image.bpp24)
|
||||
|
||||
;;================================================================================================;;
|
||||
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
@ -2206,6 +2218,7 @@ export \
|
||||
img.rotate.layer , 'img_rotate_layer' , \
|
||||
img.draw , 'img_draw' , \
|
||||
img.scale , 'img_scale' , \
|
||||
img.convert , 'img_convert' , \
|
||||
img.formats_table, 'img_formats_table'
|
||||
|
||||
; import from deflate unpacker
|
||||
|
@ -67,7 +67,7 @@ LIBIMG_ENCODE_DELETE_ALPHA = 0x08
|
||||
LIBIMG_ENCODE_FLUSH_ALPHA = 0x10
|
||||
|
||||
; convert flags
|
||||
LIBIMG_CONVERT_IN_PLACE = 0x01 ; do not create new image, store result in _src
|
||||
; TBD
|
||||
|
||||
struct FormatsTableEntry
|
||||
Format_id dd ?
|
||||
|
@ -1,5 +1,5 @@
|
||||
;;================================================================================================;;
|
||||
;;//// tga.asm //// (c) Nable, 2007-2008 /////////////////////////////////////////////////////////;;
|
||||
;;//// tga.asm //// (c) Nable, 2007-2008, (c) dunkaist, 2012 /////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
;; ;;
|
||||
;; This file is part of Common development libraries (Libs-Dev). ;;
|
||||
@ -19,6 +19,8 @@
|
||||
;; ;;
|
||||
;; References: ;;
|
||||
;; 1. Hiview 1.2 by Mohammad A. REZAEI ;;
|
||||
;; 2. Truevision TGA FILE FORMAT SPECIFICATION Version 2.0 ;;
|
||||
;; Technical Manual Version 2.2 January, 1991 ;;
|
||||
;; ;;
|
||||
;;================================================================================================;;
|
||||
|
||||
@ -34,46 +36,49 @@ proc img.is.tga _data, _length ;////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< eax = false / true ;;
|
||||
;;================================================================================================;;
|
||||
push ebx
|
||||
push ebx
|
||||
cmp [_length], 18
|
||||
jbe .nope
|
||||
mov eax, [_data]
|
||||
mov ebx,[eax+1] ;bl=cmatype,bh=subtype
|
||||
cmp bl,1 ;cmatype is in [0..1]
|
||||
mov ebx, [_data]
|
||||
mov eax, dword[ebx + tga_header.colormap_type]
|
||||
cmp al, 1
|
||||
ja .nope
|
||||
cmp bh,11 ;subtype is in [1..3] (non-rle) or in [9..11] (rle)
|
||||
cmp ah, 11
|
||||
ja .nope
|
||||
cmp bh,9
|
||||
cmp ah, 9
|
||||
jae .cont1
|
||||
cmp bh,3
|
||||
cmp ah, 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
|
||||
.cont1:
|
||||
mov eax, dword[ebx + tga_header.image_spec.depth]
|
||||
test eax, 111b ; bpp must be 8, 15, 16, 24 or 32
|
||||
jnz .maybe15
|
||||
shr bl,3
|
||||
cmp bl,4
|
||||
shr al, 3
|
||||
cmp al, 4
|
||||
ja .nope
|
||||
jmp .cont2
|
||||
.maybe15:
|
||||
cmp bl,15
|
||||
.maybe15:
|
||||
cmp al, 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
|
||||
.cont2: ; continue testing
|
||||
movzx eax, byte[ebx + tga_header.colormap_spec.entry_size] ; palette bpp
|
||||
cmp eax, 0
|
||||
je .yep
|
||||
cmp byte[eax+7],32 ;test palette bpp - only 24 and 32 are supported
|
||||
cmp eax, 16
|
||||
je .yep
|
||||
.nope:
|
||||
cmp eax, 24
|
||||
je .yep
|
||||
cmp eax, 32
|
||||
je .yep
|
||||
.nope:
|
||||
xor eax, eax
|
||||
pop ebx
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
.yep:
|
||||
.yep:
|
||||
xor eax, eax
|
||||
inc eax
|
||||
pop ebx
|
||||
pop ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
@ -88,131 +93,167 @@ proc img.decode.tga _data, _length, _options ;//////////////////////////////////
|
||||
;< eax = 0 (error) or pointer to image ;;
|
||||
;;================================================================================================;;
|
||||
locals
|
||||
IMGwidth dd ?
|
||||
IMGheight dd ?
|
||||
IMGbpp dd ?
|
||||
DupPixelCount dd ?
|
||||
TgaBlockCount dd ?
|
||||
width dd ?
|
||||
height dd ?
|
||||
bytes_per_pixel dd ?
|
||||
retvalue 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
|
||||
push ebx esi edi
|
||||
mov ebx, [_data]
|
||||
movzx esi, byte[ebx]
|
||||
lea esi, [esi + ebx + sizeof.tga_header] ; skip comment and header
|
||||
mov edx, dword[ebx + tga_header.image_spec.width]
|
||||
movzx ecx, dx ; ecx = width
|
||||
shr edx, 16 ; edx = height
|
||||
mov [width], ecx
|
||||
mov [height], edx
|
||||
movzx eax, byte[ebx + tga_header.image_spec.depth]
|
||||
add eax, 7
|
||||
shr eax, 3
|
||||
mov [bytes_per_pixel], eax
|
||||
movzx eax, byte[ebx + tga_header.image_spec.depth]
|
||||
|
||||
cmp eax, 8
|
||||
jne @f
|
||||
mov eax, Image.bpp8i
|
||||
jmp .type_defined
|
||||
@@:
|
||||
cmp eax, 15
|
||||
jne @f
|
||||
mov eax, Image.bpp15
|
||||
jmp .type_defined
|
||||
@@:
|
||||
cmp eax, 16
|
||||
jne @f
|
||||
mov eax, Image.bpp15 ; 16bpp tga images are really 15bpp ARGB
|
||||
jmp .type_defined
|
||||
@@:
|
||||
cmp eax, 24
|
||||
jne @f
|
||||
mov eax, Image.bpp24
|
||||
jmp .type_defined
|
||||
@@:
|
||||
cmp eax, 32
|
||||
jne @f
|
||||
mov eax, Image.bpp32
|
||||
jmp .type_defined
|
||||
@@:
|
||||
.type_defined:
|
||||
stdcall img.create, ecx, edx, eax
|
||||
mov [retvalue], eax
|
||||
test eax, eax ; failed to allocate?
|
||||
jz .done ; then exit
|
||||
mov ebx, eax
|
||||
cmp dword[ebx + Image.Type], Image.bpp8i
|
||||
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
|
||||
mov edi, [ebx + Image.Palette]
|
||||
mov ecx, [_data]
|
||||
cmp byte[ecx + tga_header.image_type], 3 ; we also have grayscale subtype
|
||||
jz .write_grayscale_palette ; that don't hold palette in file
|
||||
cmp byte[ecx + tga_header.image_type], 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
|
||||
movzx eax, byte[ecx + tga_header.colormap_spec.entry_size] ; size of colormap entries in bits
|
||||
movzx ecx, word[ecx + tga_header.colormap_spec.colormap_length] ; number of colormap entries
|
||||
cmp eax, 24
|
||||
je .24bpp_palette
|
||||
cmp eax, 16
|
||||
je .16bpp_palette
|
||||
rep movsd ; else they are 32 bpp
|
||||
jmp .palette_parsed
|
||||
.write_grayscale_palette:
|
||||
push eax
|
||||
mov ecx,0x100
|
||||
xor eax,eax
|
||||
@@:
|
||||
.write_grayscale_palette:
|
||||
mov ecx, 0x100
|
||||
xor eax, eax
|
||||
@@:
|
||||
stosd
|
||||
add eax,0x010101
|
||||
loop @b
|
||||
pop eax
|
||||
add eax, 0x010101
|
||||
loop @b
|
||||
jmp .palette_parsed
|
||||
.skip_24bpp_palette:
|
||||
push eax
|
||||
@@:
|
||||
.16bpp_palette: ; FIXME: code copypasted from img.do_rgb, should use img.convert
|
||||
push ebx edx ebp
|
||||
@@:
|
||||
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, 4
|
||||
loop @b
|
||||
pop ebp edx ebx
|
||||
jmp .palette_parsed
|
||||
|
||||
.24bpp_palette:
|
||||
@@:
|
||||
lodsd
|
||||
dec esi
|
||||
and eax,0xFFFFFF
|
||||
; bswap eax
|
||||
; shr eax,8
|
||||
dec esi
|
||||
and eax, 0xffffff
|
||||
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
|
||||
loop @b
|
||||
.palette_parsed:
|
||||
mov edi, [ebx + Image.Data]
|
||||
mov ebx, [width]
|
||||
imul ebx, [height]
|
||||
mov edx, [bytes_per_pixel]
|
||||
mov eax, [_data]
|
||||
test byte[eax + tga_header.image_type], 0x08
|
||||
jz .uncompressed
|
||||
.next_rle_packet:
|
||||
xor eax, eax
|
||||
lodsb
|
||||
btr ax, 7 ; Run-length packet?
|
||||
jnc .raw_packet
|
||||
add eax, 1
|
||||
sub ebx, eax
|
||||
@@:
|
||||
mov ecx, edx
|
||||
rep movsb
|
||||
sub esi, edx
|
||||
sub eax, 1
|
||||
jnz @b
|
||||
add esi, edx
|
||||
test ebx, ebx
|
||||
jnz .next_rle_packet
|
||||
jmp .done
|
||||
.raw_packet:
|
||||
mov ecx, eax
|
||||
add ecx, 1
|
||||
sub ebx, ecx
|
||||
imul ecx, edx
|
||||
rep movsb
|
||||
test ebx, ebx
|
||||
jnz .next_rle_packet
|
||||
.uncompressed:
|
||||
imul edx, ebx
|
||||
mov ecx, edx
|
||||
rep movsb
|
||||
.done:
|
||||
xor ebx, ebx
|
||||
mov esi, [_data]
|
||||
test byte[esi + tga_header.image_spec.descriptor], TGA_START_TOP
|
||||
jnz @f
|
||||
or ebx, FLIP_VERTICAL
|
||||
@@:
|
||||
test byte[esi + tga_header.image_spec.descriptor], TGA_START_RIGHT
|
||||
jz @f
|
||||
or ebx, FLIP_HORIZONTAL
|
||||
@@:
|
||||
test ebx, ebx
|
||||
jz @f
|
||||
stdcall img.flip, [retvalue], ebx
|
||||
@@:
|
||||
pop edi esi ebx
|
||||
mov eax, [retvalue]
|
||||
ret
|
||||
endp
|
||||
|
||||
@ -230,7 +271,6 @@ proc img.encode.tga _img, _p_length, _options ;/////////////////////////////////
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
;;================================================================================================;;
|
||||
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
@ -246,5 +286,3 @@ endp
|
||||
;;================================================================================================;;
|
||||
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
|
||||
;
|
@ -1,5 +1,5 @@
|
||||
;;================================================================================================;;
|
||||
;;//// tga.inc //// (c) Nable, 2007-2008 /////////////////////////////////////////////////////////;;
|
||||
;;//// tga.inc //// (c) Nable, 2007-2008, (c) dunkaist, 2012 /////////////////////////////////////;;
|
||||
;;================================================================================================;;
|
||||
;; ;;
|
||||
;; This file is part of Common development libraries (Libs-Dev). ;;
|
||||
@ -17,19 +17,28 @@
|
||||
;; ;;
|
||||
;;================================================================================================;;
|
||||
|
||||
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 ?
|
||||
struct tga_colormap_spec
|
||||
first_entry_index dw ?
|
||||
colormap_length dw ?
|
||||
entry_size db ?
|
||||
ends
|
||||
|
||||
tga.flags.top_down_row_order equ 32 ;bit5
|
||||
tga.flags.interlace_type equ 192;bits6/7
|
||||
struct tga_image_spec
|
||||
x_origin dw ?
|
||||
y_origin dw ?
|
||||
width dw ?
|
||||
height dw ?
|
||||
depth db ?
|
||||
descriptor db ?
|
||||
ends
|
||||
|
||||
struct tga_header
|
||||
id_length db ?
|
||||
colormap_type db ?
|
||||
image_type db ?
|
||||
colormap_spec tga_colormap_spec
|
||||
image_spec tga_image_spec
|
||||
ends
|
||||
|
||||
TGA_START_TOP = 0x20
|
||||
TGA_START_RIGHT = 0x10
|
||||
|
Loading…
Reference in New Issue
Block a user