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 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_bgr mov esi, [image] mov ecx, [esi + Image.Width] mov edx, [esi + Image.Height] mcall 15, 1 mcall 15, 6 test eax, eax jz exit_bgr push eax invoke img.to_rgb2, esi, eax pop ecx mcall 15, 7 exit_bgr: mcall 15, 3 jmp exit params_given: mov eax, @PARAMS call load_image jc exit ;----------------------------------------------------------------------------- red: call draw_window still: mcall 10 dec eax jz red dec eax jnz button key: mcall 2 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 invoke img.destroy mov byte [edi-1], 0 jmp red .restore_old: pop [image] jmp still @@: 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] or eax, eax jz .error cmp [image], 0 mov [image], eax 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] add edx, 19 cmp edx, 50 + 25*5 jae @f mov edx, 50 + 25*5 @@: mov [wnd_width], edx mov esi, [eax + Image.Height] add esi, 44 mov [wnd_height], esi popf jz .no_resize mcall 48, 4 add esi, eax mcall 67,-1,-1 .no_resize: ret draw_window: invoke gfx.open, TRUE mov [ctx], eax 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, , s_header mcall 9, procinfo, -1 mov ebx, [procinfo + 42] sub ebx, 9 mcall 13, , <0, 35>, 0xFFFFFF mov ecx, [procinfo + 46] sub ecx, ebp sub ecx, 9 shl ecx, 16 mov cl, 5 mcall mov cl, 35 ror ecx, 16 sub cx, 35 mov ebx, 5 mcall ; 5 pixels for indentation, [image.Width] pixels for image ; client_width - 5 - [image.Width] pixels must be white mov ebx, [image] mov esi, [procinfo + 62] inc esi push esi mov ebx, [ebx + Image.Width] sub esi, 5 sub esi, ebx pop ebx sub ebx, esi shl ebx, 16 add ebx, esi mcall invoke gfx.pen.color, [ctx], 0x007F7F7F mov eax, [procinfo + 42] sub eax, 10 invoke gfx.line, [ctx], 0, 30, eax, 30 xor ebp, ebp mcall 8, <5 + 25 * 0, 20>, <5, 20>, 'opn'+40000000h mcall 65, openbtn, <20, 20>, <5 + 25 * 0, 5>, 4, palette invoke gfx.line, [ctx], 5 + 25 * 1, 0, 5 + 25 * 1, 30 mcall 8, <10 + 25 * 1, 20>, <5, 20>, 'flh'+40000000h mcall 65, fliphorzbtn, <20, 20>, <10 + 25 * 1, 5>, 4, palette mcall 8, <10 + 25 * 2, 20>, <5, 20>, 'flv'+40000000h mcall 65, flipvertbtn, <20, 20>, <10 + 25 * 2, 5>, 4, palette invoke gfx.line, [ctx], 10 + 25 * 3, 0, 10 + 25 * 3, 30 mcall 8, <15 + 25 * 3, 20>, <5, 20>, 'rtr'+40000000h mcall 65, rotcwbtn, <20, 20>, <15 + 25 * 3, 5>, 4, palette mcall 8, <15 + 25 * 4, 20>, <5, 20>, 'rtl'+40000000h mcall 65, rotccwbtn, <20, 20>, <15 + 25 * 4, 5>, 4, palette mcall 8, <15 + 25 * 5, 20>, <5, 20>, 'flb'+40000000h mcall 65, rot180btn, <20, 20>, <15 + 25 * 5, 5>, 4, palette mov ebx, [image] mov ecx, [ebx + Image.Width] shl ecx, 16 add ecx, [ebx + Image.Height] __mov edx, 5, 35 mov esi, 8 cmp [ebx + Image.Type], Image.bpp8 jz @f mov esi, 24 cmp [ebx + Image.Type], Image.bpp24 jz @f mov esi, 32 @@: mov edi, [ebx + Image.Palette] mov ebx, [ebx + Image.Data] xor ebp, ebp mcall 65 invoke gfx.close, [ctx] 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' 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' ;----------------------------------------------------------------------------- palette: dd 0x000000, 0x800000, 0x008000, 0x808000 dd 0x000080, 0x800080, 0x008080, 0x808080 dd 0xC0C0C0, 0xFF0000, 0x00FF00, 0xFFFF00 dd 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF macro loadbtn filename { repeat 20 file filename:76h+(%-1)*12,10 end repeat repeat 10 y = % - 1 z = 20 - % repeat 10 load a byte from $ - 20*10 + y*10 + (%-1) load b byte from $ - 20*10 + z*10 + (%-1) store byte a at $ - 20*10 + z*10 + (%-1) store byte b at $ - 20*10 + y*10 + (%-1) end repeat end repeat } openbtn: loadbtn 'open.bmp' fliphorzbtn: loadbtn 'fliphorz.bmp' flipvertbtn: loadbtn 'flipvert.bmp' rotcwbtn: loadbtn 'rotcw.bmp' rotccwbtn: loadbtn 'rotccw.bmp' rot180btn: loadbtn 'rot180.bmp' ; 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 ;----------------------------------------------------------------------------- I_END: img_data dd ? img_data_len dd ? fh dd ? image dd ? wnd_width dd ? wnd_height dd ? ctx dd ? procinfo: rb 1024 path: rb 1024+16 @PARAMS rb 512