'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
This commit is contained in:
IgorA 2012-02-20 12:10:29 +00:00
parent 2e8cd5b7ac
commit 8504e7bb6d
2 changed files with 115 additions and 28 deletions

View File

@ -127,14 +127,14 @@ stdcall [buf2d_clear], edi, buf2d_color ;
<p>Рисует в буфере линию принимает такиже параметры как и функция <b>buf2d_line</b>. Данная функция рисует сглаженную линию более красивую чем <b>buf2d_line</b>, но работает медленнее неё за счет вычисления смешанных цветов фона и самой линии.</p>
<h4>buf2d_rect_by_size</h4>
<p>Рисует прямоугольную рамку, по двум координатам, 2-я координата задана по размеру.</p>
<p>Рисует прямоугольную рамку, по двум координатам, 2-я координата задана по размеру. Если размеры отрицательные рамка рисуется в обратном направлении.</p>
<pre>stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080</pre>
<p>где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла; 150, 100 - размер прямоугольника; 0x8080 - цвет линии.</p>
<p>где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет линии.</p>
<h4>buf2d_filled_rect_by_size</h4>
<p>Рисует закрашенный прямоугольник, по двум координатам, 2-я координата задана по размеру. Если размер задать 1*1, то будет нарисована точка размером в 1 пиксель, т.е. размер прямоугольника в пикселях будет равен указанному.</p>
<p>Рисует закрашенный прямоугольник, по двум координатам, 2-я координата задана по размеру. Если размер задать 1*1, то будет нарисована точка размером в 1 пиксель, т.е. размер прямоугольника в пикселях будет равен указанному. Если размеры отрицательные прямоугольник рисуется в обратном направлении.</p>
<pre>stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080</pre>
<p>где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла; 150, 100 - размер прямоугольника; 0x8080 - цвет прямоуголика.</p>
<p>где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет прямоуголика.</p>
<h4>buf2d_circle</h4>
<p>Рисует в буфере окружность с заданным цветом и радиусом. Пример:</p>
@ -176,6 +176,10 @@ stdcall [buf2d_clear], edi, buf2d_color ;
<h4>buf2d_curve_bezier</h4>
<p>Рисует по трем точкам отрезок кривой безье.</p>
<pre>stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff</pre>
<p>где buf_0 - структура буфера в котором будет рисоваться кривая;
(10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90 - координаты точек (10,20), (110,10), (50,90);
0xff - цвет прямой.</p>
<h4>buf2d_convert_text_matrix</h4>
<p>Преобразует матрицу с текстом размером 16*16 в размер 1*256. Необходимо для создания матрицы для рисования текста. Перед использованием данной функции предполагается что есть изображение с полным набором символов размером 16 столбцов на 16 строк, из которого предварительно был создан 8 битный буфер.</p>
@ -203,7 +207,7 @@ stdcall [buf2d_convert_text_matrix], buf_1</pre>
<p>Сдвиг изображения в буфере по высоте вверх или вниз.</p>
<h4>buf2d_flood_fill</h4>
<p>Функция для рекурсивной заливки выбранным цветом. Имееться два варианта заливки. Пример:</p>
<p>Функция для рекурсивной заливки выбранным цветом. Имеется два варианта заливки. Пример:</p>
<pre>stdcall [buf2d_flood_fill], buf_0, 100,200, 0, 0xff,0xff0000</pre>
<p>где buf_0 - структура буфера;
100,200 - координаты точки, с которой начнется заливка;
@ -304,6 +308,7 @@ import_buf2d_lib:
<p>25.03.11 - добавлена функция для рисования точки buf2d_set_pixel.</p>
<p>30.08.11 - добавлена функция изменения размеров буфера buf2d_resize.</p>
<p>13.09.11 - оптимизирована работа функций buf_filled_rect_by_size buf_rect_by_size, добавлены примеры использования библиотеки.</p>
<p>22.09.11 - добавлена функция buf2d_line_sm для рисования сглаженной линии.</з>
<p>22.09.11 - добавлена функция buf2d_line_sm для рисования сглаженной линии.</p>
<p>20.02.12 - функции buf_filled_rect_by_size и buf_rect_by_size могут принимать отрицательные размеры для прямоугольников, в функции buf2d_line горизонтальная линия рисуется на 1 пиксель длинее (раньше не дорисовывало), некоторые функции могут рисовать в 8 битных буферах.</p>
</body>
</html>

View File

@ -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
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: