Subversion Repositories Kolibri OS

Compare Revisions

Ignore whitespace Rev 1511 → Rev 1570

/programs/media/kiv/trunk/kiv.asm
21,902 → 21,902
;-----------------------------------------------------------------------------
 
START:
mcall 68, 11
mcall 68, 11
 
stdcall dll.Load, @IMPORT
or eax, eax
jnz exit
stdcall dll.Load, @IMPORT
or eax, eax
jnz exit
 
invoke sort.START, 1
invoke sort.START, 1
 
; OpenDialog initialisation
push dword OpenDialog_data
call [OpenDialog_Init]
push dword OpenDialog_data
call [OpenDialog_Init]
 
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
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
 
; 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
mcall 66, 1, 1 ; set kbd mode to scancodes
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
mcall 66, 1, 1 ; set kbd mode to scancodes
 
cmp byte [@PARAMS], 0
jnz params_given
cmp byte [@PARAMS], 0
jnz params_given
 
mov [OpenDialog_data.draw_window],draw_window_fake
mov [OpenDialog_data.draw_window],draw_window_fake
; OpenDialog Open
push dword OpenDialog_data
call [OpenDialog_Start]
push dword OpenDialog_data
call [OpenDialog_Start]
 
cmp [OpenDialog_data.status],1
jne exit
cmp [OpenDialog_data.status],1
jne exit
 
mov [OpenDialog_data.draw_window],draw_window
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
mov esi, path
mov edi, @PARAMS
mov ecx, 4096/4
rep movsd
mov byte [edi-1], 0
jmp params_given
 
set_bgr:
mcall 15, 4
mov eax, @PARAMS + 4
call load_image
jc exit
mcall 15, 4
mov eax, @PARAMS + 4
call load_image
jc exit
 
call set_as_bgr
jmp exit
call set_as_bgr
jmp exit
 
params_given:
 
mov esi, @PARAMS
push esi
call find_last_name_component
mov esi, @PARAMS
push esi
call find_last_name_component
 
pop eax
call load_image
jc exit
call generate_header
pop eax
call load_image
jc exit
call generate_header
 
;-----------------------------------------------------------------------------
 
red:
call draw_window
call draw_window
 
still:
mov eax, [image]
test byte [eax + Image.Flags], Image.IsAnimated
push 10
pop eax
jz @f
mcall 26, 9
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 23
pop eax
mov eax, [image]
test byte [eax + Image.Flags], Image.IsAnimated
push 10
pop eax
jz @f
mcall 26, 9
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 23
pop eax
@@:
mcall
dec eax
js red_update_frame
jz red
dec eax
jnz button
mcall
dec eax
js red_update_frame
jz red
dec eax
jnz button
 
key:
xor esi, esi
xor esi, esi
keyloop:
mcall 2
test al, al
jnz keyloopdone
shr eax, 8
mov ecx, eax
mcall 66, 3
mov edx, next_mod
call check_shortcut
jz .next
add edx, prev_mod - next_mod
call check_shortcut
jnz keyloop
mcall 2
test al, al
jnz keyloopdone
shr eax, 8
mov ecx, eax
mcall 66, 3
mov edx, next_mod
call check_shortcut
jz .next
add edx, prev_mod - next_mod
call check_shortcut
jnz keyloop
.prev:
dec esi
jmp keyloop
dec esi
jmp keyloop
.next:
inc esi
jmp keyloop
inc esi
jmp keyloop
keyloopdone:
test esi, esi
jz still
test esi, esi
jz still
next_or_prev_handler:
call next_or_prev_image
jmp red
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 eax, [cur_frame]
mov eax, [eax + Image.Next]
test eax, eax
jnz @f
mov eax, [image]
@@:
mov [cur_frame], eax
mcall 26, 9
mov [cur_frame_time], eax
mcall 9, procinfo, -1
call draw_cur_frame
jmp still
mov [cur_frame], eax
mcall 26, 9
mov [cur_frame_time], eax
mcall 9, procinfo, -1
call draw_cur_frame
jmp still
 
button:
mcall 17
shr eax, 8
mcall 17
shr eax, 8
 
; flip horizontally
cmp eax, 'flh'
jne @f
; flip horizontally
cmp eax, 'flh'
jne @f
 
invoke img.flip, [image], FLIP_HORIZONTAL
jmp redraw_image
invoke img.flip, [image], FLIP_HORIZONTAL
jmp redraw_image
 
; flip vertically
@@: cmp eax, 'flv'
jne @f
; flip vertically
@@: cmp eax, 'flv'
jne @f
 
invoke img.flip, [image], FLIP_VERTICAL
jmp redraw_image
invoke img.flip, [image], FLIP_VERTICAL
jmp redraw_image
 
; flip both horizontally and vertically
@@: cmp eax, 'flb'
jne @f
; flip both horizontally and vertically
@@: cmp eax, 'flb'
jne @f
 
invoke img.flip, [image], FLIP_BOTH
jmp redraw_image
invoke img.flip, [image], FLIP_BOTH
jmp redraw_image
 
; rotate left
@@: cmp eax, 'rtl'
jne @f
; rotate left
@@: cmp eax, 'rtl'
jne @f
 
push ROTATE_90_CCW
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
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
; rotate right
@@: cmp eax, 'rtr'
jne @f
 
push ROTATE_90_CW
jmp .rotate_common
push ROTATE_90_CW
jmp .rotate_common
 
; open new file
@@: cmp eax, 'opn'
jne @f
; 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
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
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
pop [image]
call init_frame
jmp still
 
; set background
; set background
@@:
cmp eax, 'bgr'
jne @f
cmp eax, 'bgr'
jne @f
 
call set_as_bgr
jmp still
call set_as_bgr
jmp still
 
@@:
 
or esi, -1
cmp eax, 'bck'
jz next_or_prev_handler
neg esi
cmp eax, 'fwd'
jz next_or_prev_handler
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
cmp eax, 1
jne still
 
exit:
mcall -1
mcall -1
 
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
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
 
; img.decode checks for img.is_img
; invoke img.is_img, [img_data], [img_data_len]
; or eax, eax
; jz exit
invoke img.decode, [img_data], [img_data_len], 0
or eax, eax
jz .error
cmp [image], 0
pushf
mov [image], eax
call init_frame
popf
call update_image_sizes
call free_img_data
clc
ret
; invoke img.is_img, [img_data], [img_data_len]
; or eax, eax
; jz exit
invoke img.decode, [img_data], [img_data_len], 0
or eax, eax
jz .error
cmp [image], 0
pushf
mov [image], eax
call init_frame
popf
call update_image_sizes
call free_img_data
clc
ret
 
.error_free:
invoke img.destroy, [image]
jmp .error
invoke img.destroy, [image]
jmp .error
 
.error_pop:
pop eax
jmp .error
pop eax
jmp .error
.error_close:
invoke file.close, [fh]
invoke file.close, [fh]
.error:
call free_img_data
stc
ret
call free_img_data
stc
ret
 
free_img_data:
mov eax, [img_data]
test eax, eax
jz @f
stdcall mem.Free, eax
mov eax, [img_data]
test eax, eax
jz @f
stdcall mem.Free, eax
@@:
ret
ret
 
update_image_sizes:
pushf
mov edx, [eax + Image.Width]
mov [draw_width], edx
add edx, 19
cmp edx, 40 + 25*9
jae @f
mov edx, 40 + 25*9
pushf
mov edx, [eax + Image.Width]
mov [draw_width], edx
add edx, 19
cmp edx, 40 + 25*9
jae @f
mov edx, 40 + 25*9
@@:
mov [wnd_width], edx
mov esi, [eax + Image.Height]
mov [draw_height], esi
add esi, 44
mov [wnd_height], esi
popf
jz .no_resize
mcall 48, 4
add esi, eax
mcall 67,-1,-1
mov [wnd_width], edx
mov esi, [eax + Image.Height]
mov [draw_height], esi
add esi, 44
mov [wnd_height], esi
popf
jz .no_resize
mcall 48, 4
add esi, eax
mcall 67,-1,-1
.no_resize:
ret
ret
 
set_as_bgr:
mov esi, [image]
mov ecx, [esi + Image.Width]
mov edx, [esi + Image.Height]
mcall 15, 1
mov esi, [image]
mov ecx, [esi + Image.Width]
mov edx, [esi + Image.Height]
mcall 15, 1
 
mcall 15, 6
test eax, eax
jz @f
mcall 15, 6
test eax, eax
jz @f
 
push eax
invoke img.to_rgb2, esi, eax
pop ecx
mcall 15, 7
push eax
invoke img.to_rgb2, esi, eax
pop ecx
mcall 15, 7
 
@@:
mcall 15, 3
ret
mcall 15, 3
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 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
push [image]
add eax, esi
@@:
test eax, eax
jns @f
add eax, [ebx+4]
jmp @b
test eax, eax
jns @f
add eax, [ebx+4]
jmp @b
@@:
cmp eax, [ebx+4]
jb @f
sub eax, [ebx+4]
jmp @b
cmp eax, [ebx+4]
jb @f
sub eax, [ebx+4]
jmp @b
@@:
push eax
push eax
.scanloop:
push eax ebx esi
imul esi, eax, 304
add esi, [directory_ptr]
add esi, 32 + 40
mov edi, curdir
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], '/'
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
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
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
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
inc eax
cmp eax, [ebx+4]
jb @f
xor eax, eax
@@:
.try_common:
cmp eax, [esp]
jz .notfound
jmp .scanloop
cmp eax, [esp]
jz .notfound
jmp .scanloop
.try_prev:
dec eax
jns @f
mov eax, [ebx+4]
dec eax
dec eax
jns @f
mov eax, [ebx+4]
dec eax
@@:
jmp .try_common
jmp .try_common
.loadedok:
mov [cur_file_idx], eax
pop eax
invoke img.destroy
call generate_header
mov [cur_file_idx], eax
pop eax
invoke img.destroy
call generate_header
.ret:
ret
ret
.notfound:
pop eax
pop [image]
call init_frame
ret
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
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 68, 12, 0x1000
test eax, eax
jz .ret
mov ebx, readdir_fileinfo
mov dword [ebx+12], (0x1000 - 32) / 304
mov dword [ebx+16], eax
mcall 70
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 68, 20
test eax, eax
jz free_directory
mov [directory_ptr], eax
mcall 70, readdir_fileinfo
mov byte [edi], 0
mcall 68, 12, 0x1000
test eax, eax
jz .ret
mov ebx, readdir_fileinfo
mov dword [ebx+12], (0x1000 - 32) / 304
mov dword [ebx+16], eax
mcall 70
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 68, 20
test eax, eax
jz free_directory
mov [directory_ptr], eax
mcall 70, readdir_fileinfo
.dirok:
cmp ebx, 0
jle free_directory
mov eax, [directory_ptr]
add eax, 32
mov edi, eax
push 0
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
push eax
test byte [eax], 18h
jnz .nocopy
lea esi, [eax+40]
mov ecx, esi
@@:
lodsb
test al, al
jnz @b
lodsb
test al, al
jnz @b
@@:
dec esi
cmp esi, ecx
jb .noext
cmp byte [esi], '.'
jnz @b
inc esi
mov ecx, [esi]
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, 'jpeg'
jz @f
cmp ecx, 'jpeG'
jnz .nocopy
dec esi
cmp esi, ecx
jb .noext
cmp byte [esi], '.'
jnz @b
inc esi
mov ecx, [esi]
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, 'jpeg'
jz @f
cmp ecx, 'jpeG'
jnz .nocopy
@@:
cmp byte [esi+4], 0
jnz .nocopy
cmp byte [esi+4], 0
jnz .nocopy
.copy:
mov esi, [esp]
mov ecx, 304 / 4
rep movsd
inc dword [esp+4]
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
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
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
mov [cur_file_idx], eax
.ret:
ret
ret
 
free_directory:
mcall 68, 13, [directory_ptr]
and [directory_ptr], 0
ret
mcall 68, 13, [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
mov ecx, esi
@@:
lodsb
test al, al
jnz @b
lodsb
test al, al
jnz @b
@@:
dec esi
cmp esi, ecx
jb @f
cmp byte [esi], '/'
jnz @b
dec esi
cmp esi, ecx
jb @f
cmp byte [esi], '/'
jnz @b
@@:
inc esi
mov [last_name_component], esi
ret
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 26, 9
pop ebx
mov [cur_frame_time], eax
push eax
mov eax, [image]
mov [cur_frame], eax
test byte [eax + Image.Flags], Image.IsAnimated
jz @f
push ebx
mcall 26, 9
pop ebx
mov [cur_frame_time], eax
@@:
pop eax
ret
pop eax
ret
 
draw_window:
cmp [bFirstDraw], 0
jz .posok
or ecx, -1
mcall 9, procinfo
cmp [bFirstDraw], 0
jz .posok
or ecx, -1
mcall 9, procinfo
 
cmp dword [ebx + 66], 0
jle .posok
cmp dword [ebx + 66], 0
jle .posok
 
mov edx, ecx
mov esi, ecx
cmp dword [ebx + 42], 40 + 25 * 9
jae @f
mov edx, 40 + 25 * 9
mov edx, ecx
mov esi, ecx
cmp dword [ebx + 42], 40 + 25 * 9
jae @f
mov edx, 40 + 25 * 9
@@:
cmp dword [ebx + 46], 70
jae @f
mov esi, 70
cmp dword [ebx + 46], 70
jae @f
mov esi, 70
@@:
mov eax, edx
and eax, esi
cmp eax, -1
jz @f
mov ebx, ecx
mcall 67
mov eax, edx
and eax, esi
cmp eax, -1
jz @f
mov ebx, ecx
mcall 67
@@:
 
.posok:
mcall 12, 1
mcall 48, 4
mov ebp, eax ; save skin height
add eax, [wnd_height]
__mov ebx, 100, 0
add ebx, [wnd_width]
lea ecx, [100*65536 + eax]
mcall 0, , , 0x73FFFFFF, 0, real_header
mcall 12, 1
mcall 48, 4
mov ebp, eax ; save skin height
add eax, [wnd_height]
__mov ebx, 100, 0
add ebx, [wnd_width]
lea ecx, [100*65536 + eax]
mcall 0, , , 0x73FFFFFF, 0, real_header
 
mcall 9, procinfo, -1
mov [bFirstDraw], 1
cmp dword [ebx + 66], 0
jle .nodraw
mov ebx, [ebx + 62]
inc ebx
mcall 13, , <0, 35>, 0xFFFFFF
mov ecx, [procinfo + 66]
inc ecx
mov esi, [draw_height]
add esi, 35
sub ecx, esi
jbe @f
push esi
shl esi, 16
add ecx, esi
pop esi
mcall
xor ecx, ecx
mcall 9, procinfo, -1
mov [bFirstDraw], 1
cmp dword [ebx + 66], 0
jle .nodraw
mov ebx, [ebx + 62]
inc ebx
mcall 13, , <0, 35>, 0xFFFFFF
mov ecx, [procinfo + 66]
inc ecx
mov esi, [draw_height]
add esi, 35
sub ecx, esi
jbe @f
push esi
shl esi, 16
add ecx, esi
pop esi
mcall
xor ecx, ecx
@@:
add ecx, esi
add ecx, 35*10000h - 35
__mov ebx, 0, 5
mcall
mov esi, [draw_width]
add esi, ebx
mov ebx, [procinfo+62]
inc ebx
sub ebx, esi
jbe @f
shl esi, 16
add ebx, esi
mcall
add ecx, esi
add ecx, 35*10000h - 35
__mov ebx, 0, 5
mcall
mov esi, [draw_width]
add esi, ebx
mov ebx, [procinfo+62]
inc ebx
sub ebx, esi
jbe @f
shl esi, 16
add ebx, esi
mcall
@@:
 
mov ebx, [procinfo + 62]
push ebx
mcall 38, , <30, 30>, 0x007F7F7F
mcall , <5 + 25 * 1, 5 + 25 * 1>, <0, 30>
mcall , <10 + 25 * 3, 10 + 25 * 3>
mcall , <15 + 25 * 4, 15 + 25 * 4>
pop ebx
sub ebx, 25 * 5 + 10
push ebx
imul ebx, 10001h
mcall
mov ebx, [procinfo + 62]
push ebx
mcall 38, , <30, 30>, 0x007F7F7F
mcall , <5 + 25 * 1, 5 + 25 * 1>, <0, 30>
mcall , <10 + 25 * 3, 10 + 25 * 3>
mcall , <15 + 25 * 4, 15 + 25 * 4>
pop ebx
sub ebx, 25 * 5 + 10
push ebx
imul ebx, 10001h
mcall
 
mcall 8, <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
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
mcall 8, <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
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
mov ebp, (numimages-1)*20
 
mcall 65, 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>
mov edx, [procinfo + 62]
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
mcall 65, 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>
mov edx, [procinfo + 62]
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
 
call draw_cur_frame
call draw_cur_frame
 
.nodraw:
mcall 12, 2
mcall 12, 2
 
ret
ret
 
draw_cur_frame:
push 0 ; ypos
push 0 ; xpos
mov eax, [procinfo+66]
sub eax, 34
push eax ; max height
mov eax, [procinfo+62]
sub eax, 4
push eax ; max width
push 35 ; y
push 5 ; 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
push 0 ; ypos
push 0 ; xpos
mov eax, [procinfo+66]
sub eax, 34
push eax ; max height
mov eax, [procinfo+62]
sub eax, 4
push eax ; max width
push 35 ; y
push 5 ; 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
ret
.additional_frames:
mov ebx, [procinfo+62]
sub ebx, 4
jbe .done
push 5
pop esi
mov ebx, [procinfo+62]
sub ebx, 4
jbe .done
push 5
pop esi
.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+66]
sub ecx, 34
push ecx ; max height
push ebx ; max width
push 35 ; y
push esi ; x
push eax ; image
call [img.draw]
pop eax
cmp [eax + Image.Next], 0
jnz .afloop
ret
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+66]
sub ecx, 34
push ecx ; max height
push ebx ; max width
push 35 ; y
push esi ; x
push eax ; image
call [img.draw]
pop eax
cmp [eax + Image.Next], 0
jnz .afloop
ret
 
; void* __stdcall mem.Alloc(unsigned size);
mem.Alloc:
push ebx ecx
mov ecx, [esp+12]
mcall 68, 12
pop ecx ebx
ret 4
push ebx ecx
mov ecx, [esp+12]
mcall 68, 12
pop ecx ebx
ret 4
 
; void* __stdcall mem.ReAlloc(void* mptr, unsigned size);
mem.ReAlloc:
push ebx ecx edx
mov edx, [esp+16]
mov ecx, [esp+20]
mcall 68, 20
pop edx ecx ebx
ret 8
push ebx ecx edx
mov edx, [esp+16]
mov ecx, [esp+20]
mcall 68, 20
pop edx ecx ebx
ret 8
 
; void __stdcall mem.Free(void* mptr);
mem.Free:
push ebx ecx
mov ecx, [esp+12]
mcall 68, 13
pop ecx ebx
ret 4
push ebx ecx
mov ecx, [esp+12]
mcall 68, 13
pop ecx ebx
ret 4
 
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
; 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
ret
 
check_modifier_0:
setnz al
ret
setnz al
ret
check_modifier_1:
setp al
ret
setp al
ret
check_modifier_2:
cmp al, 3
setnz al
ret
cmp al, 3
setnz al
ret
check_modifier_3:
cmp al, 1
setnz al
ret
cmp al, 1
setnz al
ret
check_modifier_4:
cmp al, 2
setnz al
ret
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
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
lodsb
test al, al
jz @f
stosb
cmp edi, real_header+256
jb @b
.overflow:
mov dword [edi-4], '...'
mov dword [edi-4], '...'
.ret:
pop eax
ret
pop eax
ret
@@:
mov esi, s_header
mov esi, s_header
@@:
lodsb
stosb
test al, al
jz .ret
cmp edi, real_header+256
jb @b
jmp .overflow
lodsb
stosb
test al, al
jz .ret
cmp edi, real_header+256
jb @b
jmp .overflow
;-----------------------------------------------------------------------------
 
s_header db ' - Kolibri Image Viewer', 0
927,49 → 927,49
align 4
@IMPORT:
 
library \
libio , 'libio.obj' , \
libgfx , 'libgfx.obj' , \
libimg , 'libimg.obj' , \
libini , 'libini.obj' , \
sort , 'sort.obj' , \
proc_lib ,'proc_lib.obj'
library \
libio , 'libio.obj' , \
libgfx , 'libgfx.obj' , \
libimg , 'libimg.obj' , \
libini , 'libini.obj' , \
sort , 'sort.obj' , \
proc_lib ,'proc_lib.obj'
 
 
import libio , \
libio.init , 'lib_init' , \
file.size , 'file_size' , \
file.open , 'file_open' , \
file.read , 'file_read' , \
file.close , 'file_close'
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 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 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'
import libini, \
ini_get_shortcut, 'ini_get_shortcut'
 
import sort, sort.START, 'START', SortDir, 'SortDir', strcmpi, 'strcmpi'
 
import proc_lib, \
OpenDialog_Init, 'OpenDialog_init', \
OpenDialog_Start,'OpenDialog_start'
import proc_lib, \
OpenDialog_Init, 'OpenDialog_init', \
OpenDialog_Start,'OpenDialog_start'
 
bFirstDraw db 0
bFirstDraw db 0
;-----------------------------------------------------------------------------
 
virtual at 0
988,9 → 988,9
rot180btn = 8
 
palette:
file 'kivicons.bmp':0x36,offbits-0x36
file 'kivicons.bmp':0x36,offbits-0x36
buttons:
file 'kivicons.bmp':offbits
file 'kivicons.bmp':offbits
repeat 10
y = % - 1
z = 20 - %
1002,41 → 1002,41
end repeat
end repeat
 
inifilename db '/sys/media/kiv.ini',0
aShortcuts db 'Shortcuts',0
aNext db 'Next',0
aPrev db 'Prev',0
inifilename db '/sys/media/kiv.ini',0
aShortcuts db 'Shortcuts',0
aNext db 'Next',0
aPrev db 'Prev',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
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
.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
 
communication_area_name:
db 'FFFFFFFF_open_dialog',0
db 'FFFFFFFF_open_dialog',0
open_dialog_path:
db '/sys/File Managers/opendial',0
db '/sys/File Managers/opendial',0
communication_area_default_pach:
db '/rd/1',0
db '/rd/1',0
 
Filter:
dd Filter.end - Filter
1049,50 → 1049,51
db 'PNG',0
db 'ICO',0
db 'CUR',0
db 'PCX',0
.end:
db 0
 
draw_window_fake:
ret
ret
;------------------------------------------------------------------------------
readdir_fileinfo:
dd 1
dd 0
dd 0
readblocks dd 0
directory_ptr dd 0
dd 1
dd 0
dd 0
readblocks dd 0
directory_ptr dd 0
;------------------------------------------------------------------------------
I_END:
curdir rb 1024
curdir rb 1024
 
align 4
img_data dd ?
img_data_len dd ?
fh dd ?
image dd ?
wnd_width dd ?
wnd_height dd ?
draw_width dd ?
draw_height dd ?
last_name_component dd ?
cur_file_idx dd ?
cur_frame_time dd ?
cur_frame dd ?
fh dd ?
image dd ?
wnd_width dd ?
wnd_height 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 ?
next_mod dd ?
next_key dd ?
prev_mod dd ?
prev_key dd ?
 
procinfo: rb 1024
path: rb 4096 ;1024+16
real_header rb 256
procinfo: rb 1024
path: rb 4096 ;1024+16
real_header rb 256
@PARAMS rb 4096 ;512
;---------------------------------------------------------------------
temp_dir_pach:
rb 4096
;---------------------------------------------------------------------
rb 4096
rb 4096
stacktop:
;---------------------------------------------------------------------
F_END: