From 8504e7bb6d582bee379757cffc12b608488614c0 Mon Sep 17 00:00:00 2001 From: IgorA Date: Mon, 20 Feb 2012 12:10:29 +0000 Subject: [PATCH] 'buf2d.obj': - functions buf_filled_rect_by_size buf_rect_by_size can take on negative dimensions of rectangles - function of the horizontal line is drawn buf2d_line 1 pixel longer - some functions can draw in 8-bit buffers git-svn-id: svn://kolibrios.org@2358 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/buf2d/trunk/about.htm | 17 ++- .../develop/libraries/buf2d/trunk/buf2d.asm | 126 +++++++++++++++--- 2 files changed, 115 insertions(+), 28 deletions(-) diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm index 4c9be67ed0..461168f7e7 100644 --- a/programs/develop/libraries/buf2d/trunk/about.htm +++ b/programs/develop/libraries/buf2d/trunk/about.htm @@ -127,14 +127,14 @@ stdcall [buf2d_clear], edi, buf2d_color ;

Рисует в буфере линию принимает такиже параметры как и функция buf2d_line. Данная функция рисует сглаженную линию более красивую чем buf2d_line, но работает медленнее неё за счет вычисления смешанных цветов фона и самой линии.

buf2d_rect_by_size

-

Рисует прямоугольную рамку, по двум координатам, 2-я координата задана по размеру.

+

Рисует прямоугольную рамку, по двум координатам, 2-я координата задана по размеру. Если размеры отрицательные рамка рисуется в обратном направлении.

stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080
-

где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла; 150, 100 - размер прямоугольника; 0x8080 - цвет линии.

+

где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет линии.

buf2d_filled_rect_by_size

-

Рисует закрашенный прямоугольник, по двум координатам, 2-я координата задана по размеру. Если размер задать 1*1, то будет нарисована точка размером в 1 пиксель, т.е. размер прямоугольника в пикселях будет равен указанному.

+

Рисует закрашенный прямоугольник, по двум координатам, 2-я координата задана по размеру. Если размер задать 1*1, то будет нарисована точка размером в 1 пиксель, т.е. размер прямоугольника в пикселях будет равен указанному. Если размеры отрицательные прямоугольник рисуется в обратном направлении.

stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080
-

где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла; 150, 100 - размер прямоугольника; 0x8080 - цвет прямоуголика.

+

где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет прямоуголика.

buf2d_circle

Рисует в буфере окружность с заданным цветом и радиусом. Пример:

@@ -176,6 +176,10 @@ stdcall [buf2d_clear], edi, buf2d_color ;

buf2d_curve_bezier

Рисует по трем точкам отрезок кривой безье.

+
stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff
+

где buf_0 - структура буфера в котором будет рисоваться кривая; + (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90 - координаты точек (10,20), (110,10), (50,90); + 0xff - цвет прямой.

buf2d_convert_text_matrix

Преобразует матрицу с текстом размером 16*16 в размер 1*256. Необходимо для создания матрицы для рисования текста. Перед использованием данной функции предполагается что есть изображение с полным набором символов размером 16 столбцов на 16 строк, из которого предварительно был создан 8 битный буфер.

@@ -203,7 +207,7 @@ stdcall [buf2d_convert_text_matrix], buf_1

Сдвиг изображения в буфере по высоте вверх или вниз.

buf2d_flood_fill

-

Функция для рекурсивной заливки выбранным цветом. Имееться два варианта заливки. Пример:

+

Функция для рекурсивной заливки выбранным цветом. Имеется два варианта заливки. Пример:

stdcall [buf2d_flood_fill], buf_0, 100,200, 0, 0xff,0xff0000

где buf_0 - структура буфера; 100,200 - координаты точки, с которой начнется заливка; @@ -304,6 +308,7 @@ import_buf2d_lib:

25.03.11 - добавлена функция для рисования точки buf2d_set_pixel.

30.08.11 - добавлена функция изменения размеров буфера buf2d_resize.

13.09.11 - оптимизирована работа функций buf_filled_rect_by_size buf_rect_by_size, добавлены примеры использования библиотеки.

-

22.09.11 - добавлена функция buf2d_line_sm для рисования сглаженной линии. +

22.09.11 - добавлена функция buf2d_line_sm для рисования сглаженной линии.

+

20.02.12 - функции buf_filled_rect_by_size и buf_rect_by_size могут принимать отрицательные размеры для прямоугольников, в функции buf2d_line горизонтальная линия рисуется на 1 пиксель длинее (раньше не дорисовывало), некоторые функции могут рисовать в 8 битных буферах.

\ 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 59f5c327ee..3fd8461f52 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -82,13 +82,19 @@ draw_pixel: mov esi,buf2d_w ;size x imul esi,ecx ;size_x*y add esi,ebx ;size_x*y+x - lea esi,[esi+esi*2] ;(size_x*y+x)*3 - add esi,buf2d_data ;ptr+(size_x*y+x)*3 - - mov word[esi],dx ;copy pixel color - ror edx,16 - mov byte[esi+2],dl - ror edx,16 + cmp buf2d_bits,8 + je .beg8 + lea esi,[esi+esi*2] ;(size_x*y+x)*3 + add esi,buf2d_data ;ptr+(size_x*y+x)*3 + mov word[esi],dx ;copy pixel color + ror edx,16 + mov byte[esi+2],dl + ror edx,16 + jmp .end_draw + .beg8: ;аЁб®ў ­ЁҐ в®зЄЁ ў 8 ЎЁв­®¬ ЎгдҐаҐ + add esi,buf2d_data ;ptr+(size_x*y+x) + mov byte[esi],dl + .end_draw: pop esi @@: ret @@ -1067,8 +1073,12 @@ endl mov eax,edi mov edi,[buf_struc] + cmp buf2d_bits,8 + je @f cmp buf2d_bits,24 - jne .coord_end + je @f + jmp .coord_end + @@: cmp [napravl],0 jne .coord_yx @@ -1251,9 +1261,14 @@ endp align 4 proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, color:dword pushad + pushfd mov edi,[buf_struc] + cmp buf2d_bits,8 + je @f cmp buf2d_bits,24 - jne .end24 + je @f + jmp .end24 + @@: ;®ЇаҐ¤Ґ«Ґ­ЁҐ Є®®а¤Ё­ в «Ё­ЁЁ ®в­®бЁвҐ«м­® ЎгдҐа  mov ecx,dword[coord_y0] bt ecx,31 @@ -1279,8 +1294,27 @@ proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword ;dec esi @@: cmp ebx,esi - jge .end24 ;Ґб«Ё x0 >= x1 ¬®¦Ґв ў®§­ЁЄ­гвм Є®Ј¤  ®ЎҐ Є®®а¤Ё­ вл x0, x1 ­ е®¤Ё«Ёбм §  ®¤­Ё¬ Ё§ ЇаҐ¤Ґ«®ў ЎгдҐа  + jg .end24 ;Ґб«Ё x0 > x1 ¬®¦Ґв ў®§­ЁЄ­гвм Є®Ј¤  ®ЎҐ Є®®а¤Ё­ вл x0, x1 ­ е®¤Ё«Ёбм §  ®¤­Ё¬ Ё§ ЇаҐ¤Ґ«®ў ЎгдҐа  + cmp buf2d_bits,24 + je .beg24 + ;аЁб®ў ­ЁҐ ў 8 ЎЁв­®¬ ЎгдҐаҐ + ;ў edx ўлзЁб«пҐ¬ ­ з «® 1-© в®зЄЁ «Ё­ЁЁ ў ЎгдҐаҐ Ё§®Ўа ¦Ґ­Ёп + mov edx,buf2d_w ;size x + imul edx,ecx ;size_x*y + add edx,ebx ;size_x*y+x + add edx,buf2d_data ;ptr+(size_x*y+x) + mov edi,edx ;⥯Ґам ¬®¦Ґ¬ Ї®авЁвм гЄ § вҐ«м ­  ЎгдҐа + + mov ecx,esi + sub ecx,ebx ;ў ecx Є®««ЁзҐбвў® в®зҐЄ «Ё­ЁЁ ўлў®¤Ё¬ле ў ЎгдҐа + inc ecx ;зв®-Ўл Ї®б«Ґ¤­пп в®зЄ  «Ё­ЁЁ в Є¦Ґ ®в®Ўа ¦ « бм + mov eax,dword[color] ;Ўг¤Ґ¬ ЁбЇ®«м§®ў вм в®«мЄ® §­ зҐ­ЁҐ ў al + cld + rep stosb ;жЁЄ« Ї® ®бЁ x ®в x0 ¤® x1 (ўЄ«оз п x1) + jmp .end24 + + .beg24: ;аЁб®ў ­ЁҐ ў 24 ЎЁв­®¬ ЎгдҐаҐ ;ў eax ўлзЁб«пҐ¬ ­ з «® 1-© в®зЄЁ «Ё­ЁЁ ў ЎгдҐаҐ Ё§®Ўа ¦Ґ­Ёп mov eax,buf2d_w ;size x imul eax,ecx ;size_x*y @@ -1290,16 +1324,18 @@ proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword mov ecx,esi sub ecx,ebx ;ў ecx Є®««ЁзҐбвў® в®зҐЄ «Ё­ЁЁ ўлў®¤Ё¬ле ў ЎгдҐа + inc ecx ;зв®-Ўл Ї®б«Ґ¤­пп в®зЄ  «Ё­ЁЁ в Є¦Ґ ®в®Ўа ¦ « бм mov edx,dword[color] mov ebx,edx ;Є®®а¤Ё­ в  x0 ў ebx 㦥 ­Ґ ­г¦­  ror edx,16 ;Ї®ў®а зЁў Ґ¬ ॣЁбва зв® Ўл 3-© Ў ©в Ї®Ї « ў dl cld - @@: ;жЁЄ« Ї® ®бЁ x ®в x0 ¤® x1 + @@: ;жЁЄ« Ї® ®бЁ x ®в x0 ¤® x1 (ўЄ«оз п x1) mov word[eax],bx ;copy pixel color mov byte[eax+2],dl add eax,3 loop @b .end24: + popfd popad ret endp @@ -1308,19 +1344,37 @@ align 4 proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword pushad mov edi,[buf_struc] + cmp buf2d_bits,8 + je @f cmp buf2d_bits,24 - jne .coord_end + je @f + jmp .coord_end + @@: mov eax,[coord_x] mov ebx,[coord_y] mov ecx,[w] - cmp ecx,1 - jl .coord_end + ;cmp ecx,1 + ;jl .coord_end + cmp ecx,0 + je .coord_end + jg @f + add eax,ecx + inc eax + neg ecx + @@: add ecx,eax dec ecx mov edx,[h] - cmp edx,1 - jl .coord_end + ;cmp edx,1 + ;jl .coord_end + cmp edx,0 + je .coord_end + jg @f + add ebx,edx + inc ebx + neg edx + @@: add edx,ebx dec edx @@ -1338,15 +1392,34 @@ align 4 proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword pushad mov edi,[buf_struc] + cmp buf2d_bits,8 + je @f cmp buf2d_bits,24 - jne .coord_end + je @f + jmp .coord_end + @@: mov eax,[coord_x] mov ebx,[coord_y] mov edx,[w] + cmp edx,0 + je .coord_end ;Ґб«Ё ўлб®в  0 ЇЁЄбҐ«Ґ© + jg @f ;Ґб«Ё ўлб®в  Ї®«®¦ЁвҐ«м­ п + add eax,edx + inc eax + neg edx ;иЁаЁ­г ¤Ґ« Ґ¬ Ї®«®¦ЁвҐ«м­®© + ;inc edx ;Ї®зҐ¬г вгв ­Ґ ¤®Ў ў«пҐ¬ 1-жг п ­Ґ §­ о, ­® б ­Ґ© а Ў®в Ґв ­Ґ Їа ўЁ«м­® + @@: add edx,eax + dec edx mov ecx,[h] - cmp ecx,1 ;ба ў­Ґ­ЁҐ б ¬Ё­Ё¬ «м­® ў®§¬®¦­®© ўлб®в®© - jl .coord_end ;Ґб«Ё ўлб®в  ¬Ґ­миҐ 1-Ј® ЇЁЄбҐ«п + cmp ecx,0 + je .coord_end ;Ґб«Ё ўлб®в  0 ЇЁЄбҐ«Ґ© + jg @f ;Ґб«Ё ўлб®в  Ї®«®¦ЁвҐ«м­ п + add ebx,ecx ;б¤ўЁЈ Ґ¬ ўҐае­оо Є®®а¤Ё­ вг Їаאַ㣮«м­ЁЄ  + inc ebx + neg ecx ;ўлб®вг ¤Ґ« Ґ¬ Ї®«®¦ЁвҐ«м­®© + ;inc ecx ;Ї®зҐ¬г вгв ­Ґ ¤®Ў ў«пҐ¬ 1-жг п ­Ґ §­ о, ­® б ­Ґ© а Ў®в Ґв ­Ґ Їа ўЁ«м­® + @@: mov esi,dword[color] cld @@: @@ -1366,8 +1439,12 @@ locals endl pushad mov edi,dword[buf_struc] + cmp buf2d_bits,8 + je @f cmp buf2d_bits,24 - jne .error + je @f + jmp .error + @@: mov edx,dword[color] finit @@ -1414,7 +1491,7 @@ endl jge @b jmp .exit_fun .error: - stdcall print_err,sz_buf2d_circle,txt_err_n24b + stdcall print_err,sz_buf2d_circle,txt_err_n8_24b .exit_fun: popad @@ -1561,8 +1638,12 @@ align 4 proc buf_set_pixel, buf_struc:dword, coord_x:dword, coord_y:dword, color:dword pushad mov edi,[buf_struc] + cmp buf2d_bits,8 + je @f cmp buf2d_bits,24 - jne .end24 + je @f + jmp .end24 + @@: mov ebx,dword[coord_x] mov ecx,dword[coord_y] mov edx,dword[color] @@ -2544,6 +2625,7 @@ endp txt_err_n8b db 'need buffer 8 bit',13,10,0 txt_err_n24b db 'need buffer 24 bit',13,10,0 +txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0 align 16 EXPORTS: