197 lines
3.4 KiB
Plaintext
197 lines
3.4 KiB
Plaintext
|
|
virtual at buffer
|
|
GIFHEADER:
|
|
.ID dd ?
|
|
.ver dw ?
|
|
.width dw ?
|
|
.height dw ?
|
|
.bits db ?
|
|
.background db ?
|
|
.reserved db ?
|
|
.length = $ - GIFHEADER
|
|
end virtual
|
|
|
|
load_picture:
|
|
|
|
invoke CreateFileA,esi,GENERIC_READ,0,0,OPEN_EXISTING,0,0
|
|
mov edi,eax
|
|
invoke ReadFile,edi,GIFHEADER,40000h,bytes_count,0
|
|
invoke CloseHandle,edi
|
|
|
|
cmp [GIFHEADER.ID],'GIF8'
|
|
jne picture_error
|
|
cmp [GIFHEADER.ver],'7a'
|
|
jne picture_error
|
|
|
|
mov al,[GIFHEADER.bits]
|
|
and al,10000111b
|
|
cmp al,10000111b
|
|
jne picture_error
|
|
|
|
add [bytes_count],buffer
|
|
|
|
mov esi,buffer+GIFHEADER.length+256*3
|
|
mov edi,esi
|
|
|
|
xor eax,eax
|
|
find_image:
|
|
cmp esi,[bytes_count]
|
|
jae picture_error
|
|
lodsb
|
|
cmp al,','
|
|
je image_found
|
|
cmp al,'!'
|
|
jne picture_error
|
|
inc esi
|
|
skip_application_data:
|
|
lodsb
|
|
add esi,eax
|
|
or al,al
|
|
jnz skip_application_data
|
|
jmp find_image
|
|
image_found:
|
|
add esi,4
|
|
xor eax,eax
|
|
lodsw
|
|
mov ebx,eax
|
|
lodsw
|
|
inc esi
|
|
cmp byte [esi],8
|
|
jne picture_error
|
|
inc esi
|
|
|
|
mov [ddsd.dwSize],sizeof.DDSURFACEDESC
|
|
mov [ddsd.dwFlags],DDSD_CAPS+DDSD_WIDTH+DDSD_HEIGHT+DDSD_CKSRCBLT
|
|
mov [ddsd.ddsCaps.dwCaps],DDSCAPS_OFFSCREENPLAIN+DDSCAPS_SYSTEMMEMORY
|
|
mov [ddsd.dwWidth],ebx
|
|
mov [ddsd.dwHeight],eax
|
|
movzx eax,[GIFHEADER.background]
|
|
mov [ddsd.ddckCKSrcBlt.dwColorSpaceLowValue],eax
|
|
mov [ddsd.ddckCKSrcBlt.dwColorSpaceHighValue],eax
|
|
cominvk DDraw,CreateSurface,\
|
|
ddsd,DDSPicture,0
|
|
or eax,eax
|
|
jnz picture_error
|
|
cominvk DDSPicture,Lock,\
|
|
0,ddsd,DDLOCK_WAIT,0
|
|
|
|
mov edi,[ddsd.lpSurface]
|
|
mov ebx,esi
|
|
movzx ebp,byte [ebx]
|
|
inc ebx
|
|
add ebp,ebx
|
|
mov [LZW_bits],0
|
|
LZW_clear:
|
|
xor edx,edx
|
|
LZW_decompress_loop:
|
|
mov ch,9
|
|
cmp edx,(100h-2)*8
|
|
jbe LZW_read_bits
|
|
mov ch,10
|
|
cmp edx,(300h-2)*8
|
|
jbe LZW_read_bits
|
|
mov ch,11
|
|
cmp edx,(700h-2)*8
|
|
jbe LZW_read_bits
|
|
mov ch,12
|
|
LZW_read_bits:
|
|
mov cl,8
|
|
sub cl,[LZW_bits]
|
|
LZW_byte_from_stream:
|
|
mov al,[ebx]
|
|
cmp ebx,ebp
|
|
jne LZW_bits_from_byte
|
|
movzx ebp,al
|
|
inc ebx
|
|
mov al,[ebx]
|
|
add ebp,ebx
|
|
LZW_bits_from_byte:
|
|
inc ebx
|
|
ror eax,8
|
|
sub cl,ch
|
|
jz LZW_bits_ready
|
|
ja LZW_bits_with_tail
|
|
add cl,ch
|
|
add cl,8
|
|
jmp LZW_byte_from_stream
|
|
LZW_bits_with_tail:
|
|
dec ebx
|
|
shl eax,cl
|
|
LZW_bits_ready:
|
|
neg cl
|
|
and cl,7
|
|
mov [LZW_bits],cl
|
|
mov cl,ch
|
|
rol eax,cl
|
|
and eax,0FFFh
|
|
cmp eax,100h
|
|
jb LZW_single_byte
|
|
je LZW_clear
|
|
sub eax,102h
|
|
jc LZW_end
|
|
shl eax,3
|
|
cmp eax,edx
|
|
ja picture_error
|
|
mov ecx,[LZW_table+eax]
|
|
mov esi,[LZW_table+eax+4]
|
|
mov [LZW_table+edx+4],edi
|
|
rep movsb
|
|
mov eax,[LZW_table+eax]
|
|
inc eax
|
|
mov [LZW_table+edx],eax
|
|
jmp LZW_decompress_next
|
|
LZW_single_byte:
|
|
mov [LZW_table+edx],2
|
|
mov [LZW_table+edx+4],edi
|
|
stosb
|
|
LZW_decompress_next:
|
|
add edx,8
|
|
jmp LZW_decompress_loop
|
|
LZW_end:
|
|
|
|
cominvk DDSPicture,Unlock,0
|
|
|
|
mov eax,[DDSPicture]
|
|
clc
|
|
ret
|
|
|
|
picture_error:
|
|
stc
|
|
ret
|
|
|
|
load_palette:
|
|
|
|
invoke CreateFileA,esi,GENERIC_READ,0,0,OPEN_EXISTING,0,0
|
|
mov edi,eax
|
|
invoke ReadFile,edi,buffer,GIFHEADER.length+256*3,bytes_count,0
|
|
cmp [bytes_count],GIFHEADER.length+256*3
|
|
jne picture_error
|
|
invoke CloseHandle,edi
|
|
|
|
cmp [GIFHEADER.ID],'GIF8'
|
|
jne picture_error
|
|
cmp [GIFHEADER.ver],'7a'
|
|
jne picture_error
|
|
mov al,[GIFHEADER.bits]
|
|
and al,111b
|
|
cmp al,111b
|
|
jne picture_error
|
|
|
|
mov esi,buffer+GIFHEADER.length
|
|
mov edi,buffer+400h
|
|
mov ecx,256
|
|
convert_palette:
|
|
movsw
|
|
movsb
|
|
xor al,al
|
|
stosb
|
|
loop convert_palette
|
|
|
|
cominvk DDraw,CreatePalette,\
|
|
DDPCAPS_8BIT+DDPCAPS_ALLOW256,buffer+400h,DDPalette,0
|
|
or eax,eax
|
|
jnz picture_error
|
|
|
|
clc
|
|
ret
|