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: |