From 5a520e0752797a64ef8850590dc5054e447b16c1 Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Mon, 4 May 2020 00:27:28 +0000 Subject: [PATCH] kiv: Add a button to switch scaling modes. Two scaling modes (fit to the window, no scaling) were implemented some time ago. One can switch them with not obvious shortcuts 'w' and '=' (like in sxiv). This commit adds a button to the toolbar to do the same. Also, the window title now mentions the number of supported images in the current directory, not the total number of files in it. Align code to the kernel style guide. git-svn-id: svn://kolibrios.org@7860 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/media/kiv/trunk/kiv.asm | 665 +++++++++++++------------- programs/media/kiv/trunk/kivicons.bmp | Bin 5078 -> 5478 bytes 2 files changed, 342 insertions(+), 323 deletions(-) diff --git a/programs/media/kiv/trunk/kiv.asm b/programs/media/kiv/trunk/kiv.asm index 1eebb5dd91..1a2228dd72 100644 --- a/programs/media/kiv/trunk/kiv.asm +++ b/programs/media/kiv/trunk/kiv.asm @@ -26,7 +26,7 @@ KEY_MOVE_PIXELS = 50 SCROLL_WIDTH_SIZE = 15 AR_OFFSET = 10 -MIN_WINDOW_WIDTH = 50 + 25*numimages +MIN_WINDOW_WIDTH = 50+25*numimages MIN_WINDOW_HEIGHT = 100 TOOLBAR_HEIGHT = 31 CANVAS_PADDING = 5 @@ -59,7 +59,7 @@ START: mov ecx, 4096/4 rep movsd mov byte[edi-1], 0 - @@: +@@: ; OpenDialog initialisation push dword OpenDialog_data call [OpenDialog_Init] @@ -97,7 +97,7 @@ START: set_bgr: mcall SF_BACKGROUND_SET, SSF_MODE_BG - stdcall load_image, __params + 4 + stdcall load_image, __params+4 jc exit call set_as_bgr jmp exit @@ -119,32 +119,32 @@ redraw_all: still: mov eax, [orig_image] - test [eax + Image.Flags], Image.IsAnimated + 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] + add ebx, [edx+Image.Delay] sub ebx, eax - cmp ebx, [edx + Image.Delay] + 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: +.wait_event: mcall dec eax jns @f call red_update_frame jmp still - @@: +@@: jz redraw_all dec eax jz key @@ -152,6 +152,10 @@ still: 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 @@ -169,7 +173,7 @@ mouse: jz @f call draw_view call draw_onimage_decorations - @@: +@@: ; check for scroll mcall SF_MOUSE_GET, SSF_SCROLL_DATA @@ -182,7 +186,7 @@ mouse: stdcall move_pictport, eax, ecx mov [pict_moved], eax jmp .mouse_done - .no_scroll: +.no_scroll: ; get cursor coordinates in window mcall SF_MOUSE_GET, SSF_WINDOW_POSITION @@ -190,7 +194,7 @@ mouse: cmp ebx, 0 jge @f add eax, 0x10000 - @@: +@@: mov ecx, [mouse_pos] cmp eax, ecx jz .no_mouse_move @@ -208,7 +212,7 @@ mouse: stdcall move_pictport, eax, ebx mov [pict_moved], eax jmp .no_mouse_move - .no_mouse_move: +.no_mouse_move: ; check buttons mcall SF_MOUSE_GET, SSF_BUTTON @@ -219,10 +223,10 @@ mouse: jz .left_button_handled test eax, 0x01 jnz .left_button_down - .left_button_up: +.left_button_up: mov [pict_drag], 0 jmp .left_button_handled - .left_button_down: +.left_button_down: mov ecx, [mouse_pos] movzx edx, cx sar ecx, 16 @@ -242,17 +246,17 @@ mouse: jl .left_click_pict_done mov [pict_drag], 1 jmp .left_button_handled - .left_click_pict_done: +.left_click_pict_done: - .left_button_handled: - .mouse_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: +.done: jmp still key: @@ -267,106 +271,106 @@ keyloop: mov edx, next_mod call check_shortcut jz .next - add edx, prev_mod - next_mod + add edx, prev_mod-next_mod call check_shortcut jz .prev - add edx, slide_mod - prev_mod + add edx, slide_mod-prev_mod call check_shortcut jz .slide - add edx, tglbar_mod - slide_mod + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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: +.esc: test [bSlideShow], 1 jz keyloop jmp .slide - .tglbar: +.tglbar: bt [window_style], 25 jnc @f mov [bToggleToolbar], 1 xor [bShowToolbar], 1 - @@: +@@: jmp keyloop - .slide: +.slide: call slide_show jmp keyloop - .set_scale_none: +.set_scale_none: mov eax, LIBIMG_SCALE_NONE call set_scale_mode jz @f call recalc_canvas - @@: +@@: jmp keyloop - .set_scale_fit_min: +.set_scale_fit_min: mov eax, LIBIMG_SCALE_FIT_MIN call set_scale_mode jz @f call recalc_work - @@: +@@: jmp keyloop - .move_pictport_left: +.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: +.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: +.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: +.move_pictport_down: stdcall move_pictport, 0, KEY_MOVE_PIXELS stdcall update_scrollbars, eax call draw_view call draw_onimage_decorations jmp keyloop - .prev: +.prev: dec esi jmp keyloop - .next: +.next: inc esi jmp keyloop keyloopdone: @@ -390,11 +394,11 @@ next_or_prev_handler: red_update_frame: mov eax, [cur_frame] - mov eax, [eax + Image.Next] + 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 @@ -413,12 +417,12 @@ button: 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: +.not_flh: cmp eax, 'flv' jnz .not_flv @@ -426,12 +430,12 @@ button: 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: +.not_flv: cmp eax, 'flb' jnz .not_flb @@ -439,28 +443,28 @@ button: 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: +.not_flb: cmp eax, 'rtl' jnz .not_rtl push ROTATE_90_CCW - .rotate_common: +.rotate_common: mov eax, [cur_image] cmp eax, [orig_image] jz @f invoke img.destroy, [cur_image] mov [cur_image], 0 - @@: +@@: invoke img.rotate, [orig_image] jmp redraw_all ; rotate right - .not_rtl: +.not_rtl: cmp eax, 'rtr' jnz .not_rtr @@ -468,7 +472,7 @@ button: jmp .rotate_common ; open new file - .not_rtr: +.not_rtr: cmp eax, 'opn' jnz @f @@ -497,12 +501,12 @@ button: call free_directory jmp redraw_all - .restore_old: +.restore_old: pop eax jmp still ; set background - @@: +@@: cmp eax, 'bgr' jnz @f @@ -510,14 +514,27 @@ button: 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 @@ -539,24 +556,24 @@ proc load_image _filename jz .error mov ebx, eax - test [eax + Image.Flags], Image.IsAnimated + test [eax+Image.Flags], Image.IsAnimated jnz @f - cmp [eax + Image.Next], 0 + 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: +.error_destroy: invoke img.destroy, ebx xor eax, eax - .error: +.error: stc - .exit: +.exit: pop edi esi ebx ret endp @@ -565,41 +582,41 @@ 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 + mov edx, [eax+Image.Width] + test [eax+Image.Flags], Image.IsAnimated jnz .not_in_row push eax - @@: - cmp [eax + Image.Next], 0 +@@: + cmp [eax+Image.Next], 0 jz @f - mov eax, [eax + Image.Next] - add edx, [eax + Image.Width] + mov eax, [eax+Image.Next] + add edx, [eax+Image.Width] inc edx jmp @b - @@: +@@: pop eax - .not_in_row: +.not_in_row: mov [pict.width], edx add edx, 19 - cmp edx, 50 + 25*numimages + cmp edx, 50+25*numimages jae @f - mov edx, 50 + 25*numimages - @@: - mov esi, [eax + Image.Height] - test [eax + Image.Flags], Image.IsAnimated + 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 +@@: + cmp [eax+Image.Next], 0 jz @f - mov eax, [eax + Image.Next] - cmp esi, [eax + Image.Height] + mov eax, [eax+Image.Next] + cmp esi, [eax+Image.Height] jae @b - mov esi, [eax + Image.Height] + mov esi, [eax+Image.Height] jmp @b - @@: +@@: pop eax - .max_equals_first: +.max_equals_first: mov [pict.height], esi ret endp @@ -608,8 +625,8 @@ endp ; in: [orig_image] proc set_as_bgr mov esi, [orig_image] - mov ecx, [esi + Image.Width] - mov edx, [esi + Image.Height] + 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 @@ -620,7 +637,7 @@ proc set_as_bgr pop ecx mcall SF_BACKGROUND_SET, SSF_UNMAP_BG - @@: +@@: mcall SF_BACKGROUND_SET, SSF_REDRAW_BG ; save to file eskin.ini xor al, al @@ -641,7 +658,7 @@ proc set_as_bgr rep movsd cld mov dword[__params], '\S__' - @@: +@@: xor al, al mov ecx, 4096 mov edi, __params @@ -664,7 +681,7 @@ proc slide_show mov [bg_color], 0x00ffffff mcall SF_CHANGE_WINDOW, [window_save.left], [window_save.top], [window_save.width], [window_save.height] jmp .done - .to_fullscreen: +.to_fullscreen: stdcall copy_box, window, window_save movzx eax, [bShowToolbar] mov [bShowToolbarSave], al @@ -680,14 +697,14 @@ proc slide_show mov eax, LIBIMG_SCALE_FIT_MIN call set_scale_mode - .done: +.done: pop edi esi ebx ret endp ; seek to ESI image files -; esi>0 means next file, esi<0 - prev file +; esi>0 means next file, esi<0-prev file proc next_or_prev_image locals files_cnt dd ? @@ -710,32 +727,32 @@ endl 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: +.scanloop: push eax esi imul esi, eax, 304 add esi, [directory_ptr] - add esi, 32 + 40 + 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 @@ -749,11 +766,11 @@ endl pop esi stdcall load_image, curdir pushfd - @@: +@@: lodsb test al, al jnz @b - @@: +@@: dec esi cmp byte[esi], '/' jnz @b @@ -763,29 +780,29 @@ endl jnc .loadedok test esi, esi js .try_prev - .try_next: +.try_next: inc eax cmp eax, [files_cnt] jb @f xor eax, eax - @@: - .try_common: +@@: +.try_common: cmp eax, [file_idx] jz .notfound jmp .scanloop - .try_prev: +.try_prev: dec eax jns @f mov eax, [files_cnt] dec eax - @@: +@@: jmp .try_common - .loadedok: +.loadedok: mov [cur_file_idx], eax - .ret: +.ret: pop edi esi ebx ret - .notfound: +.notfound: pop edi esi ebx ret endp @@ -801,13 +818,13 @@ load_directory: 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+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 @@ -824,26 +841,26 @@ load_directory: jz free_directory mov [directory_ptr], eax mcall 70, readdir_fileinfo - .dirok: +.dirok: cmp ebx, 0 jle free_directory mov eax, [directory_ptr] - mov edi, [eax + 8] ; total number of files + mov edi, [eax+8] ; total number of files mov [files_num], edi add eax, 32 ; skip header mov edi, eax push 0 - .dirskip: +.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 @@ -886,7 +903,7 @@ load_directory: jz .copy cmp ecx, 'xbm' jz .copy - .not_3: +.not_3: cmp byte[esi+4], 0 jnz .nocopy or ecx, 0x20202020 @@ -898,16 +915,16 @@ load_directory: jz @f cmp ecx, 'jpeg' jnz .nocopy - @@: +@@: cmp byte[esi+4], 0 jnz .nocopy - .copy: +.copy: mov esi, [esp] mov ecx, 304 / 4 rep movsd inc dword[esp+4] - .nocopy: - .noext: +.nocopy: +.noext: pop eax add eax, 304 dec ebx @@ -924,8 +941,8 @@ load_directory: call [SortDir] xor eax, eax mov edi, [directory_ptr] - add edi, 32 + 40 ; name - .scan: + add edi, 32+40 ; name +.scan: mov esi, [last_name_component] push edi invoke strcmpi @@ -936,9 +953,9 @@ load_directory: dec ebx jnz .scan or eax, -1 - .found: +.found: mov [cur_file_idx], eax - .ret: +.ret: ret free_directory: @@ -951,25 +968,24 @@ free_directory: ; 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 _img - push ebx edx +proc init_frame uses ebx edx, _img mov eax, [orig_image] cmp eax, [_img] jz .exit @@ -978,26 +994,25 @@ proc init_frame _img cmp eax, [cur_image] jz @f invoke img.destroy, [orig_image] - @@: +@@: invoke img.destroy, [cur_image] - .freed: +.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 + 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: - pop edx ebx +.exit: ret endp @@ -1014,22 +1029,22 @@ proc draw_window 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: +.min_size_ok: test [bNewImage], 1 jz @f call generate_window_header - @@: +@@: mcall SF_REDRAW, SSF_BEGIN_DRAW mov ecx, [window.top] shl ecx, 16 @@ -1061,12 +1076,12 @@ proc draw_window jnz .recalc jmp .recalc_done - .recalc: +.recalc: stdcall recalc_window - .recalc_done: +.recalc_done: stdcall draw_client - .nodraw: +.nodraw: mcall SF_REDRAW, SSF_END_DRAW mov [bFirstWinDraw], 0 mov [bNewImage], 0 @@ -1077,35 +1092,34 @@ proc draw_window endp -proc draw_view - push ebx esi edi +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] + mov eax, [ecx+Image.Width] cmp eax, [view.width] jnz .scale - mov eax, [ecx + Image.Height] + mov eax, [ecx+Image.Height] cmp eax, [view.height] jnz .scale jmp .draw - .scale: +.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] +@@: + 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: +.scale_none: - .draw: +.draw: push [pict.top] push [pict.left] push [view.height] @@ -1113,15 +1127,31 @@ proc draw_view push [view_abs_top] ; ypos push [view_abs_left] ; xpos invoke img.draw, [cur_frame] - .done: - pop edi esi ebx +.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, , 0x800100ff, scale_button_letter + popad + ret +endp -proc draw_toolbar - push ebx esi edi - +proc draw_toolbar uses ebx esi edi cmp [toolbar.height], 0 jz .quit mov ebx, [toolbar_abs_left] @@ -1139,48 +1169,52 @@ proc draw_toolbar mov ecx, [toolbar_abs_top] shl ecx, 16 add ecx, [toolbar_abs_top] - add ecx, (30 SHL 16) + 30 + 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) + 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) + add ebx, ((5+25*2) SHL 16)+(5+25*2) mcall - add ebx, ((5 + 25 * 2) SHL 16) + (5 + 25 * 2) + 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 + sub ebx, 25*5+10 shl ebx, 16 add ebx, [toolbar_abs_left] add ebx, [toolbar.width] - sub ebx, 25 * 5 + 10 + sub ebx, 25*5+10 mcall mov ebx, [toolbar_abs_left] shl ebx, 16 - add ebx, ((4 + 25 * 0) SHL 16) + 21 + add ebx, ((4+25*0) SHL 16)+21 mov ecx, [toolbar_abs_top] shl ecx, 16 - add ecx, (4 SHL 16) + 21 + add ecx, (4 SHL 16)+21 mcall SF_DEFINE_BUTTON, , , 'opn'+40000000h - add ebx, (5 + 25 * 1) SHL 16 + add ebx, (5+25*1) SHL 16 mcall , , , 'bck'+40000000h - add ebx, (0 + 25 * 1) SHL 16 + add ebx, (0+25*1) SHL 16 mcall , , , 'fwd'+40000000h - add ebx, (5 + 25 * 1) SHL 16 + add ebx, (5+25*1) SHL 16 mcall , , , 'bgr'+40000000h - add ebx, (0 + 25 * 1) SHL 16 + 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 + sub ebx, 25*5+10 add ebx, 5 shl ebx, 16 mov bl, 21 @@ -1199,34 +1233,37 @@ proc draw_toolbar 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*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 + sub edx, 25*5+4 shl edx, 16 add edx, [client_abs_top] add edx, 5 mcall , buttons+fliphorzbtn*20 - add edx, 25 * 65536 + add edx, 25*65536 mcall , buttons+flipvertbtn*20 - add edx, 30 * 65536 + add edx, 30*65536 mcall , buttons+rotcwbtn*20 - add edx, 25 * 65536 + add edx, 25*65536 mcall , buttons+rotccwbtn*20 - add edx, 25 * 65536 + add edx, 25*65536 mcall , buttons+rot180btn*20 - .quit: - pop edi esi ebx +.quit: ret endp @@ -1271,7 +1308,7 @@ proc draw_canvas ;mov edx, 0xffff00 ;bg_color mcall 13 - @@: +@@: call draw_view @@ -1286,7 +1323,7 @@ proc draw_client test [bShowToolbar], 1 jz .toolbar_done call draw_toolbar - .toolbar_done: +.toolbar_done: call draw_work pop edi esi ebx @@ -1357,7 +1394,7 @@ proc draw_work mov edx, [bg_color] ; mov edx, 0x00ffff mcall - @@: +@@: cmp [need_scrollbar_v], 0 jz .v_scrollbar_done @@ -1374,7 +1411,7 @@ proc draw_work 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: +.v_scrollbar_done: cmp [need_scrollbar_h], 0 jz .h_scrollbar_done @@ -1390,7 +1427,7 @@ proc draw_work 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: +.h_scrollbar_done: pop edi esi ebx ret @@ -1403,7 +1440,7 @@ proc draw_onimage_decorations ; draw fullscreen decorations on image call draw_filename call draw_fullscreen_controls - @@: +@@: ret endp @@ -1444,9 +1481,9 @@ proc draw_fullscreen_controls neg dx add dx, word[canvas.height] add edx, [canvas.top] - mcall 65, buttons + backbtn * 20, <20, 20>, , 8, palette + mcall 65, buttons+backbtn*20, <20, 20>, , 8, palette add edx, 25 SHL 16 - mcall 65, buttons + forwardbtn * 20, , , 8, + mcall 65, buttons+forwardbtn*20, , , 8, pop esi ret endp @@ -1487,7 +1524,7 @@ proc check_shortcut test al, al pop eax ; jnz .not - .not: +.not: ret endp @@ -1518,7 +1555,7 @@ proc bin2dec mov ebx, 10 xor ecx, ecx - @@: +@@: xor edx, edx div ebx push edx @@ -1526,7 +1563,7 @@ proc bin2dec test eax, eax jnz @b - @@: +@@: pop eax add eax, '0' stosb @@ -1539,29 +1576,6 @@ proc bin2dec endp -proc is_root_dir _path - push ecx esi - - mov esi, [_path] - xor ecx, ecx - @@: - lodsb - test al, al - jz .done - cmp al, '/' - jnz @b - inc ecx - jmp @b - .done: - xor eax, eax - cmp ecx, 3 - jz @f - mov eax, -2 - @@: - pop esi ecx - ret -endp - ; fills window_header with window title ; window title is generated as '[k/n] - Kolibri Image Viewer' ; n = total files in dir @@ -1579,14 +1593,14 @@ proc generate_window_header call bin2dec mov byte[edi], '/' inc edi - stdcall is_root_dir, path - add eax, [files_num] + mov eax, [directory_ptr] + mov eax, [eax+4] call bin2dec mov word[edi], '] ' add edi, 2 ; add filename - .next_symbol: +.next_symbol: lodsb test al, al jz @f @@ -1594,14 +1608,14 @@ proc generate_window_header inc [window_header_len] cmp edi, window_header+256 jb .next_symbol - .overflow: +.overflow: mov dword[edi-4], '...' - .ret: +.ret: pop edi esi ebx eax ret - @@: +@@: mov esi, s_header - @@: +@@: lodsb stosb test al, al @@ -1625,41 +1639,41 @@ proc scale_none_calc mov [need_scrollbar_v], 0 mov [need_scrollbar_h], 0 - mov eax, [ebx + Image.Width] + 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] +@@: + 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] + 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] + 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] + mov eax, [ebx+Image.Height] cmp eax, [canvas.height] jbe @f mov eax, [canvas.height] - @@: +@@: mov [view.height], eax mov [pict.height], eax @@ -1672,24 +1686,24 @@ proc scale_none_calc sar eax, 1 mov [view.top], eax - mov eax, [ebx + Image.Width] + mov eax, [ebx+Image.Width] sub eax, [pict.width] sar eax, 1 mov [pict.left], eax - mov eax, [ebx + Image.Height] + mov eax, [ebx+Image.Height] sub eax, [pict.height] sar eax, 1 mov [pict.top], eax - mov eax, [ebx + Image.Height] + 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 eax, [ebx+Image.Width] mov [scroll_bar_data_horizontal.max_area], eax mov eax, [pict.width] mov [scroll_bar_data_horizontal.cur_area], eax @@ -1710,11 +1724,11 @@ proc scale_fit_min_calc mov [scroll_bar_data_horizontal.position], 0 mov eax, [orig_image] - cmp [eax + Image.Type], Image.bpp24 + cmp [eax+Image.Type], Image.bpp24 jz @f - cmp [eax + Image.Type], Image.bpp32 + cmp [eax+Image.Type], Image.bpp32 jz @f - cmp [eax + Image.Type], Image.bpp8g + cmp [eax+Image.Type], Image.bpp8g jz @f invoke img.convert, eax, 0, Image.bpp24, 0, 0 test eax, eax @@ -1725,19 +1739,19 @@ proc scale_fit_min_calc 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] + 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: +.get_size: invoke img.get_scaled_size, eax, ecx, LIBIMG_SCALE_FIT_MIN, [canvas.width], [canvas.height] - .got_size: +.got_size: mov [pict.top], 0 mov [pict.left], 0 @@ -1745,7 +1759,7 @@ proc scale_fit_min_calc cmp eax, [canvas.width] jbe @f mov eax, [canvas.width] - @@: +@@: mov [view.width], eax mov [pict.width], eax neg eax @@ -1757,7 +1771,7 @@ proc scale_fit_min_calc cmp eax, [canvas.height] jbe @f mov eax, [canvas.height] - @@: +@@: mov [view.height], eax mov [pict.height], eax neg eax @@ -1788,47 +1802,47 @@ endl push ebx ecx mov ebx, [cur_image] - .x: +.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] + cmp eax, [ebx+Image.Width] ja @f mov [new_left], ecx jmp .xdone - @@: - mov eax, [ebx + Image.Width] +@@: + mov eax, [ebx+Image.Width] sub eax, [pict.width] mov [new_left], eax jmp .xdone - .xdone: +.xdone: - .y: +.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] + cmp eax, [ebx+Image.Height] ja @f mov [new_top], ecx jmp .ydone - @@: - mov eax, [ebx + Image.Height] +@@: + mov eax, [ebx+Image.Height] sub eax, [pict.height] mov [new_top], eax jmp .ydone - .ydone: +.ydone: xor eax, eax mov ecx, [new_left] @@ -1860,7 +1874,7 @@ proc update_scrollbars _xxhv mov [scroll_bar_data_horizontal.position], eax invoke scrollbar_hort_draw, scroll_bar_data_horizontal pop eax - .no_h_scroll: +.no_h_scroll: test al, al jz .no_v_scroll push eax @@ -1869,7 +1883,7 @@ proc update_scrollbars _xxhv mov [scroll_bar_data_vertical.position], eax invoke scrollbar_vert_draw, scroll_bar_data_vertical pop eax - .no_v_scroll: +.no_v_scroll: ret endp @@ -1879,34 +1893,34 @@ 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 + 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] + mov edx, [edx+Image.Next] + add eax, [edx+Image.Width] + cmp ecx, [edx+Image.Height] jae @f - mov ecx, [edx + Image.Height] - @@: + mov ecx, [edx+Image.Height] +@@: jmp .next - .got_sizes: +.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] + 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 + cmp [eax+Image.Type], Image.bpp32 jz @f invoke img.convert, eax, 0, Image.bpp32, 0, 0 test eax, eax @@ -1914,25 +1928,25 @@ proc merge_icons_to_single_img _img push eax invoke img.destroy, [_img] pop eax - @@: +@@: mov esi, eax xor edi, edi - .next_img: +.next_img: stdcall put_img_on_img, ebx, esi, edi, 0 - add edi, [esi + Image.Width] + add edi, [esi+Image.Width] inc edi - cmp [esi + Image.Next], 0 + cmp [esi+Image.Next], 0 jz @f - mov esi, [esi + Image.Next] + mov esi, [esi+Image.Next] jmp .next_img - @@: +@@: invoke img.destroy, esi mov eax, ebx jmp .quit - .error: +.error: xor eax, eax - .quit: +.quit: pop edi esi ebx ret endp @@ -1946,20 +1960,20 @@ endl mov ebx, [_bottom] mov edx, [_top] - mov eax, [edx + Image.Height] + mov eax, [edx+Image.Height] mov [img_height], eax - mov esi, [edx + Image.Data] - mov edi, [ebx + Image.Data] + mov esi, [edx+Image.Data] + mov edi, [ebx+Image.Data] mov eax, [_y] - imul eax, [ebx + Image.Width] + imul eax, [ebx+Image.Width] add eax, [_x] shl eax, 2 add edi, eax - .next_line: - mov ecx, [edx + Image.Width] +.next_line: + mov ecx, [edx+Image.Width] rep movsd - mov eax, [ebx + Image.Width] - sub eax, [edx + Image.Width] + mov eax, [ebx+Image.Width] + sub eax, [edx+Image.Width] shl eax, 2 add edi, eax dec [img_height] @@ -2006,7 +2020,7 @@ proc recalc_client cmp [bShowToolbar], 1 jnz @f mov [toolbar.height], TOOLBAR_HEIGHT - @@: +@@: mov eax, [toolbar.top] add eax, [client_abs_top] @@ -2022,16 +2036,16 @@ proc recalc_client test [bNewImage], 1 jnz .recalc_toolbar jmp .recalc_toolbar_done - .recalc_toolbar: +.recalc_toolbar: stdcall recalc_toolbar - .recalc_toolbar_done: +.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] @@ -2055,9 +2069,9 @@ proc recalc_client stdcall cmp_box, work, work_prev jnz .recalc_work jmp .recalc_work_done - .recalc_work: +.recalc_work: stdcall recalc_work - .recalc_work_done: +.recalc_work_done: ret endp @@ -2073,7 +2087,7 @@ proc recalc_window stdcall copy_box, client, client_prev test [bSlideShow], 1 jz .no_slide_show - .slide_show: +.slide_show: mov [client.left], 0 mov [client.top], 0 mov eax, [procinfo.box.width] @@ -2081,7 +2095,7 @@ proc recalc_window mov eax, [procinfo.box.height] mov [client.height], eax jmp .calc_abs - .no_slide_show: +.no_slide_show: mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT mov [client.top], eax neg eax @@ -2093,7 +2107,7 @@ proc recalc_window sub eax, 10 mov [client.width], eax - .calc_abs: +.calc_abs: mov eax, [client.top] mov [client_abs_top], eax mov eax, [client.left] @@ -2106,9 +2120,9 @@ proc recalc_window test [bToggleToolbar], 1 jnz .recalc_client jmp .recalc_client_done - .recalc_client: +.recalc_client: stdcall recalc_client - .recalc_client_done: +.recalc_client_done: ret endp @@ -2145,10 +2159,12 @@ proc recalc_work jnz .recalc_canvas stdcall cmp_box, canvas, canvas_prev jnz .recalc_canvas + cmp [bScaleModeChanged], 0 + jnz .recalc_canvas jmp .recalc_canvas_done - .recalc_canvas: +.recalc_canvas: stdcall recalc_canvas - .recalc_canvas_done: +.recalc_canvas_done: ret endp @@ -2156,7 +2172,7 @@ endp proc recalc_canvas stdcall copy_box, view, view_prev mov eax, [scale_mode] - call [scale_mode_calc + eax*4] + call [scale_mode_calc+eax*4] mov eax, [view.top] add eax, [canvas_abs_top] @@ -2173,7 +2189,7 @@ DATA s_header db ' - Kolibri Image Viewer',0 window_style dd 0x53FFFFFF -window BOX 101, 144, 750, 600 ; left top width height +window BOX 101, 144, 529, 324 ; 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 @@ -2345,7 +2361,7 @@ virtual at 0 file 'kivicons.bmp':0xA,4 load offbits dword from 0 end virtual -numimages = 10 +numimages = 11 openbtn = 0 backbtn = 1 forwardbtn = 2 @@ -2356,14 +2372,15 @@ 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 11 +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 @@ -2427,7 +2444,7 @@ communication_area_default_path: db '/rd/1',0 Filter: -dd Filter.end - Filter +dd Filter.end-Filter .1: db 'BMP',0 db 'GIF',0 @@ -2491,8 +2508,8 @@ readdir_fileinfo: dd 0 dd 0 readblocks dd 0 -directory_ptr dd 0 -curdir db 1024 dup (?) +directory_ptr dd 0 +curdir rb 1024 ;------------------------------------------------------------------------------ I_END: @@ -2520,6 +2537,8 @@ 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 diff --git a/programs/media/kiv/trunk/kivicons.bmp b/programs/media/kiv/trunk/kivicons.bmp index 41bcdf83102d050425a33196e41701e0ada0eac1..8d08695efed8041c14041846bd315484c8fa52d0 100644 GIT binary patch delta 1039 zcmZuuO=uHQ5dJpZZByIL?^>%BY9VW-m?dIV2t5=LBT}V^AcaNK8Z9vhn~GykoI7)h;iQAD2?vGyqWpto0<3KeIEQW6h3_7 z;#LSbC=B{&5h@&f)YO9`aJv+%eif!&q*nx*&Gv7Hie(npIkU~i>uz& z;Fwy*SF$fD<8+rrx%NJQ7{z}?A*TorJT$J@1lyYS3bLp?UT;PaJ~JGLbkS{|x=S7) zO!;oo`FaDdZhRN)kxvb<+m69mis}O4*?UxRCSDLsKCeV^upWTuBv{t5;wqzYX%w+< z(ZA>taUB#Dn@EA)!}AA{qhdOT`Ff5-Ok^%6kWHA#r%#&5W~MNax{B0=I3~;_^5!&h z=_HbgJkDp*FeX!?WodGatcs9V74h7=H>jSnE>I%NeRjRAe-^R58-kHj`SPf$Q^ifX za(ZDEBO<533@)JWtO1Kd%NZ+(np@|h*fsN0`267UoS01Opa~Je_($@dTzH;KoSvIg zm(c6pQO1+(ae~&MKHrZq+QGvgN5w9f%U@+#Sz~U$k9m|AETZfq+s|HmL(JXbV^c~G zODcYrY9H|Fx@@$F%!FyF1Or9Eq6ZOgK1D?&l>7xAR1kA$QG_`2QU~V!e)F4oGqZ2M9$Xs=pE$p! zgS4Yt0QM6TK;El z4d`4OgT&7muNP&tMYTPIRSw81v;pUjWX9xl*7*BQM$B{h>*=JGHj8#{+$>o6tJX}m zXlAdZ(lcfzZJRf&QZB+Mn?DF<)rUV+Db0{i^}*U7&GNK^Mv-$5K#52MeB5gNE)h<{Sly^{a{