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