From 882f26ac9dc93c0690603df497ee253600232af5 Mon Sep 17 00:00:00 2001 From: IgorA Date: Tue, 13 Sep 2011 20:27:29 +0000 Subject: [PATCH] buf2d: 1) small optimize 2) add examples git-svn-id: svn://kolibrios.org@2185 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/buf2d/trunk/about.htm | 3 +- .../develop/libraries/buf2d/trunk/buf2d.asm | 30 +- .../libraries/buf2d/trunk/examples/build.bat | 21 ++ .../libraries/buf2d/trunk/examples/dll.inc | 99 ++++++ .../buf2d/trunk/examples/e0_dr_lines.asm | 150 +++++++++ .../buf2d/trunk/examples/e1_scaling.asm | 182 ++++++++++ .../buf2d/trunk/examples/e2_images.asm | 318 ++++++++++++++++++ .../buf2d/trunk/examples/e3_text.asm | 318 ++++++++++++++++++ .../buf2d/trunk/examples/e4_graf_ed.asm | 189 +++++++++++ .../libraries/buf2d/trunk/examples/foto.jpg | Bin 0 -> 29394 bytes .../libraries/buf2d/trunk/examples/img0.png | Bin 0 -> 5287 bytes .../libraries/buf2d/trunk/examples/img1.png | Bin 0 -> 28581 bytes .../libraries/buf2d/trunk/examples/mem.inc | 48 +++ 13 files changed, 1344 insertions(+), 14 deletions(-) create mode 100644 programs/develop/libraries/buf2d/trunk/examples/build.bat create mode 100644 programs/develop/libraries/buf2d/trunk/examples/dll.inc create mode 100644 programs/develop/libraries/buf2d/trunk/examples/e0_dr_lines.asm create mode 100644 programs/develop/libraries/buf2d/trunk/examples/e1_scaling.asm create mode 100644 programs/develop/libraries/buf2d/trunk/examples/e2_images.asm create mode 100644 programs/develop/libraries/buf2d/trunk/examples/e3_text.asm create mode 100644 programs/develop/libraries/buf2d/trunk/examples/e4_graf_ed.asm create mode 100644 programs/develop/libraries/buf2d/trunk/examples/foto.jpg create mode 100644 programs/develop/libraries/buf2d/trunk/examples/img0.png create mode 100644 programs/develop/libraries/buf2d/trunk/examples/img1.png create mode 100644 programs/develop/libraries/buf2d/trunk/examples/mem.inc diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm index 02bf7c31ee..facb6c31b1 100644 --- a/programs/develop/libraries/buf2d/trunk/about.htm +++ b/programs/develop/libraries/buf2d/trunk/about.htm @@ -62,7 +62,7 @@ table { font-size: 15px; } ╤ хх яюью∙№■ ьюцэю ёючфртрЄ№ сєЇхЁр ё шчюсЁрцхэш ьш т ярь Єш, ш яЁш эхюсїюфшьюёЄш т√тюфшЄ№ шї эр ¤ъЁрэ. ╚чюсЁрцхэш  ьюцэю эръырф√трЄ№ юфэю эр фЁєуюх, яюффхЁцштрхЄё  ЁрсюЄр ё яЁючЁрўэ√ьш шчюсЁрцхэш ьш, хёЄ№ ЇєэъЎш  Ёшёютрэш  ышэш яюър эр ¤Єюь тёх.

-

╧юёыхфэхх юсэютыхэшх сшсышюЄхъш 25.03.11.

+

╧юёыхфэхх юсэютыхэшх сшсышюЄхъш 13.09.11.

╘юЁьрЄ√ сєЇхЁют

╧юффхЁцштрхЄё  3 ЇюЁьрЄр сєЇхЁют. @@ -293,5 +293,6 @@ import_buf2d_lib:

22.12.10 - шчьхэхэю шь  ЇєэъЎшш buf2d_cruve_bezier эр buf2d_curve_bezier.

25.03.11 - фюсртыхэр ЇєэъЎш  Ёшёютрэш  фы  Єюўъш buf2d_set_pixel.

30.08.11 - фюсртыхэр ЇєэъЎш  шчьхэхэш  ЁрчьхЁют сєЇхЁр buf2d_resize.

+

13.09.11 - юяЄшьшчшЁютрэр ЁрсюЄр ЇєэъЎшщ buf_filled_rect_by_size buf_rect_by_size, фюсртыхэ√ яЁшьхЁ√ шёяюы№чютрэш  сшсышюЄхъш.

\ No newline at end of file diff --git a/programs/develop/libraries/buf2d/trunk/buf2d.asm b/programs/develop/libraries/buf2d/trunk/buf2d.asm index d526caff48..480d827605 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -1080,11 +1080,19 @@ proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword jle @f xchg ebx,esi ;если x0 > x1 то меняем местами x0 и x1 @@: + bt ebx,31 + jae @f + ;если координата x0 отрицательная + xor ebx,ebx + @@: cmp esi,buf2d_w jl @f + ;если координата x0 больше ширины буфера mov esi,buf2d_w ;dec esi @@: + cmp ebx,esi + jge .end24 ;если x0 >= x1 может возникнуть когда обе координаты x0, x1 находились за одним из пределов буфера ;в eax вычисляем начало 1-й точки линии в буфере изображения mov eax,buf2d_w ;size x @@ -1093,21 +1101,17 @@ proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword lea eax,[eax+eax*2] ;(size_x*y+x)*3 add eax,buf2d_data ;ptr+(size_x*y+x)*3 + mov ecx,esi + sub ecx,ebx ;в ecx колличество точек линии выводимых в буфер mov edx,dword[color] + mov ebx,edx ;координата x0 в ebx уже не нужна + ror edx,16 ;поворачиваем регистр что бы 3-й байт попал в dl + cld @@: ;цикл по оси x от x0 до x1 - cmp ebx,esi - jge @f - bt ebx,31 - jc .otr_x - mov word[eax],dx ;copy pixel color - ror edx,16 - mov byte[eax+2],dl - ror edx,16 - .otr_x: - add eax,3 - inc ebx - jmp @b - @@: + mov word[eax],bx ;copy pixel color + mov byte[eax+2],dl + add eax,3 + loop @b .end24: popad ret diff --git a/programs/develop/libraries/buf2d/trunk/examples/build.bat b/programs/develop/libraries/buf2d/trunk/examples/build.bat new file mode 100644 index 0000000000..0f5a8f7e32 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/build.bat @@ -0,0 +1,21 @@ +if not exist bin mkdir bin +@fasm.exe -m 16384 ..\buf2d.asm bin\buf2d.obj +@kpack bin\buf2d.obj + +if not exist bin\font8x9.bmp @copy ..\..\..\..\..\fs\kfar\trunk\font8x9.bmp bin\font8x9.bmp +@copy foto.jpg bin\foto.jpg +@copy img0.png bin\img0.png +@copy img1.png bin\img1.png + +@fasm.exe -m 16384 e0_dr_lines.asm bin\e0_dr_lines.kex +@fasm.exe -m 16384 e1_scaling.asm bin\e1_scaling.kex +@fasm.exe -m 16384 e2_images.asm bin\e2_images.kex +@fasm.exe -m 16384 e3_text.asm bin\e3_text.kex +@fasm.exe -m 16384 e4_graf_ed.asm bin\e4_graf_ed.kex + +@kpack bin\e0_dr_lines.kex +@kpack bin\e1_scaling.kex +@kpack bin\e2_images.kex +@kpack bin\e3_text.kex +@kpack bin\e4_graf_ed.kex +pause \ No newline at end of file diff --git a/programs/develop/libraries/buf2d/trunk/examples/dll.inc b/programs/develop/libraries/buf2d/trunk/examples/dll.inc new file mode 100644 index 0000000000..5f13fbbc16 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/dll.inc @@ -0,0 +1,99 @@ + +proc dll.Load, import_table:dword + mov esi,[import_table] + .next_lib: mov edx,[esi] + or edx,edx + jz .exit + push esi + mov esi,[esi+4] + mov edi,s_libdir.fname + @@: lodsb + stosb + or al,al + jnz @b + mcall 68,19,s_libdir + or eax,eax + jz .fail + stdcall dll.Link,eax,edx + push eax + mov eax, [eax] + cmp dword [eax], 'lib_' + pop eax + jnz @f + stdcall dll.Init,[eax+4] + @@: + pop esi + add esi,8 + jmp .next_lib + .exit: xor eax,eax + ret + .fail: add esp,4 + xor eax,eax + inc eax + ret +endp + +proc dll.Link, exp:dword,imp:dword + push eax + mov esi,[imp] + test esi,esi + jz .done + .next: lodsd + test eax,eax + jz .done + stdcall dll.GetProcAddress,[exp],eax + or eax,eax + jz @f + mov [esi-4],eax + jmp .next + @@: mov dword[esp],0 + .done: pop eax + ret +endp + +proc dll.Init, dllentry:dword + pushad + mov eax,mem.Alloc + mov ebx,mem.Free + mov ecx,mem.ReAlloc + mov edx,dll.Load + stdcall [dllentry] + popad + ret +endp + +proc dll.GetProcAddress, exp:dword,sz_name:dword + mov edx,[exp] + xor eax,eax + .next: or edx,edx + jz .end + cmp dword[edx],0 + jz .end + stdcall strcmp,[edx],[sz_name] + test eax,eax + jz .ok + add edx,8 + jmp .next + .ok: mov eax,[edx+4] + .end: ret +endp + +proc strcmp, str1:dword,str2:dword + push esi edi + mov esi,[str1] + mov edi,[str2] + xor eax,eax + @@: lodsb + scasb + jne .fail + or al,al + jnz @b + jmp .ok + .fail: or eax,-1 + .ok: pop edi esi + ret +endp + +s_libdir: + db '/sys/lib/' + .fname rb 32 diff --git a/programs/develop/libraries/buf2d/trunk/examples/e0_dr_lines.asm b/programs/develop/libraries/buf2d/trunk/examples/e0_dr_lines.asm new file mode 100644 index 0000000000..c2cbdb8b10 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/e0_dr_lines.asm @@ -0,0 +1,150 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem,stacktop + dd 0,cur_dir_path + +include '../../../../../macros.inc' +include '../../../../../proc32.inc' +include '../../../../../develop/libraries/box_lib/load_lib.mac' +include 'mem.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +align 4 +start: + load_library vectors_name, cur_dir_path, library_path, system_path, \ + err_message_found_lib, head_f_l, import_buf2d_lib, err_message_import, head_f_i + cmp eax,-1 + jz button.exit + + mcall 40,0x27 + stdcall [buf2d_create], buf_0 ;создаем буфер + stdcall [buf2d_line], buf_0, 110, 20, 125, 90, 0xffff00 ;рисуем линию + stdcall [buf2d_line], buf_0, 60, 120, 110, 20, 0xd000 ;рисуем линию + stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff + stdcall [buf2d_circle], buf_0, 125, 90, 30, 0xffffff ;рисуем окружность + stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000 ;рисуем окружность + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall 10 + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + jmp still + +align 4 +draw_window: + pushad + mcall 12,1 + + ;mov edx,0x32000000 + mov edx,0x33000000 + mcall 0,(50 shl 16)+330,(30 shl 16)+275,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall 12,2 + popad + ret + +align 4 +key: + mcall 2 + + cmp ah,27 ;Esc + je button.exit + + jmp still + +align 4 +button: + mcall 17 ;получить код нажатой кнопки + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + mcall -1 ;выход из программы + +caption db 'Test buf2d library, [Esc] - exit',0 + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 20 ;+4 left + dw 10 ;+6 top + dd 160 ;+8 w + dd 128 ;+12 h + dd 0x80 ;+16 color + db 24 ;+20 bit in pixel + +;-------------------------------------------------- +system_path db '/sys/lib/' +vectors_name db 'buf2d.obj',0 +err_message_found_lib db 'Sorry I cannot load library buf2d.obj',0 +head_f_i: +head_f_l db 'System error',0 +err_message_import db 'Error on load import library buf2d.obj',0 +;-------------------------------------------------- + +i_end: ;конец кода + rb 1024 +stacktop: +cur_dir_path: + rb 4096 +library_path: + rb 4096 +mem: + diff --git a/programs/develop/libraries/buf2d/trunk/examples/e1_scaling.asm b/programs/develop/libraries/buf2d/trunk/examples/e1_scaling.asm new file mode 100644 index 0000000000..8ba752afa8 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/e1_scaling.asm @@ -0,0 +1,182 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem,stacktop + dd 0,cur_dir_path + +include '../../../../../macros.inc' +include '../../../../../proc32.inc' +include '../../../../../develop/libraries/box_lib/load_lib.mac' +include 'mem.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +align 4 +start: + load_library vectors_name, cur_dir_path, library_path, system_path, \ + err_message_found_lib, head_f_l, import_buf2d_lib, err_message_import, head_f_i + cmp eax,-1 + jz button.exit + + mcall 40,0x27 + stdcall [buf2d_create], buf_0 ;создаем буфер + stdcall [buf2d_line], buf_0, 110, 20, 125, 90, 0xffff00 ;рисуем линию + stdcall [buf2d_line], buf_0, 60, 120, 110, 20, 0xd000 ;рисуем линию + stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff + stdcall [buf2d_circle], buf_0, 125, 90, 30, 0xffffff ;рисуем окружность + stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000 ;рисуем окружность + + stdcall [buf2d_img_hdiv2], buf_0 ;сжимаем изображение в буфере по высоте в 2 раза + stdcall [buf2d_img_wdiv2], buf_0 ;сжимаем изображение в буфере по ширине в 2 раза + stdcall [buf2d_create_f_img], buf_1,[buf_0] ;создаем маленький буфер buf_1, на основе сжатого изображения из buf_0 + + ;если бы использовалась функция buf2d_create, тогда биты изображения + ;пришлось бы копировать следущими строками: + ;xor ecx,ecx + ;xor eax,eax + ;mov cx,word[buf_1.size_x] + ;mov ax,word[buf_1.size_y] + ;imul ecx,eax + ;imul ecx,3 ;ecx - колличество байт в маленьком буфере + ;stdcall mem_copy, dword[buf_0],dword[buf_1],ecx + + stdcall [buf2d_clear], buf_0,0xffffff + stdcall [buf2d_bit_blt], buf_0, 15,10, buf_1 + stdcall [buf2d_bit_blt], buf_0, 110,65, buf_1 + + stdcall [buf2d_conv_24_to_8], buf_1 + ;stdcall [buf2d_bit_blt_alpha], buf_0, 1,1, buf_1,0xff8080 ;рисуем контуры изображения на фотографии + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall 10 + cmp al,1 ;изм. положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + jmp still + +align 4 +draw_window: + pushad + mcall 12,1 + + ;mov edx,0x32000000 + mov edx,0x33000000 + mcall 0,(50 shl 16)+330,(30 shl 16)+275,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall 12,2 + popad + ret + +align 4 +key: + mcall 2 + + cmp ah,27 ;Esc + je button.exit + + jmp still + +align 4 +button: + mcall 17 ;получить код нажатой кнопки + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_1 ;удаляем буфер + mcall -1 ;выход из программы + +caption db 'Test buf2d library, [Esc] - exit',0 + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 20 ;+4 left + dw 10 ;+6 top + dd 160 ;+8 w + dd 128 ;+12 h + dd 0x80 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dw 10 ;+4 left + dw 10 ;+6 top +.size_x: dd 80 ;+8 w +.size_y: dd 64 ;+12 h + dd 0x80 ;+16 color + db 24 ;+20 bit in pixel + +;-------------------------------------------------- +system_path db '/sys/lib/' +vectors_name db 'buf2d.obj',0 +err_message_found_lib db 'Sorry I cannot load library buf2d.obj',0 +head_f_i: +head_f_l db 'System error',0 +err_message_import db 'Error on load import library buf2d.obj',0 +;-------------------------------------------------- + +i_end: ;конец кода + rb 1024 +stacktop: +cur_dir_path: + rb 4096 +library_path: + rb 4096 +mem: + diff --git a/programs/develop/libraries/buf2d/trunk/examples/e2_images.asm b/programs/develop/libraries/buf2d/trunk/examples/e2_images.asm new file mode 100644 index 0000000000..661d3011e5 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/e2_images.asm @@ -0,0 +1,318 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem,stacktop + dd 0,sys_path + +include '../../../../../macros.inc' +include '../../../../../proc32.inc' +include '../../../../../develop/libraries/box_lib/load_lib.mac' +include 'mem.inc' +include 'dll.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +IMAGE_FILE0_SIZE equ 640*480*3 ;размер файла с изображением 640 x 480 +IMAGE_FILE1_SIZE equ 200*186*3 ;размер файла с изображением 200 x 100 +fn_foto db 'foto.jpg',0 + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0x0 + else + copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je @f + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall dword[img_decode], dword[buf],ebx,0 + mov dword[image_data],eax + ;преобразуем изображение к формату rgb + stdcall dword[img_to_rgb2], dword[image_data],dword[buf] + ;удаляем временный буфер image_data + stdcall dword[img_destroy], dword[image_data] + @@: +} + +align 4 +start: + load_libraries l_libs_start,load_lib_end + + ;проверка на сколько удачно загузилась наша либа + mov ebp,lib0 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + mov ebp,lib1 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + + mcall 40,0x27 + mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета + + load_image_file fn_foto, image_data_foto,IMAGE_FILE0_SIZE + stdcall [buf2d_create_f_img], buf_0,[image_data_foto] ;создаем буфер + stdcall mem.Free,[image_data_foto] ;освобождаем память + + load_image_file 'img0.png',image_data_gray,IMAGE_FILE1_SIZE + stdcall [buf2d_create_f_img], buf_1,[image_data_gray] ;создаем буфер + stdcall mem.Free,[image_data_gray] ;освобождаем память + + load_image_file 'img1.png',image_data_rgb, IMAGE_FILE1_SIZE + stdcall [buf2d_create_f_img], buf_2,[image_data_rgb] ;создаем буфер + stdcall mem.Free,[image_data_rgb] ;освобождаем память + + stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8бит + stdcall [buf2d_conv_24_to_32],buf_2,buf_1 ;делаем буфер rgba 32бит + + stdcall [buf2d_bit_blt], buf_0, 10,170, buf_2 ;рисуем изображение на фотографии + stdcall [buf2d_bit_blt_transp], buf_0, 210,270, buf_2 ;рисуем прозрачное изображение на фотографии + stdcall [buf2d_bit_blt_alpha], buf_0, 410,170, buf_1,0xff8080 ;рисуем контуры изображения на фотографии + +align 4 +red_win: + call draw_window + +align 4 +still: ;главный цикл + mcall 10 + + cmp al,0x1 ;изменилось положение окна + jz red_win + cmp al,0x2 + jz key + cmp al,0x3 + jz button + + jmp still + +align 4 +key: + push eax ebx + mcall 2 +;... + pop ebx eax + jmp still + + +align 4 +draw_window: + pushad + mcall 12,1 + + mov edx,[sc.work] + or edx,0x33000000 + mcall 0,(20 shl 16)+670,(20 shl 16)+520,,,caption ;создание окна + + stdcall [buf2d_draw], buf_0 + + mcall 12,2 + popad + ret + +head_f_i: +head_f_l db 'Системная ошибка',0 + +system_dir0 db '/sys/lib/' +name_buf2d db 'buf2d.obj',0 +err_message_found_lib0 db 'Не удалось найти библиотеку buf2d.obj',0 +err_message_import0 db 'Ошибка при импорте библиотеки buf2d.obj',0 + +system_dir1 db '/sys/lib/' +name_libimg db 'libimg.obj',0 +err_message_found_lib1 db 'Не удалось найти библиотеку libimg.obj',0 +err_message_import1 db 'Ошибка при импорте библиотеки libimg.obj',0 + +;library structures +l_libs_start: + lib0 l_libs name_buf2d, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, import_buf2d_lib, err_message_import0, head_f_i + lib1 l_libs name_libimg, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, import_libimg, err_message_import1, head_f_i +load_lib_end: + +align 4 +button: + mcall 17 ;получить код нажатой кнопки + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_1 ;удаляем буфер + stdcall [buf2d_delete],buf_2 ;удаляем буфер + mcall -1 ;выход из программы + +image_data dd 0 ;память для преобразования картинки функциями libimg +image_data_gray dd 0 ;память с преобразованным изображением в формате 8-bit +image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb +image_data_foto dd 0 + +run_file_70 FileInfoBlock +caption db 'Draw images 13.09.11',0 ;подпись окна +sc system_colors ;системные цвета + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 5 ;+6 top + dd 640 ;+8 w + dd 480 ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dw 25 ;+4 left + dw 25 ;+6 top + dd 200 ;+8 w + dd 186 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_2: + dd 0 ;указатель на буфер изображения + dw 235 ;+4 left + dw 25 ;+6 top + dd 200 ;+8 w + dd 186 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +import_libimg: + dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + +i_end: + rb 1024 +stacktop: + sys_path rb 4096 + file_name: + rb 4096 + plugin_path: + rb 4096 + openfile_path: + rb 4096 + filename_area: + rb 256 +mem: \ No newline at end of file diff --git a/programs/develop/libraries/buf2d/trunk/examples/e3_text.asm b/programs/develop/libraries/buf2d/trunk/examples/e3_text.asm new file mode 100644 index 0000000000..dc5fa8b313 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/e3_text.asm @@ -0,0 +1,318 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem,stacktop + dd 0,sys_path + +include '../../../../../macros.inc' +include '../../../../../proc32.inc' +include '../../../../../develop/libraries/box_lib/load_lib.mac' +include 'mem.inc' +include 'dll.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +IMAGE_FILE1_SIZE equ 128*144*3 ;размер файла с изображением 128 x 144 + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0x0 + else + copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je @f + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall dword[img_decode], dword[buf],ebx,0 + mov dword[image_data],eax + ;преобразуем изображение к формату rgb + stdcall dword[img_to_rgb2], dword[image_data],dword[buf] + ;удаляем временный буфер image_data + stdcall dword[img_destroy], dword[image_data] + @@: +} + +align 4 +start: + load_libraries l_libs_start,load_lib_end + + ;проверка на сколько удачно загузилась наша либа + mov ebp,lib0 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + mov ebp,lib1 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + + mcall 40,0x27 + mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета + + stdcall [buf2d_create], buf_0 ;создаем буфер + + load_image_file 'font8x9.bmp', image_data_foto,IMAGE_FILE1_SIZE + stdcall [buf2d_create_f_img], buf_1,[image_data_foto] ;создаем буфер + stdcall mem.Free,[image_data_foto] ;освобождаем память + + stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит + stdcall [buf2d_bit_blt_alpha], buf_0, 70,10, buf_1,0x20d020 ;рисуем исходную текстовую матрицу 16*16 + stdcall [buf2d_convert_text_matrix], buf_1 + stdcall [buf2d_bit_blt_alpha], buf_0, 10,10, buf_1,0xff8080 ;рисуем преобразованную текстовую матрицу 1*256 + stdcall [buf2d_draw_text], buf_0, buf_1,some_text,70,170,0x4040ff ;рисуем строку с текстом + +align 4 +red_win: + call draw_window + +align 4 +still: ;главный цикл + mcall 10 + + cmp al,0x1 ;изменилось положение окна + jz red_win + cmp al,0x2 + jz key + cmp al,0x3 + jz button + + jmp still + +align 4 +key: + push eax ebx + mcall 2 +;... + pop ebx eax + jmp still + + +align 4 +draw_window: + pushad + mcall 12,1 + + mov edx,[sc.work] + or edx,0x33000000 + mcall 0,(20 shl 16)+670,(20 shl 16)+520,,,caption ;создание окна + + stdcall [buf2d_draw], buf_0 + + mcall 12,2 + popad + ret + +head_f_i: +head_f_l db 'Системная ошибка',0 + +system_dir0 db '/sys/lib/' +name_buf2d db 'buf2d.obj',0 +err_message_found_lib0 db 'Не удалось найти библиотеку buf2d.obj',0 +err_message_import0 db 'Ошибка при импорте библиотеки buf2d.obj',0 + +system_dir1 db '/sys/lib/' +name_libimg db 'libimg.obj',0 +err_message_found_lib1 db 'Не удалось найти библиотеку libimg.obj',0 +err_message_import1 db 'Ошибка при импорте библиотеки libimg.obj',0 + +;library structures +l_libs_start: + lib0 l_libs name_buf2d, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, import_buf2d_lib, err_message_import0, head_f_i + lib1 l_libs name_libimg, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, import_libimg, err_message_import1, head_f_i +load_lib_end: + +align 4 +button: + mcall 17 ;получить код нажатой кнопки + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_1 ;удаляем буфер + mcall -1 ;выход из программы + +image_data dd 0 ;память для преобразования картинки функциями libimg +image_data_gray dd 0 ;память с преобразованным изображением в формате 8-bit +image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb +image_data_foto dd 0 + +run_file_70 FileInfoBlock +caption db 'Draw text 13.09.11',0 ;подпись окна +sc system_colors ;системные цвета + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 5 ;+6 top + dd 640 ;+8 w + dd 480 ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dw 25 ;+4 left + dw 25 ;+6 top + dd 128 ;+8 w + dd 144 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +some_text db 'Пример вывода теста в буфер, возможен вывод:',13,13 +db ' * в несколько строк',13 +db ' * можно задавать цвет текста',13,13 +db 'Сегодня 13 сентября 2011.',0 + +align 4 +import_libimg: + dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_resize dd sz_buf2d_resize + buf2d_line dd sz_buf2d_line + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h + buf2d_flood_fill dd sz_buf2d_flood_fill + buf2d_set_pixel dd sz_buf2d_set_pixel + + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_resize db 'buf2d_resize',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + +i_end: + rb 1024 +stacktop: + sys_path rb 4096 + file_name: + rb 4096 + plugin_path: + rb 4096 + openfile_path: + rb 4096 + filename_area: + rb 256 +mem: \ No newline at end of file diff --git a/programs/develop/libraries/buf2d/trunk/examples/e4_graf_ed.asm b/programs/develop/libraries/buf2d/trunk/examples/e4_graf_ed.asm new file mode 100644 index 0000000000..2a54c361bd --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/e4_graf_ed.asm @@ -0,0 +1,189 @@ +use32 + org 0x0 + db 'MENUET01' ;шфхэЄшЇ. шёяюыэ хьюую Їрщыр тёхуфр 8 срщЄ + dd 0x1 + dd start + dd i_end ;ЁрчьхЁ яЁшыюцхэш  + dd mem,stacktop + dd 0,cur_dir_path + +include '../../../../../macros.inc' +include '../../../../../proc32.inc' +include '../../../../../develop/libraries/box_lib/load_lib.mac' +include 'mem.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +buf2d_l equ word[edi+4] ;юЄёЄєя ёыхтр +buf2d_t equ word[edi+6] ;юЄёЄєя ётхЁїє + +align 4 +start: + load_library vectors_name, cur_dir_path, library_path, system_path, \ + err_message_found_lib, head_f_l, import_buf2d_lib, err_message_import, head_f_i + cmp eax,-1 + jz button.exit + + mcall 40,0x27 + mcall 48,3,sc,sizeof.system_colors ;яюыєўрхь ёшёЄхьэ√х ЎтхЄр + stdcall [buf2d_create], buf_0 ;ёючфрхь сєЇхЁ + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall 10 + cmp al,0x1 ;шчь. яюыюцхэшх юъэр + jz red_win + cmp al,0x2 + jz key + cmp al,0x3 + jz button + cmp al,0x6 + jz mouse + jmp still + +align 4 +draw_window: + pushad + mcall 12,1 + + mov edx,[sc.work] + or edx,0x33000000 + mcall 0,(50 shl 16)+500,(30 shl 16)+370,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall 12,2 + popad + ret + +align 4 +key: + mcall 2 +; cmp ah,27 ;Esc +; je button.exit + jmp still + +align 4 +button: + mcall 17 ;яюыєўшЄ№ ъюф эрцрЄющ ъэюяъш + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;єфры хь сєЇхЁ + mcall -1 ;т√їюф шч яЁюуЁрьь√ + +align 4 +mouse: + ;юсЁрсрЄ√трхь юъэю ЁхфръЄюЁр + mcall 37,2 ;get mouse buttons + cmp al,1 + jne @f + mcall 37,1 ;get mouse coords + mov ebx,eax + shr ebx,16 ;т eax ъююЁфшэрЄр ьш°ш яю юёш 'x' + and eax,0xffff ;т eax ъююЁфшэрЄр ьш°ш яю юёш 'y' + mov edi,buf_0 + sub ax,buf2d_t ;ёфтшурхь ъююЁфшэрЄ√ єўшЄ√тр  ёьх∙хэшх сєЇхЁр + sub bx,buf2d_l + + ;Ёшёютрэшх яЁш эрцрЄшш + ;stdcall [buf2d_circle], edi, ebx, eax, 20, 0xff0000 ;Ёшёєхь юъЁєцэюёЄ№ + ;stdcall [buf2d_flood_fill], edi, ebx, eax, 0, 0xff,0xff0000 ;чрыштър ЎтхЄюь + sub eax,5 + sub ebx,5 + stdcall [buf2d_filled_rect_by_size], edi, ebx,eax, 10,10, 0xff0000 ;Ёшёєхь яЁ ьюєуюы№эшъ + stdcall [buf2d_draw], edi ;юсэюты хь ¤ъЁрэ + @@: + jmp still + +caption db 'Press left mouse button',0 +sc system_colors ;ёшёЄхьэ√х ЎтхЄр + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_resize dd sz_buf2d_resize + buf2d_line dd sz_buf2d_line + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h + buf2d_flood_fill dd sz_buf2d_flood_fill + buf2d_set_pixel dd sz_buf2d_set_pixel + + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_resize db 'buf2d_resize',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + +align 4 +buf_0: + dd 0 ;єърчрЄхы№ эр сєЇхЁ шчюсЁрцхэш  + dw 5 ;+4 left + dw 5 ;+6 top + dd 480 ;+8 w + dd 320 ;+12 h +.color: dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +;-------------------------------------------------- +system_path db '/sys/lib/' +vectors_name db 'buf2d.obj',0 +err_message_found_lib db 'Sorry I cannot load library buf2d.obj',0 +head_f_i: +head_f_l db 'System error',0 +err_message_import db 'Error on load import library buf2d.obj',0 +;-------------------------------------------------- + +i_end: ;ъюэхЎ ъюфр + rb 2*4096 +stacktop: + cur_dir_path: + rb 4096 + library_path: + rb 4096 +mem: + diff --git a/programs/develop/libraries/buf2d/trunk/examples/foto.jpg b/programs/develop/libraries/buf2d/trunk/examples/foto.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10fd26979dc993cb0c136c1ac761618949926820 GIT binary patch literal 29394 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%0Db& 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 literal 0 HcmV?d00001 diff --git a/programs/develop/libraries/buf2d/trunk/examples/img0.png b/programs/develop/libraries/buf2d/trunk/examples/img0.png new file mode 100644 index 0000000000000000000000000000000000000000..032884eaf78b5ed0264fd2ea4e6fd3347d71ae10 GIT binary patch literal 5287 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 literal 0 HcmV?d00001 diff --git a/programs/develop/libraries/buf2d/trunk/examples/mem.inc b/programs/develop/libraries/buf2d/trunk/examples/mem.inc new file mode 100644 index 0000000000..ec78fbf7f6 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/examples/mem.inc @@ -0,0 +1,48 @@ +;----------------------------------------------------------------------------- +proc mem.Alloc,size ;///////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx + mov ecx,[size] + ;*** add ecx,4 + mcall 68,12 + ;*** add ecx,-4 + ;*** mov [eax],ecx + ;*** add eax,4 + pop ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.ReAlloc,mptr,size ;////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx edx + mov ecx,[size] + or ecx,ecx + jz @f + ;*** add ecx,4 + @@: mov edx,[mptr] + or edx,edx + jz @f + ;*** add edx,-4 + @@: mcall 68,20 + or eax,eax + jz @f + ;*** add ecx,-4 + ;*** mov [eax],ecx + ;*** add eax,4 + @@: pop edx ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.Free,mptr ;////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx + mov ecx,[mptr] + or ecx,ecx + jz @f + ;*** add ecx,-4 + @@: mcall 68,13 + pop ecx ebx + ret +endp