format binary as "" use32 org 0x0 db 'MENUET01' dd 0x01, START, I_END, E_END, stacktop, __params, sys_path ;----------------------------------------------------------------------------- __DEBUG__ = 0 __DEBUG_LEVEL__ = 1 LG_TRACE equ 1 include '../../../config.inc' include '../../../proc32.inc' include '../../../macros.inc' include '../../../KOSfuncs.inc' include '../../../dll.inc' include '../../../debug-fdo.inc' include '../../../develop/libraries/libs-dev/libimg/libimg.inc' KEY_MOVE_PIXELS = 50 SCROLL_WIDTH_SIZE = 15 AR_OFFSET = 10 MIN_WINDOW_WIDTH = 50+25*numimages MIN_WINDOW_HEIGHT = 100 TOOLBAR_HEIGHT = 31 CANVAS_PADDING = 5 ;----------------------------------------------------------------------------- START: mcall SF_SYSTEM, SSF_MOUSE_SETTINGS, SSSF_SET_SPEED, 5 mcall SF_SYSTEM, SSF_MOUSE_SETTINGS, SSSF_SET_SPEEDUP, 5 mcall SF_SYS_MISC, SSF_HEAP_INIT mcall SF_KEYBOARD, SSF_SET_INPUT_MODE, 1 ; set kbd mode to scancodes mcall SF_SET_EVENTS_MASK, EVM_REDRAW or EVM_KEY or EVM_BUTTON or EVM_MOUSE or EVM_MOUSE_FILTER 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, aKivSection, aNext, -1, next_mod mov [next_key], eax invoke ini_get_shortcut, inifilename, aKivSection, aPrev, -1, prev_mod mov [prev_key], eax invoke ini_get_shortcut, inifilename, aKivSection, aSlide, -1, slide_mod mov [slide_key], eax invoke ini_get_shortcut, inifilename, aKivSection, aTglbar, -1, tglbar_mod mov [tglbar_key], eax invoke ini_get_int, inifilename, aKivSection, aWinX, 100 mov [window.left], eax invoke ini_get_int, inifilename, aKivSection, aWinY, 150 mov [window.top], eax invoke ini_get_int, inifilename, aKivSection, aWinW, 0 mov [window.width], eax invoke ini_get_int, inifilename, aKivSection, aWinH, 0 mov [window.height], eax 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 jnz 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 stdcall load_image, __params+4 jc exit call set_as_bgr jmp exit params_given: mov esi, __params push esi call find_last_name_component call load_directory pop eax stdcall load_image, eax jc exit ;----------------------------------------------------------------------------- redraw_all: call draw_window still: mov eax, [orig_image] test [eax+Image.Flags], Image.IsAnimated movi eax, SF_WAIT_EVENT jz .wait_event 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] jna @f call red_update_frame jmp still @@: test ebx, ebx jnz @f call red_update_frame jmp still @@: movi eax, SF_WAIT_EVENT_TIMEOUT .wait_event: mcall dec eax jns @f call red_update_frame jmp still @@: jz redraw_all dec eax jz key dec eax jz button mouse: mov eax, [need_scrollbar_v] add eax, [need_scrollbar_h] test eax, eax jz .done mov [pict_moved], 0 invoke scrollbar_vert_mouse, scroll_bar_data_vertical invoke scrollbar_hort_mouse, scroll_bar_data_horizontal xor ecx, ecx mov eax, [scroll_bar_data_vertical.position] cmp [pict.top], eax mov [pict.top], eax setnz cl mov eax, [scroll_bar_data_horizontal.position] cmp [pict.left], eax mov [pict.left], eax setnz ch test ecx, ecx jz @f call draw_view call draw_onimage_decorations @@: ; check for scroll mcall SF_MOUSE_GET, SSF_SCROLL_DATA test eax, eax jz .no_scroll movsx ecx, ax shl ecx, 4 sar eax, 16 shl eax, 4 stdcall move_pictport, eax, ecx mov [pict_moved], eax jmp .mouse_done .no_scroll: ; get cursor coordinates in window mcall SF_MOUSE_GET, SSF_WINDOW_POSITION movsx ebx, ax cmp ebx, 0 jge @f add eax, 0x10000 @@: mov ecx, [mouse_pos] cmp eax, ecx jz .no_mouse_move mov [mouse_pos], eax cmp [pict_drag], 1 jnz .no_mouse_move sar eax, 16 movsx edx, cx sar ecx, 16 sub eax, ecx sub ebx, edx neg eax neg ebx stdcall move_pictport, eax, ebx mov [pict_moved], eax jmp .no_mouse_move .no_mouse_move: ; check buttons mcall SF_MOUSE_GET, SSF_BUTTON mov ecx, eax xor ecx, [mouse_buttons] mov [mouse_buttons], eax test ecx, 0x01 jz .left_button_handled test eax, 0x01 jnz .left_button_down .left_button_up: mov [pict_drag], 0 jmp .left_button_handled .left_button_down: mov ecx, [mouse_pos] movzx edx, cx sar ecx, 16 mov ebx, [canvas_abs_top] add ebx, [view.top] cmp ebx, edx jg .left_click_pict_done add ebx, [view.height] cmp ebx, edx jl .left_click_pict_done mov ebx, [canvas_abs_left] add ebx, [view.left] cmp ebx, ecx jg .left_click_pict_done add ebx, [view.width] cmp ebx, ecx jl .left_click_pict_done mov [pict_drag], 1 jmp .left_button_handled .left_click_pict_done: .left_button_handled: .mouse_done: mov eax, [pict_moved] test eax, eax jz .done stdcall update_scrollbars, eax call draw_view call draw_onimage_decorations .done: jmp still 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 mov edx, scale_none_mod call check_shortcut jz .set_scale_none add edx, scale_fit_min_mod-scale_none_mod call check_shortcut jz .set_scale_fit_min add edx, move_pictport_left_1_mod-scale_fit_min_mod call check_shortcut jz .move_pictport_left add edx, move_pictport_left_2_mod-move_pictport_left_1_mod call check_shortcut jz .move_pictport_left add edx, move_pictport_right_1_mod-move_pictport_left_2_mod call check_shortcut jz .move_pictport_right add edx, move_pictport_right_2_mod-move_pictport_right_1_mod call check_shortcut jz .move_pictport_right add edx, move_pictport_up_1_mod-move_pictport_right_2_mod call check_shortcut jz .move_pictport_up add edx, move_pictport_up_2_mod-move_pictport_up_1_mod call check_shortcut jz .move_pictport_up add edx, move_pictport_down_1_mod-move_pictport_up_2_mod call check_shortcut jz .move_pictport_down add edx, move_pictport_down_2_mod-move_pictport_down_1_mod call check_shortcut jz .move_pictport_down cmp cl, 1 ; Esc jz .esc jmp keyloop .esc: test [bSlideShow], 1 jz keyloop jmp .slide .tglbar: bt [window_style], 25 jnc @f mov [bToggleToolbar], 1 xor [bShowToolbar], 1 @@: jmp keyloop .slide: call slide_show jmp keyloop .set_scale_none: mov eax, LIBIMG_SCALE_NONE call set_scale_mode jz @f call recalc_canvas @@: jmp keyloop .set_scale_fit_min: mov eax, LIBIMG_SCALE_FIT_MIN call set_scale_mode jz @f call recalc_work @@: jmp keyloop .move_pictport_left: stdcall move_pictport, -KEY_MOVE_PIXELS, 0 stdcall update_scrollbars, eax call draw_view call draw_onimage_decorations jmp keyloop .move_pictport_right: stdcall move_pictport, KEY_MOVE_PIXELS, 0 stdcall update_scrollbars, eax call draw_view call draw_onimage_decorations jmp keyloop .move_pictport_up: stdcall move_pictport, 0, -KEY_MOVE_PIXELS stdcall update_scrollbars, eax call draw_view call draw_onimage_decorations jmp keyloop .move_pictport_down: stdcall move_pictport, 0, KEY_MOVE_PIXELS stdcall update_scrollbars, eax call draw_view call draw_onimage_decorations jmp keyloop .prev: dec esi jmp keyloop .next: inc esi jmp keyloop keyloopdone: test esi, esi jnz next_or_prev_handler test [bToggleSlideShow], 1 jnz redraw_all test [bToggleToolbar], 1 stdcall recalc_client jnz redraw_all test [bScaleModeChanged], 1 mov [bScaleModeChanged], 0 jnz redraw_all test [bNewImage], 1 mov [bNewImage], 0 jnz redraw_all jmp still next_or_prev_handler: call next_or_prev_image jmp redraw_all red_update_frame: mov eax, [cur_frame] mov eax, [eax+Image.Next] test eax, eax jnz @f mov eax, [cur_image] @@: mov [cur_frame], eax mcall SF_SYSTEM_GET, SSF_TIME_COUNT mov [cur_frame_time], eax call draw_view ret button: mcall SF_GET_BUTTON shr eax, 8 ; flip horizontally cmp eax, 'flh' jnz .not_flh mov eax, [cur_image] cmp eax, [orig_image] jz @f invoke img.flip, [cur_image], FLIP_HORIZONTAL @@: invoke img.flip, [orig_image], FLIP_HORIZONTAL jmp redraw_all ; flip vertically .not_flh: cmp eax, 'flv' jnz .not_flv mov eax, [cur_image] cmp eax, [orig_image] jz @f invoke img.flip, [cur_image], FLIP_VERTICAL @@: invoke img.flip, [orig_image], FLIP_VERTICAL jmp redraw_all ; flip both horizontally and vertically .not_flv: cmp eax, 'flb' jnz .not_flb mov eax, [cur_image] cmp eax, [orig_image] jz @f invoke img.flip, [cur_image], FLIP_BOTH @@: invoke img.flip, [orig_image], FLIP_BOTH jmp redraw_all ; rotate left .not_flb: cmp eax, 'rtl' jnz .not_rtl push ROTATE_90_CCW .rotate_common: mov eax, [cur_image] cmp eax, [orig_image] jz @f push dword[esp] invoke img.rotate, [cur_image] @@: invoke img.rotate, [orig_image] mov [bNewImage], 1 jmp redraw_all ; rotate right .not_rtl: cmp eax, 'rtr' jnz .not_rtr push ROTATE_90_CW jmp .rotate_common ; open new file .not_rtr: cmp eax, 'opn' jnz @f ; OpenDialog Open push dword OpenDialog_data call [OpenDialog_Start] cmp [OpenDialog_data.status], 1 jnz 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 [cur_image] stdcall load_image, eax jc .restore_old call free_directory jmp redraw_all .restore_old: pop eax jmp still ; set background @@: cmp eax, 'bgr' jnz @f mcall SF_BACKGROUND_SET, SSF_MODE_BG, 2 ; stretch by default call set_as_bgr jmp still @@: cmp eax, 'sld' jnz @f call slide_show jmp redraw_all @@: cmp eax, 'scl' jnz .not_scl mov eax, LIBIMG_SCALE_NONE cmp [scale_mode], LIBIMG_SCALE_NONE jnz @f mov eax, LIBIMG_SCALE_FIT_MIN @@: call set_scale_mode jz @f call recalc_work @@: jmp redraw_all .not_scl: or esi, -1 cmp eax, 'bck' jz next_or_prev_handler neg esi cmp eax, 'fwd' jz next_or_prev_handler cmp eax, 1 jnz still exit: invoke ini_set_int, inifilename, aKivSection, aWinX, [window.left] invoke ini_set_int, inifilename, aKivSection, aWinY, [window.top] invoke ini_set_int, inifilename, aKivSection, aWinW, [window.width] invoke ini_set_int, inifilename, aKivSection, aWinH, [window.height] mcall -1 proc load_image _filename push ebx esi edi invoke img.from_file, [_filename] test eax, eax jz .error mov ebx, eax test [eax+Image.Flags], Image.IsAnimated jnz @f cmp [eax+Image.Next], 0 jz @f stdcall merge_icons_to_single_img, eax test eax, eax jz .error_destroy @@: stdcall init_frame, eax clc jmp .exit .error_destroy: invoke img.destroy, ebx xor eax, eax .error: stc .exit: pop edi esi ebx ret endp ; in: eax -- pointer to image ; out: fill pict structure proc calculate_picture_size 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 [pict.width], edx add edx, 19 cmp edx, 50+25*numimages jae @f mov edx, 50+25*numimages @@: 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 [pict.height], esi ret endp ; in: [orig_image] proc set_as_bgr mov esi, [orig_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' jz @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 endp proc slide_show push ebx esi edi mov [bToggleSlideShow], 1 btc [window_style], 25 xor [bSlideShow], 1 jnz .to_fullscreen ; back from fullscreen movzx eax, [bShowToolbarSave] mov [bShowToolbar], al mov [canvas_padding], CANVAS_PADDING mov [bg_color], 0x00ffffff mcall SF_CHANGE_WINDOW, [window_save.left], [window_save.top], [window_save.width], [window_save.height] jmp .done .to_fullscreen: stdcall copy_box, window, window_save movzx eax, [bShowToolbar] mov [bShowToolbarSave], al mov [bShowToolbar], 0 mov [canvas_padding], 0 mov [bg_color], 0x00000000 mcall SF_GET_SCREEN_SIZE mov edx, eax shr edx, 16 movzx eax, ax mov esi, eax mcall SF_CHANGE_WINDOW, 0, 0, , mov eax, LIBIMG_SCALE_FIT_MIN call set_scale_mode .done: pop edi esi ebx ret endp ; seek to ESI image files ; esi>0 means next file, esi<0-prev file proc next_or_prev_image locals files_cnt dd ? file_idx dd ? endl push ebx esi edi push esi call load_directory pop esi mov eax, [directory_ptr] mov eax, [eax+4] mov [files_cnt], eax cmp [directory_ptr], 0 jz .ret cmp [files_cnt], 0 ; number of files jz .ret mov eax, [cur_file_idx] cmp eax, -1 jnz @f test esi, esi jns @f mov eax, [files_cnt] @@: add eax, esi @@: test eax, eax jns @f add eax, [files_cnt] jmp @b @@: cmp eax, [files_cnt] jb @f sub eax, [files_cnt] jmp @b @@: mov [file_idx], eax .scanloop: push eax 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 esi, curdir push esi mov edi, __params mov ecx, 4096/4 rep movsd mov byte[edi-1], 0 pop esi stdcall load_image, curdir pushfd @@: lodsb test al, al jnz @b @@: dec esi cmp byte[esi], '/' jnz @b mov byte[esi], 0 popfd pop esi eax jnc .loadedok test esi, esi js .try_prev .try_next: inc eax cmp eax, [files_cnt] jb @f xor eax, eax @@: .try_common: cmp eax, [file_idx] jz .notfound jmp .scanloop .try_prev: dec eax jns @f mov eax, [files_cnt] dec eax @@: jmp .try_common .loadedok: mov [cur_file_idx], eax .ret: pop edi esi ebx ret .notfound: pop edi esi ebx ret endp 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 68, 12, 0x1000 test eax, eax jz .ret mov ebx, readdir_fileinfo mov dword[ebx+12], (0x1000-32) / 304 ; blocks to read mov dword[ebx+16], eax ; where to store mcall 70 cmp eax, 6 ; read ok, but there are more files jz .dirok test eax, eax jnz free_directory mov edx, [directory_ptr] mov ecx, [edx+8] ; total number of files mov [readblocks], ecx imul ecx, 304 ; try to read entire dir, FIXME add ecx, 32 ; plus header mcall 68, 20 ; realloc 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] mov edi, [eax+8] ; total number of files mov [files_num], edi add eax, 32 ; skip header mov edi, eax push 0 .dirskip: push eax test byte[eax], 0x18 ; volume label or folder jnz .nocopy lea esi, [eax+40] ; name 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 jnz .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, 'ppm' jz .copy cmp ecx, 'tif' jz .copy cmp ecx, 'xbm' jz .copy .not_3: cmp byte[esi+4], 0 jnz .nocopy or ecx, 0x20202020 cmp ecx, 'tiff' jz @f cmp ecx, 'wbmp' jz @f cmp ecx, 'webp' 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 ; name .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 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) proc 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 endp proc init_frame uses ebx edx, _img mov eax, [orig_image] cmp eax, [_img] jz .exit test eax, eax jz .freed cmp eax, [cur_image] jz @f invoke img.destroy, [orig_image] @@: invoke img.destroy, [cur_image] .freed: mov [bNewImage], 1 mov eax, [_img] mov [orig_image], eax mov [cur_image], eax 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 @@: mov [pict.top], 0 mov [pict.left], 0 .exit: ret endp proc draw_window test [bFirstWinDraw], 1 jnz .min_size_ok mcall SF_THREAD_INFO, procinfo, -1 xor eax, eax mov edx, -1 mov esi, -1 cmp [procinfo.box.width], MIN_WINDOW_WIDTH ja @f mov edx, MIN_WINDOW_WIDTH inc eax @@: cmp [procinfo.box.height], MIN_WINDOW_HEIGHT ja @f mov esi, MIN_WINDOW_HEIGHT inc eax @@: test eax, eax jz @f mcall SF_CHANGE_WINDOW, -1, -1, , @@: .min_size_ok: test [bNewImage], 1 jz @f call generate_window_header @@: cmp [window.width], 0 jne @f mcall SF_GET_SCREEN_SIZE mov ebx,eax ; shr ebx,16 ; ebx = width movzx esi,ax ; esi = height mov eax, ebx xor edx, edx mov ebx, 3 div ebx imul eax, 2 mov [window.width], eax xor edx, edx mov ebx, 4 div ebx mov [window.left], eax mov eax, esi xor edx, edx mov ebx, 3 div ebx imul eax, 2 mov [window.height], eax xor edx, edx mov ebx, 4 div ebx mov [window.top], eax @@: mcall SF_REDRAW, SSF_BEGIN_DRAW mov ecx, [window.top] shl ecx, 16 mov cx, word[window.height] mov ebx, [window.left] shl ebx, 16 mov bx, word[window.width] mcall 0, , , [window_style], 0, window_header mcall SF_THREAD_INFO, procinfo, -1 test [procinfo.wnd_state], 0x04 jnz .nodraw stdcall copy_box, window, window_prev stdcall copy_box, procinfo.box, window test [bFirstWinDraw], 1 jnz .recalc test [bToggleSlideShow], 1 jnz .recalc mov eax, [window.width] cmp eax, [window_prev.width] jnz .recalc mov eax, [window.height] cmp eax, [window_prev.height] jnz .recalc test [bNewImage], 1 jnz .recalc test [bToggleToolbar], 1 jnz .recalc jmp .recalc_done .recalc: stdcall recalc_window .recalc_done: stdcall draw_client .nodraw: mcall SF_REDRAW, SSF_END_DRAW mov [bFirstWinDraw], 0 mov [bNewImage], 0 mov [bToggleToolbar], 0 mov [bToggleSlideShow], 0 ret endp proc draw_view uses ebx esi edi cmp [scale_mode], LIBIMG_SCALE_FIT_MIN jnz .scale_none mov ecx, [cur_frame] mov eax, [ecx+Image.Width] cmp eax, [view.width] jnz .scale mov eax, [ecx+Image.Height] cmp eax, [view.height] jnz .scale jmp .draw .scale: mov eax, [orig_image] cmp eax, [cur_image] jz @f invoke img.destroy, [cur_image] mov eax, [orig_image] @@: invoke img.scale, eax, 0, 0, [eax+Image.Width], [eax+Image.Height], 0, LIBIMG_SCALE_STRETCH, LIBIMG_INTER_DEFAULT, [view.width], [view.height] test eax, eax ;FIXME mov [cur_image], eax mov [cur_frame], eax ; FIXME index jmp .draw .scale_none: .draw: push [pict.top] push [pict.left] push [view.height] push [view.width] push [view_abs_top] ; ypos push [view_abs_left] ; xpos invoke img.draw, [cur_frame] .done: ret endp proc draw_scale_button pushad mcall 65, buttons+scalebtn*20, <20,20>, [scale_button_xy], 8, palette mov ebx, [scale_button_xy] add ebx, 0x00050006 ; print letter(s) corresponding to the current scaling mode mov edi, 2 mov [scale_button_letter], 'x1' cmp [scale_mode], LIBIMG_SCALE_NONE jz @f add ebx, 0x00020001 mov edi, 1 mov [scale_button_letter], 'W' ; cmp [scale_mode], LIBIMG_SCALE_FIT_MIN @@: mcall 4, , 0x800000ff, scale_button_letter popad ret endp proc draw_toolbar uses ebx esi edi cmp [toolbar.height], 0 jz .quit mov ebx, [toolbar_abs_left] shl ebx, 16 add ebx, [toolbar.width] inc ebx mov ecx, [toolbar_abs_top] shl ecx, 16 add ecx, [toolbar.height] mcall 13, , , [bg_color] mov ebx, [toolbar_abs_left] shl ebx, 16 add ebx, [toolbar_abs_left] add ebx, [toolbar.width] mov ecx, [toolbar_abs_top] shl ecx, 16 add ecx, [toolbar_abs_top] add ecx, (30 SHL 16)+30 mcall 38, , , 0x007F7F7F mov ebx, [toolbar_abs_left] shl ebx, 16 add ebx, [toolbar_abs_left] add ebx, ((5+25*1) SHL 16)+(5+25*1) mov ecx, [toolbar_abs_top] shl ecx, 16 add ecx, [toolbar_abs_top] add ecx, [toolbar.height] mcall add ebx, ((5+25*2) SHL 16)+(5+25*2) mcall add ebx, ((5+25*2) SHL 16)+(5+25*2) mcall add ebx, ((5+25*1) SHL 16)+(5+25*1) mcall mov ebx, [toolbar_abs_left] add ebx, [toolbar.width] sub ebx, 25*5+10 shl ebx, 16 add ebx, [toolbar_abs_left] add ebx, [toolbar.width] sub ebx, 25*5+10 mcall mov ebx, [toolbar_abs_left] shl ebx, 16 add ebx, ((4+25*0) SHL 16)+21 mov ecx, [toolbar_abs_top] shl ecx, 16 add ecx, (4 SHL 16)+21 mcall SF_DEFINE_BUTTON, , , 'opn'+40000000h add ebx, (5+25*1) SHL 16 mcall , , , 'bck'+40000000h add ebx, (0+25*1) SHL 16 mcall , , , 'fwd'+40000000h add ebx, (5+25*1) SHL 16 mcall , , , 'bgr'+40000000h add ebx, (0+25*1) SHL 16 mcall , , , 'sld'+40000000h add ebx, (5+25*1) SHL 16 mcall , , , 'scl'+40000000h mov ebx, [toolbar_abs_left] add ebx, [toolbar.width] sub ebx, 25*5+10 add ebx, 5 shl ebx, 16 mov bl, 21 mcall , , , 'flh'+40000000h add ebx, 25 SHL 16 mcall , , , 'flv'+40000000h add ebx, 30 SHL 16 mcall , , , 'rtr'+40000000h add ebx, 25 SHL 16 mcall , , , 'rtl'+40000000h add ebx, 25 SHL 16 mcall , , , 'flb'+40000000h mov ebp, (numimages-1)*20 mov edx, [toolbar_abs_left] shl edx, 16 add edx, [toolbar_abs_top] add edx, ((5+25*0) SHL 16)+5 mcall 65, buttons+openbtn *20, <20, 20>, , 8, palette add edx, ((5+25*1) SHL 16)+0 mcall , buttons+backbtn *20 add edx, ((0+25*1) SHL 16)+0 mcall , buttons+forwardbtn*20 add edx, ((5+25*1) SHL 16)+0 mcall , buttons+bgrbtn *20 add edx, ((0+25*1) SHL 16)+0 mcall , buttons+slidebtn *20 add edx, ((5+25*1) SHL 16)+0 ; mcall , buttons+scalebtn *20 mov [scale_button_xy], edx call draw_scale_button mov edx, [client_abs_left] add edx, [client.width] sub edx, 25*5+4 shl edx, 16 add edx, [client_abs_top] add edx, 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 .quit: ret endp proc draw_canvas push ebx esi edi mov ebx, [canvas_abs_left] shl ebx, 16 add ebx, [canvas.width] mov ecx, [canvas_abs_top] shl ecx, 16 add ecx, [view.top] ;mov edx, 0xff0000 mcall 13, , , [bg_color] mcall 13 mov ecx, [view_abs_top] add ecx, [view.height] shl ecx, 16 add ecx, [canvas.height] sub ecx, [view.top] sub ecx, [view.height] ;mov edx, 0x00ff00 mcall 13, , , [bg_color] mcall 13 mov ebx, [canvas_abs_left] shl ebx, 16 add ebx, [view.left] mov ecx, [canvas_abs_top] shl ecx, 16 add ecx, [canvas.height] ;mov edx, 0x0000ff ;bg_color mcall mov ebx, [view_abs_left] add ebx, [view.width] shl ebx, 16 mov eax, [canvas.width] sub eax, [view.left] sub ebx, [view.width] add ebx, eax ;mov edx, 0xffff00 ;bg_color mcall 13 @@: call draw_view pop edi esi ebx ret endp proc draw_client push ebx esi edi test [bShowToolbar], 1 jz .toolbar_done call draw_toolbar .toolbar_done: call draw_work pop edi esi ebx ret endp proc draw_work push ebx esi edi mov ebx, [work_abs_left] shl ebx, 16 add ebx, [work.width] inc ebx mov ecx, [work_abs_top] shl ecx, 16 add ecx, [canvas.top] ; mcall 13, , , 0xff0000 mcall 13, , , [bg_color] mov eax, [canvas.height] ror ecx, 16 add ecx, eax add ecx, [canvas_padding] ror ecx, 16 ; mcall 13, , , 0x00ff00 mcall 13, , , [bg_color] ; mcall 13 mov ebx, [work_abs_left] shl ebx, 16 add ebx, [canvas.left] mov ecx, [work_abs_top] add ecx, [canvas_padding] shl ecx, 16 add ecx, [canvas.height] ; mcall 13, , , 0x0000ff mcall 13, , , [bg_color] ; mcall mov eax, [canvas.width] ror ebx, 16 add ebx, eax add ebx, [canvas_padding] ror ebx, 16 ; mcall 13, , , 0xffff00 mcall 13, , , [bg_color] ; mcall 13 call draw_canvas call draw_onimage_decorations mov eax, 13 cmp [need_scrollbar_v], 1 jnz @f cmp [need_scrollbar_h], 1 jnz @f mov ebx, [work_abs_left] add ebx, [work.width] sub ebx, SCROLL_WIDTH_SIZE shl ebx, 16 add ebx, SCROLL_WIDTH_SIZE inc ebx mov ecx, [work_abs_top] add ecx, [work.height] sub ecx, SCROLL_WIDTH_SIZE shl ecx, 16 add ecx, SCROLL_WIDTH_SIZE inc ecx mov edx, [bg_color] ; mov edx, 0x00ffff mcall @@: cmp [need_scrollbar_v], 0 jz .v_scrollbar_done mov eax, [client.left] add eax, [client.width] sub eax, SCROLL_WIDTH_SIZE mov [scroll_bar_data_vertical.start_x], ax mov eax, [toolbar.height] add eax, [client.top] mov [scroll_bar_data_vertical.start_y], ax mov eax, [canvas.height] add eax, [canvas_padding] add eax, [canvas_padding] mov [scroll_bar_data_vertical.size_y], ax mov [scroll_bar_data_vertical.all_redraw], 1 invoke scrollbar_vert_draw, scroll_bar_data_vertical .v_scrollbar_done: cmp [need_scrollbar_h], 0 jz .h_scrollbar_done mov eax, [client.left] mov [scroll_bar_data_horizontal.start_x], ax mov eax, [client.top] add eax, [client.height] sub eax, SCROLL_WIDTH_SIZE mov [scroll_bar_data_horizontal.start_y], ax mov eax, [canvas.width] add eax, [canvas_padding] add eax, [canvas_padding] mov [scroll_bar_data_horizontal.size_x], ax mov [scroll_bar_data_horizontal.all_redraw], 1 invoke scrollbar_hort_draw, scroll_bar_data_horizontal .h_scrollbar_done: pop edi esi ebx ret endp proc draw_onimage_decorations bt [window_style], 25 jc @f ; draw fullscreen decorations on image call draw_filename call draw_fullscreen_controls @@: ret endp proc draw_filename push esi mcall 4, <100, 65>, 0x40ffffff, window_header, [window_header_len], 0x008800 pop esi ret endp proc draw_fullscreen_controls push esi mov ebx, [canvas.width] shr ebx, 1 add ebx, [canvas.left] sub ebx, 22 shl ebx, 16 add ebx, 20 mov ecx, [canvas.height] shr ecx, 3 neg ecx add ecx, [canvas.height] add ecx, [canvas.top] shl ecx, 16 add ecx, 20 mcall 8, , , 'bck'+40000000h add ebx, 25 SHL 16 mcall 8, , , 'fwd'+40000000h mov edx, [canvas.width] shr edx, 1 add edx, [canvas.left] sub edx, 22 shl edx, 16 add edx, [canvas.height] shr dx, 3 neg dx add dx, word[canvas.height] add edx, [canvas.top] mcall 65, buttons+backbtn*20, <20, 20>, , 8, palette add edx, 25 SHL 16 mcall 65, buttons+forwardbtn*20, , , 8, pop esi ret endp proc 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 endp 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 ; >edi = destination string ; >eax = number proc bin2dec push ebx ecx edx esi mov ebx, 10 xor ecx, ecx @@: xor edx, edx div ebx push edx inc ecx test eax, eax jnz @b @@: pop eax add eax, '0' stosb inc [window_header_len] dec ecx jnz @b pop esi edx ecx ebx ret endp ; fills window_header with window title ; window title is generated as '[k/n] - Kolibri Image Viewer' ; n = total files in dir ; k = current file index proc generate_window_header push eax ebx esi edi mov esi, [last_name_component] mov edi, window_header mov [window_header_len], 4 ; [,/,], mov byte[edi], '[' inc edi mov eax, [cur_file_idx] inc eax call bin2dec mov byte[edi], '/' inc edi mov eax, [directory_ptr] mov eax, [eax+4] call bin2dec mov word[edi], '] ' add edi, 2 ; add filename .next_symbol: lodsb test al, al jz @f stosb inc [window_header_len] cmp edi, window_header+256 jb .next_symbol .overflow: mov dword[edi-4], '...' .ret: pop edi esi ebx eax ret @@: mov esi, s_header @@: lodsb stosb test al, al jz .ret cmp edi, window_header+256 jb @b jmp .overflow endp proc scale_none_calc push ebx mov [scale_mode], LIBIMG_SCALE_NONE mov eax, [cur_image] cmp eax, [orig_image] jz @f invoke img.destroy, eax @@: mov eax, [orig_image] mov [cur_image], eax mov [cur_frame], eax mov ebx, eax mov [need_scrollbar_v], 0 mov [need_scrollbar_h], 0 mov eax, [ebx+Image.Width] cmp eax, [canvas.width] jbe @f sub [canvas.height], SCROLL_WIDTH_SIZE+1 mov [need_scrollbar_h], 1 @@: mov eax, [ebx+Image.Height] cmp eax, [canvas.height] jbe @f sub [canvas.width], SCROLL_WIDTH_SIZE+1 mov [need_scrollbar_v], 1 @@: cmp [need_scrollbar_h], 1 jz @f mov eax, [ebx+Image.Width] cmp eax, [canvas.width] jbe @f sub [canvas.height], SCROLL_WIDTH_SIZE+1 mov [need_scrollbar_h], 1 @@: mov eax, [ebx+Image.Width] cmp eax, [canvas.width] jbe @f mov eax, [canvas.width] @@: mov [view.width], eax mov [pict.width], eax mov eax, [ebx+Image.Height] cmp eax, [canvas.height] jbe @f mov eax, [canvas.height] @@: mov [view.height], eax mov [pict.height], eax mov eax, [canvas.width] sub eax, [view.width] sar eax, 1 mov [view.left], eax mov eax, [canvas.height] sub eax, [view.height] sar eax, 1 mov [view.top], eax mov eax, [ebx+Image.Width] sub eax, [pict.width] sar eax, 1 mov [pict.left], eax mov eax, [ebx+Image.Height] sub eax, [pict.height] sar eax, 1 mov [pict.top], eax mov eax, [ebx+Image.Height] mov [scroll_bar_data_vertical.max_area], eax mov eax, [pict.height] mov [scroll_bar_data_vertical.cur_area], eax mov eax, [pict.top] mov [scroll_bar_data_vertical.position], eax mov eax, [ebx+Image.Width] mov [scroll_bar_data_horizontal.max_area], eax mov eax, [pict.width] mov [scroll_bar_data_horizontal.cur_area], eax mov eax, [pict.left] mov [scroll_bar_data_horizontal.position], eax pop ebx ret endp proc scale_fit_min_calc push ebx mov [need_scrollbar_v], 0 mov [need_scrollbar_h], 0 mov [scroll_bar_data_vertical.position], 0 mov [scroll_bar_data_horizontal.position], 0 mov eax, [orig_image] cmp [eax+Image.Type], Image.bpp24 jz @f cmp [eax+Image.Type], Image.bpp32 jz @f cmp [eax+Image.Type], Image.bpp8g jz @f invoke img.convert, eax, 0, Image.bpp24, 0, 0 test eax, eax ; jz .error push eax invoke img.destroy, [orig_image] pop eax mov [orig_image], eax mov [cur_image], eax mov [cur_frame], eax @@: mov eax, [orig_image] mov ecx, [eax+Image.Height] mov eax, [eax+Image.Width] cmp eax, [canvas.width] ja .get_size cmp ecx, [canvas.height] ja .get_size jmp .got_size .get_size: invoke img.get_scaled_size, eax, ecx, LIBIMG_SCALE_FIT_MIN, [canvas.width], [canvas.height] .got_size: mov [pict.top], 0 mov [pict.left], 0 cmp eax, [canvas.width] jbe @f mov eax, [canvas.width] @@: mov [view.width], eax mov [pict.width], eax neg eax add eax, [canvas.width] shr eax, 1 mov [view.left], eax mov eax, ecx cmp eax, [canvas.height] jbe @f mov eax, [canvas.height] @@: mov [view.height], eax mov [pict.height], eax neg eax add eax, [canvas.height] shr eax, 1 mov [view.top], eax pop ebx ret endp ; eax: new scaling mode ; z/Z - not/changed proc set_scale_mode cmp eax, [scale_mode] mov [scale_mode], eax setnz [bScaleModeChanged] ret endp proc move_pictport _dx, _dy locals new_left dd ? new_top dd ? endl push ebx ecx mov ebx, [cur_image] .x: mov eax, [pict.left] add eax, [_dx] cmp eax, 0 jge @f mov [new_left], 0 jmp .xdone @@: mov ecx, eax add eax, [pict.width] cmp eax, [ebx+Image.Width] ja @f mov [new_left], ecx jmp .xdone @@: mov eax, [ebx+Image.Width] sub eax, [pict.width] mov [new_left], eax jmp .xdone .xdone: .y: mov eax, [pict.top] add eax, [_dy] cmp eax, 0 jge @f mov [new_top], 0 jmp .ydone @@: mov ecx, eax add eax, [pict.height] cmp eax, [ebx+Image.Height] ja @f mov [new_top], ecx jmp .ydone @@: mov eax, [ebx+Image.Height] sub eax, [pict.height] mov [new_top], eax jmp .ydone .ydone: xor eax, eax mov ecx, [new_left] mov edx, [new_top] cmp ecx, [pict.left] setnz al shl eax, 8 cmp edx, [pict.top] setnz al mov [pict.left], ecx mov [pict.top], edx pop ecx ebx ret endp proc update_scrollbars _xxhv mov eax, [_xxhv] test ah, ah jz .no_h_scroll push eax mov [scroll_bar_data_horizontal.all_redraw], 0 mov eax, [pict.left] mov [scroll_bar_data_horizontal.position], eax invoke scrollbar_hort_draw, scroll_bar_data_horizontal pop eax .no_h_scroll: test al, al jz .no_v_scroll push eax mov [scroll_bar_data_vertical.all_redraw], 0 mov eax, [pict.top] mov [scroll_bar_data_vertical.position], eax invoke scrollbar_vert_draw, scroll_bar_data_vertical pop eax .no_v_scroll: ret endp proc merge_icons_to_single_img _img push ebx esi edi mov edx, [_img] mov eax, [edx+Image.Width] mov ecx, [edx+Image.Height] .next: cmp [edx+Image.Next], 0 jz .got_sizes inc eax mov edx, [edx+Image.Next] add eax, [edx+Image.Width] cmp ecx, [edx+Image.Height] jae @f mov ecx, [edx+Image.Height] @@: jmp .next .got_sizes: invoke img.create, eax, ecx, Image.bpp32 test eax, eax jz .error mov ebx, eax mov eax, [bg_color] mov edi, [ebx+Image.Data] mov ecx, [ebx+Image.Width] imul ecx, [ebx+Image.Height] rep stosd mov eax, [_img] cmp [eax+Image.Type], Image.bpp32 jz @f invoke img.convert, eax, 0, Image.bpp32, 0, 0 test eax, eax jz .error push eax invoke img.destroy, [_img] pop eax @@: mov esi, eax xor edi, edi .next_img: stdcall put_img_on_img, ebx, esi, edi, 0 add edi, [esi+Image.Width] inc edi cmp [esi+Image.Next], 0 jz @f mov esi, [esi+Image.Next] jmp .next_img @@: invoke img.destroy, esi mov eax, ebx jmp .quit .error: xor eax, eax .quit: pop edi esi ebx ret endp proc put_img_on_img _bottom, _top, _x, _y locals img_height dd ? endl push ebx esi edi mov ebx, [_bottom] mov edx, [_top] mov eax, [edx+Image.Height] mov [img_height], eax mov esi, [edx+Image.Data] mov edi, [ebx+Image.Data] mov eax, [_y] imul eax, [ebx+Image.Width] add eax, [_x] shl eax, 2 add edi, eax .next_line: mov ecx, [edx+Image.Width] rep movsd mov eax, [ebx+Image.Width] sub eax, [edx+Image.Width] shl eax, 2 add edi, eax dec [img_height] jnz .next_line pop edi esi ebx ret endp proc copy_box _src, _dst pushad mov esi, [_src] mov edi, [_dst] mov ecx, 4 rep movsd popad ret endp proc cmp_box _a, _b pushad mov esi, [_a] mov edi, [_b] mov ecx, 4 rep cmpsd popad ret endp proc recalc_client stdcall copy_box, toolbar, toolbar_prev mov [toolbar.left], 0 mov [toolbar.top], 0 mov eax, [client.width] mov [toolbar.width], eax mov [toolbar.height], 0 cmp [bShowToolbar], 1 jnz @f mov [toolbar.height], TOOLBAR_HEIGHT @@: mov eax, [toolbar.top] add eax, [client_abs_top] mov [toolbar_abs_top], eax mov eax, [toolbar.left] add eax, [client_abs_left] mov [toolbar_abs_left], eax test [bFirstWinDraw], 1 jnz .recalc_toolbar stdcall cmp_box, toolbar, toolbar_prev jnz .recalc_toolbar test [bNewImage], 1 jnz .recalc_toolbar jmp .recalc_toolbar_done .recalc_toolbar: stdcall recalc_toolbar .recalc_toolbar_done: stdcall copy_box, work, work_prev xor ecx, ecx test [bShowToolbar], 1 jz @f mov ecx, [toolbar.height] @@: mov eax, ecx mov [work.top], eax mov eax, [client.height] sub eax, ecx mov [work.height], eax mov [work.left], 0 mov eax, [client.width] mov [work.width], eax mov eax, [work.top] add eax, [client_abs_top] mov [work_abs_top], eax mov eax, [work.left] add eax, [client_abs_left] mov [work_abs_left], eax test [bFirstWinDraw], 1 jnz .recalc_work test [bNewImage], 1 jnz .recalc_work stdcall cmp_box, work, work_prev jnz .recalc_work jmp .recalc_work_done .recalc_work: stdcall recalc_work .recalc_work_done: ret endp proc recalc_toolbar ret endp proc recalc_window stdcall copy_box, client, client_prev test [bSlideShow], 1 jz .no_slide_show .slide_show: mov [client.left], 0 mov [client.top], 0 mov eax, [procinfo.box.width] mov [client.width], eax mov eax, [procinfo.box.height] mov [client.height], eax jmp .calc_abs .no_slide_show: mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT mov [client.top], eax neg eax add eax, [procinfo.box.height] sub eax, 5 mov [client.height], eax mov [client.left], 5 mov eax, [procinfo.box.width] sub eax, 10 mov [client.width], eax .calc_abs: mov eax, [client.top] mov [client_abs_top], eax mov eax, [client.left] mov [client_abs_left], eax stdcall cmp_box, client, client_prev jnz .recalc_client test [bNewImage], 1 jnz .recalc_client test [bToggleToolbar], 1 jnz .recalc_client jmp .recalc_client_done .recalc_client: stdcall recalc_client .recalc_client_done: ret endp proc recalc_work stdcall copy_box, canvas, canvas_prev mov eax, [work.left] add eax, [canvas_padding] mov [canvas.left], eax mov eax, [work.width] sub eax, [canvas_padding] sub eax, [canvas_padding] inc eax mov [canvas.width], eax mov eax, [canvas_padding] mov [canvas.top], eax mov eax, [work.height] sub eax, [canvas_padding] sub eax, [canvas_padding] inc eax mov [canvas.height], eax mov eax, [canvas.top] add eax, [work_abs_top] mov [canvas_abs_top], eax mov eax, [canvas.left] add eax, [work_abs_left] mov [canvas_abs_left], eax test [bFirstWinDraw], 1 jnz .recalc_canvas test [bNewImage], 1 jnz .recalc_canvas stdcall cmp_box, canvas, canvas_prev jnz .recalc_canvas cmp [bScaleModeChanged], 0 jnz .recalc_canvas jmp .recalc_canvas_done .recalc_canvas: stdcall recalc_canvas .recalc_canvas_done: ret endp proc recalc_canvas stdcall copy_box, view, view_prev mov eax, [scale_mode] call [scale_mode_calc+eax*4] mov eax, [view.top] add eax, [canvas_abs_top] mov [view_abs_top], eax mov eax, [view.left] add eax, [canvas_abs_left] mov [view_abs_left], eax ret endp ;----------------------------------------------------------------------------- DATA s_header db ' - Kolibri Image Viewer',0 window_style dd 0x53FFFFFF window BOX 100, 150, 0, 0 ; left top width height window_prev BOX 0, 0, 0, 0 window_save BOX 0, 0, 0, 0 ; restore after slide show client BOX 0, 0, 0, 0 client_prev BOX 0, 0, 0, 0 client_abs_top dd ? client_abs_left dd ? toolbar BOX 0, 0, 0, 0 toolbar_prev BOX 0, 0, 0, 0 toolbar_abs_top dd ? toolbar_abs_left dd ? work BOX 0, 0, 0, 0 work_prev BOX 0, 0, 0, 0 work_abs_top dd ? work_abs_left dd ? canvas BOX 0, 0, 0, 0 canvas_prev BOX 0, 0, 0, 0 canvas_abs_top dd ? canvas_abs_left dd ? view BOX -1, -1, 0, 0 view_prev BOX -1, -1, 0, 0 view_abs_top dd ? view_abs_left dd ? pict BOX 0, 0, 0, 0 canvas_padding dd 5 bg_color dd 0x00ffffff scale_mode dd LIBIMG_SCALE_FIT_MIN pict_drag dd 0 scroll_v_drag dd 0 scroll_h_drag dd 0 mouse_buttons dd 0 mouse_pos dd 0 need_scrollbar_v dd 0 need_scrollbar_h dd 0 pict_moved dd 0 ;----------------------------------------------------------------------------- align 4 scroll_bar_data_vertical: .x: .size_x dw SCROLL_WIDTH_SIZE .start_x dw 1 .y: .size_y dw 100 .start_y dw 0 .btn_high dd SCROLL_WIDTH_SIZE .type dd 0 ;+12 .max_area dd 100 ;+16 .cur_area dd 10 ;+20 .position dd 0 ;+24 .bckg_col dd 0xAAAAAA ;+28 .frnt_col dd 0xCCCCCC ;+32 .line_col dd 0 ;+36 .redraw dd 0 ;+40 .delta dw 0 ;+44 .delta2 dw 0 ;+46 .run_x: .r_size_x dw 0 ;+48 .r_start_x dw 0 ;+50 .run_y: .r_size_y dw 0 ;+52 .r_start_y dw 0 ;+54 .m_pos dd 0 ;+56 .m_pos_2 dd 0 ;+60 .m_keys dd 0 ;+64 .run_size dd 0 ;+68 .position2 dd 0 ;+72 .work_size dd 0 ;+76 .all_redraw dd 0 ;+80 .ar_offset dd KEY_MOVE_PIXELS ;+84 ;----------------------------------------------------------------------------- align 4 scroll_bar_data_horizontal: .x: .size_x dw 0 ;+0 .start_x dw 0 ;+2 .y: .size_y dw SCROLL_WIDTH_SIZE ;+4 .start_y dw 0 ;+6 .btn_high dd SCROLL_WIDTH_SIZE ;+8 .type dd 0 ;+12 .max_area dd 50 ;+16 .cur_area dd 50 ;+20 .position dd 0 ;+24 .bckg_col dd 0xAAAAAA ;+28 .frnt_col dd 0xCCCCCC ;+32 .line_col dd 0 ;+36 .redraw dd 0 ;+40 .delta dw 0 ;+44 .delta2 dw 0 ;+46 .run_x: .r_size_x dw 0 ;+48 .r_start_x dw 0 ;+50 .run_y: .r_size_y dw 0 ;+52 .r_start_y dw 0 ;+54 .m_pos dd 0 ;+56 .m_pos_2 dd 0 ;+60 .m_keys dd 0 ;+64 .run_size dd 0 ;+68 .position2 dd 0 ;+72 .work_size dd 0 ;+76 .all_redraw dd 0 ;+80 .ar_offset dd KEY_MOVE_PIXELS ;+84 ;----------------------------------------------------------------------------- align 4 @IMPORT: library \ libgfx , 'libgfx.obj' , \ libimg , 'libimg.obj' , \ libini , 'libini.obj' , \ sort , 'sort.obj' , \ proc_lib, 'proc_lib.obj', \ box_lib , 'box_lib.obj' 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.from_file , 'img_from_file' , \ img.to_rgb2 , 'img_to_rgb2' , \ img.create , 'img_create' , \ img.flip , 'img_flip' , \ img.rotate , 'img_rotate' , \ img.destroy , 'img_destroy' , \ img.scale , 'img_scale' , \ img.get_scaled_size, 'img_get_scaled_size', \ img.convert , 'img_convert' , \ img.draw , 'img_draw' import libini , \ ini_get_shortcut, 'ini_get_shortcut', \ ini_get_int, 'ini_get_int',\ ini_set_int, 'ini_set_int',\ 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 box_lib ,\ scrollbar_vert_draw , 'scrollbar_v_draw' ,\ scrollbar_vert_mouse, 'scrollbar_v_mouse',\ scrollbar_hort_draw , 'scrollbar_h_draw' ,\ scrollbar_hort_mouse, 'scrollbar_h_mouse' bFirstWinDraw db 1 bSlideShow db 0 bToggleSlideShow db 0 bShowToolbar db 1 bShowToolbarSave db 0 ; to restore state when return from slide show bToggleToolbar db 0 bScaleModeChanged db 0 bNewImage db 0 ;----------------------------------------------------------------------------- virtual at 0 file 'kivicons.bmp':0xA,4 load offbits dword from 0 end virtual numimages = 11 openbtn = 0 backbtn = 1 forwardbtn = 2 bgrbtn = 3 fliphorzbtn = 4 flipvertbtn = 5 rotcwbtn = 6 rotccwbtn = 7 rot180btn = 8 slidebtn = 9 scalebtn = 10 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 aKivSection db 'Kiv',0 aNext db 'Next',0 aPrev db 'Prev',0 aSlide db 'SlideShow',0 aTglbar db 'ToggleBar',0 aWinX db 'WinX',0 aWinY db 'WinY',0 aWinW db 'WinW',0 aWinH db 'WinH',0 inifileeskin db '/sys/settings/system.ini',0 amain db 'style',0 aprogram db 'bg_program',0 aparam db 'bg_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_path dd temp_dir_path ; +16 .dir_default_path dd communication_area_default_path ; +20 .start_path dd open_dialog_path ; +24 .draw_window dd draw_window ; +28 .status dd 0 ; +32 .openfile_path dd path ; openfile_path ; +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_path: 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 'PPM',0 db 'TIF',0 db 'TIFF',0 db 'WBMP',0 db 'WEBP',0 db 'XBM',0 .end: db 0 draw_window_fake: ret ;------------------------------------------------------------------------------ scale_mode_calc dd scale_none_calc, 0, 0, 0, scale_fit_min_calc scale_none_mod dd 0 scale_none_key dd 13 ; '=' scale_fit_min_mod dd 0 scale_fit_min_key dd 17 ; 'w' move_pictport_left_1_mod dd 0 move_pictport_left_1_key dd 35 ; 'h' move_pictport_left_2_mod dd 0 move_pictport_left_2_key dd 75 ; arrow left move_pictport_right_1_mod dd 0 move_pictport_right_1_key dd 38 ; 'l' move_pictport_right_2_mod dd 0 move_pictport_right_2_key dd 77 ; arrow right move_pictport_up_1_mod dd 0 move_pictport_up_1_key dd 37 ; 'k' move_pictport_up_2_mod dd 0 move_pictport_up_2_key dd 72 ; arrow up move_pictport_down_1_mod dd 0 move_pictport_down_1_key dd 36 ; 'j' move_pictport_down_2_mod dd 0 move_pictport_down_2_key dd 80 ; arrow down ;shift_left_down_mod ;include_debug_strings readdir_fileinfo: dd 1 dd 0 dd 0 readblocks dd 0 directory_ptr dd 0 curdir rb 1024 ;------------------------------------------------------------------------------ I_END: align 4 img_data_len rd 1 fh rd 1 orig_image rd 1 cur_image rd 1 files_num rd 1 cur_file_idx rd 1 cur_frame_time rd 1 cur_frame rd 1 next_mod rd 1 next_key rd 1 prev_mod rd 1 prev_key rd 1 slide_mod rd 1 slide_key rd 1 tglbar_mod rd 1 tglbar_key rd 1 last_name_component rd 1 toolbar.height_old rd 1 procinfo process_information scale_button_xy dd ? scale_button_letter dd ? ; i.e. 'x1',0 align 16 path rb 4096 window_header rb 256 window_header_len rd 1 __params rb 4096 ;--------------------------------------------------------------------- sys_path rb 1024 temp_dir_path: rb 4096 ;--------------------------------------------------------------------- rb 4096 stacktop: ;--------------------------------------------------------------------- E_END: