* new version of gif_lite.inc, common for all programs which use GIF

* restored config.inc because it is needed for normal compilation of
  one program with build_ru.bat

git-svn-id: svn://kolibrios.org@552 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Evgeny Grechnikov (Diamond) 2007-06-25 17:20:49 +00:00
parent f8ca762192
commit d5f66e011c
28 changed files with 3276 additions and 2459 deletions

View File

@ -210,7 +210,6 @@ fasm demos\trantest\trunk\trantest.asm %BIN%\demos\trantest
fasm demos\tube\trunk\tube.asm %BIN%\demos\tube fasm demos\tube\trunk\tube.asm %BIN%\demos\tube
erase lang.inc erase lang.inc
erase config.inc
echo * echo *
echo Finished building echo Finished building

1
programs/config.inc Normal file
View File

@ -0,0 +1 @@
__CPU_type fix p5

View File

@ -8,7 +8,7 @@
; ;
; Willow - greatly srinked code size by using GIF texture and FPU to calculate sine table ; Willow - greatly srinked code size by using GIF texture and FPU to calculate sine table
; ;
; !!!! Don't use GIF.INC in your apps - it's modified for FREE3D !!!! ; !!!! Don't use GIF_LITE.INC in your apps - it's modified for FREE3D !!!!
; ;
; Heavyiron - new 0-function of drawing window from kolibri (do not work correctly with menuet) ; Heavyiron - new 0-function of drawing window from kolibri (do not work correctly with menuet)
@ -37,12 +37,11 @@ use32
include 'lang.inc' include 'lang.inc'
include '..\..\..\macros.inc' include '..\..\..\macros.inc'
COLOR_ORDER equ OTHER COLOR_ORDER equ OTHER
include 'gif.inc' include 'gif_lite.inc'
START: ; start of execution START: ; start of execution
mov esi,textures mov esi,textures
mov edi,ceil mov edi,ceil-8
mov eax,sinus
call ReadGIF call ReadGIF
mov esi,sinus mov esi,sinus
mov ecx,360*10 mov ecx,360*10
@ -151,10 +150,7 @@ s_up: ; walk forward (key or mouse)
mov ecx,[vheading] mov ecx,[vheading]
; imul ecx,4 mov edi,[sinus+ecx*4]
; add ecx,sinus
lea ecx, [sinus+ecx*4]
mov edi,[ecx]
mov edx,[vheading] mov edx,[vheading]
; imul edx,4 ; imul edx,4
@ -193,10 +189,7 @@ s_down: ; walk backward
mov ebx,[vpy] mov ebx,[vpy]
mov ecx,[vheading] mov ecx,[vheading]
; imul ecx,4 mov edi,[sinus+ecx*4]
; add ecx,sinus
lea ecx, [sinus+ecx*4]
mov edi,[ecx]
mov edx,[vheading] mov edx,[vheading]
; imul edx,4 ; imul edx,4
@ -1087,5 +1080,6 @@ lasty:
dd ?;- dd ?;-
I_END: I_END:
IncludeUGlobals
sinus rd 360*10 sinus rd 360*10
eosinus: eosinus:

View File

@ -1,302 +0,0 @@
; GIF LITE v2.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow
;
; This include file will contain functions to handle GIF image format
;
; Created: August 15, 2004
; Last changed: September 9, 2004
; Change COLOR_ORDER in your program
; if colors are displayed improperly
if ~ (COLOR_ORDER in <MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: MENUETOS or OTHER',13,10
end if
; virtual structure, used internally
struc GIF_list
{
.NextImg rd 1
.Left rw 1
.Top rw 1
.Width rw 1
.Height rw 1
}
struc GIF_info
{
.Left rw 1
.Top rw 1
.Width rw 1
.Height rw 1
}
_null fix 0x1000
; ****************************************
; FUNCTION ReadGIF - unpacks GIF image
; ****************************************
; in:
; esi - pointer to GIF file in memory
; edi - pointer to output image list
; eax - pointer to work area (MIN 16 KB!)
; out:
; eax - 0, all OK;
; eax - 1, invalid signature;
; eax >=8, unsupported image attributes
;
; ecx - number of images
ReadGIF:
push esi edi
mov [.table_ptr],eax
mov [.cur_info],edi
xor eax,eax
mov [.globalColor],eax
mov [.img_count],eax
inc eax
cmp dword[esi],'GIF8'
jne .er ; signature
mov ecx,[esi+0xa]
inc eax
add esi,0xd
mov edi,esi
bt ecx,7
jnc .nextblock
mov [.globalColor],esi
call .Gif_skipmap
.nextblock:
cmp byte[edi],0x21
jne .noextblock
inc edi
cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc
add edi,7
jmp .nextblock
.no_gc:
cmp byte[edi],0xfe ; Comment Ext
jne .no_comm
inc edi
.block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
cmp byte[edi],0
jnz .block_skip
inc edi
jmp .nextblock
.no_comm:
cmp byte[edi],0xff ; Application Ext
jne .nextblock
add edi,13
jmp .block_skip
.noextblock:
cmp byte[edi],0x2c ; image beginning
jne .er
inc [.img_count]
inc edi
mov esi,[.cur_info]
add esi,4
xchg esi,edi
movsd
movsd
push edi
movzx ecx,word[esi]
inc esi
bt ecx,7
jc .uselocal
push [.globalColor]
mov edi,esi
jmp .setPal
.uselocal:
call .Gif_skipmap
push esi
.setPal:
movzx ecx,byte[edi]
inc ecx
mov [.codesize],ecx
dec ecx
pop [.Palette]
lea esi,[edi+1]
mov edi,[.table_ptr]
xor eax,eax
cld
lodsb ; eax - block_count
add eax,esi
mov [.block_ofs],eax
mov [.bit_count],8
mov eax,1
shl eax,cl
mov [.CC],eax
inc eax
mov [.EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16
.filltable:
stosd
inc eax
loop .filltable
pop edi
mov [.img_start],edi
.reinit:
mov edx,[.EOI]
inc edx
push [.codesize]
pop [.compsize]
call .Gif_get_sym
cmp eax,[.CC]
je .reinit
call .Gif_output
.cycle:
movzx ebx,ax
call .Gif_get_sym
cmp eax,edx
jae .notintable
cmp eax,[.CC]
je .reinit
cmp eax,[.EOI]
je .end
call .Gif_output
.add:
push eax
mov eax,[.table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF
jae .cycle
inc edx
bsr ebx,edx
cmp ebx,[.compsize]
jne .noinc
inc [.compsize]
.noinc:
jmp .cycle
.notintable:
push eax
mov eax,ebx
call .Gif_output
push ebx
movzx eax,bx
call .Gif_output
pop ebx eax
jmp .add
.er:
pop edi
jmp .ex
.end:
mov eax,[.cur_info]
mov [eax],edi
mov [.cur_info],edi
add esi,2
xchg esi,edi
.nxt:
cmp byte[edi],0
jnz .continue
inc edi
jmp .nxt
.continue:
cmp byte[edi],0x3b
jne .nextblock
xor eax,eax
stosd
mov ecx,[.img_count]
.ex:
pop edi esi
ret
.Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
.Gif_get_sym:
mov ecx,[.compsize]
push ecx
xor eax,eax
.shift:
ror byte[esi],1
rcr eax,1
dec [.bit_count]
jnz .loop1
inc esi
cmp esi,[.block_ofs]
jb .noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz .nextbl
mov eax,[.EOI]
sub esi,2
add esp,8
jmp .exx
.nextbl:
add eax,esi
mov [.block_ofs],eax
pop eax
.noblock:
mov [.bit_count],8
.loop1:
loop .shift
pop ecx
rol eax,cl
.exx:
xor ecx,ecx
ret
.Gif_output:
push esi eax edx
mov edx,[.table_ptr]
.next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz .next
shl ebx,16
mov bx,[esp]
.loop2:
pop ax
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsw
movsb
and byte[edi],0
inc edi
end if
loop .loop2
pop edx eax esi
ret
.globalColor rd 1
.img_count rd 1
.cur_info rd 1 ; image table pointer
.img_start rd 1
.codesize rd 1
.compsize rd 1
.bit_count rd 1
.CC rd 1
.EOI rd 1
.Palette rd 1
.block_ofs rd 1
.table_ptr rd 1

View File

@ -0,0 +1,487 @@
; GIF LITE v3.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow
; Modified by Diamond
;
; This include file will contain functions to handle GIF image format
;
; Created: August 15, 2004
; Last changed: June 24, 2007
; Requires kglobals.inc (iglobal/uglobal macro)
; (program must 'include "kglobals.inc"' and say 'IncludeUGlobal'
; somewhere in uninitialized data area).
; Configuration: [changed from program which includes this file]
; 1. The constant COLOR_ORDER: must be one of
; PALETTE - for 8-bit image with palette (sysfunction 65)
; MENUETOS - for MenuetOS and KolibriOS color order (sysfunction 7)
; OTHER - for standard color order
; 2. Define constant GIF_SUPPORT_INTERLACED if you want to support interlaced
; GIFs.
; 3. Single image mode vs multiple image mode:
; if the program defines the variable 'gif_img_count' of type dword
; somewhere, ReadGIF will enter multiple image mode: gif_img_count
; will be initialized with image count, output format is GIF_list,
; the function GetGIFinfo retrieves Nth image info. Otherwise, ReadGIF
; uses single image mode: exit after end of first image, output is
; <dd width,height, times width*height[*3] db image>
if ~ (COLOR_ORDER in <PALETTE,MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: PALETTE, MENUETOS or OTHER',13,10
end if
if defined gif_img_count
; virtual structure, used internally
struct GIF_list
NextImg rd 1
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1 ; 0 = not specified
; 1 = do not dispose
; 2 = restore to background color
; 3 = restore to previous
if COLOR_ORDER eq PALETTE
Image rd 1
end if
ends
struct GIF_info
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1
if COLOR_ORDER eq PALETTE
Palette rd 1
end if
ends
; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info
; ****************************************
; in:
; esi - pointer to image list header
; ecx - image_index (0...img_count-1)
; edi - pointer to GIF_info structure to be filled
; out:
; eax - pointer to RAW data, or 0, if error
GetGIFinfo:
push esi ecx edi
xor eax,eax
jecxz .eloop
.lp:
mov esi,[esi]
test esi,esi
jz .error
loop .lp
.eloop:
lodsd
movsd
movsd
movsd
movsd
if COLOR_ORDER eq PALETTE
lodsd
mov [edi],esi
else
mov eax,esi
end if
.error:
pop edi ecx esi
ret
end if
_null fix 0x1000
; ****************************************
; FUNCTION ReadGIF - unpacks GIF image
; ****************************************
; in:
; esi - pointer to GIF file in memory
; edi - pointer to output image list
; out:
; eax - 0, all OK;
; eax - 1, invalid signature;
; eax >=8, unsupported image attributes
;
ReadGIF:
push esi edi
mov [.cur_info],edi
xor eax,eax
mov [.globalColor],eax
if defined gif_img_count
mov [gif_img_count],eax
mov [.anim_delay],eax
mov [.anim_disp],eax
end if
inc eax
cmp dword[esi],'GIF8'
jne .ex ; signature
mov ecx,[esi+0xa]
add esi,0xd
mov edi,esi
test cl,cl
jns .nextblock
mov [.globalColor],esi
call .Gif_skipmap
.nextblock:
cmp byte[edi],0x21
jne .noextblock
inc edi
if defined gif_img_count
cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc
movzx eax,word [edi+3]
mov [.anim_delay],eax
mov al,[edi+2]
shr al,2
and eax,7
mov [.anim_disp],eax
add edi,7
jmp .nextblock
.no_gc:
end if
inc edi
.block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
test eax,eax
jnz .block_skip
jmp .nextblock
.noextblock:
mov al,8
cmp byte[edi],0x2c ; image beginning
jne .ex
if defined gif_img_count
inc [gif_img_count]
end if
inc edi
mov esi,[.cur_info]
if defined gif_img_count
add esi,4
end if
xchg esi,edi
if defined GIF_SUPPORT_INTERLACED
movzx ecx,word[esi+4]
mov [.width],ecx
movzx eax,word[esi+6]
imul eax,ecx
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
mov [.img_end],eax
inc eax
mov [.row_end],eax
and [.pass],0
test byte[esi+8],40h
jz @f
if ~(COLOR_ORDER eq PALETTE)
lea ecx,[ecx*3]
end if
mov [.row_end],ecx
@@:
end if
if defined gif_img_count
movsd
movsd
mov eax,[.anim_delay]
stosd
mov eax,[.anim_disp]
stosd
else
movzx eax,word[esi+4]
stosd
movzx eax,word[esi+6]
stosd
add esi,8
end if
push edi
mov ecx,[esi]
inc esi
test cl,cl
js .uselocal
push [.globalColor]
mov edi,esi
jmp .setPal
.uselocal:
call .Gif_skipmap
push esi
.setPal:
movzx ecx,byte[edi]
inc ecx
mov [.codesize],ecx
dec ecx
if ~(COLOR_ORDER eq PALETTE)
pop [.Palette]
end if
lea esi,[edi+1]
mov edi,.gif_workarea
xor eax,eax
lodsb ; eax - block_count
add eax,esi
mov [.block_ofs],eax
mov [.bit_count],8
mov eax,1
shl eax,cl
mov [.CC],eax
mov ecx,eax
inc eax
mov [.EOI],eax
mov eax, _null shl 16
.filltable:
stosd
inc eax
loop .filltable
if COLOR_ORDER eq PALETTE
pop eax
pop edi
push edi
scasd
push esi
mov esi,eax
mov ecx,[.CC]
@@:
lodsd
dec esi
bswap eax
shr eax,8
stosd
loop @b
pop esi
pop eax
mov [eax],edi
else
pop edi
end if
if defined GIF_SUPPORT_INTERLACED
mov [.img_start],edi
add [.img_end],edi
add [.row_end],edi
end if
.reinit:
mov edx,[.EOI]
inc edx
push [.codesize]
pop [.compsize]
call .Gif_get_sym
cmp eax,[.CC]
je .reinit
call .Gif_output
.cycle:
movzx ebx,ax
call .Gif_get_sym
cmp eax,edx
jae .notintable
cmp eax,[.CC]
je .reinit
cmp eax,[.EOI]
je .end
call .Gif_output
.add:
mov dword [.gif_workarea+edx*4],ebx
cmp edx,0xFFF
jae .cycle
inc edx
bsr ebx,edx
cmp ebx,[.compsize]
jne .noinc
inc [.compsize]
.noinc:
jmp .cycle
.notintable:
push eax
mov eax,ebx
call .Gif_output
push ebx
movzx eax,bx
call .Gif_output
pop ebx eax
jmp .add
.end:
if defined GIF_SUPPORT_INTERLACED
mov edi,[.img_end]
end if
if defined gif_img_count
mov eax,[.cur_info]
mov [eax],edi
mov [.cur_info],edi
add esi,2
xchg esi,edi
.nxt:
cmp byte[edi],0
jnz .continue
inc edi
jmp .nxt
.continue:
cmp byte[edi],0x3b
jne .nextblock
xchg esi,edi
and dword [eax],0
end if
xor eax,eax
.ex:
pop edi esi
ret
.Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
.Gif_get_sym:
mov ecx,[.compsize]
push ecx
xor eax,eax
.shift:
ror byte[esi],1
rcr eax,1
dec [.bit_count]
jnz .loop1
inc esi
cmp esi,[.block_ofs]
jb .noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz .nextbl
mov eax,[.EOI]
sub esi,2
add esp,8
jmp .exx
.nextbl:
add eax,esi
mov [.block_ofs],eax
pop eax
.noblock:
mov [.bit_count],8
.loop1:
loop .shift
pop ecx
rol eax,cl
.exx:
xor ecx,ecx
ret
.Gif_output:
push esi eax edx
mov edx,.gif_workarea
.next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz .next
shl ebx,16
mov bx,[esp]
.loop2:
pop ax
if COLOR_ORDER eq PALETTE
stosb
else
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsb
movsb
movsb
mov byte [edi],0
inc edi
end if
end if
if defined GIF_SUPPORT_INTERLACED
cmp edi,[.row_end]
jb .norowend
mov eax,[.width]
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
push eax
sub edi,eax
add eax,eax
cmp [.pass],3
jz @f
add eax,eax
cmp [.pass],2
jz @f
add eax,eax
@@:
add edi,eax
pop eax
cmp edi,[.img_end]
jb .nextrow
mov edi,[.img_start]
inc [.pass]
add edi,eax
cmp [.pass],3
jz @f
add edi,eax
cmp [.pass],2
jz @f
add edi,eax
add edi,eax
@@:
.nextrow:
add eax,edi
mov [.row_end],eax
xor eax,eax
.norowend:
end if
loop .loop2
pop edx eax esi
ret
uglobal
align 4
ReadGIF.globalColor rd 1
ReadGIF.cur_info rd 1 ; image table pointer
ReadGIF.codesize rd 1
ReadGIF.compsize rd 1
ReadGIF.bit_count rd 1
ReadGIF.CC rd 1
ReadGIF.EOI rd 1
if ~(COLOR_ORDER eq PALETTE)
ReadGIF.Palette rd 1
end if
ReadGIF.block_ofs rd 1
if defined GIF_SUPPORT_INTERLACED
ReadGIF.row_end rd 1
ReadGIF.img_end rd 1
ReadGIF.img_start rd 1
ReadGIF.pass rd 1
ReadGIF.width rd 1
end if
if defined gif_img_count
ReadGIF.anim_delay rd 1
ReadGIF.anim_disp rd 1
end if
ReadGIF.gif_workarea rb 16*1024
endg

View File

@ -791,594 +791,26 @@ end_bmp:
mov dword [img_dest_area+4],ebx mov dword [img_dest_area+4],ebx
} }
if used ReadGIF
; For convert RGB to BGR ; For convert RGB to BGR
COLOR_ORDER equ MENUETOS COLOR_ORDER equ MENUETOS
include 'gif_lite.inc'
end if
macro giftoani gifsrc,imgsrc,num_of_frames macro giftoani gifsrc,imgsrc,num_of_frames
{ {
local hasharea, ReadGIF, nextblock,_null gif_img_count = num_of_frames
local globalColor, img_count, cur_info, img_start mov esi, gifsrc
local codesize, compsize, bit_count, CC, EOI, Palette mov edi, imgsrc
local block_ofs, table_ptr, gifmacend call ReadGIF
local no_gc, block_skip, no_comm, noextblock, uselocal
local setPal, filltable, reinit, cycle, zadd, noinc
local notintable, er, zend, nxt, continue, ex, Gif_skipmap
local Gif_get_sym, shift, nextbl, noblock, loop1, exx
local Gif_output, next, loop2
_null = 0x1000 ; 0x1000
; jmp sss
; if defined gif_hash_offset
; else
; hasharea:
; times 4096 dd 0 ;4096
; end if
;sss:
mov esi,gifsrc ;“ª § â¥«ì ­  ƒˆ” ä ¨« ¢ ¯ ¬ïâ¨
mov edi,imgsrc ;“ª § â¥«ì ­  ᯨ᮪ ª à⨭®ª
if defined gif_hash_offset
mov eax,gif_hash_offset ;<EFBFBD> ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
else
mov eax,hasharea ;<EFBFBD> ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
end if
call ReadGIF
push ecx
pop dword num_of_frames
jmp gifmacend
if defined gif_hash_offset
else
hasharea:
times 4096 dd 0 ;4096
end if
ReadGIF:
push esi edi
mov [table_ptr],eax
mov [cur_info],edi
xor eax,eax
mov [globalColor],eax
mov [img_count],eax
inc eax
cmp dword[esi],'GIF8'
jne er ; signature
mov ecx,[esi+0xa]
inc eax
add esi,0xd
mov edi,esi
bt ecx,7
jnc nextblock
mov [globalColor],esi
call Gif_skipmap
nextblock:
cmp byte[edi],0x21
jne noextblock
inc edi
cmp byte[edi],0xf9 ; Graphic Control Ext
jne no_gc
add edi,7
jmp nextblock
no_gc:
cmp byte[edi],0xfe ; Comment Ext
jne no_comm
inc edi
block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
cmp byte[edi],0
jnz block_skip
inc edi
jmp nextblock
no_comm:
cmp byte[edi],0xff ; Application Ext
jne nextblock
add edi,13
jmp block_skip
noextblock:
cmp byte[edi],0x2c ; image beginning
jne er
inc [img_count]
inc edi
mov esi,[cur_info]
xchg esi,edi
movsd
movsd
push edi
movzx ecx,word[esi]
inc esi
bt ecx,7
jc uselocal
push [globalColor]
mov edi,esi
jmp setPal
uselocal:
call Gif_skipmap
push esi
setPal:
movzx ecx,byte[edi]
inc ecx
mov [codesize],ecx
dec ecx
pop [Palette]
lea esi,[edi+1]
mov edi,[table_ptr]
xor eax,eax
cld
lodsb ; eax - block_count
add eax,esi
mov [block_ofs],eax
mov [bit_count],8
mov eax,1
shl eax,cl
mov [CC],eax
inc eax
mov [EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16
filltable:
stosd
inc eax
loop filltable
pop edi
mov [img_start],edi
reinit:
mov edx,[EOI]
inc edx
push [codesize]
pop [compsize]
call Gif_get_sym
cmp eax,[CC]
je reinit
call Gif_output
cycle:
movzx ebx,ax
call Gif_get_sym
cmp eax,edx
jae notintable
cmp eax,[CC]
je reinit
cmp eax,[EOI]
je zend
call Gif_output
zadd:
push eax
mov eax,[table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF
jae cycle
inc edx
bsr ebx,edx
cmp ebx,[compsize]
jne noinc
inc [compsize]
noinc:
jmp cycle
notintable:
push eax
mov eax,ebx
call Gif_output
push ebx
movzx eax,bx
call Gif_output
pop ebx eax
jmp zadd
er:
pop edi
jmp ex
zend:
; mov eax,[.cur_info] ; skip offset to next frame
; mov [eax],edi
mov [cur_info],edi
add esi,2
xchg esi,edi
nxt:
cmp byte[edi],0
jnz continue
inc edi
jmp nxt
continue:
cmp byte[edi],0x3b ;read next frame
jne nextblock
xor eax,eax
stosd
mov ecx,[img_count]
ex:
pop edi esi
ret
Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
Gif_get_sym:
mov ecx,[compsize]
push ecx
xor eax,eax
shift:
ror byte[esi],1
rcr eax,1
dec [bit_count]
jnz loop1
inc esi
cmp esi,[block_ofs]
jb noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz nextbl
mov eax,[EOI]
sub esi,2
add esp,8
jmp exx
nextbl:
add eax,esi
mov [block_ofs],eax
pop eax
noblock:
mov [bit_count],8
loop1:
loop shift
pop ecx
rol eax,cl
exx:
xor ecx,ecx
ret
Gif_output:
push esi eax edx
mov edx,[table_ptr]
next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz next
shl ebx,16
mov bx,[esp]
loop2:
pop ax
lea esi,[eax+eax*2]
add esi,[Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsw
movsb
end if
loop loop2
pop edx eax esi
ret
globalColor dd 1
img_count dd 1
cur_info dd 1 ; image table pointer
img_start dd 1
codesize dd 1
compsize dd 1
bit_count dd 1
CC dd 1
EOI dd 1
Palette dd 1
block_ofs dd 1
table_ptr dd 1
gifmacend:
} }
macro giftoimg gifsrc,imgsrc macro giftoimg gifsrc,imgsrc
{ {
local hasharea, ReadGIF, nextblock,_null if defined gif_img_count
local globalColor, img_count, cur_info, img_start error 'giftoimg cannot be used in GIF multiple images mode. Use giftoani instead.'
local codesize, compsize, bit_count, CC, EOI, Palette end if
local block_ofs, table_ptr, gifmacend mov esi, gifsrc
local no_gc, block_skip, no_comm, noextblock, uselocal mov edi, imgsrc
local setPal, filltable, reinit, cycle, zadd, noinc call ReadGIF
local notintable, er, zend, nxt, continue, ex, Gif_skipmap
local Gif_get_sym, shift, nextbl, noblock, loop1, exx
local Gif_output, next, loop2
_null = 0x1000 ; 0x1000
mov esi,gifsrc ;“ª § â¥«ì ­  ƒˆ” ä ¨« ¢ ¯ ¬ïâ¨
mov edi,imgsrc ;“ª § â¥«ì ­  ᯨ᮪ ª à⨭®ª
if defined gif_hash_offset
mov eax,gif_hash_offset ;<EFBFBD> ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
else
mov eax,hasharea ;<EFBFBD> ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
end if
call ReadGIF
jmp gifmacend
if defined gif_hash_offset
else
hasharea:
times 4096 dd 0 ;4096
end if
ReadGIF:
push esi edi
mov [table_ptr],eax
mov [cur_info],edi
xor eax,eax
mov [globalColor],eax
mov [img_count],eax
inc eax
cmp dword[esi],'GIF8'
jne er ; signature
mov ecx,[esi+0xa]
inc eax
add esi,0xd
mov edi,esi
bt ecx,7
jnc nextblock
mov [globalColor],esi
call Gif_skipmap
nextblock:
cmp byte[edi],0x21
jne noextblock
inc edi
cmp byte[edi],0xf9 ; Graphic Control Ext
jne no_gc
add edi,7
jmp nextblock
no_gc:
cmp byte[edi],0xfe ; Comment Ext
jne no_comm
inc edi
block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
cmp byte[edi],0
jnz block_skip
inc edi
jmp nextblock
no_comm:
cmp byte[edi],0xff ; Application Ext
jne nextblock
add edi,13
jmp block_skip
noextblock:
cmp byte[edi],0x2c ; image beginning
jne er
inc [img_count]
inc edi
mov esi,[cur_info]
xchg esi,edi
; movsd
; movsd
mov bp,word[esi+4]
movzx ebx,bp
mov [edi],ebx
mov bp,word[esi+6]
movzx ebx,bp
mov [edi+4],ebx
add edi,8
add esi,8
push edi
movzx ecx,word[esi]
inc esi
bt ecx,7
jc uselocal
push [globalColor]
mov edi,esi
jmp setPal
uselocal:
call Gif_skipmap
push esi
setPal:
movzx ecx,byte[edi]
inc ecx
mov [codesize],ecx
dec ecx
pop [Palette]
lea esi,[edi+1]
mov edi,[table_ptr]
xor eax,eax
cld
lodsb ; eax - block_count
add eax,esi
mov [block_ofs],eax
mov [bit_count],8
mov eax,1
shl eax,cl
mov [CC],eax
inc eax
mov [EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16
filltable:
stosd
inc eax
loop filltable
pop edi
mov [img_start],edi
reinit:
mov edx,[EOI]
inc edx
push [codesize]
pop [compsize]
call Gif_get_sym
cmp eax,[CC]
je reinit
call Gif_output
cycle:
movzx ebx,ax
call Gif_get_sym
cmp eax,edx
jae notintable
cmp eax,[CC]
je reinit
cmp eax,[EOI]
je zend
call Gif_output
zadd:
push eax
mov eax,[table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF
jae cycle
inc edx
bsr ebx,edx
cmp ebx,[compsize]
jne noinc
inc [compsize]
noinc:
jmp cycle
notintable:
push eax
mov eax,ebx
call Gif_output
push ebx
movzx eax,bx
call Gif_output
pop ebx eax
jmp zadd
er:
pop edi
jmp ex
zend:
; mov eax,[.cur_info] ; skip offset to next frame
; mov [eax],edi
mov [cur_info],edi
add esi,2
xchg esi,edi
nxt:
cmp byte[edi],0
jnz continue
inc edi
jmp nxt
continue:
; cmp byte[edi],0x3b ;read next frame
; jne nextblock
xor eax,eax
stosd
mov ecx,[img_count]
ex:
pop edi esi
ret
Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
Gif_get_sym:
mov ecx,[compsize]
push ecx
xor eax,eax
shift:
ror byte[esi],1
rcr eax,1
dec [bit_count]
jnz loop1
inc esi
cmp esi,[block_ofs]
jb noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz nextbl
mov eax,[EOI]
sub esi,2
add esp,8
jmp exx
nextbl:
add eax,esi
mov [block_ofs],eax
pop eax
noblock:
mov [bit_count],8
loop1:
loop shift
pop ecx
rol eax,cl
exx:
xor ecx,ecx
ret
Gif_output:
push esi eax edx
mov edx,[table_ptr]
next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz next
shl ebx,16
mov bx,[esp]
loop2:
pop ax
lea esi,[eax+eax*2]
add esi,[Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsw
movsb
end if
loop loop2
pop edx eax esi
ret
globalColor dd 1
img_count dd 1
cur_info dd 1 ; image table pointer
img_start dd 1
codesize dd 1
compsize dd 1
bit_count dd 1
CC dd 1
EOI dd 1
Palette dd 1
block_ofs dd 1
table_ptr dd 1
gifmacend:
} }

View File

@ -0,0 +1,485 @@
; GIF LITE v3.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow
; Modified by Diamond
;
; This include file will contain functions to handle GIF image format
;
; Created: August 15, 2004
; Last changed: June 24, 2007
; Requires kglobals.inc (iglobal/uglobal macro)
; (program must 'include "kglobals.inc"' and say 'IncludeUGlobal'
; somewhere in uninitialized data area).
; Configuration: [changed from program which includes this file]
; 1. The constant COLOR_ORDER: must be one of
; PALETTE - for 8-bit image with palette (sysfunction 65)
; MENUETOS - for MenuetOS and KolibriOS color order (sysfunction 7)
; OTHER - for standard color order
; 2. Define constant GIF_SUPPORT_INTERLACED if you want to support interlaced
; GIFs.
; 3. Single image mode vs multiple image mode:
; if the program defines the variable 'gif_img_count' of type dword
; somewhere, ReadGIF will enter multiple image mode: gif_img_count
; will be initialized with image count, output format is GIF_list,
; the function GetGIFinfo retrieves Nth image info. Otherwise, ReadGIF
; uses single image mode: exit after end of first image, output is
; <dd width,height, times width*height[*3] db image>
if ~ (COLOR_ORDER in <PALETTE,MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: PALETTE, MENUETOS or OTHER',13,10
end if
if defined gif_img_count
; virtual structure, used internally
struct GIF_list
NextImg rd 1
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1 ; 0 = not specified
; 1 = do not dispose
; 2 = restore to background color
; 3 = restore to previous
if COLOR_ORDER eq PALETTE
Image rd 1
end if
ends
struct GIF_info
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1
if COLOR_ORDER eq PALETTE
Palette rd 1
end if
ends
; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info
; ****************************************
; in:
; esi - pointer to image list header
; ecx - image_index (0...img_count-1)
; edi - pointer to GIF_info structure to be filled
; out:
; eax - pointer to RAW data, or 0, if error
GetGIFinfo:
push esi ecx edi
xor eax,eax
jecxz .eloop
.lp:
mov esi,[esi]
test esi,esi
jz .error
loop .lp
.eloop:
lodsd
movsd
movsd
movsd
movsd
if COLOR_ORDER eq PALETTE
lodsd
mov [edi],esi
else
mov eax,esi
end if
.error:
pop edi ecx esi
ret
end if
_null fix 0x1000
; ****************************************
; FUNCTION ReadGIF - unpacks GIF image
; ****************************************
; in:
; esi - pointer to GIF file in memory
; edi - pointer to output image list
; out:
; eax - 0, all OK;
; eax - 1, invalid signature;
; eax >=8, unsupported image attributes
;
ReadGIF:
push esi edi
mov [.cur_info],edi
xor eax,eax
mov [.globalColor],eax
if defined gif_img_count
mov [gif_img_count],eax
mov [.anim_delay],eax
mov [.anim_disp],eax
end if
inc eax
cmp dword[esi],'GIF8'
jne .ex ; signature
mov ecx,[esi+0xa]
add esi,0xd
mov edi,esi
test cl,cl
jns .nextblock
mov [.globalColor],esi
call .Gif_skipmap
.nextblock:
cmp byte[edi],0x21
jne .noextblock
inc edi
if defined gif_img_count
cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc
movzx eax,word [edi+3]
mov [.anim_delay],eax
mov al,[edi+2]
shr al,2
and eax,7
mov [.anim_disp],eax
add edi,7
jmp .nextblock
.no_gc:
end if
inc edi
.block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
test eax,eax
jnz .block_skip
jmp .nextblock
.noextblock:
mov al,8
cmp byte[edi],0x2c ; image beginning
jne .ex
if defined gif_img_count
inc [gif_img_count]
end if
inc edi
mov esi,[.cur_info]
if defined gif_img_count
add esi,4
end if
xchg esi,edi
if defined GIF_SUPPORT_INTERLACED
movzx ecx,word[esi+4]
mov [.width],ecx
movzx eax,word[esi+6]
imul eax,ecx
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
mov [.img_end],eax
inc eax
mov [.row_end],eax
and [.pass],0
test byte[esi+8],40h
jz @f
if ~(COLOR_ORDER eq PALETTE)
lea ecx,[ecx*3]
end if
mov [.row_end],ecx
@@:
end if
if defined gif_img_count
movsd
movsd
mov eax,[.anim_delay]
stosd
mov eax,[.anim_disp]
stosd
else
movzx eax,word[esi+4]
stosd
movzx eax,word[esi+6]
stosd
add esi,8
end if
push edi
mov ecx,[esi]
inc esi
test cl,cl
js .uselocal
push [.globalColor]
mov edi,esi
jmp .setPal
.uselocal:
call .Gif_skipmap
push esi
.setPal:
movzx ecx,byte[edi]
inc ecx
mov [.codesize],ecx
dec ecx
if ~(COLOR_ORDER eq PALETTE)
pop [.Palette]
end if
lea esi,[edi+1]
mov edi,.gif_workarea
xor eax,eax
lodsb ; eax - block_count
add eax,esi
mov [.block_ofs],eax
mov [.bit_count],8
mov eax,1
shl eax,cl
mov [.CC],eax
mov ecx,eax
inc eax
mov [.EOI],eax
mov eax, _null shl 16
.filltable:
stosd
inc eax
loop .filltable
if COLOR_ORDER eq PALETTE
pop eax
pop edi
push edi
scasd
push esi
mov esi,eax
mov ecx,[.CC]
@@:
lodsd
dec esi
bswap eax
shr eax,8
stosd
loop @b
pop esi
pop eax
mov [eax],edi
else
pop edi
end if
if defined GIF_SUPPORT_INTERLACED
mov [.img_start],edi
add [.img_end],edi
add [.row_end],edi
end if
.reinit:
mov edx,[.EOI]
inc edx
push [.codesize]
pop [.compsize]
call .Gif_get_sym
cmp eax,[.CC]
je .reinit
call .Gif_output
.cycle:
movzx ebx,ax
call .Gif_get_sym
cmp eax,edx
jae .notintable
cmp eax,[.CC]
je .reinit
cmp eax,[.EOI]
je .end
call .Gif_output
.add:
mov dword [.gif_workarea+edx*4],ebx
cmp edx,0xFFF
jae .cycle
inc edx
bsr ebx,edx
cmp ebx,[.compsize]
jne .noinc
inc [.compsize]
.noinc:
jmp .cycle
.notintable:
push eax
mov eax,ebx
call .Gif_output
push ebx
movzx eax,bx
call .Gif_output
pop ebx eax
jmp .add
.end:
if defined GIF_SUPPORT_INTERLACED
mov edi,[.img_end]
end if
if defined gif_img_count
mov eax,[.cur_info]
mov [eax],edi
mov [.cur_info],edi
add esi,2
xchg esi,edi
.nxt:
cmp byte[edi],0
jnz .continue
inc edi
jmp .nxt
.continue:
cmp byte[edi],0x3b
jne .nextblock
xchg esi,edi
and dword [eax],0
end if
xor eax,eax
.ex:
pop edi esi
ret
.Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
.Gif_get_sym:
mov ecx,[.compsize]
push ecx
xor eax,eax
.shift:
ror byte[esi],1
rcr eax,1
dec [.bit_count]
jnz .loop1
inc esi
cmp esi,[.block_ofs]
jb .noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz .nextbl
mov eax,[.EOI]
sub esi,2
add esp,8
jmp .exx
.nextbl:
add eax,esi
mov [.block_ofs],eax
pop eax
.noblock:
mov [.bit_count],8
.loop1:
loop .shift
pop ecx
rol eax,cl
.exx:
xor ecx,ecx
ret
.Gif_output:
push esi eax edx
mov edx,.gif_workarea
.next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz .next
shl ebx,16
mov bx,[esp]
.loop2:
pop ax
if COLOR_ORDER eq PALETTE
stosb
else
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsb
movsb
movsb
end if
end if
if defined GIF_SUPPORT_INTERLACED
cmp edi,[.row_end]
jb .norowend
mov eax,[.width]
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
push eax
sub edi,eax
add eax,eax
cmp [.pass],3
jz @f
add eax,eax
cmp [.pass],2
jz @f
add eax,eax
@@:
add edi,eax
pop eax
cmp edi,[.img_end]
jb .nextrow
mov edi,[.img_start]
inc [.pass]
add edi,eax
cmp [.pass],3
jz @f
add edi,eax
cmp [.pass],2
jz @f
add edi,eax
add edi,eax
@@:
.nextrow:
add eax,edi
mov [.row_end],eax
xor eax,eax
.norowend:
end if
loop .loop2
pop edx eax esi
ret
uglobal
align 4
ReadGIF.globalColor rd 1
ReadGIF.cur_info rd 1 ; image table pointer
ReadGIF.codesize rd 1
ReadGIF.compsize rd 1
ReadGIF.bit_count rd 1
ReadGIF.CC rd 1
ReadGIF.EOI rd 1
if ~(COLOR_ORDER eq PALETTE)
ReadGIF.Palette rd 1
end if
ReadGIF.block_ofs rd 1
if defined GIF_SUPPORT_INTERLACED
ReadGIF.row_end rd 1
ReadGIF.img_end rd 1
ReadGIF.img_start rd 1
ReadGIF.pass rd 1
ReadGIF.width rd 1
end if
if defined gif_img_count
ReadGIF.anim_delay rd 1
ReadGIF.anim_disp rd 1
end if
ReadGIF.gif_workarea rb 16*1024
endg

View File

@ -49,8 +49,6 @@ include '..\..\..\macros.inc'
include 'ascl.inc' include 'ascl.inc'
include 'ascgl.inc' include 'ascgl.inc'
gif_hash_offset = gif_hash
START: ; start of execution START: ; start of execution
; //// Willow ; //// Willow
; mov eax,58 ; mov eax,58
@ -1104,6 +1102,7 @@ cyc:
popad popad
ret ret
iglobal
;HELP TEXT ;HELP TEXT
help_text: help_text:
;0123456789012345678901234567890123456789 ;0123456789012345678901234567890123456789
@ -1131,7 +1130,7 @@ info_text:
db ' Create by Pavlushin Evgeni ' db ' Create by Pavlushin Evgeni '
db 'with ASCL library special for Kolibri OS' db 'with ASCL library special for Kolibri OS'
db ' www.deck4.narod.ru waptap@mail.ru ' db ' www.deck4.narod.ru waptap@mail.ru '
endg
; ********************************************* ; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ******** ; ******* WINDOW DEFINITIONS AND DRAW ********
@ -1380,10 +1379,12 @@ isb4:
outcount [listsize],294,25,cl_Black,4*65536 outcount [listsize],294,25,cl_Black,4*65536
jmp isb5 jmp isb5
iglobal
head_dlg: db 'OPEN FILE' head_dlg: db 'OPEN FILE'
db 'SAVE FILE' db 'SAVE FILE'
but_dlg: db 'OPEN' but_dlg: db 'OPEN'
db 'SAVE' db 'SAVE'
endg
nob5: nob5:
@ -1944,8 +1945,8 @@ extloo:
mov ecx,cl_Black mov ecx,cl_Black
mov edx,file_text_label mov edx,file_text_label
call drawmenu call drawmenu
jmp no_drawhftext
iglobal
file_text_label: file_text_label:
db ' Open ' db ' Open '
db ' Copy ' db ' Copy '
@ -1955,6 +1956,7 @@ file_text_label:
db ' Edit ' db ' Edit '
db ' ' db ' '
db ' Exit ' db ' Exit '
endg
no_drawhftext: no_drawhftext:
@ -1969,13 +1971,14 @@ no_drawhftext:
mov ecx,cl_Black mov ecx,cl_Black
mov edx,view_text_label mov edx,view_text_label
call drawmenu call drawmenu
jmp no_drawhvtext
iglobal
view_text_label: view_text_label:
db ' Name sort ' db ' Name sort '
db ' Ext. sort ' db ' Ext. sort '
db ' Size sort ' db ' Size sort '
db ' Date sort ' db ' Date sort '
endg
no_drawhvtext: no_drawhvtext:
@ -1991,11 +1994,12 @@ no_drawhvtext:
mov ecx,cl_Black mov ecx,cl_Black
mov edx,info_text_label mov edx,info_text_label
call drawmenu call drawmenu
jmp no_drawhitext
iglobal
info_text_label: info_text_label:
db ' Help ' db ' Help '
db ' About ' db ' About '
endg
no_drawhitext: no_drawhitext:
@ -2014,6 +2018,7 @@ no_flick:
;FILE LIST PARAMETRS ;FILE LIST PARAMETRS
iglobal
listx dd 15 listx dd 15
listy dd 72 listy dd 72
listxsize dd 350 listxsize dd 350
@ -2034,7 +2039,7 @@ urlx dd 10
urly dd 20 urly dd 20
urlxsize dd 350 urlxsize dd 350
urlysize dd 12 urlysize dd 12
endg
drawmenu: drawmenu:
mov eax,4 mov eax,4
@ -2559,6 +2564,8 @@ life2 db '/sys/DEMOS/LIFE2',0
more_char db 10h more_char db 10h
IncludeIGlobals
fileinfo_start: fileinfo_start:
dd 7 dd 7
dd 0 dd 0
@ -2576,14 +2583,14 @@ clipfile_info:
dd 0 dd 0
dd ? dd ?
dd paramtest dd paramtest
db '/sys/CLIPFILE.TXT',0 db '/SYS/CLIPFILE.TXT',0
copyr_run: copyr_run:
dd 7 dd 7
dd 0 dd 0
dd copyr_param dd copyr_param
dd 0 dd 0
dd 0 dd 0
db '/sys/COPYR',0 db '/SYS/COPYR',0
fileinfoblock: fileinfoblock:
dd 0x1 ; read folder dd 0x1 ; read folder
@ -2643,9 +2650,6 @@ tempimg: ;reserve ram for images
rb 400*100*3+8 ;for picture rb 400*100*3+8 ;for picture
rb 8000 rb 8000
gif_hash:
rd 4096
MYPID: MYPID:
rd 8 rd 8
@ -2656,6 +2660,8 @@ rb 1024
filedir: filedir:
rb 1024 rb 1024
IncludeUGlobals
procinfo process_information procinfo process_information
sc system_colors sc system_colors

View File

@ -791,595 +791,26 @@ end_bmp:
mov dword [img_dest_area+4],ebx mov dword [img_dest_area+4],ebx
} }
if used ReadGIF
; For convert RGB to BGR ; For convert RGB to BGR
COLOR_ORDER equ MENUETOS COLOR_ORDER equ MENUETOS
include 'gif_lite.inc'
end if
macro giftoani gifsrc,imgsrc,num_of_frames macro giftoani gifsrc,imgsrc,num_of_frames
{ {
local hasharea, ReadGIF, nextblock,_null gif_img_count = num_of_frames
local globalColor, img_count, cur_info, img_start mov esi, gifsrc
local codesize, compsize, bit_count, CC, EOI, Palette mov edi, imgsrc
local block_ofs, table_ptr, gifmacend call ReadGIF
local no_gc, block_skip, no_comm, noextblock, uselocal
local setPal, filltable, reinit, cycle, zadd, noinc
local notintable, er, zend, nxt, continue, ex, Gif_skipmap
local Gif_get_sym, shift, nextbl, noblock, loop1, exx
local Gif_output, next, loop2
_null equ 0x1000 ; 0x1000
; jmp sss
; if defined gif_hash_offset
; else
; hasharea:
; times 4096 dd 0 ;4096
; end if
;sss:
mov esi,gifsrc ;“ª § â¥«ì ­  ƒˆ” ä ¨« ¢ ¯ ¬ïâ¨
mov edi,imgsrc ;“ª § â¥«ì ­  ᯨ᮪ ª à⨭®ª
if defined gif_hash_offset
mov eax,gif_hash_offset ;<EFBFBD> ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
else
mov eax,hasharea ;<EFBFBD> ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
end if
call ReadGIF
push ecx
pop dword num_of_frames
jmp gifmacend
if defined gif_hash_offset
else
hasharea:
times 4096 dd 0 ;4096
end if
ReadGIF:
push esi edi
mov [table_ptr],eax
mov [cur_info],edi
xor eax,eax
mov [globalColor],eax
mov [img_count],eax
inc eax
cmp dword[esi],'GIF8'
jne er ; signature
mov ecx,[esi+0xa]
inc eax
add esi,0xd
mov edi,esi
bt ecx,7
jnc nextblock
mov [globalColor],esi
call Gif_skipmap
nextblock:
cmp byte[edi],0x21
jne noextblock
inc edi
cmp byte[edi],0xf9 ; Graphic Control Ext
jne no_gc
add edi,7
jmp nextblock
no_gc:
cmp byte[edi],0xfe ; Comment Ext
jne no_comm
inc edi
block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
cmp byte[edi],0
jnz block_skip
inc edi
jmp nextblock
no_comm:
cmp byte[edi],0xff ; Application Ext
jne nextblock
add edi,13
jmp block_skip
noextblock:
cmp byte[edi],0x2c ; image beginning
jne er
inc [img_count]
inc edi
mov esi,[cur_info]
xchg esi,edi
movsd
movsd
push edi
movzx ecx,word[esi]
inc esi
bt ecx,7
jc uselocal
push [globalColor]
mov edi,esi
jmp setPal
uselocal:
call Gif_skipmap
push esi
setPal:
movzx ecx,byte[edi]
inc ecx
mov [codesize],ecx
dec ecx
pop [Palette]
lea esi,[edi+1]
mov edi,[table_ptr]
xor eax,eax
cld
lodsb ; eax - block_count
add eax,esi
mov [block_ofs],eax
mov [bit_count],8
mov eax,1
shl eax,cl
mov [CC],eax
inc eax
mov [EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16
filltable:
stosd
inc eax
loop filltable
pop edi
mov [img_start],edi
reinit:
mov edx,[EOI]
inc edx
push [codesize]
pop [compsize]
call Gif_get_sym
cmp eax,[CC]
je reinit
call Gif_output
cycle:
movzx ebx,ax
call Gif_get_sym
cmp eax,edx
jae notintable
cmp eax,[CC]
je reinit
cmp eax,[EOI]
je zend
call Gif_output
zadd:
push eax
mov eax,[table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF
jae cycle
inc edx
bsr ebx,edx
cmp ebx,[compsize]
jne noinc
inc [compsize]
noinc:
jmp cycle
notintable:
push eax
mov eax,ebx
call Gif_output
push ebx
movzx eax,bx
call Gif_output
pop ebx eax
jmp zadd
er:
pop edi
jmp ex
zend:
; mov eax,[.cur_info] ; skip offset to next frame
; mov [eax],edi
mov [cur_info],edi
add esi,2
xchg esi,edi
nxt:
cmp byte[edi],0
jnz continue
inc edi
jmp nxt
continue:
cmp byte[edi],0x3b ;read next frame
jne nextblock
xor eax,eax
stosd
mov ecx,[img_count]
ex:
pop edi esi
ret
Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
Gif_get_sym:
mov ecx,[compsize]
push ecx
xor eax,eax
shift:
ror byte[esi],1
rcr eax,1
dec [bit_count]
jnz loop1
inc esi
cmp esi,[block_ofs]
jb noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz nextbl
mov eax,[EOI]
sub esi,2
add esp,8
jmp exx
nextbl:
add eax,esi
mov [block_ofs],eax
pop eax
noblock:
mov [bit_count],8
loop1:
loop shift
pop ecx
rol eax,cl
exx:
xor ecx,ecx
ret
Gif_output:
push esi eax edx
mov edx,[table_ptr]
next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz next
shl ebx,16
mov bx,[esp]
loop2:
pop ax
lea esi,[eax+eax*2]
add esi,[Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsw
movsb
end if
loop loop2
pop edx eax esi
ret
globalColor dd 1
img_count dd 1
cur_info dd 1 ; image table pointer
img_start dd 1
codesize dd 1
compsize dd 1
bit_count dd 1
CC dd 1
EOI dd 1
Palette dd 1
block_ofs dd 1
table_ptr dd 1
gifmacend:
} }
macro giftoimg gifsrc,imgsrc macro giftoimg gifsrc,imgsrc
{ {
local hasharea, ReadGIF, nextblock,_null if defined gif_img_count
local globalColor, img_count, cur_info, img_start error 'giftoimg cannot be used in GIF multiple images mode. Use giftoani instead.'
local codesize, compsize, bit_count, CC, EOI, Palette end if
local block_ofs, table_ptr, gifmacend mov esi, gifsrc
local no_gc, block_skip, no_comm, noextblock, uselocal mov edi, imgsrc
local setPal, filltable, reinit, cycle, zadd, noinc call ReadGIF
local notintable, er, zend, nxt, continue, ex, Gif_skipmap
local Gif_get_sym, shift, nextbl, noblock, loop1, exx
local Gif_output, next, loop2
_null fix 0x1000 ; 0x1000
mov esi,gifsrc ;“ª § â¥«ì ­  ƒˆ” ä ¨« ¢ ¯ ¬ïâ¨
mov edi,imgsrc ;“ª § â¥«ì ­  ᯨ᮪ ª à⨭®ª
if defined gif_hash_offset
mov eax,gif_hash_offset ;<EFBFBD> ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
else
mov eax,hasharea ;<EFBFBD> ¡®ç ï ®¡« áâì ¬¨­¨¬ã¬ 4096*4 ¡ ©â
end if
call ReadGIF
jmp gifmacend
if defined gif_hash_offset
else
hasharea:
times 4096 dd 0 ;4096
end if
ReadGIF:
push esi edi
mov [table_ptr],eax
mov [cur_info],edi
xor eax,eax
mov [globalColor],eax
mov [img_count],eax
inc eax
cmp dword[esi],'GIF8'
jne er ; signature
mov ecx,[esi+0xa]
inc eax
add esi,0xd
mov edi,esi
bt ecx,7
jnc nextblock
mov [globalColor],esi
call Gif_skipmap
nextblock:
cmp byte[edi],0x21
jne noextblock
inc edi
cmp byte[edi],0xf9 ; Graphic Control Ext
jne no_gc
add edi,7
jmp nextblock
no_gc:
cmp byte[edi],0xfe ; Comment Ext
jne no_comm
inc edi
block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
cmp byte[edi],0
jnz block_skip
inc edi
jmp nextblock
no_comm:
cmp byte[edi],0xff ; Application Ext
jne nextblock
add edi,13
jmp block_skip
noextblock:
cmp byte[edi],0x2c ; image beginning
jne er
inc [img_count]
inc edi
mov esi,[cur_info]
xchg esi,edi
; movsd
; movsd
mov bp,word[esi+4]
movzx ebx,bp
mov [edi],ebx
mov bp,word[esi+6]
movzx ebx,bp
mov [edi+4],ebx
add edi,8
add esi,8
push edi
movzx ecx,word[esi]
inc esi
bt ecx,7
jc uselocal
push [globalColor]
mov edi,esi
jmp setPal
uselocal:
call Gif_skipmap
push esi
setPal:
movzx ecx,byte[edi]
inc ecx
mov [codesize],ecx
dec ecx
pop [Palette]
lea esi,[edi+1]
mov edi,[table_ptr]
xor eax,eax
cld
lodsb ; eax - block_count
add eax,esi
mov [block_ofs],eax
mov [bit_count],8
mov eax,1
shl eax,cl
mov [CC],eax
inc eax
mov [EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16
filltable:
stosd
inc eax
loop filltable
pop edi
mov [img_start],edi
reinit:
mov edx,[EOI]
inc edx
push [codesize]
pop [compsize]
call Gif_get_sym
cmp eax,[CC]
je reinit
call Gif_output
cycle:
movzx ebx,ax
call Gif_get_sym
cmp eax,edx
jae notintable
cmp eax,[CC]
je reinit
cmp eax,[EOI]
je zend
call Gif_output
zadd:
push eax
mov eax,[table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF
jae cycle
inc edx
bsr ebx,edx
cmp ebx,[compsize]
jne noinc
inc [compsize]
noinc:
jmp cycle
notintable:
push eax
mov eax,ebx
call Gif_output
push ebx
movzx eax,bx
call Gif_output
pop ebx eax
jmp zadd
er:
pop edi
jmp ex
zend:
; mov eax,[.cur_info] ; skip offset to next frame
; mov [eax],edi
mov [cur_info],edi
add esi,2
xchg esi,edi
nxt:
cmp byte[edi],0
jnz continue
inc edi
jmp nxt
continue:
; cmp byte[edi],0x3b ;read next frame
; jne nextblock
xor eax,eax
stosd
mov ecx,[img_count]
ex:
pop edi esi
ret
Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
Gif_get_sym:
mov ecx,[compsize]
push ecx
xor eax,eax
shift:
ror byte[esi],1
rcr eax,1
dec [bit_count]
jnz loop1
inc esi
cmp esi,[block_ofs]
jb noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz nextbl
mov eax,[EOI]
sub esi,2
add esp,8
jmp exx
nextbl:
add eax,esi
mov [block_ofs],eax
pop eax
noblock:
mov [bit_count],8
loop1:
loop shift
pop ecx
rol eax,cl
exx:
xor ecx,ecx
ret
Gif_output:
push esi eax edx
mov edx,[table_ptr]
next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz next
shl ebx,16
mov bx,[esp]
loop2:
pop ax
lea esi,[eax+eax*2]
add esi,[Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsw
movsb
end if
loop loop2
pop edx eax esi
ret
globalColor dd 1
img_count dd 1
cur_info dd 1 ; image table pointer
img_start dd 1
codesize dd 1
compsize dd 1
bit_count dd 1
CC dd 1
EOI dd 1
Palette dd 1
block_ofs dd 1
table_ptr dd 1
gifmacend:
} }

View File

@ -0,0 +1,485 @@
; GIF LITE v3.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow
; Modified by Diamond
;
; This include file will contain functions to handle GIF image format
;
; Created: August 15, 2004
; Last changed: June 24, 2007
; Requires kglobals.inc (iglobal/uglobal macro)
; (program must 'include "kglobals.inc"' and say 'IncludeUGlobal'
; somewhere in uninitialized data area).
; Configuration: [changed from program which includes this file]
; 1. The constant COLOR_ORDER: must be one of
; PALETTE - for 8-bit image with palette (sysfunction 65)
; MENUETOS - for MenuetOS and KolibriOS color order (sysfunction 7)
; OTHER - for standard color order
; 2. Define constant GIF_SUPPORT_INTERLACED if you want to support interlaced
; GIFs.
; 3. Single image mode vs multiple image mode:
; if the program defines the variable 'gif_img_count' of type dword
; somewhere, ReadGIF will enter multiple image mode: gif_img_count
; will be initialized with image count, output format is GIF_list,
; the function GetGIFinfo retrieves Nth image info. Otherwise, ReadGIF
; uses single image mode: exit after end of first image, output is
; <dd width,height, times width*height[*3] db image>
if ~ (COLOR_ORDER in <PALETTE,MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: PALETTE, MENUETOS or OTHER',13,10
end if
if defined gif_img_count
; virtual structure, used internally
struct GIF_list
NextImg rd 1
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1 ; 0 = not specified
; 1 = do not dispose
; 2 = restore to background color
; 3 = restore to previous
if COLOR_ORDER eq PALETTE
Image rd 1
end if
ends
struct GIF_info
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1
if COLOR_ORDER eq PALETTE
Palette rd 1
end if
ends
; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info
; ****************************************
; in:
; esi - pointer to image list header
; ecx - image_index (0...img_count-1)
; edi - pointer to GIF_info structure to be filled
; out:
; eax - pointer to RAW data, or 0, if error
GetGIFinfo:
push esi ecx edi
xor eax,eax
jecxz .eloop
.lp:
mov esi,[esi]
test esi,esi
jz .error
loop .lp
.eloop:
lodsd
movsd
movsd
movsd
movsd
if COLOR_ORDER eq PALETTE
lodsd
mov [edi],esi
else
mov eax,esi
end if
.error:
pop edi ecx esi
ret
end if
_null fix 0x1000
; ****************************************
; FUNCTION ReadGIF - unpacks GIF image
; ****************************************
; in:
; esi - pointer to GIF file in memory
; edi - pointer to output image list
; out:
; eax - 0, all OK;
; eax - 1, invalid signature;
; eax >=8, unsupported image attributes
;
ReadGIF:
push esi edi
mov [.cur_info],edi
xor eax,eax
mov [.globalColor],eax
if defined gif_img_count
mov [gif_img_count],eax
mov [.anim_delay],eax
mov [.anim_disp],eax
end if
inc eax
cmp dword[esi],'GIF8'
jne .ex ; signature
mov ecx,[esi+0xa]
add esi,0xd
mov edi,esi
test cl,cl
jns .nextblock
mov [.globalColor],esi
call .Gif_skipmap
.nextblock:
cmp byte[edi],0x21
jne .noextblock
inc edi
if defined gif_img_count
cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc
movzx eax,word [edi+3]
mov [.anim_delay],eax
mov al,[edi+2]
shr al,2
and eax,7
mov [.anim_disp],eax
add edi,7
jmp .nextblock
.no_gc:
end if
inc edi
.block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
test eax,eax
jnz .block_skip
jmp .nextblock
.noextblock:
mov al,8
cmp byte[edi],0x2c ; image beginning
jne .ex
if defined gif_img_count
inc [gif_img_count]
end if
inc edi
mov esi,[.cur_info]
if defined gif_img_count
add esi,4
end if
xchg esi,edi
if defined GIF_SUPPORT_INTERLACED
movzx ecx,word[esi+4]
mov [.width],ecx
movzx eax,word[esi+6]
imul eax,ecx
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
mov [.img_end],eax
inc eax
mov [.row_end],eax
and [.pass],0
test byte[esi+8],40h
jz @f
if ~(COLOR_ORDER eq PALETTE)
lea ecx,[ecx*3]
end if
mov [.row_end],ecx
@@:
end if
if defined gif_img_count
movsd
movsd
mov eax,[.anim_delay]
stosd
mov eax,[.anim_disp]
stosd
else
movzx eax,word[esi+4]
stosd
movzx eax,word[esi+6]
stosd
add esi,8
end if
push edi
mov ecx,[esi]
inc esi
test cl,cl
js .uselocal
push [.globalColor]
mov edi,esi
jmp .setPal
.uselocal:
call .Gif_skipmap
push esi
.setPal:
movzx ecx,byte[edi]
inc ecx
mov [.codesize],ecx
dec ecx
if ~(COLOR_ORDER eq PALETTE)
pop [.Palette]
end if
lea esi,[edi+1]
mov edi,.gif_workarea
xor eax,eax
lodsb ; eax - block_count
add eax,esi
mov [.block_ofs],eax
mov [.bit_count],8
mov eax,1
shl eax,cl
mov [.CC],eax
mov ecx,eax
inc eax
mov [.EOI],eax
mov eax, _null shl 16
.filltable:
stosd
inc eax
loop .filltable
if COLOR_ORDER eq PALETTE
pop eax
pop edi
push edi
scasd
push esi
mov esi,eax
mov ecx,[.CC]
@@:
lodsd
dec esi
bswap eax
shr eax,8
stosd
loop @b
pop esi
pop eax
mov [eax],edi
else
pop edi
end if
if defined GIF_SUPPORT_INTERLACED
mov [.img_start],edi
add [.img_end],edi
add [.row_end],edi
end if
.reinit:
mov edx,[.EOI]
inc edx
push [.codesize]
pop [.compsize]
call .Gif_get_sym
cmp eax,[.CC]
je .reinit
call .Gif_output
.cycle:
movzx ebx,ax
call .Gif_get_sym
cmp eax,edx
jae .notintable
cmp eax,[.CC]
je .reinit
cmp eax,[.EOI]
je .end
call .Gif_output
.add:
mov dword [.gif_workarea+edx*4],ebx
cmp edx,0xFFF
jae .cycle
inc edx
bsr ebx,edx
cmp ebx,[.compsize]
jne .noinc
inc [.compsize]
.noinc:
jmp .cycle
.notintable:
push eax
mov eax,ebx
call .Gif_output
push ebx
movzx eax,bx
call .Gif_output
pop ebx eax
jmp .add
.end:
if defined GIF_SUPPORT_INTERLACED
mov edi,[.img_end]
end if
if defined gif_img_count
mov eax,[.cur_info]
mov [eax],edi
mov [.cur_info],edi
add esi,2
xchg esi,edi
.nxt:
cmp byte[edi],0
jnz .continue
inc edi
jmp .nxt
.continue:
cmp byte[edi],0x3b
jne .nextblock
xchg esi,edi
and dword [eax],0
end if
xor eax,eax
.ex:
pop edi esi
ret
.Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
.Gif_get_sym:
mov ecx,[.compsize]
push ecx
xor eax,eax
.shift:
ror byte[esi],1
rcr eax,1
dec [.bit_count]
jnz .loop1
inc esi
cmp esi,[.block_ofs]
jb .noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz .nextbl
mov eax,[.EOI]
sub esi,2
add esp,8
jmp .exx
.nextbl:
add eax,esi
mov [.block_ofs],eax
pop eax
.noblock:
mov [.bit_count],8
.loop1:
loop .shift
pop ecx
rol eax,cl
.exx:
xor ecx,ecx
ret
.Gif_output:
push esi eax edx
mov edx,.gif_workarea
.next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz .next
shl ebx,16
mov bx,[esp]
.loop2:
pop ax
if COLOR_ORDER eq PALETTE
stosb
else
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsb
movsb
movsb
end if
end if
if defined GIF_SUPPORT_INTERLACED
cmp edi,[.row_end]
jb .norowend
mov eax,[.width]
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
push eax
sub edi,eax
add eax,eax
cmp [.pass],3
jz @f
add eax,eax
cmp [.pass],2
jz @f
add eax,eax
@@:
add edi,eax
pop eax
cmp edi,[.img_end]
jb .nextrow
mov edi,[.img_start]
inc [.pass]
add edi,eax
cmp [.pass],3
jz @f
add edi,eax
cmp [.pass],2
jz @f
add edi,eax
add edi,eax
@@:
.nextrow:
add eax,edi
mov [.row_end],eax
xor eax,eax
.norowend:
end if
loop .loop2
pop edx eax esi
ret
uglobal
align 4
ReadGIF.globalColor rd 1
ReadGIF.cur_info rd 1 ; image table pointer
ReadGIF.codesize rd 1
ReadGIF.compsize rd 1
ReadGIF.bit_count rd 1
ReadGIF.CC rd 1
ReadGIF.EOI rd 1
if ~(COLOR_ORDER eq PALETTE)
ReadGIF.Palette rd 1
end if
ReadGIF.block_ofs rd 1
if defined GIF_SUPPORT_INTERLACED
ReadGIF.row_end rd 1
ReadGIF.img_end rd 1
ReadGIF.img_start rd 1
ReadGIF.pass rd 1
ReadGIF.width rd 1
end if
if defined gif_img_count
ReadGIF.anim_delay rd 1
ReadGIF.anim_disp rd 1
end if
ReadGIF.gif_workarea rb 16*1024
endg

View File

@ -360,10 +360,7 @@ oelemsize = 20
mcall mcall
startgame: startgame:
gif_hash_offset = gif_hash_area
giftoimg gif_file_area2,canvas giftoimg gif_file_area2,canvas
gif_hash_offset = gif_hash_area
giftoimg gif_file_area,img_area giftoimg gif_file_area,img_area
getimg img_area,0,0,32,32,ship getimg img_area,0,0,32,32,ship
@ -1275,17 +1272,14 @@ imgsize:
;dd 20 ;size of element in bytes ;dd 20 ;size of element in bytes
;rb 400*20 ;rb 400*20
keymap: keymap:
rb 1000 rb 1000
;gif_file_area ~21500 ;gif_file_area ~21500
gif_file_area2: gif_file_area2:
file 'phenix.gif' file 'phenix.gif'
rb 50
gif_file_area: gif_file_area:
file 'star2.gif';include gif file file 'star2.gif';include gif file
rb 50 ;50 bytes temp back zone
img_area: img_area:
rb 256*64*3+8 rb 256*64*3+8
ship: ship:
@ -1307,8 +1301,7 @@ rb 32*32*3+8
box: box:
rb 32*32*3+8 rb 32*32*3+8
gif_hash_area: IncludeUGlobals
rd 4096+1 ;hash area size for unpacking GIF
massive: massive:
rd massize ;elements num rd massize ;elements num

View File

@ -22,7 +22,8 @@ org 0x0
include '..\..\..\macros.inc' include '..\..\..\macros.inc'
include 'giflib.inc' COLOR_ORDER equ MENUETOS
include 'gif_lite.inc'
include 'bmplib.inc' include 'bmplib.inc'
include 'dialog.inc' include 'dialog.inc'
include 'dialog2.inc' include 'dialog2.inc'
@ -274,4 +275,4 @@ file 'zoom.cur'
I_END: I_END:
IncludeUGlobals

View File

@ -0,0 +1,485 @@
; GIF LITE v3.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow
; Modified by Diamond
;
; This include file will contain functions to handle GIF image format
;
; Created: August 15, 2004
; Last changed: June 24, 2007
; Requires kglobals.inc (iglobal/uglobal macro)
; (program must 'include "kglobals.inc"' and say 'IncludeUGlobal'
; somewhere in uninitialized data area).
; Configuration: [changed from program which includes this file]
; 1. The constant COLOR_ORDER: must be one of
; PALETTE - for 8-bit image with palette (sysfunction 65)
; MENUETOS - for MenuetOS and KolibriOS color order (sysfunction 7)
; OTHER - for standard color order
; 2. Define constant GIF_SUPPORT_INTERLACED if you want to support interlaced
; GIFs.
; 3. Single image mode vs multiple image mode:
; if the program defines the variable 'gif_img_count' of type dword
; somewhere, ReadGIF will enter multiple image mode: gif_img_count
; will be initialized with image count, output format is GIF_list,
; the function GetGIFinfo retrieves Nth image info. Otherwise, ReadGIF
; uses single image mode: exit after end of first image, output is
; <dd width,height, times width*height[*3] db image>
if ~ (COLOR_ORDER in <PALETTE,MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: PALETTE, MENUETOS or OTHER',13,10
end if
if defined gif_img_count
; virtual structure, used internally
struct GIF_list
NextImg rd 1
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1 ; 0 = not specified
; 1 = do not dispose
; 2 = restore to background color
; 3 = restore to previous
if COLOR_ORDER eq PALETTE
Image rd 1
end if
ends
struct GIF_info
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1
if COLOR_ORDER eq PALETTE
Palette rd 1
end if
ends
; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info
; ****************************************
; in:
; esi - pointer to image list header
; ecx - image_index (0...img_count-1)
; edi - pointer to GIF_info structure to be filled
; out:
; eax - pointer to RAW data, or 0, if error
GetGIFinfo:
push esi ecx edi
xor eax,eax
jecxz .eloop
.lp:
mov esi,[esi]
test esi,esi
jz .error
loop .lp
.eloop:
lodsd
movsd
movsd
movsd
movsd
if COLOR_ORDER eq PALETTE
lodsd
mov [edi],esi
else
mov eax,esi
end if
.error:
pop edi ecx esi
ret
end if
_null fix 0x1000
; ****************************************
; FUNCTION ReadGIF - unpacks GIF image
; ****************************************
; in:
; esi - pointer to GIF file in memory
; edi - pointer to output image list
; out:
; eax - 0, all OK;
; eax - 1, invalid signature;
; eax >=8, unsupported image attributes
;
ReadGIF:
push esi edi
mov [.cur_info],edi
xor eax,eax
mov [.globalColor],eax
if defined gif_img_count
mov [gif_img_count],eax
mov [.anim_delay],eax
mov [.anim_disp],eax
end if
inc eax
cmp dword[esi],'GIF8'
jne .ex ; signature
mov ecx,[esi+0xa]
add esi,0xd
mov edi,esi
test cl,cl
jns .nextblock
mov [.globalColor],esi
call .Gif_skipmap
.nextblock:
cmp byte[edi],0x21
jne .noextblock
inc edi
if defined gif_img_count
cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc
movzx eax,word [edi+3]
mov [.anim_delay],eax
mov al,[edi+2]
shr al,2
and eax,7
mov [.anim_disp],eax
add edi,7
jmp .nextblock
.no_gc:
end if
inc edi
.block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
test eax,eax
jnz .block_skip
jmp .nextblock
.noextblock:
mov al,8
cmp byte[edi],0x2c ; image beginning
jne .ex
if defined gif_img_count
inc [gif_img_count]
end if
inc edi
mov esi,[.cur_info]
if defined gif_img_count
add esi,4
end if
xchg esi,edi
if defined GIF_SUPPORT_INTERLACED
movzx ecx,word[esi+4]
mov [.width],ecx
movzx eax,word[esi+6]
imul eax,ecx
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
mov [.img_end],eax
inc eax
mov [.row_end],eax
and [.pass],0
test byte[esi+8],40h
jz @f
if ~(COLOR_ORDER eq PALETTE)
lea ecx,[ecx*3]
end if
mov [.row_end],ecx
@@:
end if
if defined gif_img_count
movsd
movsd
mov eax,[.anim_delay]
stosd
mov eax,[.anim_disp]
stosd
else
movzx eax,word[esi+4]
stosd
movzx eax,word[esi+6]
stosd
add esi,8
end if
push edi
mov ecx,[esi]
inc esi
test cl,cl
js .uselocal
push [.globalColor]
mov edi,esi
jmp .setPal
.uselocal:
call .Gif_skipmap
push esi
.setPal:
movzx ecx,byte[edi]
inc ecx
mov [.codesize],ecx
dec ecx
if ~(COLOR_ORDER eq PALETTE)
pop [.Palette]
end if
lea esi,[edi+1]
mov edi,.gif_workarea
xor eax,eax
lodsb ; eax - block_count
add eax,esi
mov [.block_ofs],eax
mov [.bit_count],8
mov eax,1
shl eax,cl
mov [.CC],eax
mov ecx,eax
inc eax
mov [.EOI],eax
mov eax, _null shl 16
.filltable:
stosd
inc eax
loop .filltable
if COLOR_ORDER eq PALETTE
pop eax
pop edi
push edi
scasd
push esi
mov esi,eax
mov ecx,[.CC]
@@:
lodsd
dec esi
bswap eax
shr eax,8
stosd
loop @b
pop esi
pop eax
mov [eax],edi
else
pop edi
end if
if defined GIF_SUPPORT_INTERLACED
mov [.img_start],edi
add [.img_end],edi
add [.row_end],edi
end if
.reinit:
mov edx,[.EOI]
inc edx
push [.codesize]
pop [.compsize]
call .Gif_get_sym
cmp eax,[.CC]
je .reinit
call .Gif_output
.cycle:
movzx ebx,ax
call .Gif_get_sym
cmp eax,edx
jae .notintable
cmp eax,[.CC]
je .reinit
cmp eax,[.EOI]
je .end
call .Gif_output
.add:
mov dword [.gif_workarea+edx*4],ebx
cmp edx,0xFFF
jae .cycle
inc edx
bsr ebx,edx
cmp ebx,[.compsize]
jne .noinc
inc [.compsize]
.noinc:
jmp .cycle
.notintable:
push eax
mov eax,ebx
call .Gif_output
push ebx
movzx eax,bx
call .Gif_output
pop ebx eax
jmp .add
.end:
if defined GIF_SUPPORT_INTERLACED
mov edi,[.img_end]
end if
if defined gif_img_count
mov eax,[.cur_info]
mov [eax],edi
mov [.cur_info],edi
add esi,2
xchg esi,edi
.nxt:
cmp byte[edi],0
jnz .continue
inc edi
jmp .nxt
.continue:
cmp byte[edi],0x3b
jne .nextblock
xchg esi,edi
and dword [eax],0
end if
xor eax,eax
.ex:
pop edi esi
ret
.Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
.Gif_get_sym:
mov ecx,[.compsize]
push ecx
xor eax,eax
.shift:
ror byte[esi],1
rcr eax,1
dec [.bit_count]
jnz .loop1
inc esi
cmp esi,[.block_ofs]
jb .noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz .nextbl
mov eax,[.EOI]
sub esi,2
add esp,8
jmp .exx
.nextbl:
add eax,esi
mov [.block_ofs],eax
pop eax
.noblock:
mov [.bit_count],8
.loop1:
loop .shift
pop ecx
rol eax,cl
.exx:
xor ecx,ecx
ret
.Gif_output:
push esi eax edx
mov edx,.gif_workarea
.next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz .next
shl ebx,16
mov bx,[esp]
.loop2:
pop ax
if COLOR_ORDER eq PALETTE
stosb
else
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsb
movsb
movsb
end if
end if
if defined GIF_SUPPORT_INTERLACED
cmp edi,[.row_end]
jb .norowend
mov eax,[.width]
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
push eax
sub edi,eax
add eax,eax
cmp [.pass],3
jz @f
add eax,eax
cmp [.pass],2
jz @f
add eax,eax
@@:
add edi,eax
pop eax
cmp edi,[.img_end]
jb .nextrow
mov edi,[.img_start]
inc [.pass]
add edi,eax
cmp [.pass],3
jz @f
add edi,eax
cmp [.pass],2
jz @f
add edi,eax
add edi,eax
@@:
.nextrow:
add eax,edi
mov [.row_end],eax
xor eax,eax
.norowend:
end if
loop .loop2
pop edx eax esi
ret
uglobal
align 4
ReadGIF.globalColor rd 1
ReadGIF.cur_info rd 1 ; image table pointer
ReadGIF.codesize rd 1
ReadGIF.compsize rd 1
ReadGIF.bit_count rd 1
ReadGIF.CC rd 1
ReadGIF.EOI rd 1
if ~(COLOR_ORDER eq PALETTE)
ReadGIF.Palette rd 1
end if
ReadGIF.block_ofs rd 1
if defined GIF_SUPPORT_INTERLACED
ReadGIF.row_end rd 1
ReadGIF.img_end rd 1
ReadGIF.img_start rd 1
ReadGIF.pass rd 1
ReadGIF.width rd 1
end if
if defined gif_img_count
ReadGIF.anim_delay rd 1
ReadGIF.anim_disp rd 1
end if
ReadGIF.gif_workarea rb 16*1024
endg

View File

@ -1,331 +0,0 @@
; GIF LITE v2.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow
;
; This include file will contain functions to handle GIF image format
;
; Created: August 15, 2004
; Last changed: September 9, 2004
; Change COLOR_ORDER in your program
; if colors are displayed improperly
COLOR_ORDER equ MENUETOS
if ~ (COLOR_ORDER in <MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: MENUETOS or OTHER',13,10
end if
; virtual structure, used internally
struc GIF_list
{
.NextImg rd 1
.Left rw 1
.Top rw 1
.Width rw 1
.Height rw 1
}
struc GIF_info
{
.Left rw 1
.Top rw 1
.Width rw 1
.Height rw 1
}
_null fix 0x1000
; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info
; ****************************************
; in:
; esi - pointer to image list header
; ecx - image_index (0...img_count-1)
; edi - pointer to GIF_info structure to be filled
; out:
; eax - pointer to RAW data, or 0, if error
GetGIFinfo:
push esi ecx edi
xor eax,eax
jecxz .eloop
.lp:
mov esi,[esi]
test esi,esi
jz .error
loop .lp
.eloop:
add esi,4
movsd
movsd
mov eax,esi
.error:
pop edi ecx esi
ret
; ****************************************
; FUNCTION ReadGIF - unpacks GIF image
; ****************************************
; in:
; esi - pointer to GIF file in memory
; edi - pointer to output image list
; eax - pointer to work area (MIN 16 KB!)
; out:
; eax - 0, all OK;
; eax - 1, invalid signature;
; eax >=8, unsupported image attributes
;
; ecx - number of images
ReadGIF:
push esi edi
mov [.table_ptr],eax
mov [.cur_info],edi
xor eax,eax
mov [.globalColor],eax
mov [.img_count],eax
inc eax
cmp dword[esi],'GIF8'
jne .er ; signature
mov ecx,[esi+0xa]
inc eax
add esi,0xd
mov edi,esi
bt ecx,7
jnc .nextblock
mov [.globalColor],esi
call .Gif_skipmap
.nextblock:
cmp byte[edi],0x21
jne .noextblock
inc edi
cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc
add edi,7
jmp .nextblock
.no_gc:
cmp byte[edi],0xfe ; Comment Ext
jne .no_comm
inc edi
.block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
cmp byte[edi],0
jnz .block_skip
inc edi
jmp .nextblock
.no_comm:
cmp byte[edi],0xff ; Application Ext
jne .nextblock
add edi,13
jmp .block_skip
.noextblock:
cmp byte[edi],0x2c ; image beginning
jne .er
inc [.img_count]
inc edi
mov esi,[.cur_info]
add esi,4
xchg esi,edi
movsd
movsd
push edi
movzx ecx,word[esi]
inc esi
bt ecx,7
jc .uselocal
push [.globalColor]
mov edi,esi
jmp .setPal
.uselocal:
call .Gif_skipmap
push esi
.setPal:
movzx ecx,byte[edi]
inc ecx
mov [.codesize],ecx
dec ecx
pop [.Palette]
lea esi,[edi+1]
mov edi,[.table_ptr]
xor eax,eax
cld
lodsb ; eax - block_count
add eax,esi
mov [.block_ofs],eax
mov [.bit_count],8
mov eax,1
shl eax,cl
mov [.CC],eax
inc eax
mov [.EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16
.filltable:
stosd
inc eax
loop .filltable
pop edi
mov [.img_start],edi
.reinit:
mov edx,[.EOI]
inc edx
push [.codesize]
pop [.compsize]
call .Gif_get_sym
cmp eax,[.CC]
je .reinit
call .Gif_output
.cycle:
movzx ebx,ax
call .Gif_get_sym
cmp eax,edx
jae .notintable
cmp eax,[.CC]
je .reinit
cmp eax,[.EOI]
je .end
call .Gif_output
.add:
push eax
mov eax,[.table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF
jae .cycle
inc edx
bsr ebx,edx
cmp ebx,[.compsize]
jne .noinc
inc [.compsize]
.noinc:
jmp .cycle
.notintable:
push eax
mov eax,ebx
call .Gif_output
push ebx
movzx eax,bx
call .Gif_output
pop ebx eax
jmp .add
.er:
pop edi
jmp .ex
.end:
mov eax,[.cur_info]
mov [eax],edi
mov [.cur_info],edi
add esi,2
xchg esi,edi
.nxt:
cmp byte[edi],0
jnz .continue
inc edi
jmp .nxt
.continue:
cmp byte[edi],0x3b
jne .nextblock
xor eax,eax
stosd
mov ecx,[.img_count]
.ex:
pop edi esi
ret
.Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
.Gif_get_sym:
mov ecx,[.compsize]
push ecx
xor eax,eax
.shift:
ror byte[esi],1
rcr eax,1
dec [.bit_count]
jnz .loop1
inc esi
cmp esi,[.block_ofs]
jb .noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz .nextbl
mov eax,[.EOI]
sub esi,2
add esp,8
jmp .exx
.nextbl:
add eax,esi
mov [.block_ofs],eax
pop eax
.noblock:
mov [.bit_count],8
.loop1:
loop .shift
pop ecx
rol eax,cl
.exx:
xor ecx,ecx
ret
.Gif_output:
push esi eax edx
mov edx,[.table_ptr]
.next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz .next
shl ebx,16
mov bx,[esp]
.loop2:
pop ax
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsw
movsb
end if
loop .loop2
pop edx eax esi
ret
.globalColor rd 1
.img_count rd 1
.cur_info rd 1 ; image table pointer
.img_start rd 1
.codesize rd 1
.compsize rd 1
.bit_count rd 1
.CC rd 1
.EOI rd 1
.Palette rd 1
.block_ofs rd 1
.table_ptr rd 1

View File

@ -4,7 +4,6 @@
load_icons: load_icons:
mov esi,panel_picture mov esi,panel_picture
mov edi,[ScreenPointer] mov edi,[ScreenPointer]
mov eax,edi
add edi,(1200*1000*3) add edi,(1200*1000*3)
;mov edi,[PointerToIcons] ;mov edi,[PointerToIcons]
call ReadGIF call ReadGIF
@ -21,7 +20,7 @@ draw_icons:
shl edx,16 shl edx,16
add edx,[Icon_Y] add edx,[Icon_Y]
mov ebx,[ScreenPointer] mov ebx,[ScreenPointer]
add ebx,(1200*1000*3)+12 add ebx,(1200*1000*3)+8
mov eax,7 mov eax,7
mov ecx,417*65536+46 mov ecx,417*65536+46
mcall mcall

View File

@ -142,7 +142,7 @@ load_picture:
cmp [type],'GI' cmp [type],'GI'
jne no_unpakcing_file_1 jne no_unpakcing_file_1
;GIF DECODER ;GIF DECODER
sub edi,12 sub edi,8
call ReadGIF call ReadGIF
mov [save_flag],1 mov [save_flag],1
no_unpakcing_file_1: no_unpakcing_file_1:

View File

@ -337,7 +337,7 @@ TakeInstruments:
cmp [type],'GI' cmp [type],'GI'
jne no_unpakcing_file jne no_unpakcing_file
;GIF DECODER ;GIF DECODER
sub edi,12 sub edi,8
call ReadGIF call ReadGIF
mov [save_flag],1 mov [save_flag],1
no_unpakcing_file: no_unpakcing_file:

View File

@ -1,39 +1,66 @@
; GIF LITE v2.0 by Willow ; GIF LITE v3.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow ; Written in pure assembler by Ivushkin Andrey aka Willow
; Modified by Diamond
; ;
; This include file will contain functions to handle GIF image format ; This include file will contain functions to handle GIF image format
; ;
; Created: August 15, 2004 ; Created: August 15, 2004
; Last changed: August 25, 2006 ; Last changed: June 24, 2007
; Change COLOR_ORDER in your program ; Requires kglobals.inc (iglobal/uglobal macro)
; if colors are displayed improperly ; (program must 'include "kglobals.inc"' and say 'IncludeUGlobal'
; somewhere in uninitialized data area).
if ~ (COLOR_ORDER in <MENUETOS,OTHER>) ; Configuration: [changed from program which includes this file]
; 1. The constant COLOR_ORDER: must be one of
; PALETTE - for 8-bit image with palette (sysfunction 65)
; MENUETOS - for MenuetOS and KolibriOS color order (sysfunction 7)
; OTHER - for standard color order
; 2. Define constant GIF_SUPPORT_INTERLACED if you want to support interlaced
; GIFs.
; 3. Single image mode vs multiple image mode:
; if the program defines the variable 'gif_img_count' of type dword
; somewhere, ReadGIF will enter multiple image mode: gif_img_count
; will be initialized with image count, output format is GIF_list,
; the function GetGIFinfo retrieves Nth image info. Otherwise, ReadGIF
; uses single image mode: exit after end of first image, output is
; <dd width,height, times width*height[*3] db image>
if ~ (COLOR_ORDER in <PALETTE,MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch... ; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: MENUETOS or OTHER',13,10 display 'Please define COLOR_ORDER: PALETTE, MENUETOS or OTHER',13,10
end if end if
if defined gif_img_count
; virtual structure, used internally ; virtual structure, used internally
struc GIF_list struct GIF_list
{ NextImg rd 1
.NextImg rd 1 Left rw 1
.Left rw 1 Top rw 1
.Top rw 1 Width rw 1
.Width rw 1 Height rw 1
.Height rw 1 Delay rd 1
} Displacement rd 1 ; 0 = not specified
; 1 = do not dispose
; 2 = restore to background color
; 3 = restore to previous
if COLOR_ORDER eq PALETTE
Image rd 1
end if
ends
struc GIF_info struct GIF_info
{ Left rw 1
.Left rw 1 Top rw 1
.Top rw 1 Width rw 1
.Width rw 1 Height rw 1
.Height rw 1 Delay rd 1
} Displacement rd 1
if COLOR_ORDER eq PALETTE
_null fix 0x1000 Palette rd 1
end if
ends
; **************************************** ; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info ; FUNCTION GetGIFinfo - retrieve Nth image info
@ -56,86 +83,134 @@ GetGIFinfo:
jz .error jz .error
loop .lp loop .lp
.eloop: .eloop:
add esi,4 lodsd
movsd movsd
movsd movsd
movsd
movsd
if COLOR_ORDER eq PALETTE
lodsd
mov [edi],esi
else
mov eax,esi mov eax,esi
end if
.error: .error:
pop edi ecx esi pop edi ecx esi
ret ret
end if
_null fix 0x1000
; **************************************** ; ****************************************
; FUNCTION ReadGIF - unpacks GIF image ; FUNCTION ReadGIF - unpacks GIF image
; **************************************** ; ****************************************
; in: ; in:
; esi - pointer to GIF file in memory ; esi - pointer to GIF file in memory
; edi - pointer to output image list ; edi - pointer to output image list
; eax - pointer to work area (MIN 16 KB!)
; out: ; out:
; eax - 0, all OK; ; eax - 0, all OK;
; eax - 1, invalid signature; ; eax - 1, invalid signature;
; eax >=8, unsupported image attributes ; eax >=8, unsupported image attributes
; ;
; ecx - number of images
ReadGIF: ReadGIF:
push esi edi push esi edi
mov [.table_ptr],eax
mov [.cur_info],edi mov [.cur_info],edi
xor eax,eax xor eax,eax
mov [.globalColor],eax mov [.globalColor],eax
mov [.img_count],eax if defined gif_img_count
mov [gif_img_count],eax
mov [.anim_delay],eax
mov [.anim_disp],eax
end if
inc eax inc eax
cmp dword[esi],'GIF8' cmp dword[esi],'GIF8'
jne .ex ; signature jne .ex ; signature
mov ecx,[esi+0xa] mov ecx,[esi+0xa]
inc eax
add esi,0xd add esi,0xd
mov edi,esi mov edi,esi
bt ecx,7 test cl,cl
jnc .nextblock jns .nextblock
mov [.globalColor],esi mov [.globalColor],esi
call .Gif_skipmap call .Gif_skipmap
.nextblock: .nextblock:
cmp byte[edi],0x21 cmp byte[edi],0x21
jne .noextblock jne .noextblock
inc edi inc edi
if defined gif_img_count
cmp byte[edi],0xf9 ; Graphic Control Ext cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc jne .no_gc
movzx eax,word [edi+3]
mov [.anim_delay],eax
mov al,[edi+2]
shr al,2
and eax,7
mov [.anim_disp],eax
add edi,7 add edi,7
jmp .nextblock jmp .nextblock
.no_gc: .no_gc:
cmp byte[edi],0xfe ; Comment Ext end if
jne .no_comm
inc edi inc edi
.block_skip: .block_skip:
movzx eax,byte[edi] movzx eax,byte[edi]
lea edi,[edi+eax+1] lea edi,[edi+eax+1]
cmp byte[edi],0 test eax,eax
jnz .block_skip jnz .block_skip
inc edi
jmp .nextblock jmp .nextblock
.no_comm:
cmp byte[edi],0xff ; Application Ext
jne .nextblock
add edi,13
jmp .block_skip
.noextblock: .noextblock:
mov al,8
cmp byte[edi],0x2c ; image beginning cmp byte[edi],0x2c ; image beginning
jne .ex jne .ex
inc [.img_count] if defined gif_img_count
inc [gif_img_count]
end if
inc edi inc edi
mov esi,[.cur_info] mov esi,[.cur_info]
if defined gif_img_count
add esi,4 add esi,4
end if
xchg esi,edi xchg esi,edi
if defined GIF_SUPPORT_INTERLACED
movzx ecx,word[esi+4]
mov [.width],ecx
movzx eax,word[esi+6]
imul eax,ecx
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
mov [.img_end],eax
inc eax
mov [.row_end],eax
and [.pass],0
test byte[esi+8],40h
jz @f
if ~(COLOR_ORDER eq PALETTE)
lea ecx,[ecx*3]
end if
mov [.row_end],ecx
@@:
end if
if defined gif_img_count
movsd movsd
movsd movsd
mov eax,[.anim_delay]
stosd
mov eax,[.anim_disp]
stosd
else
movzx eax,word[esi+4]
stosd
movzx eax,word[esi+6]
stosd
add esi,8
end if
push edi push edi
movzx ecx,word[esi] mov ecx,[esi]
inc esi inc esi
bt ecx,7 test cl,cl
jc .uselocal js .uselocal
push [.globalColor] push [.globalColor]
mov edi,esi mov edi,esi
jmp .setPal jmp .setPal
@ -147,11 +222,12 @@ ReadGIF:
inc ecx inc ecx
mov [.codesize],ecx mov [.codesize],ecx
dec ecx dec ecx
if ~(COLOR_ORDER eq PALETTE)
pop [.Palette] pop [.Palette]
end if
lea esi,[edi+1] lea esi,[edi+1]
mov edi,[.table_ptr] mov edi,.gif_workarea
xor eax,eax xor eax,eax
cld
lodsb ; eax - block_count lodsb ; eax - block_count
add eax,esi add eax,esi
mov [.block_ofs],eax mov [.block_ofs],eax
@ -159,16 +235,40 @@ ReadGIF:
mov eax,1 mov eax,1
shl eax,cl shl eax,cl
mov [.CC],eax mov [.CC],eax
mov ecx,eax
inc eax inc eax
mov [.EOI],eax mov [.EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16 mov eax, _null shl 16
.filltable: .filltable:
stosd stosd
inc eax inc eax
loop .filltable loop .filltable
if COLOR_ORDER eq PALETTE
pop eax
pop edi pop edi
push edi
scasd
push esi
mov esi,eax
mov ecx,[.CC]
@@:
lodsd
dec esi
bswap eax
shr eax,8
stosd
loop @b
pop esi
pop eax
mov [eax],edi
else
pop edi
end if
if defined GIF_SUPPORT_INTERLACED
mov [.img_start],edi mov [.img_start],edi
add [.img_end],edi
add [.row_end],edi
end if
.reinit: .reinit:
mov edx,[.EOI] mov edx,[.EOI]
inc edx inc edx
@ -189,10 +289,7 @@ ReadGIF:
je .end je .end
call .Gif_output call .Gif_output
.add: .add:
push eax mov dword [.gif_workarea+edx*4],ebx
mov eax,[.table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF cmp edx,0xFFF
jae .cycle jae .cycle
inc edx inc edx
@ -212,6 +309,10 @@ ReadGIF:
pop ebx eax pop ebx eax
jmp .add jmp .add
.end: .end:
if defined GIF_SUPPORT_INTERLACED
mov edi,[.img_end]
end if
if defined gif_img_count
mov eax,[.cur_info] mov eax,[.cur_info]
mov [eax],edi mov [eax],edi
mov [.cur_info],edi mov [.cur_info],edi
@ -225,9 +326,10 @@ ReadGIF:
.continue: .continue:
cmp byte[edi],0x3b cmp byte[edi],0x3b
jne .nextblock jne .nextblock
xchg esi,edi
and dword [eax],0
end if
xor eax,eax xor eax,eax
stosd
mov ecx,[.img_count]
.ex: .ex:
pop edi esi pop edi esi
ret ret
@ -281,7 +383,7 @@ ReadGIF:
.Gif_output: .Gif_output:
push esi eax edx push esi eax edx
mov edx,[.table_ptr] mov edx,.gif_workarea
.next: .next:
push word[edx+eax*4] push word[edx+eax*4]
mov ax,word[edx+eax*4+2] mov ax,word[edx+eax*4+2]
@ -293,8 +395,11 @@ ReadGIF:
.loop2: .loop2:
pop ax pop ax
lea esi,[eax+eax*2] if COLOR_ORDER eq PALETTE
add esi,[.Palette] stosb
else
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS if COLOR_ORDER eq MENUETOS
mov esi,[esi] mov esi,[esi]
@ -303,23 +408,78 @@ ReadGIF:
mov [edi],esi mov [edi],esi
add edi,3 add edi,3
else else
movsw movsb
movsb
movsb movsb
end if end if
end if
if defined GIF_SUPPORT_INTERLACED
cmp edi,[.row_end]
jb .norowend
mov eax,[.width]
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
push eax
sub edi,eax
add eax,eax
cmp [.pass],3
jz @f
add eax,eax
cmp [.pass],2
jz @f
add eax,eax
@@:
add edi,eax
pop eax
cmp edi,[.img_end]
jb .nextrow
mov edi,[.img_start]
inc [.pass]
add edi,eax
cmp [.pass],3
jz @f
add edi,eax
cmp [.pass],2
jz @f
add edi,eax
add edi,eax
@@:
.nextrow:
add eax,edi
mov [.row_end],eax
xor eax,eax
.norowend:
end if
loop .loop2 loop .loop2
pop edx eax esi pop edx eax esi
ret ret
.globalColor rd 1 uglobal
.img_count rd 1 align 4
.cur_info rd 1 ; image table pointer ReadGIF.globalColor rd 1
.img_start rd 1 ReadGIF.cur_info rd 1 ; image table pointer
.codesize rd 1 ReadGIF.codesize rd 1
.compsize rd 1 ReadGIF.compsize rd 1
.bit_count rd 1 ReadGIF.bit_count rd 1
.CC rd 1 ReadGIF.CC rd 1
.EOI rd 1 ReadGIF.EOI rd 1
.Palette rd 1 if ~(COLOR_ORDER eq PALETTE)
.block_ofs rd 1 ReadGIF.Palette rd 1
.table_ptr rd 1 end if
ReadGIF.block_ofs rd 1
if defined GIF_SUPPORT_INTERLACED
ReadGIF.row_end rd 1
ReadGIF.img_end rd 1
ReadGIF.img_start rd 1
ReadGIF.pass rd 1
ReadGIF.width rd 1
end if
if defined gif_img_count
ReadGIF.anim_delay rd 1
ReadGIF.anim_disp rd 1
end if
ReadGIF.gif_workarea rb 16*1024
endg

View File

@ -23,19 +23,16 @@ use32
dd 0x01 dd 0x01
dd START dd START
dd I_END dd I_END
dd 0x300000 dd 0x400000
dd 0x27fff0 dd 0x400000
dd filename ;0x0 dd filename ;0x0
dd 0x0 dd 0x0
include 'lang.inc' include 'lang.inc'
include '..\..\..\macros.inc' ; decrease code size (optional) include '..\..\..\macros.inc' ; decrease code size (optional)
include 'debug.inc'
COLOR_ORDER equ MENUETOS
DELAY equ 20 ; animation speed COLOR_ORDER equ PALETTE
GIF_SUPPORT_INTERLACED = 1
;include '/hd/1/gif/gif_lite.inc'
include 'gif_lite.inc' include 'gif_lite.inc'
START: START:
@ -43,17 +40,17 @@ START:
jne openfile2 jne openfile2
; jmp openfile2 ; jmp openfile2
openfile: openfile:
and [entered],0
xor eax,eax xor eax,eax
mov [imgcount],eax mov [entered], eax
mov [gif_img_count],eax
mov esi,fn_input mov esi,fn_input
mov edi,filename mov edi,filename
mov ecx,[inp_pos] mov ecx,[inp_pos]
rep movsb rep movsb
stosb stosb
openfile2: openfile2:
mov eax,70
mov ebx,file_info mov ebx,file_info
mov eax,70
mcall mcall
cmp eax,6 cmp eax,6
je temp je temp
@ -63,9 +60,8 @@ temp:
; cmp ebx,64 ; cmp ebx,64
; jbe ok2 ; jbe ok2
and [entered],0
xor eax,eax xor eax,eax
mov [imgcount],eax mov [entered], eax
mov esi,filename mov esi,filename
mov edi,fn_input mov edi,fn_input
mov ecx,256/4 ;[filename_len] mov ecx,256/4 ;[filename_len]
@ -73,12 +69,9 @@ temp:
mov edi,fn_input mov edi,fn_input
mov ecx,256 mov ecx,256
xor eax,eax
repne scasb repne scasb
sub edi,fn_input sub edi,fn_input
dec edi
mov [inp_pos],edi mov [inp_pos],edi
inc [inp_pos]
; test eax,eax ; test eax,eax
; jnz .ok2 ; jnz .ok2
@ -86,36 +79,67 @@ temp:
; jbe .ok2 ; jbe .ok2
mov esi,workarea mov esi,workarea
mov edi,Image mov edi,Image
mov eax,hashtable
call ReadGIF call ReadGIF
test eax,eax test eax,eax
jz .ok jz .ok
xor ecx,ecx and [gif_img_count], 0
.ok: .ok:
mov [imgcount],ecx
ok2: ok2:
and dword[img_index],0 and dword[img_index],0
mov eax,48
mov ebx,3 mov ebx,3
mov ecx,sc mov ecx,sc
mov edx,sizeof.system_colors mov edx,sizeof.system_colors
mov eax,48
mcall mcall
red: red:
call draw_window ; *********************************************
; ******* Ž<><C5BD>…„…<E280B9>ˆˆ Ž<C5BD>ˆŽŠ€ ŽŠ<C5BD>€ *******
; *********************************************
draw_window:
mov ebx,1
mov eax,12
mcall
xor eax,eax
mov ebx,50*65536+700
mov ecx,50*65536+500
mov edx,[sc.work]
or edx,0x33000000
mov edi,title
mcall
call draw_input
xor ecx,ecx
call draw_subimage
cmp [gif_img_count],1
jz @f
mov ecx,[img_index]
call draw_subimage
@@:
mov ebx,2
mov eax,12
mcall
still: still:
cmp [imgcount], 1 cmp [gif_img_count], 1
jnz .delay jbe .infinite
mov eax, 10 mov ebx, [cur_anim_delay]
int 0x40 test ebx, ebx
jz .infinite
mov eax, 23
mcall
jmp @f jmp @f
.delay: .infinite:
mov ebx,DELAY mov eax, 10
mov eax,23 mcall
mcall
@@: @@:
dec eax dec eax
jz red jz red
@ -123,7 +147,7 @@ still:
jz key jz key
dec eax dec eax
jz button jz button
mov eax,[imgcount] mov eax,[gif_img_count]
cmp eax,1 cmp eax,1
je still je still
inc [img_index] inc [img_index]
@ -143,33 +167,31 @@ still:
jmp still jmp still
button: button:
mov eax,17 mcall 17
mcall
cmp ah,1 cmp ah,1
jne noclose jnz wait_input
_close: _close:
or eax,-1 or eax,-1
mcall mcall
noclose:
is_input: ; simple input line with backspace feature is_input: ; simple input line with backspace feature
inc [entered] ; sorry - no cursor inc [entered] ; sorry - no cursor
wait_input: wait_input:
call draw_input call draw_input
mov eax,10 mov eax,10
mcall mcall
cmp eax,2 cmp al,2
jne still jne still
mov edi,[inp_pos] mov edi,[inp_pos]
mov eax,2 ; mov eax,2
mcall mcall
shr eax,8 shr eax,8
cmp eax,27 cmp al,27
je still je still
cmp eax,13 cmp al,13
je openfile je openfile
cmp eax,8 cmp al,8
je backsp je backsp
mov [fn_input+edi],al mov [fn_input+edi],al
inc [inp_pos] inc [inp_pos]
@ -185,80 +207,44 @@ still:
;******* DRAW CONTENTS OF INPUT LINE **** ;******* DRAW CONTENTS OF INPUT LINE ****
;**************************************** ;****************************************
draw_input: draw_input:
push edi mov esi,0xe0e0e0
cmp [entered],0 cmp [entered],0
jne highlight jne highlight
mov esi,0x00aabbcc mov esi,0x00aabbcc
jmp di_draw
highlight: highlight:
mov esi,0xe0e0e0
di_draw:
mov eax,8
mov ebx,INP_X
mov ecx,INP_Y mov ecx,INP_Y
mov edx,2 mov edx,2
mov ebx,INP_X
mov eax,8
mcall mcall
mov eax,4
mov ecx,0x00107a30 mov ecx,0x00107a30
mov ebx,INP_XY
mov edx,fn_input mov edx,fn_input
mov esi,[inp_pos] mov esi,[inp_pos]
mcall mov ebx,INP_XY
pop edi mov eax,4
ret
; *********************************************
; ******* Ž<><C5BD>…„…<E280B9>ˆˆ Ž<C5BD>ˆŽŠ€ ŽŠ<C5BD>€ *******
; *********************************************
draw_window:
mov eax,12
mov ebx,1
mcall
mov eax,0
mov ebx,50*65536+700
mov ecx,50*65536+500
mov edx,[sc.work]
or edx,0x33000000
mov edi,title
mcall
call draw_input
xor ecx,ecx
call draw_subimage
cmp [imgcount],1
je .enddraw
mov ecx,[img_index]
call draw_subimage
.enddraw:
mov eax,12
mov ebx,2
mcall mcall
ret ret
draw_subimage: draw_subimage:
cmp [imgcount],0 cmp [gif_img_count],0
jz .enddraw jz .enddraw
mov esi,Image mov esi,Image
mov edi,gif_inf mov edi,gif_inf
call GetGIFinfo call GetGIFinfo
test eax,eax test eax,eax
jz .enddraw jz .enddraw
movzx ebx,[gif_inf.Width] mov ecx, dword [edi+GIF_info.Width-2]
shl ebx,16 mov cx, [edi+GIF_info.Height]
movzx ecx,[gif_inf.Height]
add ecx,ebx
mov ebx,eax mov ebx,eax
movzx eax,[gif_inf.Top] mov eax, [edi+GIF_info.Delay]
movzx edx,[gif_inf.Left] mov [cur_anim_delay],eax
shl edx,16 mov edx, dword [edi+GIF_info.Left-2]
add edx,eax mov dx, [edi+GIF_info.Top]
add edx,5 shl 16 +25 add edx,5 shl 16 +25
mov eax,7 mov esi, 8
mov edi, [edi+GIF_info.Palette]
xor ebp, ebp
mov eax, 65
mcall mcall
.enddraw: .enddraw:
ret ret
@ -291,14 +277,17 @@ filename:
; db '/hd/1/gif/meos.gif',0 ; db '/hd/1/gif/meos.gif',0
rb 257 rb 257
;filename_len dd 0 ;filename_len dd 0
entered rd 1 entered rd 1
sc system_colors sc system_colors
imgcount rd 1 gif_img_count rd 1
cur_anim_delay rd 1
img_index rd 1 img_index rd 1
gif_inf GIF_info gif_inf GIF_info
hashtable rd 4096 IncludeUGlobals
workarea rb 0x100000 workarea rb 0x100000
Image: Image:

View File

@ -83,15 +83,12 @@ START:
mcall 40,1000111b mcall 40,1000111b
mov esi,btns mov esi,btns
mov edi,btn_raw mov edi,btn_raw
mov eax,hash_table
call ReadGIF call ReadGIF
mov esi,hdrimg mov esi,hdrimg
mov edi,hdr_raw mov edi,hdr_raw
mov eax,hash_table
call ReadGIF call ReadGIF
mov esi,bottom mov esi,bottom
mov edi,bottom_raw mov edi,bottom_raw
mov eax,hash_table
call ReadGIF call ReadGIF
call respawn call respawn
mcall 9,prcinfo,-1 mcall 9,prcinfo,-1
@ -385,12 +382,11 @@ sel_track db ?
ipcmsg db ? ipcmsg db ?
fnbuf: fnbuf:
rb 1024 rb 1024
btn_raw rb 222*17*3+12 btn_raw rb 222*17*3+8
hdr_raw rb 275*29*3+12 hdr_raw rb 275*29*3+8
bottom_raw rb 25*378*3+12 bottom_raw rb 25*378*3+8
rb 4 rb 4
playlist rb 256*LISTITEMS playlist rb 256*LISTITEMS
hash_table: IncludeUGlobals
rd 4096
dir_table rb 32+304 dir_table rb 32+304
workarea: workarea:

View File

@ -49,7 +49,7 @@ draw_window:
xor eax,eax xor eax,eax
mov ebx,100*65536+275 mov ebx,100*65536+275
mov ecx,200*65536+WND_HEIGHT mov ecx,200*65536+WND_HEIGHT
mov edi,hdr_raw+12 mov edi,hdr_raw+8
mov ebp,[coo] mov ebp,[coo]
test [flag],FL_HIDDEN test [flag],FL_HIDDEN
jz .nohide1 jz .nohide1
@ -126,7 +126,7 @@ draw_window:
test [flag],FL_HIDDEN test [flag],FL_HIDDEN
jnz .nohide2 jnz .nohide2
mov eax,7 mov eax,7
mov ebx,btn_raw+12 mov ebx,btn_raw+8
mov ecx,BTNS_SIZE mov ecx,BTNS_SIZE
mov edx,BTNS_XY mov edx,BTNS_XY
mcall mcall
@ -254,7 +254,7 @@ draw_bottom:
mov ecx,5 mov ecx,5
mov esi,bot_btn mov esi,bot_btn
push esi push esi
mov ebx,bottom_raw+12 mov ebx,bottom_raw+8
xor eax,eax xor eax,eax
.nxt: .nxt:
push ecx push ecx
@ -323,7 +323,7 @@ draw_popup:
push edx push edx
.noadj3: .noadj3:
imul ebx,eax,BOTT_S imul ebx,eax,BOTT_S
add ebx,bottom_raw+12 add ebx,bottom_raw+8
push ecx push ecx
.nxt: .nxt:
push ecx push ecx

View File

@ -1,39 +1,66 @@
; GIF LITE v2.0 by Willow ; GIF LITE v3.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow ; Written in pure assembler by Ivushkin Andrey aka Willow
; Modified by Diamond
; ;
; This include file will contain functions to handle GIF image format ; This include file will contain functions to handle GIF image format
; ;
; Created: August 15, 2004 ; Created: August 15, 2004
; Last changed: September 9, 2004 ; Last changed: June 24, 2007
; Change COLOR_ORDER in your program ; Requires kglobals.inc (iglobal/uglobal macro)
; if colors are displayed improperly ; (program must 'include "kglobals.inc"' and say 'IncludeUGlobal'
; somewhere in uninitialized data area).
if ~ (COLOR_ORDER in <MENUETOS,OTHER>) ; Configuration: [changed from program which includes this file]
; 1. The constant COLOR_ORDER: must be one of
; PALETTE - for 8-bit image with palette (sysfunction 65)
; MENUETOS - for MenuetOS and KolibriOS color order (sysfunction 7)
; OTHER - for standard color order
; 2. Define constant GIF_SUPPORT_INTERLACED if you want to support interlaced
; GIFs.
; 3. Single image mode vs multiple image mode:
; if the program defines the variable 'gif_img_count' of type dword
; somewhere, ReadGIF will enter multiple image mode: gif_img_count
; will be initialized with image count, output format is GIF_list,
; the function GetGIFinfo retrieves Nth image info. Otherwise, ReadGIF
; uses single image mode: exit after end of first image, output is
; <dd width,height, times width*height[*3] db image>
if ~ (COLOR_ORDER in <PALETTE,MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch... ; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: MENUETOS or OTHER',13,10 display 'Please define COLOR_ORDER: PALETTE, MENUETOS or OTHER',13,10
end if end if
if defined gif_img_count
; virtual structure, used internally ; virtual structure, used internally
struc GIF_list struct GIF_list
{ NextImg rd 1
.NextImg rd 1 Left rw 1
.Left rw 1 Top rw 1
.Top rw 1 Width rw 1
.Width rw 1 Height rw 1
.Height rw 1 Delay rd 1
} Displacement rd 1 ; 0 = not specified
; 1 = do not dispose
; 2 = restore to background color
; 3 = restore to previous
if COLOR_ORDER eq PALETTE
Image rd 1
end if
ends
struc GIF_info struct GIF_info
{ Left rw 1
.Left rw 1 Top rw 1
.Top rw 1 Width rw 1
.Width rw 1 Height rw 1
.Height rw 1 Delay rd 1
} Displacement rd 1
if COLOR_ORDER eq PALETTE
_null fix 0x1000 Palette rd 1
end if
ends
; **************************************** ; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info ; FUNCTION GetGIFinfo - retrieve Nth image info
@ -56,86 +83,134 @@ GetGIFinfo:
jz .error jz .error
loop .lp loop .lp
.eloop: .eloop:
add esi,4 lodsd
movsd movsd
movsd movsd
movsd
movsd
if COLOR_ORDER eq PALETTE
lodsd
mov [edi],esi
else
mov eax,esi mov eax,esi
end if
.error: .error:
pop edi ecx esi pop edi ecx esi
ret ret
end if
_null fix 0x1000
; **************************************** ; ****************************************
; FUNCTION ReadGIF - unpacks GIF image ; FUNCTION ReadGIF - unpacks GIF image
; **************************************** ; ****************************************
; in: ; in:
; esi - pointer to GIF file in memory ; esi - pointer to GIF file in memory
; edi - pointer to output image list ; edi - pointer to output image list
; eax - pointer to work area (MIN 16 KB!)
; out: ; out:
; eax - 0, all OK; ; eax - 0, all OK;
; eax - 1, invalid signature; ; eax - 1, invalid signature;
; eax >=8, unsupported image attributes ; eax >=8, unsupported image attributes
; ;
; ecx - number of images
ReadGIF: ReadGIF:
push esi edi push esi edi
mov [.table_ptr],eax
mov [.cur_info],edi mov [.cur_info],edi
xor eax,eax xor eax,eax
mov [.globalColor],eax mov [.globalColor],eax
mov [.img_count],eax if defined gif_img_count
mov [gif_img_count],eax
mov [.anim_delay],eax
mov [.anim_disp],eax
end if
inc eax inc eax
cmp dword[esi],'GIF8' cmp dword[esi],'GIF8'
jne .ex ; signature jne .ex ; signature
mov ecx,[esi+0xa] mov ecx,[esi+0xa]
inc eax
add esi,0xd add esi,0xd
mov edi,esi mov edi,esi
bt ecx,7 test cl,cl
jnc .nextblock jns .nextblock
mov [.globalColor],esi mov [.globalColor],esi
call .Gif_skipmap call .Gif_skipmap
.nextblock: .nextblock:
cmp byte[edi],0x21 cmp byte[edi],0x21
jne .noextblock jne .noextblock
inc edi inc edi
if defined gif_img_count
cmp byte[edi],0xf9 ; Graphic Control Ext cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc jne .no_gc
movzx eax,word [edi+3]
mov [.anim_delay],eax
mov al,[edi+2]
shr al,2
and eax,7
mov [.anim_disp],eax
add edi,7 add edi,7
jmp .nextblock jmp .nextblock
.no_gc: .no_gc:
cmp byte[edi],0xfe ; Comment Ext end if
jne .no_comm
inc edi inc edi
.block_skip: .block_skip:
movzx eax,byte[edi] movzx eax,byte[edi]
lea edi,[edi+eax+1] lea edi,[edi+eax+1]
cmp byte[edi],0 test eax,eax
jnz .block_skip jnz .block_skip
inc edi
jmp .nextblock jmp .nextblock
.no_comm:
cmp byte[edi],0xff ; Application Ext
jne .nextblock
add edi,13
jmp .block_skip
.noextblock: .noextblock:
mov al,8
cmp byte[edi],0x2c ; image beginning cmp byte[edi],0x2c ; image beginning
jne .ex jne .ex
inc [.img_count] if defined gif_img_count
inc [gif_img_count]
end if
inc edi inc edi
mov esi,[.cur_info] mov esi,[.cur_info]
if defined gif_img_count
add esi,4 add esi,4
end if
xchg esi,edi xchg esi,edi
if defined GIF_SUPPORT_INTERLACED
movzx ecx,word[esi+4]
mov [.width],ecx
movzx eax,word[esi+6]
imul eax,ecx
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
mov [.img_end],eax
inc eax
mov [.row_end],eax
and [.pass],0
test byte[esi+8],40h
jz @f
if ~(COLOR_ORDER eq PALETTE)
lea ecx,[ecx*3]
end if
mov [.row_end],ecx
@@:
end if
if defined gif_img_count
movsd movsd
movsd movsd
mov eax,[.anim_delay]
stosd
mov eax,[.anim_disp]
stosd
else
movzx eax,word[esi+4]
stosd
movzx eax,word[esi+6]
stosd
add esi,8
end if
push edi push edi
movzx ecx,word[esi] mov ecx,[esi]
inc esi inc esi
bt ecx,7 test cl,cl
jc .uselocal js .uselocal
push [.globalColor] push [.globalColor]
mov edi,esi mov edi,esi
jmp .setPal jmp .setPal
@ -147,11 +222,12 @@ ReadGIF:
inc ecx inc ecx
mov [.codesize],ecx mov [.codesize],ecx
dec ecx dec ecx
if ~(COLOR_ORDER eq PALETTE)
pop [.Palette] pop [.Palette]
end if
lea esi,[edi+1] lea esi,[edi+1]
mov edi,[.table_ptr] mov edi,.gif_workarea
xor eax,eax xor eax,eax
cld
lodsb ; eax - block_count lodsb ; eax - block_count
add eax,esi add eax,esi
mov [.block_ofs],eax mov [.block_ofs],eax
@ -159,16 +235,40 @@ ReadGIF:
mov eax,1 mov eax,1
shl eax,cl shl eax,cl
mov [.CC],eax mov [.CC],eax
mov ecx,eax
inc eax inc eax
mov [.EOI],eax mov [.EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16 mov eax, _null shl 16
.filltable: .filltable:
stosd stosd
inc eax inc eax
loop .filltable loop .filltable
if COLOR_ORDER eq PALETTE
pop eax
pop edi pop edi
push edi
scasd
push esi
mov esi,eax
mov ecx,[.CC]
@@:
lodsd
dec esi
bswap eax
shr eax,8
stosd
loop @b
pop esi
pop eax
mov [eax],edi
else
pop edi
end if
if defined GIF_SUPPORT_INTERLACED
mov [.img_start],edi mov [.img_start],edi
add [.img_end],edi
add [.row_end],edi
end if
.reinit: .reinit:
mov edx,[.EOI] mov edx,[.EOI]
inc edx inc edx
@ -189,10 +289,7 @@ ReadGIF:
je .end je .end
call .Gif_output call .Gif_output
.add: .add:
push eax mov dword [.gif_workarea+edx*4],ebx
mov eax,[.table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF cmp edx,0xFFF
jae .cycle jae .cycle
inc edx inc edx
@ -212,6 +309,10 @@ ReadGIF:
pop ebx eax pop ebx eax
jmp .add jmp .add
.end: .end:
if defined GIF_SUPPORT_INTERLACED
mov edi,[.img_end]
end if
if defined gif_img_count
mov eax,[.cur_info] mov eax,[.cur_info]
mov [eax],edi mov [eax],edi
mov [.cur_info],edi mov [.cur_info],edi
@ -225,8 +326,10 @@ ReadGIF:
.continue: .continue:
cmp byte[edi],0x3b cmp byte[edi],0x3b
jne .nextblock jne .nextblock
xchg esi,edi
and dword [eax],0
end if
xor eax,eax xor eax,eax
mov ecx,[.img_count]
.ex: .ex:
pop edi esi pop edi esi
ret ret
@ -280,7 +383,7 @@ ReadGIF:
.Gif_output: .Gif_output:
push esi eax edx push esi eax edx
mov edx,[.table_ptr] mov edx,.gif_workarea
.next: .next:
push word[edx+eax*4] push word[edx+eax*4]
mov ax,word[edx+eax*4+2] mov ax,word[edx+eax*4+2]
@ -292,8 +395,11 @@ ReadGIF:
.loop2: .loop2:
pop ax pop ax
lea esi,[eax+eax*2] if COLOR_ORDER eq PALETTE
add esi,[.Palette] stosb
else
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS if COLOR_ORDER eq MENUETOS
mov esi,[esi] mov esi,[esi]
@ -302,23 +408,78 @@ ReadGIF:
mov [edi],esi mov [edi],esi
add edi,3 add edi,3
else else
movsw movsb
movsb
movsb movsb
end if end if
end if
if defined GIF_SUPPORT_INTERLACED
cmp edi,[.row_end]
jb .norowend
mov eax,[.width]
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
push eax
sub edi,eax
add eax,eax
cmp [.pass],3
jz @f
add eax,eax
cmp [.pass],2
jz @f
add eax,eax
@@:
add edi,eax
pop eax
cmp edi,[.img_end]
jb .nextrow
mov edi,[.img_start]
inc [.pass]
add edi,eax
cmp [.pass],3
jz @f
add edi,eax
cmp [.pass],2
jz @f
add edi,eax
add edi,eax
@@:
.nextrow:
add eax,edi
mov [.row_end],eax
xor eax,eax
.norowend:
end if
loop .loop2 loop .loop2
pop edx eax esi pop edx eax esi
ret ret
.globalColor rd 1 uglobal
.img_count rd 1 align 4
.cur_info rd 1 ; image table pointer ReadGIF.globalColor rd 1
.img_start rd 1 ReadGIF.cur_info rd 1 ; image table pointer
.codesize rd 1 ReadGIF.codesize rd 1
.compsize rd 1 ReadGIF.compsize rd 1
.bit_count rd 1 ReadGIF.bit_count rd 1
.CC rd 1 ReadGIF.CC rd 1
.EOI rd 1 ReadGIF.EOI rd 1
.Palette rd 1 if ~(COLOR_ORDER eq PALETTE)
.block_ofs rd 1 ReadGIF.Palette rd 1
.table_ptr rd 1 end if
ReadGIF.block_ofs rd 1
if defined GIF_SUPPORT_INTERLACED
ReadGIF.row_end rd 1
ReadGIF.img_end rd 1
ReadGIF.img_start rd 1
ReadGIF.pass rd 1
ReadGIF.width rd 1
end if
if defined gif_img_count
ReadGIF.anim_delay rd 1
ReadGIF.anim_disp rd 1
end if
ReadGIF.gif_workarea rb 16*1024
endg

View File

@ -75,7 +75,7 @@ PL_show:
test [flag],FL_BOTTRED test [flag],FL_BOTTRED
jz .nobott jz .nobott
pusha pusha
mcall 7,hdr_raw+12+275*16*3,<275,12>,<10,(WND_HEIGHT-20)> mcall 7,hdr_raw+8+275*16*3,<275,12>,<10,(WND_HEIGHT-20)>
mov ebp,main_coo2 mov ebp,main_coo2
mov esi,10 shl 16 mov esi,10 shl 16
mov edi,(WND_HEIGHT-22)shl 16 mov edi,(WND_HEIGHT-22)shl 16

View File

@ -35,8 +35,6 @@ include 'caches.inc' ;(L1 and L2 cashes decoding for Intel)
include 'multipli.inc' ;(multiplier decoding) include 'multipli.inc' ;(multiplier decoding)
include 'features.inc' ;(features decoding) include 'features.inc' ;(features decoding)
include 'gif2img.inc' ;macros to convert gif to img
include 'rsatest.inc' include 'rsatest.inc'
include 'variable.inc' include 'variable.inc'
@ -1715,10 +1713,11 @@ Text 15,250,,brandid, brandidlen-brandid
ret ; ret ;
load_gif: load_gif:
mov edi, img_area mov edi, img_area
load_gif2: load_gif2:
gif2img esi,edi
; ret COLOR_ORDER equ MENUETOS
include 'gif_lite.inc' ; parse GIF files
; DATA AREA ; DATA AREA
@ -2134,8 +2133,6 @@ rb 201*49*3+8 ; image resolution (bits to reserve)
img_area2: ; image is going to be unpacked to here img_area2: ; image is going to be unpacked to here
rb 93*24*3+8 ; image resolution (bits to reserve) rb 93*24*3+8 ; image resolution (bits to reserve)
gif_hash_area:
rd 4096+1 ;hash area size for unpacking gif
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
I_END: I_END:
@ -2148,19 +2145,7 @@ align 4
iter rd 1 iter rd 1
openkey rd 1 openkey rd 1
; GIF unpacker data IncludeUGlobals
globalColor dd ?
img_count dd ?
cur_info dd ? ; image table pointer
codesize dd ?
compsize dd ?
bit_count dd ?
CC dd ?
EOI dd ?
Palette dd ?
block_ofs dd ?
table_ptr dd ?
ost dd ? ost dd ?
sot dd ? sot dd ?

View File

@ -1,283 +0,0 @@
COLOR_ORDER equ MENUETOS
gif_hash_offset = gif_hash_area
macro gif2img gifsrc,imgsrc
{
local hasharea, ReadGIF, nextblock,_null
;local globalColor, img_count, cur_info, img_start
;local codesize, compsize, bit_count, CC, EOI, Palette
;local block_ofs, table_ptr, gifmacend
local no_gc, block_skip, no_comm, noextblock, uselocal
local setPal, filltable, reinit, cycle, zadd, noinc
local notintable, er, zend, nxt, continue, ex, Gif_skipmap
local Gif_get_sym, shift, nextbl, noblock, loop1, exx
local Gif_output, next, loop2
_null fix 0x1000 ; 0x1000
if ~gifsrc eq esi
mov esi,gifsrc
end if
if ~imgsrc eq edi
mov edi,imgsrc
end if
if defined gif_hash_offset
mov eax,gif_hash_offset
else
mov eax,hasharea
end if
call ReadGIF
ret
if defined gif_hash_offset
else
hasharea:
times 4096 dd 0 ;4096
end if
ReadGIF:
push esi edi
mov [table_ptr],eax
mov [cur_info],edi
xor eax,eax
mov [globalColor],eax
mov [img_count],eax
inc eax
cmp dword[esi],'GIF8'
jne ex ; signature
mov ecx,[esi+0xa]
inc eax
add esi,0xd
mov edi,esi
bt ecx,7
jnc nextblock
mov [globalColor],esi
call Gif_skipmap
nextblock:
cmp byte[edi],0x21
jne noextblock
inc edi
cmp byte[edi],0xf9 ; Graphic Control Ext
jne no_gc
add edi,7
jmp nextblock
no_gc:
cmp byte[edi],0xfe ; Comment Ext
jne no_comm
inc edi
block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
cmp byte[edi],0
jnz block_skip
inc edi
jmp nextblock
no_comm:
cmp byte[edi],0xff ; Application Ext
jne nextblock
add edi,13
jmp block_skip
noextblock:
cmp byte[edi],0x2c ; image beginning
jne ex
inc [img_count]
inc edi
mov esi,[cur_info]
xchg esi,edi
; movsd
; movsd
mov bp,word[esi+4]
movzx ebx,bp
mov [edi],ebx
mov bp,word[esi+6]
movzx ebx,bp
mov [edi+4],ebx
add edi,8
add esi,8
push edi
movzx ecx,word[esi]
inc esi
bt ecx,7
jc uselocal
push [globalColor]
mov edi,esi
jmp setPal
uselocal:
call Gif_skipmap
push esi
setPal:
movzx ecx,byte[edi]
inc ecx
mov [codesize],ecx
dec ecx
pop [Palette]
lea esi,[edi+1]
mov edi,[table_ptr]
xor eax,eax
cld
lodsb ; eax - block_count
add eax,esi
mov [block_ofs],eax
mov [bit_count],8
mov eax,1
shl eax,cl
mov [CC],eax
inc eax
mov [EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16
filltable:
stosd
inc eax
loop filltable
pop edi
reinit:
mov edx,[EOI]
inc edx
push [codesize]
pop [compsize]
call Gif_get_sym
cmp eax,[CC]
je reinit
call Gif_output
cycle:
movzx ebx,ax
call Gif_get_sym
cmp eax,edx
jae notintable
cmp eax,[CC]
je reinit
cmp eax,[EOI]
je zend
call Gif_output
zadd:
push eax
mov eax,[table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF
jae cycle
inc edx
bsr ebx,edx
cmp ebx,[compsize]
jne noinc
inc [compsize]
noinc:
jmp cycle
notintable:
push eax
mov eax,ebx
call Gif_output
push ebx
movzx eax,bx
call Gif_output
pop ebx eax
jmp zadd
zend:
; mov eax,[.cur_info] ; skip offset to next frame
; mov [eax],edi
mov [cur_info],edi
add esi,2
xchg esi,edi
nxt:
cmp byte[edi],0
jnz continue
inc edi
jmp nxt
continue:
; cmp byte[edi],0x3b ;read next frame
; jne nextblock
mov ecx,[img_count]
ex:
pop edi esi
ret
Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
Gif_get_sym:
mov ecx,[compsize]
push ecx
xor eax,eax
shift:
ror byte[esi],1
rcr eax,1
dec [bit_count]
jnz loop1
inc esi
cmp esi,[block_ofs]
jb noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz nextbl
mov eax,[EOI]
sub esi,2
add esp,8
jmp exx
nextbl:
add eax,esi
mov [block_ofs],eax
pop eax
noblock:
mov [bit_count],8
loop1:
loop shift
pop ecx
rol eax,cl
exx:
xor ecx,ecx
ret
Gif_output:
push esi eax edx
mov edx,[table_ptr]
next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz next
shl ebx,16
mov bx,[esp]
loop2:
pop ax
lea esi,[eax+eax*2]
add esi,[Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsw
movsb
end if
loop loop2
pop edx eax esi
ret
gifmacend:
}

View File

@ -0,0 +1,485 @@
; GIF LITE v3.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow
; Modified by Diamond
;
; This include file will contain functions to handle GIF image format
;
; Created: August 15, 2004
; Last changed: June 24, 2007
; Requires kglobals.inc (iglobal/uglobal macro)
; (program must 'include "kglobals.inc"' and say 'IncludeUGlobal'
; somewhere in uninitialized data area).
; Configuration: [changed from program which includes this file]
; 1. The constant COLOR_ORDER: must be one of
; PALETTE - for 8-bit image with palette (sysfunction 65)
; MENUETOS - for MenuetOS and KolibriOS color order (sysfunction 7)
; OTHER - for standard color order
; 2. Define constant GIF_SUPPORT_INTERLACED if you want to support interlaced
; GIFs.
; 3. Single image mode vs multiple image mode:
; if the program defines the variable 'gif_img_count' of type dword
; somewhere, ReadGIF will enter multiple image mode: gif_img_count
; will be initialized with image count, output format is GIF_list,
; the function GetGIFinfo retrieves Nth image info. Otherwise, ReadGIF
; uses single image mode: exit after end of first image, output is
; <dd width,height, times width*height[*3] db image>
if ~ (COLOR_ORDER in <PALETTE,MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: PALETTE, MENUETOS or OTHER',13,10
end if
if defined gif_img_count
; virtual structure, used internally
struct GIF_list
NextImg rd 1
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1 ; 0 = not specified
; 1 = do not dispose
; 2 = restore to background color
; 3 = restore to previous
if COLOR_ORDER eq PALETTE
Image rd 1
end if
ends
struct GIF_info
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1
if COLOR_ORDER eq PALETTE
Palette rd 1
end if
ends
; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info
; ****************************************
; in:
; esi - pointer to image list header
; ecx - image_index (0...img_count-1)
; edi - pointer to GIF_info structure to be filled
; out:
; eax - pointer to RAW data, or 0, if error
GetGIFinfo:
push esi ecx edi
xor eax,eax
jecxz .eloop
.lp:
mov esi,[esi]
test esi,esi
jz .error
loop .lp
.eloop:
lodsd
movsd
movsd
movsd
movsd
if COLOR_ORDER eq PALETTE
lodsd
mov [edi],esi
else
mov eax,esi
end if
.error:
pop edi ecx esi
ret
end if
_null fix 0x1000
; ****************************************
; FUNCTION ReadGIF - unpacks GIF image
; ****************************************
; in:
; esi - pointer to GIF file in memory
; edi - pointer to output image list
; out:
; eax - 0, all OK;
; eax - 1, invalid signature;
; eax >=8, unsupported image attributes
;
ReadGIF:
push esi edi
mov [.cur_info],edi
xor eax,eax
mov [.globalColor],eax
if defined gif_img_count
mov [gif_img_count],eax
mov [.anim_delay],eax
mov [.anim_disp],eax
end if
inc eax
cmp dword[esi],'GIF8'
jne .ex ; signature
mov ecx,[esi+0xa]
add esi,0xd
mov edi,esi
test cl,cl
jns .nextblock
mov [.globalColor],esi
call .Gif_skipmap
.nextblock:
cmp byte[edi],0x21
jne .noextblock
inc edi
if defined gif_img_count
cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc
movzx eax,word [edi+3]
mov [.anim_delay],eax
mov al,[edi+2]
shr al,2
and eax,7
mov [.anim_disp],eax
add edi,7
jmp .nextblock
.no_gc:
end if
inc edi
.block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
test eax,eax
jnz .block_skip
jmp .nextblock
.noextblock:
mov al,8
cmp byte[edi],0x2c ; image beginning
jne .ex
if defined gif_img_count
inc [gif_img_count]
end if
inc edi
mov esi,[.cur_info]
if defined gif_img_count
add esi,4
end if
xchg esi,edi
if defined GIF_SUPPORT_INTERLACED
movzx ecx,word[esi+4]
mov [.width],ecx
movzx eax,word[esi+6]
imul eax,ecx
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
mov [.img_end],eax
inc eax
mov [.row_end],eax
and [.pass],0
test byte[esi+8],40h
jz @f
if ~(COLOR_ORDER eq PALETTE)
lea ecx,[ecx*3]
end if
mov [.row_end],ecx
@@:
end if
if defined gif_img_count
movsd
movsd
mov eax,[.anim_delay]
stosd
mov eax,[.anim_disp]
stosd
else
movzx eax,word[esi+4]
stosd
movzx eax,word[esi+6]
stosd
add esi,8
end if
push edi
mov ecx,[esi]
inc esi
test cl,cl
js .uselocal
push [.globalColor]
mov edi,esi
jmp .setPal
.uselocal:
call .Gif_skipmap
push esi
.setPal:
movzx ecx,byte[edi]
inc ecx
mov [.codesize],ecx
dec ecx
if ~(COLOR_ORDER eq PALETTE)
pop [.Palette]
end if
lea esi,[edi+1]
mov edi,.gif_workarea
xor eax,eax
lodsb ; eax - block_count
add eax,esi
mov [.block_ofs],eax
mov [.bit_count],8
mov eax,1
shl eax,cl
mov [.CC],eax
mov ecx,eax
inc eax
mov [.EOI],eax
mov eax, _null shl 16
.filltable:
stosd
inc eax
loop .filltable
if COLOR_ORDER eq PALETTE
pop eax
pop edi
push edi
scasd
push esi
mov esi,eax
mov ecx,[.CC]
@@:
lodsd
dec esi
bswap eax
shr eax,8
stosd
loop @b
pop esi
pop eax
mov [eax],edi
else
pop edi
end if
if defined GIF_SUPPORT_INTERLACED
mov [.img_start],edi
add [.img_end],edi
add [.row_end],edi
end if
.reinit:
mov edx,[.EOI]
inc edx
push [.codesize]
pop [.compsize]
call .Gif_get_sym
cmp eax,[.CC]
je .reinit
call .Gif_output
.cycle:
movzx ebx,ax
call .Gif_get_sym
cmp eax,edx
jae .notintable
cmp eax,[.CC]
je .reinit
cmp eax,[.EOI]
je .end
call .Gif_output
.add:
mov dword [.gif_workarea+edx*4],ebx
cmp edx,0xFFF
jae .cycle
inc edx
bsr ebx,edx
cmp ebx,[.compsize]
jne .noinc
inc [.compsize]
.noinc:
jmp .cycle
.notintable:
push eax
mov eax,ebx
call .Gif_output
push ebx
movzx eax,bx
call .Gif_output
pop ebx eax
jmp .add
.end:
if defined GIF_SUPPORT_INTERLACED
mov edi,[.img_end]
end if
if defined gif_img_count
mov eax,[.cur_info]
mov [eax],edi
mov [.cur_info],edi
add esi,2
xchg esi,edi
.nxt:
cmp byte[edi],0
jnz .continue
inc edi
jmp .nxt
.continue:
cmp byte[edi],0x3b
jne .nextblock
xchg esi,edi
and dword [eax],0
end if
xor eax,eax
.ex:
pop edi esi
ret
.Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
.Gif_get_sym:
mov ecx,[.compsize]
push ecx
xor eax,eax
.shift:
ror byte[esi],1
rcr eax,1
dec [.bit_count]
jnz .loop1
inc esi
cmp esi,[.block_ofs]
jb .noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz .nextbl
mov eax,[.EOI]
sub esi,2
add esp,8
jmp .exx
.nextbl:
add eax,esi
mov [.block_ofs],eax
pop eax
.noblock:
mov [.bit_count],8
.loop1:
loop .shift
pop ecx
rol eax,cl
.exx:
xor ecx,ecx
ret
.Gif_output:
push esi eax edx
mov edx,.gif_workarea
.next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz .next
shl ebx,16
mov bx,[esp]
.loop2:
pop ax
if COLOR_ORDER eq PALETTE
stosb
else
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsb
movsb
movsb
end if
end if
if defined GIF_SUPPORT_INTERLACED
cmp edi,[.row_end]
jb .norowend
mov eax,[.width]
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
push eax
sub edi,eax
add eax,eax
cmp [.pass],3
jz @f
add eax,eax
cmp [.pass],2
jz @f
add eax,eax
@@:
add edi,eax
pop eax
cmp edi,[.img_end]
jb .nextrow
mov edi,[.img_start]
inc [.pass]
add edi,eax
cmp [.pass],3
jz @f
add edi,eax
cmp [.pass],2
jz @f
add edi,eax
add edi,eax
@@:
.nextrow:
add eax,edi
mov [.row_end],eax
xor eax,eax
.norowend:
end if
loop .loop2
pop edx eax esi
ret
uglobal
align 4
ReadGIF.globalColor rd 1
ReadGIF.cur_info rd 1 ; image table pointer
ReadGIF.codesize rd 1
ReadGIF.compsize rd 1
ReadGIF.bit_count rd 1
ReadGIF.CC rd 1
ReadGIF.EOI rd 1
if ~(COLOR_ORDER eq PALETTE)
ReadGIF.Palette rd 1
end if
ReadGIF.block_ofs rd 1
if defined GIF_SUPPORT_INTERLACED
ReadGIF.row_end rd 1
ReadGIF.img_end rd 1
ReadGIF.img_start rd 1
ReadGIF.pass rd 1
ReadGIF.width rd 1
end if
if defined gif_img_count
ReadGIF.anim_delay rd 1
ReadGIF.anim_disp rd 1
end if
ReadGIF.gif_workarea rb 16*1024
endg

View File

@ -1,39 +1,66 @@
; GIF LITE v2.0 by Willow ; GIF LITE v3.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow ; Written in pure assembler by Ivushkin Andrey aka Willow
; Modified by Diamond
; ;
; This include file will contain functions to handle GIF image format ; This include file will contain functions to handle GIF image format
; ;
; Created: August 15, 2004 ; Created: August 15, 2004
; Last changed: September 9, 2004 ; Last changed: June 24, 2007
; Change COLOR_ORDER in your program ; Requires kglobals.inc (iglobal/uglobal macro)
; if colors are displayed improperly ; (program must 'include "kglobals.inc"' and say 'IncludeUGlobal'
; somewhere in uninitialized data area).
if ~ (COLOR_ORDER in <MENUETOS,OTHER>) ; Configuration: [changed from program which includes this file]
; 1. The constant COLOR_ORDER: must be one of
; PALETTE - for 8-bit image with palette (sysfunction 65)
; MENUETOS - for MenuetOS and KolibriOS color order (sysfunction 7)
; OTHER - for standard color order
; 2. Define constant GIF_SUPPORT_INTERLACED if you want to support interlaced
; GIFs.
; 3. Single image mode vs multiple image mode:
; if the program defines the variable 'gif_img_count' of type dword
; somewhere, ReadGIF will enter multiple image mode: gif_img_count
; will be initialized with image count, output format is GIF_list,
; the function GetGIFinfo retrieves Nth image info. Otherwise, ReadGIF
; uses single image mode: exit after end of first image, output is
; <dd width,height, times width*height[*3] db image>
if ~ (COLOR_ORDER in <PALETTE,MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch... ; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: MENUETOS or OTHER',13,10 display 'Please define COLOR_ORDER: PALETTE, MENUETOS or OTHER',13,10
end if end if
if defined gif_img_count
; virtual structure, used internally ; virtual structure, used internally
struc GIF_list struct GIF_list
{ NextImg rd 1
.NextImg rd 1 Left rw 1
.Left rw 1 Top rw 1
.Top rw 1 Width rw 1
.Width rw 1 Height rw 1
.Height rw 1 Delay rd 1
} Displacement rd 1 ; 0 = not specified
; 1 = do not dispose
; 2 = restore to background color
; 3 = restore to previous
if COLOR_ORDER eq PALETTE
Image rd 1
end if
ends
struc GIF_info struct GIF_info
{ Left rw 1
.Left rw 1 Top rw 1
.Top rw 1 Width rw 1
.Width rw 1 Height rw 1
.Height rw 1 Delay rd 1
} Displacement rd 1
if COLOR_ORDER eq PALETTE
_null fix 0x1000 Palette rd 1
end if
ends
; **************************************** ; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info ; FUNCTION GetGIFinfo - retrieve Nth image info
@ -56,86 +83,134 @@ GetGIFinfo:
jz .error jz .error
loop .lp loop .lp
.eloop: .eloop:
add esi,4 lodsd
movsd movsd
movsd movsd
movsd
movsd
if COLOR_ORDER eq PALETTE
lodsd
mov [edi],esi
else
mov eax,esi mov eax,esi
end if
.error: .error:
pop edi ecx esi pop edi ecx esi
ret ret
end if
_null fix 0x1000
; **************************************** ; ****************************************
; FUNCTION ReadGIF - unpacks GIF image ; FUNCTION ReadGIF - unpacks GIF image
; **************************************** ; ****************************************
; in: ; in:
; esi - pointer to GIF file in memory ; esi - pointer to GIF file in memory
; edi - pointer to output image list ; edi - pointer to output image list
; eax - pointer to work area (MIN 16 KB!)
; out: ; out:
; eax - 0, all OK; ; eax - 0, all OK;
; eax - 1, invalid signature; ; eax - 1, invalid signature;
; eax >=8, unsupported image attributes ; eax >=8, unsupported image attributes
; ;
; ecx - number of images
ReadGIF: ReadGIF:
push esi edi push esi edi
mov [.table_ptr],eax
mov [.cur_info],edi mov [.cur_info],edi
xor eax,eax xor eax,eax
mov [.globalColor],eax mov [.globalColor],eax
mov [.img_count],eax if defined gif_img_count
mov [gif_img_count],eax
mov [.anim_delay],eax
mov [.anim_disp],eax
end if
inc eax inc eax
cmp dword[esi],'GIF8' cmp dword[esi],'GIF8'
jne .er ; signature jne .ex ; signature
mov ecx,[esi+0xa] mov ecx,[esi+0xa]
inc eax
add esi,0xd add esi,0xd
mov edi,esi mov edi,esi
bt ecx,7 test cl,cl
jnc .nextblock jns .nextblock
mov [.globalColor],esi mov [.globalColor],esi
call .Gif_skipmap call .Gif_skipmap
.nextblock: .nextblock:
cmp byte[edi],0x21 cmp byte[edi],0x21
jne .noextblock jne .noextblock
inc edi inc edi
if defined gif_img_count
cmp byte[edi],0xf9 ; Graphic Control Ext cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc jne .no_gc
movzx eax,word [edi+3]
mov [.anim_delay],eax
mov al,[edi+2]
shr al,2
and eax,7
mov [.anim_disp],eax
add edi,7 add edi,7
jmp .nextblock jmp .nextblock
.no_gc: .no_gc:
cmp byte[edi],0xfe ; Comment Ext end if
jne .no_comm
inc edi inc edi
.block_skip: .block_skip:
movzx eax,byte[edi] movzx eax,byte[edi]
lea edi,[edi+eax+1] lea edi,[edi+eax+1]
cmp byte[edi],0 test eax,eax
jnz .block_skip jnz .block_skip
inc edi
jmp .nextblock jmp .nextblock
.no_comm:
cmp byte[edi],0xff ; Application Ext
jne .nextblock
add edi,13
jmp .block_skip
.noextblock: .noextblock:
mov al,8
cmp byte[edi],0x2c ; image beginning cmp byte[edi],0x2c ; image beginning
jne .er jne .ex
inc [.img_count] if defined gif_img_count
inc [gif_img_count]
end if
inc edi inc edi
mov esi,[.cur_info] mov esi,[.cur_info]
if defined gif_img_count
add esi,4 add esi,4
end if
xchg esi,edi xchg esi,edi
if defined GIF_SUPPORT_INTERLACED
movzx ecx,word[esi+4]
mov [.width],ecx
movzx eax,word[esi+6]
imul eax,ecx
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
mov [.img_end],eax
inc eax
mov [.row_end],eax
and [.pass],0
test byte[esi+8],40h
jz @f
if ~(COLOR_ORDER eq PALETTE)
lea ecx,[ecx*3]
end if
mov [.row_end],ecx
@@:
end if
if defined gif_img_count
movsd movsd
movsd movsd
mov eax,[.anim_delay]
stosd
mov eax,[.anim_disp]
stosd
else
movzx eax,word[esi+4]
stosd
movzx eax,word[esi+6]
stosd
add esi,8
end if
push edi push edi
movzx ecx,word[esi] mov ecx,[esi]
inc esi inc esi
bt ecx,7 test cl,cl
jc .uselocal js .uselocal
push [.globalColor] push [.globalColor]
mov edi,esi mov edi,esi
jmp .setPal jmp .setPal
@ -147,11 +222,12 @@ ReadGIF:
inc ecx inc ecx
mov [.codesize],ecx mov [.codesize],ecx
dec ecx dec ecx
if ~(COLOR_ORDER eq PALETTE)
pop [.Palette] pop [.Palette]
end if
lea esi,[edi+1] lea esi,[edi+1]
mov edi,[.table_ptr] mov edi,.gif_workarea
xor eax,eax xor eax,eax
cld
lodsb ; eax - block_count lodsb ; eax - block_count
add eax,esi add eax,esi
mov [.block_ofs],eax mov [.block_ofs],eax
@ -159,16 +235,40 @@ ReadGIF:
mov eax,1 mov eax,1
shl eax,cl shl eax,cl
mov [.CC],eax mov [.CC],eax
mov ecx,eax
inc eax inc eax
mov [.EOI],eax mov [.EOI],eax
lea ecx,[eax-1]
mov eax, _null shl 16 mov eax, _null shl 16
.filltable: .filltable:
stosd stosd
inc eax inc eax
loop .filltable loop .filltable
if COLOR_ORDER eq PALETTE
pop eax
pop edi pop edi
push edi
scasd
push esi
mov esi,eax
mov ecx,[.CC]
@@:
lodsd
dec esi
bswap eax
shr eax,8
stosd
loop @b
pop esi
pop eax
mov [eax],edi
else
pop edi
end if
if defined GIF_SUPPORT_INTERLACED
mov [.img_start],edi mov [.img_start],edi
add [.img_end],edi
add [.row_end],edi
end if
.reinit: .reinit:
mov edx,[.EOI] mov edx,[.EOI]
inc edx inc edx
@ -189,10 +289,7 @@ ReadGIF:
je .end je .end
call .Gif_output call .Gif_output
.add: .add:
push eax mov dword [.gif_workarea+edx*4],ebx
mov eax,[.table_ptr]
mov [eax+edx*4],ebx
pop eax
cmp edx,0xFFF cmp edx,0xFFF
jae .cycle jae .cycle
inc edx inc edx
@ -211,10 +308,11 @@ ReadGIF:
call .Gif_output call .Gif_output
pop ebx eax pop ebx eax
jmp .add jmp .add
.er:
pop edi
jmp .ex
.end: .end:
if defined GIF_SUPPORT_INTERLACED
mov edi,[.img_end]
end if
if defined gif_img_count
mov eax,[.cur_info] mov eax,[.cur_info]
mov [eax],edi mov [eax],edi
mov [.cur_info],edi mov [.cur_info],edi
@ -228,9 +326,10 @@ ReadGIF:
.continue: .continue:
cmp byte[edi],0x3b cmp byte[edi],0x3b
jne .nextblock jne .nextblock
xchg esi,edi
and dword [eax],0
end if
xor eax,eax xor eax,eax
stosd
mov ecx,[.img_count]
.ex: .ex:
pop edi esi pop edi esi
ret ret
@ -284,7 +383,7 @@ ReadGIF:
.Gif_output: .Gif_output:
push esi eax edx push esi eax edx
mov edx,[.table_ptr] mov edx,.gif_workarea
.next: .next:
push word[edx+eax*4] push word[edx+eax*4]
mov ax,word[edx+eax*4+2] mov ax,word[edx+eax*4+2]
@ -296,8 +395,11 @@ ReadGIF:
.loop2: .loop2:
pop ax pop ax
lea esi,[eax+eax*2] if COLOR_ORDER eq PALETTE
add esi,[.Palette] stosb
else
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS if COLOR_ORDER eq MENUETOS
mov esi,[esi] mov esi,[esi]
@ -306,23 +408,78 @@ ReadGIF:
mov [edi],esi mov [edi],esi
add edi,3 add edi,3
else else
movsw movsb
movsb
movsb movsb
end if end if
end if
if defined GIF_SUPPORT_INTERLACED
cmp edi,[.row_end]
jb .norowend
mov eax,[.width]
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
push eax
sub edi,eax
add eax,eax
cmp [.pass],3
jz @f
add eax,eax
cmp [.pass],2
jz @f
add eax,eax
@@:
add edi,eax
pop eax
cmp edi,[.img_end]
jb .nextrow
mov edi,[.img_start]
inc [.pass]
add edi,eax
cmp [.pass],3
jz @f
add edi,eax
cmp [.pass],2
jz @f
add edi,eax
add edi,eax
@@:
.nextrow:
add eax,edi
mov [.row_end],eax
xor eax,eax
.norowend:
end if
loop .loop2 loop .loop2
pop edx eax esi pop edx eax esi
ret ret
.globalColor rd 1 uglobal
.img_count rd 1 align 4
.cur_info rd 1 ; image table pointer ReadGIF.globalColor rd 1
.img_start rd 1 ReadGIF.cur_info rd 1 ; image table pointer
.codesize rd 1 ReadGIF.codesize rd 1
.compsize rd 1 ReadGIF.compsize rd 1
.bit_count rd 1 ReadGIF.bit_count rd 1
.CC rd 1 ReadGIF.CC rd 1
.EOI rd 1 ReadGIF.EOI rd 1
.Palette rd 1 if ~(COLOR_ORDER eq PALETTE)
.block_ofs rd 1 ReadGIF.Palette rd 1
.table_ptr rd 1 end if
ReadGIF.block_ofs rd 1
if defined GIF_SUPPORT_INTERLACED
ReadGIF.row_end rd 1
ReadGIF.img_end rd 1
ReadGIF.img_start rd 1
ReadGIF.pass rd 1
ReadGIF.width rd 1
end if
if defined gif_img_count
ReadGIF.anim_delay rd 1
ReadGIF.anim_disp rd 1
end if
ReadGIF.gif_workarea rb 16*1024
endg

View File

@ -40,7 +40,7 @@ START: ; start of execution
mov edi,strip_file mov edi,strip_file
mov eax,icon_data mov eax,icon_data
call ReadGIF call ReadGIF
movzx eax,word[strip_file+10] mov eax,dword[edi+4]
shr eax,5 shr eax,5
mov [icon_count],eax mov [icon_count],eax
call load_ic call load_ic
@ -727,7 +727,7 @@ draw_icon:
and eax,0xfffffff8 and eax,0xfffffff8
push eax push eax
imul eax,ICON_SIZE imul eax,ICON_SIZE
lea ebx,[strip_file+12+eax] lea ebx,[strip_file+8+eax]
mov ecx,8 mov ecx,8
mov edx,(33-18) shl 16+238 mov edx,(33-18) shl 16+238
.nxt: .nxt:
@ -1078,10 +1078,10 @@ draw_picture:
cmp eax,[icon_count] cmp eax,[icon_count]
ja toponly.ex ja toponly.ex
imul eax,(32*3*32) imul eax,(32*3*32)
lea edi,[eax+strip_file+12] lea edi,[eax+strip_file+8]
xor ebx,ebx xor ebx,ebx
xor ecx,ecx xor ecx,ecx
mov esi,edi;strip_file+12+(32*3*32)*2 mov esi,edi;strip_file+8+(32*3*32)*2
mov [pixpos],0 mov [pixpos],0
newb: newb:
@ -1377,4 +1377,6 @@ icon_count rd 1
gif_file rb GIF_SIZE gif_file rb GIF_SIZE
strip_file rb RAW_SIZE strip_file rb RAW_SIZE
IncludeUGlobals
I_END: I_END: