; Picture browser by lisovin@26.ru ; Modified by Ivan Poddubny - v.0.3 ; Modified by Diamond - v.0.4 ; Modified by Mario79: ; v.0.5 18.07.08 Dinamic Allocation Memory ; v.0.6 20.07.08 ; 1) Use Editbox (Author ) ; 2) Draw window without fill working area (C = 1) ; 3) Open file with parameter in patch: ; Size of parameter - 4 bytes. Parameter starts with the ; character "\", the unused characters are filled ; by a blank (ASCII 20h). ; '\T /hd0/1/1.bmp' - set background, mode: tile ; '\S /hd0/1/1.bmp' - set background, mode: stretch ; v.0.65 23.07.08 ; 1) Use new version Editbox (Thanks ) ; (mouse correctly works in secondary thread) ; 2) The memory used for storage of the file BMP ; after conversion in RAW comes back to OS. ; 3) Usage of keys 1,2,3,4 for call of buttons of the application ; without the mouse, before the key were defined incorrectly. ; 4) Deleting of the unnecessary procedure of clearing of ; a background of a picture at pressing the button "Open". ; Compile with FASM for Menuet ;****************************************************************************** use32 org 0x0 db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd START ; start of code dd IM_END ; size of image dd I_END ; memory for app dd I_END ; esp dd temp_area , 0x0 ; I_Param , I_Icon include 'lang.inc' include '..\..\..\macros.inc' include '..\..\..\develop\examples\editbox\trunk\editbox.inc' ;include 'macros.inc' ;include 'EDITBOX.INC' use_edit_box ;****************************************************************************** START: ; start of execution mcall 68, 11 mcall 66, 1,1 ; check for parameters cmp dword [temp_area],'BOOT' jne .no_boot .background: call load_image call convert call background .exit: or eax,-1 mcall .no_boot: cmp byte [temp_area],0 jz .no_param mov edi,string ; clear string mov ecx,256/4 ; length of a string xor eax,eax ; symbol <0> rep stosd mov edi,temp_area ; look for <0> in temp_area cmp [edi],byte "\" jne .continue cmp [edi+1],byte "T" jne @f mov [bgrmode],dword 1 jmp .continue_1 @@: cmp [edi+1],byte "S" jne START.exit mov [bgrmode],dword 2 .continue_1: add edi,4 .continue: mov esi,edi mov ecx,257 ; strlen repne scasb lea ecx, [edi-temp_area] mov edi,string rep movsb ; copy string from temp_area to "string" (filename) cmp [temp_area],byte "\" je START.background call load_image call convert .no_param: or ecx,-1 ; get information about me call getappinfo mov edx,[process_info+30] ; теперь в edx наш идентификатор mov ecx,eax @@: call getappinfo cmp edx,[process_info+30] je @f ; если наш PID совпал с PID рассматриваемого процесса, мы нашли себя dec ecx ; иначе смотрим следующий процесс jne @b ; возвращаемся, если не все процессы рассмотрены @@: ; теперь в ecx номер процесса mov [process],ecx draw_still: call draw_window still: mov eax,10 ; wait here for event mcall dec eax jz red dec eax jnz button key: ; key mov al,2 mcall mov al,ah cmp al,130 ; 1 je kfile cmp al,131 ; 2 je kopen cmp al,132 ; 3 je kinfo cmp al,133 ; 4 je kbgrd jmp still red: test byte [status], 4 jz draw_still mov al, 18 mov ebx, 3 mov ecx, [process] mcall and byte [status], not 4 jmp still button: ; button mov eax,17 ; get id mcall cmp ah,1 ; button id=1 ? jne noclose mov eax,-1 ; close this program mcall noclose: cmp ah,2 jne nofile kfile: test byte [status], 1 jnz still or byte [status], 1 mov eax,51 mov ebx,1 mov ecx,thread1 mov edx,thread ;0x29fff0 mcall jmp still nofile: cmp ah,3 jne noopen kopen: mov ecx,-1 call getappinfo call load_image open1: mov eax,[image_file] cmp [eax],word 'BM' jne still call convert jmp draw_still noopen: cmp ah,4 jne noinfo kinfo: test byte [status], 2 jnz still or byte [status], 2 mov eax,51 mov ebx,1 mov ecx,thread2 mov edx,thread-512 mcall jmp still noinfo: ; УСТАНОВИТЬ ФОН cmp ah,5 jne still kbgrd: test byte [status], 8 jnz still or byte [status], 8 mov eax,51 mov ebx,1 mov ecx,thread3 mov edx,thread-512*2 mcall jmp still ;call background getappinfo: mov eax,9 mov ebx,process_info mcall ret load_image: mov [fileinfo+0],dword 5 mov [fileinfo+12],dword 0 mov [fileinfo+16],dword process_info cmp [image_file],0 je @f mov ecx,[image_file] mcall 68, 13, @@: mcall 70, fileinfo mov [fileinfo+0],dword 0 mov [fileinfo+12],dword 512 mov [fileinfo+16],dword process_info+40 mcall 70, fileinfo mov ecx,[process_info+32] mov [fileinfo+12],ecx mcall 68, 12 mov [fileinfo+16],eax mov [image_file_1],eax mov eax,[process_info+40+28] cmp eax, 24 jz .convert24 cmp eax, 8 jz .convert8 cmp eax, 4 jz .convert4 shl ecx,2 .convert4: shl ecx,1 .convert8: lea ecx,[ecx*3] .convert24: ;@@: add ecx,512 mcall 68, 12 mov [image_file],eax mcall 70, fileinfo mov esi,[image_file_1] mov edi,[image_file] mov ecx,512/4 cld rep movsd mov eax,[image_file] mov ebx,[eax+22] mov eax,[eax+18] test ebx, ebx jns @f neg ebx @@: add eax,9 cmp eax,210 jae @f mov eax,210 @@: add ebx,54 cmp ebx,56 jae @f mov ebx,56 @@: mov [wnd_width],eax mov [wnd_height],ebx test [bWasDraw],1 jz @f mov esi,ebx mov edx,eax mcall 67,-1,-1 @@: ret drawimage: mov eax,[image_file] cmp [eax],word 'BM' jne nodrawimage mov ecx, dword [eax+18-2] mov cx, [eax+22] test cx, cx jns @f neg cx @@: mov edx,5*65536+50 mcall 7,[soi] nodrawimage: ret ; УСТАНОВИТЬ ФОН background: mov eax,[image_file] cmp [eax],word 'BM' jne @f mov ecx,[eax+18] ; ширина mov edx,[eax+22] ; высота mcall 15,1 mov esi, ecx imul esi, edx lea esi, [esi+esi*2] mov ebx,5 mov ecx,[soi] xor edx,edx ;;; mov esi, ;640*480*3 mcall dec ebx ;tile/stretch mov ecx,dword [bgrmode] mcall dec ebx mcall @@: ret convert: call convert_1 mov ecx,[image_file_1] mcall 68, 13, ret convert_1: mov ecx, [image_file] add ecx,512 mov [soi], ecx mov eax,[image_file_1] mov ebp, [eax+18] lea ebp, [ebp*3] ; ebp = size of output scanline mov eax, [eax+22] dec eax mul ebp add eax, ecx mov edi, eax ; edi points to last scanline mov esi, [image_file_1] add esi, [esi+10] mov ebx,[image_file_1] mov edx, [ebx+22] add ebx,54 lea eax, [ebp*2] mov [delta], eax test edx, edx jz .ret jns @f neg edx and [delta], 0 mov edi, ecx @@: mov eax,[image_file_1] movzx eax,word [eax+28] cmp eax, 24 jz convert24 cmp eax, 8 jz convert8 cmp eax, 4 jz convert4 dec eax jz convert1 .ret: ret convert24: mov ecx, ebp rep movsb sub edi, [delta] mov eax, ebp neg eax and eax, 3 add esi, eax dec edx jnz convert24 ret convert8: push edi add [esp], ebp .loopi: xor eax, eax lodsb push eax mov eax,[image_file_1] cmp dword [eax+30],1 pop eax jnz .nocompressed .compressed: mov ecx, eax jecxz .special lodsb mov eax, [ebx+eax*4] @@: call putpixel loop @b jmp .loopi .nocompressed: mov eax, [ebx+eax*4] call putpixel .loopicont: cmp edi, [esp] jnz .loopi .next: pop edi sub edi, [delta] mov eax, ebp and eax, 3 add esi, eax dec edx jnz convert8 ret .special: lodsb test al, al jz .next cmp al, 2 jbe .end mov ecx, eax push ecx @@: xor eax, eax lodsb mov eax, [ebx+eax*4] call putpixel loop @b pop ecx and ecx, 1 add esi, ecx jmp .loopi .end: pop edi ret convert4: push edi add [esp], ebp .loopi: xor eax, eax lodsb shr eax, 4 mov eax, [ebx+eax*4] call putpixel cmp edi, [esp] jz .loopidone mov al, [esi-1] and eax, 0xF mov eax, [ebx+eax*4] stosd dec edi cmp edi, [esp] jnz .loopi .loopidone: pop edi sub edi, [delta] call align_input dec edx jnz convert4 ret convert1: push edi add [esp], ebp .loopi: lodsb mov ecx, 8 .loopii: add al, al push eax setc al movzx eax, al mov eax, [ebx+eax*4] call putpixel pop eax cmp edi, [esp] loopnz .loopii jnz .loopi pop edi sub edi, [delta] call align_input dec edx jnz convert1 ret align_input: push esi push eax mov eax,[image_file_1] sub esi,eax sub esi,[eax+10] pop eax neg esi and esi, 3 add [esp], esi pop esi ret putpixel: push eax stosw shr eax, 16 stosb pop eax ret ;--------------------------------------------------------------------- get_window_param: mcall 9, procinfo, -1 mov eax,[ebx+46] mov [window_high],eax mov eax,[ebx+42] mov [window_width],eax mcall 48,4 mov [skin_high],eax ret ;--------------------------------------------------------------------- ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window: or [bWasDraw],1 mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw mcall ; DRAW WINDOW xor eax,eax ; function 0 : define and draw window ; mov ebx,350 ; [x start] *65536 + [x size] ; mov ecx,400 ; [y start] *65536 + [y size] mov ebx,0*65536 mov ecx,0*65536 add ebx,[wnd_width] add ecx,[wnd_height] cmp cx,55 ja @f mov cx,55 @@: mov edx,0x43ffffff ; color of work area RRGGBB,8->color gl mcall call get_window_param mov ebx,5 shl ebx,16 add ebx,[window_width] sub ebx,9 push ebx mov ecx,[skin_high] shl ecx,16 add ecx,50 sub ecx,[skin_high] mcall 13, , ,0xffffff mov eax,[image_file] mov ecx,[eax+22] mov ebx,[eax+18] push ecx add ebx,5 mov ax,bx shl ebx,16 add ebx,[window_width] sub ebx,4 sub bx,ax cmp bx,0 jbe @f add ecx,50 shl 16 mcall 13, , ,0xffffff @@: pop ecx pop ebx add ecx,50 mov ax,cx shl ecx,16 add ecx,[window_high] sub cx,ax sub ecx,4 cmp cx,0 jbe @f mcall 13, , ,0xffffff @@: mov eax,8 mov ebx,10*65536+46 mov ecx,25*65536+20 mov edx,2 mov esi,0x780078 newbutton: mcall add ebx,48*65536 inc edx cmp edx,6 jb newbutton ; WINDOW LABEL mov eax,4 ; function 4 : write text to window mov ebx,8*65536+8 ; [x start] *65536 + [y start] mov ecx,0x10ddeeff ; font 1 & color ( 0xF0RRGGBB ) mov edx,labelt ; pointer to text beginning mov esi,12 ; text length mcall mov ebx,14*65536+32 mov edx,buttext mov esi,26 mcall call drawimage mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw mcall ret ; DATA AREA labelt: db 'MeView v.0.4' lsz buttext,\ en, ' FILE OPEN INFO BGRD',\ ru, ' ФАЙЛ ОТКР ИНФО ФОН ',\ de, 'DATEI OEFNEN INFO HGRD' thread1: ; start of thread1 mcall 40, 0x27 or ecx,-1 ; get information about me call getappinfo mov esi,string @@: cld lodsb test al,al jne @r sub esi,string mov eax,esi dec eax mov edi, edit1 mov ed_size, eax mov ed_pos, eax red1: call draw_window1 still1: mcall 10 ; wait here for event cmp eax,1 ; redraw request ? je red1 cmp eax,2 ; key in buffer ? je key1 cmp eax,3 ; button in buffer ? je button1 mouse_edit_box name_editboxes jmp still1 key1: ; key mcall 2 cmp ah,13 je close1 cmp ah,27 je close1 key_edit_box name_editboxes jmp still1 button1: ; button mov eax,17 ; get id mcall cmp ah,1 ; button id=1 ? jne still1 close1: bts dword [status],2 btr dword [status],0 mov eax,-1 ; close this program mcall jmp still1 ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window1: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw mcall ; DRAW WINDOW xor eax,eax ; function 0 : define and draw window mov ebx,100*65536+300 ; [x start] *65536 + [x size] mov ecx,100*65536+80 ; [y start] *65536 + [y size] mov edx,0x03780078 ; color of work area RRGGBB,8->color gl mcall ; WINDOW LABEL mov eax,4 ; function 4 : write text to window mov ebx,8*65536+8 ; [x start] *65536 + [y start] mov ecx,0x10ddeeff ; font 1 & color ( 0xF0RRGGBB ) mov edx,labelt1 ; pointer to text beginning mov esi,labelt1.size ; text length mcall ; call drawstring draw_edit_box name_editboxes mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw mcall ret drawstring: pusha mov eax,8 ;invisible button mov ebx,21*65536+258 mov ecx,40*65536+15 mov edx,0x60000002 mcall mov eax,13 ;bar mov edx,0xe0e0e0 mcall push eax ;cursor mov eax,6*65536 mul dword [pos] add eax,21*65536+6 mov ebx,eax pop eax mov edx,0x6a73d0 mcall mov eax,4 ;path mov ebx,21*65536+44 xor ecx,ecx mov edx,string mov esi,43 mcall popa ret ; DATA AREA lsz labelt1,\ en, 'File',\ ru, 'Файл',\ de, 'Datei' thread2: ; start of info thread call draw_window2 still2: mov eax,10 ; wait here for event mcall cmp eax,1 ; redraw request ? je thread2 cmp eax,2 ; key in buffer ? je close2 cmp eax,3 ; button in buffer ? je button2 jmp still2 button2: ; button mov eax,17 ; get id mcall cmp ah,1 ; button id=1 ? jne noclose2 close2: btr dword [status],1 bts dword [status],2 mov eax,-1 ; close this program mcall noclose2: jmp still2 ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window2: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw mcall ; DRAW WINDOW xor eax,eax ; function 0 : define and draw window mov ebx,100*65536+330 ; [x start] *65536 + [x size] mov ecx,100*65536+90 ; [y start] *65536 + [y size] mov edx,0x03780078 ; color of work area RRGGBB,8->color gl mcall ; WINDOW LABEL mov eax,4 ; function 4 : write text to window mov ebx,8*65536+8 ; [x start] *65536 + [y start] mov ecx,0x10ddeeff ; font 1 & color ( 0xF0RRGGBB ) mov edx,labelt2 ; pointer to text beginning mov esi,labelt2.size ; text length mcall mov ebx,10*65536+30 mov edx,string mov esi,43 mcall mov edx,fitext mov esi,14 add ebx,70*65536+10 followstring: mcall add ebx,10 add edx,esi cmp ebx,80*65536+70 jbe followstring mov eax,47 mov edx,200*65536+40 mov esi,ecx mov ecx,[image_file] push ecx mov ecx, [ecx+2] call digitcorrect mcall add edx,10 pop ecx push ecx mov ecx, [ecx+18] call digitcorrect mcall add edx,10 pop ecx push ecx mov ecx, [ecx+22] call digitcorrect mcall add edx,10 pop ecx movzx ecx,word [ecx+28] call digitcorrect mcall mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw mcall ret digitcorrect: xor ebx,ebx mov bh,6 cmp ecx,99999 ja c_end dec bh cmp ecx,9999 ja c_end dec bh cmp ecx,999 ja c_end dec bh cmp ecx,99 ja c_end dec bh cmp ecx,9 ja c_end dec bh c_end: bswap ebx ret ; DATA AREA lsz labelt2,\ en, 'File info',\ ru, 'Информация о файле',\ de, 'Dateiinfo' lsz fitext,\ en, 'FILE SIZE ',\ en, 'X SIZE ',\ en, 'Y SIZE ',\ en, 'BITS PER PIXEL',\ \ ru, 'Размер файла ',\ ru, 'Ширина ',\ ru, 'Высота ',\ ru, 'Бит на пиксел ',\ \ de, 'FATEIGROESSE ',\ de, 'X GROESSE ',\ de, 'Y GROESSE ',\ de, 'BITS PER PIXEL' thread3: ; start of bgrd thread call draw_window3 still3: mov eax,10 ; wait here for event mcall cmp eax,1 ; redraw request ? je thread3 cmp eax,2 ; key in buffer ? je key3 cmp eax,3 ; button in buffer ? je button3 jmp still3 key3: mcall cmp ah,27 je close3 cmp ah,13 je kok cmp ah,178 ;up jne nofup cmp dword [bgrmode],1 je fdn fup: dec dword [bgrmode] jmp flagcont nofup: cmp ah,177 ;down jne still3 cmp dword [bgrmode],2 je fup fdn: inc dword [bgrmode] jmp flagcont button3: ; button mov eax,17 ; get id mcall cmp ah,1 ; button id=1 ? jne noclose3 close3: btr dword [status],3 bts dword [status],2 mov eax,-1 ; close this program mcall noclose3: cmp ah,4 jne nook kok: call background jmp close3 nook: cmp ah,2 jb still3 cmp ah,3 ja still3 dec ah mov byte [bgrmode],ah flagcont: call drawflags jmp still3 ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window3: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw mcall ; DRAW WINDOW xor eax,eax ; function 0 : define and draw window mov ebx,100*65536+200 ; [x start] *65536 + [x size] mov ecx,100*65536+100 ; [y start] *65536 + [y size] mov edx,0x03780078 ; color of work area RRGGBB,8->color gl mcall mov eax,8 mov ebx,70*65536+40 mov ecx,70*65536+20 mov edx,4 mov esi,0xac0000 mcall ; WINDOW LABEL mov eax,4 ; function 4 : write text to window mov ebx,8*65536+8 ; [x start] *65536 + [y start] mov ecx,0x10ddeeff ; font 1 & color ( 0xF0RRGGBB ) mov edx,labelt3 ; pointer to text beginning mov esi,labelt3.size ; text length mcall add ebx,38*65536+20 mov ecx,0xddeeff mov edx, bgrdtext mov esi, bgrdtext.size mcall add ebx,40*65536+15 mov edx, tiled mov esi, tiled.size mcall add ebx,15 mov edx, stretch mov esi, stretch.size ;7 mcall add ebx,18 mov edx, ok_btn mov esi, ok_btn.size ;2 mcall call drawflags mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw mcall ret drawflags: mov eax,8 mov ebx,70*65536+10 mov ecx,40*65536+10 mov edx,2 mov esi,0xe0e0e0 mcall add ecx,15*65536 inc edx mcall mov eax,4 mov ebx,73*65536+42 xor ecx,ecx mov edx,vflag mov esi,1 cmp dword [bgrmode],1 je nodownflag add ebx,15 nodownflag: mcall ret ; DATA AREA status dd 0 ;bit0=1 if file thread is created soi dd 0 delta dd 0 process dd 0 bWasDraw db 0 vflag: db 'x' bgrmode: dd 1 wnd_width dd 210 wnd_height dd 53 lsz labelt3,\ en, 'Background set',\ ru, "Установка фона",\ de, 'Hintergrund gesetzt' lsz bgrdtext,\ en, 'SET AS BACKGROUND:',\ ru, 'Тип обоев:',\ de, 'ALS HINTERGRUND' lsz tiled,\ en, 'TILED',\ ru, 'замостить',\ de, 'GEKACHELT' lsz stretch,\ en, 'STRETCH',\ ru, 'растянуть',\ de, 'GESTRECKT' lsz ok_btn,\ en, 'Ok',\ ru, 'Ok',\ de, 'Ok' image_file dd 0 image_file_1 dd 0 pos: dd 6 window_high dd 0 window_width dd 0 skin_high dd 0 ;--------------------------------------------------------------------- ; for EDITBOX name_editboxes: edit1 edit_box 200,10,30,0xffffff,0xbbddff,0,0,0,255,string,ed_focus+ed_always_focus,0 name_editboxes_end: mouse_flag: dd 0x0 ;--------------------------------------------------------------------- fileinfo: dd 5 dd 0 dd 0 dd 0 dd process_info string: db '/sys/bgr.bmp',0 IM_END: rb string+257-$ temp_area: procinfo: process_info: rb 1024*4 rb 1024*2 thread: rb 512 I_END: