bc5ea26ad2
git-svn-id: svn://kolibrios.org@7604 a494cfbc-eb01-0410-851d-a64ba20cac60
1436 lines
30 KiB
NASM
1436 lines
30 KiB
NASM
format binary as ""
|
|
|
|
use32
|
|
org 0x0
|
|
|
|
db 'MENUET01'
|
|
dd 0x01, START, I_END, F_END, stacktop, @PARAMS, sys_path
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
include '../../../config.inc'
|
|
include '../../../proc32.inc'
|
|
include '../../../macros.inc'
|
|
include '../../../dll.inc'
|
|
include '../../../KOSfuncs.inc'
|
|
;include '../../../debug.inc'
|
|
|
|
include '../../../develop/libraries/libs-dev/libio/libio.inc'
|
|
include '../../../develop/libraries/libs-dev/libimg/libimg.inc'
|
|
|
|
;include '../../../develop/libraries/box_lib/asm/trunk/opendial.mac'
|
|
;use_OpenDialog
|
|
;-----------------------------------------------------------------------------
|
|
|
|
START:
|
|
mcall SF_SYS_MISC, SSF_HEAP_INIT
|
|
|
|
stdcall dll.Load, @IMPORT
|
|
or eax, eax
|
|
jnz exit
|
|
|
|
invoke sort.START, 1
|
|
|
|
mov ecx, 1 ; for 15.4: 1 = tile
|
|
cmp word [@PARAMS], '\T'
|
|
jz set_bgr
|
|
inc ecx ; for 15.4: 2 = stretch
|
|
cmp word [@PARAMS], '\S'
|
|
jz set_bgr
|
|
|
|
cmp byte [@PARAMS], 0
|
|
jz @f
|
|
mov esi, @PARAMS
|
|
mov edi, path
|
|
mov ecx, 4096/4
|
|
rep movsd
|
|
mov byte [edi-1], 0
|
|
@@:
|
|
; OpenDialog initialisation
|
|
push dword OpenDialog_data
|
|
call [OpenDialog_Init]
|
|
|
|
; initialize keyboard handling
|
|
invoke ini_get_shortcut, inifilename, aShortcuts, aNext, -1, next_mod
|
|
mov [next_key], eax
|
|
invoke ini_get_shortcut, inifilename, aShortcuts, aPrev, -1, prev_mod
|
|
mov [prev_key], eax
|
|
invoke ini_get_shortcut, inifilename, aShortcuts, aSlide, -1, slide_mod
|
|
mov [slide_key], eax
|
|
invoke ini_get_shortcut, inifilename, aShortcuts, aTglbar, -1, tglbar_mod
|
|
mov [tglbar_key], eax
|
|
mcall SF_KEYBOARD, SSF_SET_INPUT_MODE, 1 ; set kbd mode to scancodes
|
|
|
|
cmp byte [@PARAMS], 0
|
|
jnz params_given
|
|
|
|
mov [OpenDialog_data.draw_window],draw_window_fake
|
|
|
|
; OpenDialog Open
|
|
push dword OpenDialog_data
|
|
call [OpenDialog_Start]
|
|
|
|
cmp [OpenDialog_data.status],1
|
|
jne exit
|
|
|
|
mov [OpenDialog_data.draw_window],draw_window
|
|
|
|
mov esi, path
|
|
mov edi, @PARAMS
|
|
mov ecx, 4096/4
|
|
rep movsd
|
|
mov byte [edi-1], 0
|
|
jmp params_given
|
|
|
|
set_bgr:
|
|
mcall SF_BACKGROUND_SET, SSF_MODE_BG
|
|
mov eax, @PARAMS + 4
|
|
call load_image
|
|
jc exit
|
|
|
|
call set_as_bgr
|
|
jmp exit
|
|
|
|
params_given:
|
|
|
|
mov esi, @PARAMS
|
|
push esi
|
|
call find_last_name_component
|
|
|
|
pop eax
|
|
call load_image
|
|
jc exit
|
|
call generate_header
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
red:
|
|
call draw_window
|
|
|
|
still:
|
|
mov eax, [image]
|
|
test byte [eax + Image.Flags], Image.IsAnimated
|
|
push SF_WAIT_EVENT
|
|
pop eax
|
|
jz @f
|
|
mcall SF_SYSTEM_GET, SSF_TIME_COUNT
|
|
mov edx, [cur_frame]
|
|
mov ebx, [cur_frame_time]
|
|
add ebx, [edx + Image.Delay]
|
|
sub ebx, eax
|
|
cmp ebx, [edx + Image.Delay]
|
|
ja red_update_frame
|
|
test ebx, ebx
|
|
jz red_update_frame
|
|
push SF_WAIT_EVENT_TIMEOUT
|
|
pop eax
|
|
@@:
|
|
mcall
|
|
dec eax
|
|
js red_update_frame
|
|
jz red
|
|
dec eax
|
|
jnz button
|
|
|
|
key:
|
|
xor esi, esi
|
|
keyloop:
|
|
mcall SF_GET_KEY
|
|
test al, al
|
|
jnz keyloopdone
|
|
shr eax, 8
|
|
mov ecx, eax
|
|
mcall SF_KEYBOARD, SSF_GET_CONTROL_KEYS
|
|
mov edx, next_mod
|
|
call check_shortcut
|
|
jz .next
|
|
add edx, prev_mod - next_mod
|
|
call check_shortcut
|
|
jz .prev
|
|
add edx, slide_mod - prev_mod
|
|
call check_shortcut
|
|
jz .slide
|
|
add edx, tglbar_mod - slide_mod
|
|
call check_shortcut
|
|
jz .tglbar
|
|
cmp cl, 1 ; Esc
|
|
jz .esc
|
|
jmp keyloop
|
|
.esc:
|
|
test byte [bSlideShow], 1
|
|
jnz .slide
|
|
jmp keyloop
|
|
.tglbar:
|
|
mov byte [bTglbar], 1
|
|
test byte[bSlideShow], 1
|
|
jnz @f
|
|
xor [toolbar_height], 31
|
|
@@:
|
|
jmp keyloop
|
|
.slide:
|
|
call slide_show
|
|
jmp keyloop
|
|
.prev:
|
|
dec esi
|
|
jmp keyloop
|
|
.next:
|
|
inc esi
|
|
jmp keyloop
|
|
keyloopdone:
|
|
test esi, esi
|
|
jnz next_or_prev_handler
|
|
test byte [bSlideShow], 2
|
|
jnz red
|
|
test byte [bTglbar], 1
|
|
jnz red
|
|
jmp still
|
|
next_or_prev_handler:
|
|
call next_or_prev_image
|
|
jmp red
|
|
|
|
red_update_frame:
|
|
mov eax, [cur_frame]
|
|
mov eax, [eax + Image.Next]
|
|
test eax, eax
|
|
jnz @f
|
|
mov eax, [image]
|
|
@@:
|
|
mov [cur_frame], eax
|
|
mcall SF_SYSTEM_GET, SSF_TIME_COUNT
|
|
mov [cur_frame_time], eax
|
|
mcall SF_THREAD_INFO, procinfo, -1
|
|
call draw_cur_frame
|
|
jmp still
|
|
|
|
button:
|
|
mcall SF_GET_BUTTON
|
|
shr eax, 8
|
|
|
|
; flip horizontally
|
|
cmp eax, 'flh'
|
|
jne @f
|
|
|
|
invoke img.flip, [image], FLIP_HORIZONTAL
|
|
jmp redraw_image
|
|
|
|
; flip vertically
|
|
@@: cmp eax, 'flv'
|
|
jne @f
|
|
|
|
invoke img.flip, [image], FLIP_VERTICAL
|
|
jmp redraw_image
|
|
|
|
; flip both horizontally and vertically
|
|
@@: cmp eax, 'flb'
|
|
jne @f
|
|
|
|
invoke img.flip, [image], FLIP_BOTH
|
|
jmp redraw_image
|
|
|
|
; rotate left
|
|
@@: cmp eax, 'rtl'
|
|
jne @f
|
|
|
|
push ROTATE_90_CCW
|
|
.rotate_common:
|
|
invoke img.rotate, [image]
|
|
mov eax, [image]
|
|
test eax, eax ; clear ZF flag
|
|
call update_image_sizes
|
|
jmp redraw_image
|
|
|
|
; rotate right
|
|
@@: cmp eax, 'rtr'
|
|
jne @f
|
|
|
|
push ROTATE_90_CW
|
|
jmp .rotate_common
|
|
|
|
; open new file
|
|
@@: cmp eax, 'opn'
|
|
jne @f
|
|
|
|
; OpenDialog Open
|
|
push dword OpenDialog_data
|
|
call [OpenDialog_Start]
|
|
|
|
cmp [OpenDialog_data.status],1
|
|
jne still
|
|
|
|
mov esi, path
|
|
mov edi, @PARAMS
|
|
push edi
|
|
mov ecx, 4096/4
|
|
rep movsd
|
|
mov byte [edi-1], 0
|
|
|
|
pop esi
|
|
push esi
|
|
call find_last_name_component
|
|
|
|
pop eax
|
|
push [image]
|
|
call load_image
|
|
jc .restore_old
|
|
call generate_header
|
|
|
|
invoke img.destroy
|
|
call free_directory
|
|
jmp red
|
|
|
|
.restore_old:
|
|
pop [image]
|
|
call init_frame
|
|
jmp still
|
|
|
|
; set background
|
|
@@:
|
|
cmp eax, 'bgr'
|
|
jne @f
|
|
|
|
mcall SF_BACKGROUND_SET, SSF_MODE_BG, 2 ;stretch by default
|
|
call set_as_bgr
|
|
jmp still
|
|
|
|
@@:
|
|
cmp eax, 'sld'
|
|
jne @f
|
|
|
|
call slide_show
|
|
jmp red
|
|
|
|
@@:
|
|
|
|
or esi, -1
|
|
cmp eax, 'bck'
|
|
jz next_or_prev_handler
|
|
neg esi
|
|
cmp eax, 'fwd'
|
|
jz next_or_prev_handler
|
|
|
|
cmp eax, 1
|
|
jne still
|
|
|
|
exit:
|
|
mcall SF_TERMINATE_PROCESS
|
|
|
|
redraw_image = red
|
|
|
|
load_image:
|
|
and [img_data], 0
|
|
push eax
|
|
invoke file.open, eax, O_READ
|
|
or eax, eax
|
|
jz .error_pop
|
|
mov [fh], eax
|
|
invoke file.size
|
|
mov [img_data_len], ebx
|
|
stdcall mem.Alloc, ebx
|
|
test eax, eax
|
|
jz .error_close
|
|
mov [img_data], eax
|
|
invoke file.read, [fh], eax, [img_data_len]
|
|
cmp eax, -1
|
|
jz .error_close
|
|
cmp eax, [img_data_len]
|
|
jnz .error_close
|
|
invoke file.close, [fh]
|
|
inc eax
|
|
jz .error
|
|
|
|
invoke img.decode, [img_data], [img_data_len], 0
|
|
or eax, eax
|
|
jz .error
|
|
cmp [image], 0
|
|
pushf
|
|
mov [image], eax
|
|
call img_resize_to_screen
|
|
call init_frame
|
|
popf
|
|
call update_image_sizes
|
|
call free_img_data
|
|
clc
|
|
ret
|
|
|
|
.error_free:
|
|
invoke img.destroy, [image]
|
|
jmp .error
|
|
|
|
.error_pop:
|
|
pop eax
|
|
jmp .error
|
|
.error_close:
|
|
invoke file.close, [fh]
|
|
.error:
|
|
call free_img_data
|
|
stc
|
|
ret
|
|
|
|
align 4
|
|
proc img_resize_to_screen uses eax ebx ecx edx
|
|
mov ebx, [image]
|
|
cmp [ebx+Image.Type],Image.bpp24
|
|
jne .end_f
|
|
test [ebx+Image.Flags],Image.IsAnimated
|
|
jnz .end_f
|
|
mov eax, [ebx+Image.Data]
|
|
mov [buf_0],eax
|
|
mov eax, [ebx+Image.Width]
|
|
mov [buf_0.w],eax
|
|
mov eax, [ebx+Image.Height]
|
|
mov [buf_0.h],eax
|
|
|
|
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
|
mov edx, [image_padding]
|
|
shl edx, 1
|
|
add edx, eax
|
|
mcall SF_GET_SCREEN_SIZE
|
|
mov ecx, eax
|
|
shr ecx, 17
|
|
|
|
mov ebx, [image]
|
|
movzx eax,ax
|
|
sub eax, edx
|
|
sub eax, [toolbar_height]
|
|
sub eax, 5-1 ;5 px = border
|
|
cmp eax, 1
|
|
jle .end0
|
|
cmp eax, [ebx+Image.Height]
|
|
jl .end1
|
|
.end0:
|
|
xor eax,eax
|
|
jmp .end2
|
|
.end1:
|
|
mov [ebx+Image.Height],eax
|
|
.end2:
|
|
sub ecx, [image_padding]
|
|
shl ecx, 1
|
|
sub ecx, 10-1 ;10 px = 2 borders
|
|
cmp ecx, 1
|
|
jle .end3
|
|
cmp ecx, [ebx+Image.Width]
|
|
jl .end4
|
|
.end3:
|
|
xor ecx,ecx
|
|
jmp .end5
|
|
.end4:
|
|
mov [ebx+Image.Width],ecx
|
|
.end5:
|
|
cmp eax,ecx
|
|
jne @f
|
|
test eax,eax
|
|
jz .end_f
|
|
@@:
|
|
stdcall [buf2d_resize], buf_0, ecx, eax, 2
|
|
.end_f:
|
|
ret
|
|
endp
|
|
|
|
align 4
|
|
free_img_data:
|
|
mov eax, [img_data]
|
|
test eax, eax
|
|
jz @f
|
|
stdcall mem.Free, eax
|
|
@@:
|
|
ret
|
|
|
|
update_image_sizes:
|
|
pushf
|
|
mov edx, [eax + Image.Width]
|
|
test [eax + Image.Flags], Image.IsAnimated
|
|
jnz .not_in_row
|
|
push eax
|
|
@@: cmp [eax + Image.Next], 0
|
|
jz @f
|
|
mov eax, [eax + Image.Next]
|
|
add edx, [eax + Image.Width]
|
|
inc edx
|
|
jmp @b
|
|
@@: pop eax
|
|
.not_in_row:
|
|
mov [draw_width], edx
|
|
add edx, 19
|
|
cmp edx, 50 + 25*numimages
|
|
jae @f
|
|
mov edx, 50 + 25*numimages
|
|
@@:
|
|
; dec edx
|
|
mov [wnd_width], edx
|
|
mov esi, [eax + Image.Height]
|
|
test [eax + Image.Flags], Image.IsAnimated
|
|
jnz .max_equals_first
|
|
push eax
|
|
@@: cmp [eax + Image.Next], 0
|
|
jz @f
|
|
mov eax, [eax + Image.Next]
|
|
cmp esi, [eax + Image.Height]
|
|
jae @b
|
|
mov esi, [eax + Image.Height]
|
|
jmp @b
|
|
@@: pop eax
|
|
.max_equals_first:
|
|
mov [draw_height], esi
|
|
add esi, [toolbar_height]
|
|
add esi, [image_padding]
|
|
add esi, [image_padding]
|
|
add esi, 5 ; window bottom frame height
|
|
dec esi
|
|
mov [wnd_height], esi
|
|
popf
|
|
jz .no_resize
|
|
test [wnd_style], 1 SHL 25
|
|
jz .no_resize
|
|
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
|
add esi, eax
|
|
mcall SF_CHANGE_WINDOW,-1,-1
|
|
.no_resize:
|
|
ret
|
|
|
|
set_as_bgr:
|
|
mov esi, [image]
|
|
mov ecx, [esi + Image.Width]
|
|
mov edx, [esi + Image.Height]
|
|
mcall SF_BACKGROUND_SET, SSF_SIZE_BG
|
|
|
|
mcall SF_BACKGROUND_SET, SSF_MAP_BG
|
|
test eax, eax
|
|
jz @f
|
|
|
|
push eax
|
|
invoke img.to_rgb2, esi, eax
|
|
pop ecx
|
|
mcall SF_BACKGROUND_SET, SSF_UNMAP_BG
|
|
|
|
@@:
|
|
mcall SF_BACKGROUND_SET, SSF_REDRAW_BG
|
|
|
|
;save to file eskin.ini
|
|
xor al,al
|
|
mov ecx,1024
|
|
mov edi,sys_path+2
|
|
repne scasb
|
|
sub edi,sys_path+3
|
|
invoke ini_set_str, inifileeskin, amain, aprogram, sys_path+2, edi
|
|
;add param '\S__'
|
|
cmp word[@PARAMS],'\T'
|
|
je @f
|
|
cmp word[@PARAMS],'\S'
|
|
je @f
|
|
mov esi, @PARAMS+4096-8
|
|
mov edi, @PARAMS+4096-4
|
|
mov ecx, 4096/4-1
|
|
std
|
|
rep movsd
|
|
cld
|
|
mov dword[@PARAMS],'\S__'
|
|
@@:
|
|
;
|
|
xor al,al
|
|
mov ecx,4096
|
|
mov edi,@PARAMS
|
|
repne scasb
|
|
sub edi,@PARAMS+1
|
|
invoke ini_set_str, inifileeskin, amain, aparam, @PARAMS, edi
|
|
ret
|
|
|
|
slide_show:
|
|
or byte [bSlideShow], 2
|
|
xor byte [bSlideShow], 1
|
|
btc dword [wnd_style], 25
|
|
jc @f
|
|
mov eax, [toolbar_height_old]
|
|
mov [toolbar_height], eax
|
|
mov [image_padding], 5
|
|
jmp .toolbar_height_done
|
|
@@:
|
|
mov eax, [toolbar_height]
|
|
mov [toolbar_height_old], eax
|
|
mov [toolbar_height], 0
|
|
mov [image_padding], 0
|
|
.toolbar_height_done:
|
|
ret
|
|
|
|
; seek to ESI image files
|
|
; esi>0 means next file, esi<0 - prev file
|
|
next_or_prev_image:
|
|
push esi
|
|
call load_directory
|
|
pop esi
|
|
mov ebx, [directory_ptr]
|
|
test ebx, ebx
|
|
jz .ret
|
|
cmp dword[ebx+4], 0
|
|
jz .ret
|
|
mov eax, [cur_file_idx]
|
|
cmp eax, -1
|
|
jnz @f
|
|
test esi, esi
|
|
jns @f
|
|
mov eax, [ebx+4]
|
|
@@:
|
|
push [image]
|
|
add eax, esi
|
|
@@:
|
|
test eax, eax
|
|
jns @f
|
|
add eax, [ebx+4]
|
|
jmp @b
|
|
@@:
|
|
cmp eax, [ebx+4]
|
|
jb @f
|
|
sub eax, [ebx+4]
|
|
jmp @b
|
|
@@:
|
|
push eax
|
|
.scanloop:
|
|
push eax ebx esi
|
|
imul esi, eax, 304
|
|
add esi, [directory_ptr]
|
|
add esi, 32 + 40
|
|
mov edi, curdir
|
|
@@:
|
|
inc edi
|
|
cmp byte [edi-1], 0
|
|
jnz @b
|
|
mov byte [edi-1], '/'
|
|
@@:
|
|
lodsb
|
|
stosb
|
|
test al, al
|
|
jnz @b
|
|
mov eax, curdir
|
|
call load_image
|
|
pushf
|
|
mov esi, curdir
|
|
push esi
|
|
mov edi, @PARAMS
|
|
mov ecx, 4096/4
|
|
rep movsd
|
|
mov byte [edi-1], 0
|
|
pop esi
|
|
@@:
|
|
lodsb
|
|
test al, al
|
|
jnz @b
|
|
@@:
|
|
dec esi
|
|
cmp byte [esi], '/'
|
|
jnz @b
|
|
mov byte [esi], 0
|
|
popf
|
|
pop esi ebx eax
|
|
jnc .loadedok
|
|
test esi, esi
|
|
js .try_prev
|
|
.try_next:
|
|
inc eax
|
|
cmp eax, [ebx+4]
|
|
jb @f
|
|
xor eax, eax
|
|
@@:
|
|
.try_common:
|
|
cmp eax, [esp]
|
|
jz .notfound
|
|
jmp .scanloop
|
|
.try_prev:
|
|
dec eax
|
|
jns @f
|
|
mov eax, [ebx+4]
|
|
dec eax
|
|
@@:
|
|
jmp .try_common
|
|
.loadedok:
|
|
mov [cur_file_idx], eax
|
|
pop eax
|
|
invoke img.destroy
|
|
call generate_header
|
|
.ret:
|
|
ret
|
|
.notfound:
|
|
pop eax
|
|
pop [image]
|
|
call init_frame
|
|
ret
|
|
|
|
load_directory:
|
|
cmp [directory_ptr], 0
|
|
jnz .ret
|
|
mov esi, @PARAMS
|
|
mov edi, curdir
|
|
mov ecx, [last_name_component]
|
|
sub ecx, esi
|
|
dec ecx
|
|
js @f
|
|
rep movsb
|
|
@@:
|
|
mov byte [edi], 0
|
|
mcall SF_SYS_MISC, SSF_MEM_ALLOC, 0x1000
|
|
test eax, eax
|
|
jz .ret
|
|
mov ebx, readdir_fileinfo
|
|
mov dword [ebx+12], (0x1000 - 32) / 304
|
|
mov dword [ebx+16], eax
|
|
mcall SF_FILE
|
|
cmp eax, 6
|
|
jz .dirok
|
|
test eax, eax
|
|
jnz free_directory
|
|
mov edx, [directory_ptr]
|
|
mov ecx, [edx+8]
|
|
mov [readblocks], ecx
|
|
imul ecx, 304
|
|
add ecx, 32
|
|
mcall SF_SYS_MISC, SSF_MEM_REALLOC
|
|
test eax, eax
|
|
jz free_directory
|
|
mov [directory_ptr], eax
|
|
mcall SF_FILE, readdir_fileinfo
|
|
.dirok:
|
|
cmp ebx, 0
|
|
jle free_directory
|
|
mov eax, [directory_ptr]
|
|
add eax, 32
|
|
mov edi, eax
|
|
push 0
|
|
.dirskip:
|
|
push eax
|
|
test byte [eax], 18h
|
|
jnz .nocopy
|
|
lea esi, [eax+40]
|
|
mov ecx, esi
|
|
@@:
|
|
lodsb
|
|
test al, al
|
|
jnz @b
|
|
@@:
|
|
dec esi
|
|
cmp esi, ecx
|
|
jb .noext
|
|
cmp byte [esi], '.'
|
|
jnz @b
|
|
inc esi
|
|
mov ecx, [esi]
|
|
cmp byte[esi+3], 0
|
|
jne .not_3
|
|
or ecx, 0x202020
|
|
cmp ecx, 'jpg'
|
|
jz .copy
|
|
cmp ecx, 'bmp'
|
|
jz .copy
|
|
cmp ecx, 'gif'
|
|
jz .copy
|
|
cmp ecx, 'png'
|
|
jz .copy
|
|
cmp ecx, 'jpe'
|
|
jz .copy
|
|
cmp ecx, 'ico'
|
|
jz .copy
|
|
cmp ecx, 'cur'
|
|
jz .copy
|
|
cmp ecx, 'tga'
|
|
jz .copy
|
|
cmp ecx, 'pcx'
|
|
jz .copy
|
|
cmp ecx, 'xcf'
|
|
jz .copy
|
|
cmp ecx, 'pbm'
|
|
jz .copy
|
|
cmp ecx, 'pgm'
|
|
jz .copy
|
|
cmp ecx, 'pnm'
|
|
jz .copy
|
|
cmp ecx, 'tif'
|
|
jz .copy
|
|
.not_3:
|
|
cmp byte[esi+4], 0
|
|
jne .nocopy
|
|
or ecx, 0x20202020
|
|
cmp ecx, 'tiff'
|
|
jz @f
|
|
cmp ecx, 'wbmp'
|
|
jz @f
|
|
cmp ecx, 'jpeg'
|
|
jnz .nocopy
|
|
@@:
|
|
cmp byte [esi+4], 0
|
|
jnz .nocopy
|
|
.copy:
|
|
mov esi, [esp]
|
|
mov ecx, 304 / 4
|
|
rep movsd
|
|
inc dword [esp+4]
|
|
.nocopy:
|
|
.noext:
|
|
pop eax
|
|
add eax, 304
|
|
dec ebx
|
|
jnz .dirskip
|
|
mov eax, [directory_ptr]
|
|
pop ebx
|
|
mov [eax+4], ebx
|
|
test ebx, ebx
|
|
jz free_directory
|
|
push 0 ; sort mode
|
|
push ebx
|
|
add eax, 32
|
|
push eax
|
|
call [SortDir]
|
|
xor eax, eax
|
|
mov edi, [directory_ptr]
|
|
add edi, 32 + 40
|
|
.scan:
|
|
mov esi, [last_name_component]
|
|
push edi
|
|
invoke strcmpi
|
|
pop edi
|
|
jz .found
|
|
inc eax
|
|
add edi, 304
|
|
dec ebx
|
|
jnz .scan
|
|
or eax, -1
|
|
.found:
|
|
mov [cur_file_idx], eax
|
|
.ret:
|
|
ret
|
|
|
|
free_directory:
|
|
mcall SF_SYS_MISC, SSF_MEM_FREE, [directory_ptr]
|
|
and [directory_ptr], 0
|
|
ret
|
|
|
|
; in: esi->full name (e.g. /path/to/file.png)
|
|
; out: [last_name_component]->last component (e.g. file.png)
|
|
find_last_name_component:
|
|
mov ecx, esi
|
|
@@:
|
|
lodsb
|
|
test al, al
|
|
jnz @b
|
|
@@:
|
|
dec esi
|
|
cmp esi, ecx
|
|
jb @f
|
|
cmp byte [esi], '/'
|
|
jnz @b
|
|
@@:
|
|
inc esi
|
|
mov [last_name_component], esi
|
|
ret
|
|
|
|
init_frame:
|
|
push eax
|
|
mov eax, [image]
|
|
mov [cur_frame], eax
|
|
test byte [eax + Image.Flags], Image.IsAnimated
|
|
jz @f
|
|
push ebx
|
|
mcall SF_SYSTEM_GET, SSF_TIME_COUNT
|
|
pop ebx
|
|
mov [cur_frame_time], eax
|
|
@@:
|
|
pop eax
|
|
ret
|
|
|
|
draw_window:
|
|
btr word [bSlideShow], 1 ; mode changed
|
|
jc .mode_changed
|
|
test byte [bTglbar], 1
|
|
jz .mode_not_changed
|
|
.mode_changed:
|
|
test [wnd_style], 1 SHL 25
|
|
jz .mode_slide
|
|
mov [bg_color], 0x00ffffff
|
|
mov eax, [image]
|
|
cmp eax, eax
|
|
call update_image_sizes
|
|
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
|
mov esi, [wnd_height]
|
|
add esi, eax
|
|
test byte [bTglbar], 1
|
|
jz @f
|
|
mcall SF_CHANGE_WINDOW, -1, -1, [wnd_width],
|
|
jmp .mode_not_changed
|
|
@@:
|
|
mcall SF_CHANGE_WINDOW, [wnd_x], [wnd_y], [wnd_width],
|
|
jmp .mode_not_changed
|
|
.mode_slide:
|
|
mov [bg_color], 0x00000000
|
|
mov eax, [procinfo.box.left]
|
|
mov [wnd_x], eax
|
|
mov eax, [procinfo.box.top]
|
|
mov [wnd_y], eax
|
|
mcall SF_GET_SCREEN_SIZE
|
|
mov edx, eax
|
|
shr edx, 16
|
|
movzx eax, ax
|
|
mov esi, eax
|
|
mcall SF_CHANGE_WINDOW, 0, 0, ,
|
|
jmp .posok.slide_show
|
|
|
|
.mode_not_changed:
|
|
cmp [bFirstDraw], 0
|
|
jz .posok
|
|
or ecx, -1
|
|
mcall SF_THREAD_INFO, procinfo
|
|
|
|
test byte [procinfo.wnd_state], 0x04
|
|
jnz .posok
|
|
|
|
mov edx, ecx
|
|
mov esi, ecx
|
|
cmp dword [procinfo.box.width], 50 + 25 * numimages
|
|
jae @f
|
|
mov edx, 50 + 25 * numimages
|
|
@@:
|
|
cmp dword [procinfo.box.height], 70
|
|
jae @f
|
|
mov esi, 70
|
|
@@:
|
|
mov eax, edx
|
|
and eax, esi
|
|
cmp eax, -1
|
|
jz @f
|
|
mov ebx, ecx
|
|
mcall SF_CHANGE_WINDOW
|
|
@@:
|
|
|
|
.posok:
|
|
test [wnd_style], 1 SHL 25
|
|
jz .posok.slide_show
|
|
mcall SF_REDRAW, SSF_BEGIN_DRAW
|
|
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
|
mov ebp, eax ; save skin height
|
|
add eax, [wnd_height]
|
|
mov ebx, [wnd_x]
|
|
shl ebx, 16
|
|
add ebx, [wnd_width]
|
|
mov ecx, [wnd_y]
|
|
shl ecx, 16
|
|
add ecx, eax
|
|
mcall SF_CREATE_WINDOW, , , [wnd_style], 0, real_header
|
|
jmp .posok.common
|
|
.posok.slide_show:
|
|
mcall SF_REDRAW, SSF_BEGIN_DRAW
|
|
mcall SF_GET_SCREEN_SIZE
|
|
mov ebx, eax
|
|
shr ebx, 16
|
|
movzx eax, ax
|
|
mov ecx, eax
|
|
mcall SF_CREATE_WINDOW, , , [wnd_style], 0, real_header
|
|
.posok.common:
|
|
mcall SF_THREAD_INFO, procinfo, -1
|
|
mov eax, [procinfo.client_box.width]
|
|
sub eax, [image_padding]
|
|
sub eax, [image_padding]
|
|
sub eax, [draw_width]
|
|
sar eax, 1
|
|
test eax, eax
|
|
jns @f
|
|
mov eax, 0
|
|
@@:
|
|
add eax, [image_padding]
|
|
mov [draw_x], eax
|
|
mov eax, [procinfo.client_box.height]
|
|
sub eax, [toolbar_height]
|
|
sub eax, [image_padding]
|
|
sub eax, [image_padding]
|
|
sub eax, [draw_height]
|
|
sar eax, 1
|
|
test eax, eax
|
|
jns @f
|
|
mov eax, 0
|
|
@@:
|
|
add eax, [toolbar_height]
|
|
add eax, [image_padding]
|
|
mov [draw_y], eax
|
|
mov [bFirstDraw], 1
|
|
cmp dword [procinfo.client_box.height], 0
|
|
jle .nodraw
|
|
mov ebx, [procinfo.client_box.width]
|
|
inc ebx
|
|
mov ecx, [draw_y]
|
|
mcall SF_DRAW_RECT, , , [bg_color]
|
|
mov ecx, [procinfo.client_box.height]
|
|
inc ecx
|
|
mov esi, [cur_frame]
|
|
mov esi, [esi + Image.Height]
|
|
add esi, [draw_y]
|
|
sub ecx, esi
|
|
jbe @f
|
|
push esi
|
|
shl esi, 16
|
|
add ecx, esi
|
|
pop esi
|
|
mcall
|
|
xor ecx, ecx
|
|
@@:
|
|
add ecx, esi
|
|
mov ebx, [draw_y]
|
|
sub ecx, ebx
|
|
shl ebx, 16
|
|
add ecx, ebx
|
|
mov ebx, [draw_x]
|
|
mcall
|
|
mov esi, [cur_frame]
|
|
mov esi, [esi + Image.Width]
|
|
add esi, ebx
|
|
mov ebx, [procinfo.client_box.width]
|
|
inc ebx
|
|
sub ebx, esi
|
|
jbe @f
|
|
shl esi, 16
|
|
add ebx, esi
|
|
mcall
|
|
@@:
|
|
|
|
test [wnd_style], 1 SHL 25
|
|
jz .slide_show_mode
|
|
mov byte [bTglbar], 0
|
|
cmp byte [toolbar_height], 0
|
|
je .decorations_done
|
|
mov ebx, [procinfo.client_box.width]
|
|
push ebx
|
|
mcall SF_DRAW_LINE, , <30, 30>, 0x007F7F7F
|
|
mcall , <5 + 25 * 1, 5 + 25 * 1>, <0, 30>
|
|
mcall , <10 + 25 * 3, 10 + 25 * 3>
|
|
mcall , <15 + 25 * 5, 15 + 25 * 5>
|
|
pop ebx
|
|
sub ebx, 25 * 5 + 10
|
|
push ebx
|
|
imul ebx, 10001h
|
|
mcall
|
|
|
|
mcall SF_DEFINE_BUTTON, <5 + 25 * 0, 20>, <5, 20>, 'opn'+40000000h
|
|
mcall , <10 + 25 * 1, 20>, , 'bck'+40000000h
|
|
mcall , <10 + 25 * 2, 20>, , 'fwd'+40000000h
|
|
mcall , <15 + 25 * 3, 20>, , 'bgr'+40000000h
|
|
mcall , <15 + 25 * 4, 20>, , 'sld'+40000000h
|
|
pop ebx
|
|
add ebx, 5
|
|
shl ebx, 16
|
|
mov bl, 20
|
|
mcall , , , 'flh'+40000000h
|
|
add ebx, 25 * 65536
|
|
mcall , , , 'flv'+40000000h
|
|
add ebx, 30 * 65536
|
|
mcall , , , 'rtr'+40000000h
|
|
add ebx, 25 * 65536
|
|
mcall , , , 'rtl'+40000000h
|
|
add ebx, 25 * 65536
|
|
mcall , , , 'flb'+40000000h
|
|
|
|
mov ebp, (numimages-1)*20
|
|
|
|
mcall SF_PUT_IMAGE_EXT, buttons+openbtn*20, <20, 20>, <5 + 25 * 0, 5>, 8, palette
|
|
mcall , buttons+backbtn*20, , <10 + 25 * 1, 5>
|
|
mcall , buttons+forwardbtn*20, , <10 + 25 * 2, 5>
|
|
mcall , buttons+bgrbtn*20, , <15 + 25 * 3, 5>
|
|
mcall , buttons+slidebtn*20, , <15 + 25 * 4, 5>
|
|
mov edx, [procinfo.client_box.width]
|
|
sub edx, 25 * 5 + 4
|
|
shl edx, 16
|
|
mov dl, 5
|
|
mcall , buttons+fliphorzbtn*20
|
|
add edx, 25 * 65536
|
|
mcall , buttons+flipvertbtn*20
|
|
add edx, 30 * 65536
|
|
mcall , buttons+rotcwbtn*20
|
|
add edx, 25 * 65536
|
|
mcall , buttons+rotccwbtn*20
|
|
add edx, 25 * 65536
|
|
mcall , buttons+rot180btn*20
|
|
jmp .decorations_done
|
|
|
|
.slide_show_mode:
|
|
|
|
.decorations_done:
|
|
call draw_cur_frame
|
|
|
|
.nodraw:
|
|
mcall SF_REDRAW, SSF_END_DRAW
|
|
|
|
ret
|
|
|
|
draw_cur_frame:
|
|
push 0 ; ypos
|
|
push 0 ; xpos
|
|
mov eax, [procinfo.client_box.height]
|
|
sub eax, [toolbar_height]
|
|
sub eax, [image_padding]
|
|
inc eax
|
|
push eax ; max height
|
|
mov eax, [procinfo.client_box.width]
|
|
sub eax, [image_padding]
|
|
inc eax
|
|
push eax ; max width
|
|
push [draw_y]
|
|
push [draw_x]
|
|
push [cur_frame]
|
|
call [img.draw]
|
|
mov eax, [image]
|
|
test [eax + Image.Flags], Image.IsAnimated
|
|
jnz .done
|
|
cmp [eax + Image.Next], 0
|
|
jnz .additional_frames
|
|
.done:
|
|
ret
|
|
.additional_frames:
|
|
mov ebx, [procinfo.client_box.width]
|
|
sub ebx, [image_padding]
|
|
inc ebx
|
|
jbe .done
|
|
mov esi, [draw_x]
|
|
.afloop:
|
|
sub ebx, [eax + Image.Width]
|
|
jbe .done
|
|
dec ebx
|
|
jz .done
|
|
add esi, [eax + Image.Width]
|
|
mov eax, [eax + Image.Next]
|
|
push eax
|
|
inc esi
|
|
push 0 ; ypos
|
|
push 0 ; xpos
|
|
mov ecx, [procinfo.client_box.height]
|
|
sub ecx, [toolbar_height]
|
|
sub ecx, [image_padding]
|
|
inc ecx
|
|
; inc ebx
|
|
push ecx ; max height
|
|
push ebx ; max width
|
|
push [draw_y] ; y
|
|
push esi ; x
|
|
push eax ; image
|
|
call [img.draw]
|
|
pop eax
|
|
cmp [eax + Image.Next], 0
|
|
jnz .afloop
|
|
ret
|
|
|
|
|
|
check_shortcut:
|
|
; in: cl = scancode (from sysfn 2),
|
|
; eax = state of modifiers (from sysfn 66.3),
|
|
; edx -> shortcut descriptor
|
|
; out: ZF set <=> fail
|
|
cmp cl, [edx+4]
|
|
jnz .not
|
|
push eax
|
|
mov esi, [edx]
|
|
and esi, 0xF
|
|
and al, 3
|
|
call dword [check_modifier_table+esi*4]
|
|
test al, al
|
|
pop eax
|
|
jnz .not
|
|
push eax
|
|
mov esi, [edx]
|
|
shr esi, 4
|
|
and esi, 0xF
|
|
shr al, 2
|
|
and al, 3
|
|
call dword [check_modifier_table+esi*4]
|
|
test al, al
|
|
pop eax
|
|
jnz .not
|
|
push eax
|
|
mov esi, [edx]
|
|
shr esi, 8
|
|
and esi, 0xF
|
|
shr al, 4
|
|
and al, 3
|
|
call dword [check_modifier_table+esi*4]
|
|
test al, al
|
|
pop eax
|
|
; jnz .not
|
|
.not:
|
|
ret
|
|
|
|
check_modifier_0:
|
|
setnz al
|
|
ret
|
|
check_modifier_1:
|
|
setp al
|
|
ret
|
|
check_modifier_2:
|
|
cmp al, 3
|
|
setnz al
|
|
ret
|
|
check_modifier_3:
|
|
cmp al, 1
|
|
setnz al
|
|
ret
|
|
check_modifier_4:
|
|
cmp al, 2
|
|
setnz al
|
|
ret
|
|
|
|
; fills real_header with window title
|
|
; window title is generated as '<filename> - Kolibri Image Viewer'
|
|
generate_header:
|
|
push eax
|
|
mov esi, [last_name_component]
|
|
mov edi, real_header
|
|
@@:
|
|
lodsb
|
|
test al, al
|
|
jz @f
|
|
stosb
|
|
cmp edi, real_header+256
|
|
jb @b
|
|
.overflow:
|
|
mov dword [edi-4], '...'
|
|
.ret:
|
|
pop eax
|
|
ret
|
|
@@:
|
|
mov esi, s_header
|
|
@@:
|
|
lodsb
|
|
stosb
|
|
test al, al
|
|
jz .ret
|
|
cmp edi, real_header+256
|
|
jb @b
|
|
jmp .overflow
|
|
;-----------------------------------------------------------------------------
|
|
|
|
s_header db ' - Kolibri Image Viewer', 0
|
|
wnd_style dd 0x73FFFFFF
|
|
wnd_x dd 100
|
|
wnd_y dd 100
|
|
image_padding dd 5
|
|
toolbar_height dd 31
|
|
bg_color dd 0x00ffffff
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;-----------------------------------------------------------------------------
|
|
|
|
align 4
|
|
@IMPORT:
|
|
|
|
library \
|
|
libio , 'libio.obj' , \
|
|
libgfx , 'libgfx.obj' , \
|
|
libimg , 'libimg.obj' , \
|
|
libini , 'libini.obj' , \
|
|
sort , 'sort.obj' , \
|
|
proc_lib ,'proc_lib.obj',\
|
|
libbuf2d, 'buf2d.obj'
|
|
|
|
|
|
import libio , \
|
|
libio.init , 'lib_init' , \
|
|
file.size , 'file_size' , \
|
|
file.open , 'file_open' , \
|
|
file.read , 'file_read' , \
|
|
file.close , 'file_close'
|
|
|
|
import libgfx , \
|
|
libgfx.init , 'lib_init' , \
|
|
gfx.open , 'gfx_open' , \
|
|
gfx.close , 'gfx_close' , \
|
|
gfx.pen.color , 'gfx_pen_color' , \
|
|
gfx.line , 'gfx_line'
|
|
|
|
import libimg , \
|
|
libimg.init , 'lib_init' , \
|
|
img.is_img , 'img_is_img' , \
|
|
img.to_rgb2 , 'img_to_rgb2', \
|
|
img.decode , 'img_decode' , \
|
|
img.flip , 'img_flip' , \
|
|
img.rotate , 'img_rotate' , \
|
|
img.destroy , 'img_destroy', \
|
|
img.draw , 'img_draw'
|
|
|
|
import libini, \
|
|
ini_get_shortcut, 'ini_get_shortcut',\
|
|
ini_set_str, 'ini_set_str'
|
|
|
|
import sort, sort.START, 'START', SortDir, 'SortDir', strcmpi, 'strcmpi'
|
|
|
|
import proc_lib, \
|
|
OpenDialog_Init, 'OpenDialog_init', \
|
|
OpenDialog_Start,'OpenDialog_start'
|
|
|
|
import libbuf2d, \
|
|
buf2d_init, 'lib_init', \
|
|
buf2d_resize, 'buf2d_resize'
|
|
|
|
align 4
|
|
buf_0: dd 0
|
|
dw 0,0
|
|
.w: dd 0
|
|
.h: dd 0,0
|
|
db 24 ;+20 bit in pixel
|
|
|
|
bFirstDraw db 0
|
|
bSlideShow db 0
|
|
bTglbar db 0
|
|
;-----------------------------------------------------------------------------
|
|
|
|
virtual at 0
|
|
file 'kivicons.bmp':0xA,4
|
|
load offbits dword from 0
|
|
end virtual
|
|
numimages = 10
|
|
openbtn = 0
|
|
backbtn = 1
|
|
forwardbtn = 2
|
|
bgrbtn = 3
|
|
fliphorzbtn = 4
|
|
flipvertbtn = 5
|
|
rotcwbtn = 6
|
|
rotccwbtn = 7
|
|
rot180btn = 8
|
|
slidebtn = 9
|
|
|
|
palette:
|
|
file 'kivicons.bmp':0x36,offbits-0x36
|
|
buttons:
|
|
file 'kivicons.bmp':offbits
|
|
repeat 10
|
|
y = % - 1
|
|
z = 20 - %
|
|
repeat numimages*5
|
|
load a dword from $ - numimages*20*20 + numimages*20*y + (%-1)*4
|
|
load b dword from $ - numimages*20*20 + numimages*20*z + (%-1)*4
|
|
store dword a at $ - numimages*20*20 + numimages*20*z + (%-1)*4
|
|
store dword b at $ - numimages*20*20 + numimages*20*y + (%-1)*4
|
|
end repeat
|
|
end repeat
|
|
|
|
inifilename db '/sys/settings/app.ini',0
|
|
aShortcuts db 'Kiv',0
|
|
aNext db 'Next',0
|
|
aPrev db 'Prev',0
|
|
aSlide db 'SlideShow',0
|
|
aTglbar db 'ToggleBar',0
|
|
|
|
inifileeskin db '/sys/settings/eskin.ini',0
|
|
amain db 'main',0
|
|
aprogram db 'program',0
|
|
aparam db 'param',0
|
|
|
|
align 4
|
|
check_modifier_table:
|
|
dd check_modifier_0
|
|
dd check_modifier_1
|
|
dd check_modifier_2
|
|
dd check_modifier_3
|
|
dd check_modifier_4
|
|
|
|
;---------------------------------------------------------------------
|
|
align 4
|
|
OpenDialog_data:
|
|
.type dd 0
|
|
.procinfo dd procinfo ;+4
|
|
.com_area_name dd communication_area_name ;+8
|
|
.com_area dd 0 ;+12
|
|
.opendir_pach dd temp_dir_pach ;+16
|
|
.dir_default_pach dd communication_area_default_pach ;+20
|
|
.start_path dd open_dialog_path ;+24
|
|
.draw_window dd draw_window ;+28
|
|
.status dd 0 ;+32
|
|
.openfile_pach dd path ;openfile_pach ;+36
|
|
.filename_area dd 0 ;+40
|
|
.filter_area dd Filter
|
|
.x:
|
|
.x_size dw 420 ;+48 ; Window X size
|
|
.x_start dw 10 ;+50 ; Window X position
|
|
.y:
|
|
.y_size dw 320 ;+52 ; Window y size
|
|
.y_start dw 10 ;+54 ; Window Y position
|
|
|
|
communication_area_name:
|
|
db 'FFFFFFFF_open_dialog',0
|
|
|
|
open_dialog_path:
|
|
if __nightbuild eq yes
|
|
db '/sys/MANAGERS/opendial',0
|
|
else
|
|
db '/sys/File Managers/opendial',0
|
|
end if
|
|
communication_area_default_pach:
|
|
db '/rd/1',0
|
|
|
|
Filter:
|
|
dd Filter.end - Filter
|
|
.1:
|
|
db 'BMP',0
|
|
db 'GIF',0
|
|
db 'JPG',0
|
|
db 'JPEG',0
|
|
db 'JPE',0
|
|
db 'PNG',0
|
|
db 'ICO',0
|
|
db 'CUR',0
|
|
db 'TGA',0
|
|
db 'PCX',0
|
|
db 'XCF',0
|
|
db 'PBM',0
|
|
db 'PGM',0
|
|
db 'PNM',0
|
|
db 'TIF',0
|
|
db 'TIFF',0
|
|
db 'WBMP',0
|
|
.end:
|
|
db 0
|
|
|
|
draw_window_fake:
|
|
ret
|
|
;------------------------------------------------------------------------------
|
|
readdir_fileinfo:
|
|
dd 1
|
|
dd 0
|
|
dd 0
|
|
readblocks dd 0
|
|
directory_ptr dd 0
|
|
;------------------------------------------------------------------------------
|
|
I_END:
|
|
curdir rb 1024
|
|
|
|
align 4
|
|
img_data dd ?
|
|
img_data_len dd ?
|
|
fh dd ?
|
|
image dd ?
|
|
wnd_width dd 100
|
|
wnd_height dd 100
|
|
draw_x dd ?
|
|
draw_y dd ?
|
|
draw_width dd ?
|
|
draw_height dd ?
|
|
last_name_component dd ?
|
|
cur_file_idx dd ?
|
|
cur_frame_time dd ?
|
|
cur_frame dd ?
|
|
|
|
next_mod dd ?
|
|
next_key dd ?
|
|
prev_mod dd ?
|
|
prev_key dd ?
|
|
slide_mod dd ?
|
|
slide_key dd ?
|
|
tglbar_mod dd ?
|
|
tglbar_key dd ?
|
|
|
|
toolbar_height_old rd 1
|
|
|
|
procinfo process_information
|
|
align 16
|
|
path: rb 4096 ;1024+16
|
|
real_header rb 256
|
|
@PARAMS rb 4096 ;512
|
|
;---------------------------------------------------------------------
|
|
sys_path rb 1024
|
|
temp_dir_pach:
|
|
rb 4096
|
|
;---------------------------------------------------------------------
|
|
rb 4096
|
|
stacktop:
|
|
;---------------------------------------------------------------------
|
|
F_END:
|