use32 org 0x0 db 'MENUET01' dd 0x01, START, I_END, 0x4000, 0x4000, @PARAMS, 0x0 ;----------------------------------------------------------------------------- FALSE = 0 TRUE = 1 include '../../../proc32.inc' include '../../../macros.inc' include 'dll.inc' include '../../../develop/libraries/libs-dev/libio/libio.inc' include '../../../develop/libraries/libs-dev/libimg/libimg.inc' ;----------------------------------------------------------------------------- START: mcall 68, 11 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 jnz params_given call opendialog jc exit mov esi, path mov edi, @PARAMS mov ecx, 512/4 rep movsd mov byte [edi-1], 0 jmp params_given set_bgr: mcall 15, 4 mov eax, @PARAMS + 4 call load_image jc exit call set_as_bgr jmp exit params_given: mov eax, @PARAMS call load_image jc exit ;----------------------------------------------------------------------------- red: call draw_window still: mov eax, [image] test byte [eax + Image.Flags], Image.IsAnimated push 10 pop eax jz @f mcall 26, 9 mov edx, [cur_frame] mov ebx, [cur_frame_time] add ebx, [edx + Image.Delay] sub ebx, eax cmp ebx, [edx + Image.Delay] ja red_update_frame test ebx, ebx jz red_update_frame push 23 pop eax @@: mcall dec eax js red_update_frame jz red dec eax jnz button key: mcall 2 jmp still 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 26, 9 mov [cur_frame_time], eax mcall 9, procinfo, -1 call draw_cur_frame jmp still button: mcall 17 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 call opendialog jc still push [image] mov eax, path call load_image jc .restore_old mov esi, path mov edi, @PARAMS mov ecx, 512/4 rep movsd mov byte [edi-1], 0 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, 'bck' jnz @f call prev_image jmp red @@: cmp eax, 'fwd' jnz @f call next_image jmp red @@: cmp eax, 1 jne still exit: mcall -1 redraw_image = red load_image: and [img_data], 0 push eax invoke file.open, eax, O_READ or eax, eax jz .error_pop mov [fh], eax invoke file.size mov [img_data_len], ebx stdcall mem.Alloc, ebx test eax, eax jz .error_close mov [img_data], eax invoke file.read, [fh], eax, [img_data_len] cmp eax, -1 jz .error_close cmp eax, [img_data_len] jnz .error_close invoke file.close, [fh] inc eax jz .error ; img.decode checks for img.is_img ; invoke img.is_img, [img_data], [img_data_len] ; or eax, eax ; jz exit invoke img.decode, [img_data], [img_data_len], 0 or eax, eax jz .error cmp [image], 0 pushf mov [image], eax call init_frame popf call update_image_sizes call free_img_data clc ret .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 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] mov [draw_width], edx add edx, 19 cmp edx, 40 + 25*9 jae @f mov edx, 40 + 25*9 @@: mov [wnd_width], edx mov esi, [eax + Image.Height] mov [draw_height], esi add esi, 44 mov [wnd_height], esi popf jz .no_resize mcall 48, 4 add esi, eax mcall 67,-1,-1 .no_resize: ret set_as_bgr: mov esi, [image] mov ecx, [esi + Image.Width] mov edx, [esi + Image.Height] mcall 15, 1 mcall 15, 6 test eax, eax jz @f push eax invoke img.to_rgb2, esi, eax pop ecx mcall 15, 7 @@: mcall 15, 3 ret prev_image: call load_directory cmp [directory_ptr], 0 jz .ret mov ebx, [directory_ptr] mov eax, [cur_file_idx] cmp eax, -1 jnz @f mov eax, [ebx+4] @@: push [image] .scanloop: dec eax jns @f mov eax, [ebx+4] dec eax cmp [cur_file_idx], -1 jz .notfound @@: cmp eax, [cur_file_idx] jz .notfound push eax ebx 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, 512/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 ebx eax jc .scanloop mov [cur_file_idx], eax invoke img.destroy .ret: ret .notfound: pop [image] call init_frame ret next_image: call load_directory cmp [directory_ptr], 0 jz .ret mov ebx, [directory_ptr] mov eax, [cur_file_idx] push [image] .scanloop: inc eax cmp eax, [ebx+4] jb @f xor eax, eax cmp [cur_file_idx], -1 jz .notfound @@: cmp eax, [cur_file_idx] jz .notfound push eax ebx 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, 512/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 ebx eax jc .scanloop mov [cur_file_idx], eax invoke img.destroy .ret: ret .notfound: pop [image] call init_frame ret load_directory: cmp [directory_ptr], 0 jnz .ret mov esi, @PARAMS mov ecx, esi @@: lodsb test al, al jnz @b @@: dec esi cmp byte [esi], '/' jnz @b mov [last_name_component], esi sub esi, ecx xchg ecx, esi mov edi, curdir rep movsb mov byte [edi], 0 mcall 68, 12, 0x1000 test eax, eax jz .ret mov ebx, readdir_fileinfo mov dword [ebx+12], (0x1000 - 32) / 304 mov dword [ebx+16], eax mcall 70 cmp eax, 6 jz .dirok test eax, eax jnz free_directory mov edx, [directory_ptr] mov ecx, [edx+8] mov [readblocks], ecx imul ecx, 304 add ecx, 32 mcall 68, 20 test eax, eax jz free_directory mov [directory_ptr], eax mcall 70, readdir_fileinfo .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] or ecx, 0x202020 cmp ecx, 'jpg' jz .copy cmp ecx, 'bmp' jz .copy cmp ecx, 'gif' jz .copy cmp ecx, 'png' jz .copy cmp ecx, 'jpe' jz .copy cmp ecx, 'ico' jz .copy cmp ecx, 'cur' jz .copy cmp ecx, 'jpeg' jz @f cmp ecx, 'jpeG' jnz .nocopy @@: cmp byte [esi+4], 0 jnz .nocopy .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] inc esi 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 init_frame: push eax mov eax, [image] mov [cur_frame], eax test byte [eax + Image.Flags], Image.IsAnimated jz @f push ebx mcall 26, 9 pop ebx mov [cur_frame_time], eax @@: pop eax ret draw_window: cmp [bFirstDraw], 0 jz .posok or ecx, -1 mcall 9, procinfo cmp dword [ebx + 66], 0 jle .posok mov edx, ecx mov esi, ecx cmp dword [ebx + 42], 40 + 25 * 9 jae @f mov edx, 40 + 25 * 9 @@: cmp dword [ebx + 46], 70 jae @f mov esi, 70 @@: mov eax, edx and eax, esi cmp eax, -1 jz @f mov ebx, ecx mcall 67 @@: .posok: mcall 12, 1 mcall 48, 4 mov ebp, eax ; save skin height add eax, [wnd_height] __mov ebx, 100, 0 add ebx, [wnd_width] lea ecx, [100*65536 + eax] mcall 0, , , 0x73FFFFFF, 0, s_header mcall 9, procinfo, -1 mov [bFirstDraw], 1 cmp dword [ebx + 66], 0 jle .nodraw mov ebx, [ebx + 62] inc ebx mcall 13, , <0, 35>, 0xFFFFFF mov ecx, [procinfo + 66] inc ecx mov esi, [draw_height] add esi, 35 sub ecx, esi jbe @f push esi shl esi, 16 add ecx, esi pop esi mcall xor ecx, ecx @@: add ecx, esi add ecx, 35*10000h - 35 __mov ebx, 0, 5 mcall mov esi, [draw_width] add esi, ebx mov ebx, [procinfo+62] inc ebx sub ebx, esi jbe @f shl esi, 16 add ebx, esi mcall @@: mov ebx, [procinfo + 62] push ebx mcall 38, , <30, 30>, 0x007F7F7F mcall , <5 + 25 * 1, 5 + 25 * 1>, <0, 30> mcall , <10 + 25 * 3, 10 + 25 * 3> mcall , <15 + 25 * 4, 15 + 25 * 4> pop ebx sub ebx, 25 * 5 + 10 push ebx imul ebx, 10001h mcall mcall 8, <5 + 25 * 0, 20>, <5, 20>, 'opn'+40000000h mcall , <10 + 25 * 1, 20>, , 'bck'+40000000h mcall , <10 + 25 * 2, 20>, , 'fwd'+40000000h mcall , <15 + 25 * 3, 20>, , 'bgr'+40000000h pop ebx add ebx, 5 shl ebx, 16 mov bl, 20 mcall , , , 'flh'+40000000h add ebx, 25 * 65536 mcall , , , 'flv'+40000000h add ebx, 30 * 65536 mcall , , , 'rtr'+40000000h add ebx, 25 * 65536 mcall , , , 'rtl'+40000000h add ebx, 25 * 65536 mcall , , , 'flb'+40000000h mov ebp, (numimages-1)*20 mcall 65, buttons+openbtn*20, <20, 20>, <5 + 25 * 0, 5>, 8, palette mcall , buttons+backbtn*20, , <10 + 25 * 1, 5> mcall , buttons+forwardbtn*20, , <10 + 25 * 2, 5> mcall , buttons+bgrbtn*20, , <15 + 25 * 3, 5> mov edx, [procinfo + 62] sub edx, 25 * 5 + 4 shl edx, 16 mov dl, 5 mcall , buttons+fliphorzbtn*20 add edx, 25 * 65536 mcall , buttons+flipvertbtn*20 add edx, 30 * 65536 mcall , buttons+rotcwbtn*20 add edx, 25 * 65536 mcall , buttons+rotccwbtn*20 add edx, 25 * 65536 mcall , buttons+rot180btn*20 call draw_cur_frame .nodraw: mcall 12, 2 ret draw_cur_frame: push 0 ; ypos push 0 ; xpos mov eax, [procinfo+66] sub eax, 34 push eax ; max height mov eax, [procinfo+62] sub eax, 4 push eax ; max width push 35 ; y push 5 ; x push [cur_frame] call [img.draw] mov eax, [image] test [eax + Image.Flags], Image.IsAnimated jnz .done cmp [eax + Image.Next], 0 jnz .additional_frames .done: ret .additional_frames: mov ebx, [procinfo+62] sub ebx, 4 jbe .done push 5 pop esi .afloop: sub ebx, [eax + Image.Width] jbe .done dec ebx jz .done add esi, [eax + Image.Width] mov eax, [eax + Image.Next] push eax inc esi push 0 ; ypos push 0 ; xpos mov ecx, [procinfo+66] sub ecx, 34 push ecx ; max height push ebx ; max width push 35 ; y push esi ; x push eax ; image call [img.draw] pop eax cmp [eax + Image.Next], 0 jnz .afloop ret ; void* __stdcall mem.Alloc(unsigned size); mem.Alloc: push ebx ecx mov ecx, [esp+12] mcall 68, 12 pop ecx ebx ret 4 ; void* __stdcall mem.ReAlloc(void* mptr, unsigned size); mem.ReAlloc: push ebx ecx edx mov edx, [esp+16] mov ecx, [esp+20] mcall 68, 20 pop edx ecx ebx ret 8 ; void __stdcall mem.Free(void* mptr); mem.Free: push ebx ecx mov ecx, [esp+12] mcall 68, 13 pop ecx ebx ret 4 ;----------------------------------------------------------------------------- s_header db 'Kolibri Image Viewer', 0 ;----------------------------------------------------------------------------- opendialog: ; ; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec, ; 1 byte space, 1 byte type of dialog (O - Open ,S - Save) ; ;; mov esi,path mov edi,path xor eax,eax mov ecx,(1024+16)/4 rep stosd ;mov [get_loops],0 mov [dlg_pid_get],0 ; Get my PID in dec format 4 bytes mov eax,9 mov ebx,procinfo or ecx,-1 mcall ; convert eax bin to param dec mov eax,dword [procinfo+30] ;offset of myPID mov edi,param+4-1 ;offset to 4 bytes mov ecx,4 mov ebx,10 new_d: xor edx,edx div ebx add dl,'0' mov [edi],dl dec edi loop new_d ; wirite 1 byte space to param mov [param+4],byte 32 ;Space for next parametr ; and 1 byte type of dialog to param mov [param+5],byte 'O' ;Get Open dialog (Use 'S' for Save dialog) ; ; STEP2 prepare IPC area for get messages ; ; prepare IPC area mov [path],dword 0 mov [path+4],dword 8 ; define IPC memory mov eax,60 mov ebx,1 ; define IPC mov ecx,path ; offset of area mov edx,1024+16 ; size mcall ; change wanted events list 7-bit IPC event mov eax,40 mov ebx,01000111b cmp [image], 0 jnz @f mov bl, 01000110b @@: mcall ; ; STEP 3 run SYSTEM XTREE with parameters ; mov eax,70 mov ebx,run_fileinfo mcall mov [get_loops],0 getmesloop: mov eax,23 mov ebx,50 ;0.5 sec mcall dec eax jz mred dec eax jz mkey dec eax jz mbutton cmp al, 7-3 jz mgetmes ; Get number of procces mov ebx,procinfo mov ecx,-1 mov eax,9 mcall mov ebp,eax loox: mov eax,9 mov ebx,procinfo mov ecx,ebp mcall mov eax,[DLGPID] cmp [procinfo+30],eax ;IF Dialog find je dlg_is_work ;jmp to dlg_is_work dec ebp jnz loox jmp erroff dlg_is_work: cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated je erroff ;TESTODP2 terminated too cmp [dlg_pid_get],dword 1 je getmesloop inc [get_loops] cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated jae erroff jmp getmesloop mred: cmp [image], 0 jz getmesloop call draw_window jmp getmesloop mkey: mov eax,2 mcall ; read (eax=2) jmp getmesloop mbutton: mov eax,17 ; get id mcall cmp ah,1 ; button id=1 ? jne getmesloop mov eax,-1 ; close this program mcall mgetmes: ; If dlg_pid_get then second message get jmp to still cmp [dlg_pid_get],dword 1 je ready ; First message is number of PID SYSXTREE dialog ; convert PID dec to PID bin movzx eax,byte [path+16] sub eax,48 imul eax,10 movzx ebx,byte [path+16+1] add eax,ebx sub eax,48 imul eax,10 movzx ebx,byte [path+16+2] add eax,ebx sub eax,48 imul eax,10 movzx ebx,byte [path+16+3] add eax,ebx sub eax,48 mov [DLGPID],eax ; Claear and prepare IPC area for next message mov [path],dword 0 mov [path+4],dword 8 mov [path+8],dword 0 mov [path+12],dword 0 mov [path+16],dword 0 ; Set dlg_pid_get for get next message mov [dlg_pid_get],dword 1 cmp [image], 0 jz getmesloop call draw_window jmp getmesloop ready: ; ; The second message get ; Second message is 100 bytes path to SAVE/OPEN file ; shl path string on 16 bytes ; mov esi,path+16 mov edi,path mov ecx,1024/4 rep movsd mov [edi],byte 0 openoff: mcall 40, 7 clc ret erroff: mcall 40, 7 stc ret ;----------------------------------------------------------------------------- align 4 @IMPORT: library \ libio , 'libio.obj' , \ libgfx , 'libgfx.obj' , \ libimg , 'libimg.obj' , \ sort , 'sort.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 sort, sort.START, 'START', SortDir, 'SortDir', strcmpi, 'strcmpi' bFirstDraw db 0 ;----------------------------------------------------------------------------- virtual at 0 file 'kivicons.bmp':0xA,4 load offbits dword from 0 end virtual numimages = 9 openbtn = 0 backbtn = 1 forwardbtn = 2 bgrbtn = 3 fliphorzbtn = 4 flipvertbtn = 5 rotcwbtn = 6 rotccwbtn = 7 rot180btn = 8 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 ; DATA AREA get_loops dd 0 dlg_pid_get dd 0 DLGPID dd 0 param: dd 0 ; My dec PID dd 0,0 ; Type of dialog run_fileinfo: dd 7 dd 0 dd param dd 0 dd 0 ;run_filepath db '/sys/SYSXTREE',0 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 ? wnd_height dd ? draw_width dd ? draw_height dd ? last_name_component dd ? cur_file_idx dd ? cur_frame_time dd ? cur_frame dd ? ctx dd ? procinfo: rb 1024 path: rb 1024+16 @PARAMS rb 512