From 68cfc90d5b72a5430e492953a793277286748fd4 Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 22 Sep 2011 15:38:57 +0000 Subject: [PATCH] buf2d.obj: add new function 'buf2d_line_sm' to drawing smooth lines git-svn-id: svn://kolibrios.org@2230 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/buf2d/trunk/about.htm | 17 +- .../develop/libraries/buf2d/trunk/buf2d.asm | 193 +++++++++++++++++- .../libraries/buf2d/trunk/examples/build.bat | 2 + .../buf2d/trunk/examples/e5_lines_sm.asm | 183 +++++++++++++++++ 4 files changed, 390 insertions(+), 5 deletions(-) create mode 100644 programs/develop/libraries/buf2d/trunk/examples/e5_lines_sm.asm diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm index facb6c31b1..4c9be67ed0 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; } ╤ хх яюью∙№■ ьюцэю ёючфртрЄ№ сєЇхЁр ё шчюсЁрцхэш ьш т ярь Єш, ш яЁш эхюсїюфшьюёЄш т√тюфшЄ№ шї эр ¤ъЁрэ. ╚чюсЁрцхэш  ьюцэю эръырф√трЄ№ юфэю эр фЁєуюх, яюффхЁцштрхЄё  ЁрсюЄр ё яЁючЁрўэ√ьш шчюсЁрцхэш ьш, хёЄ№ ЇєэъЎш  Ёшёютрэш  ышэш яюър эр ¤Єюь тёх.

-

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

+

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

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

╧юффхЁцштрхЄё  3 ЇюЁьрЄр сєЇхЁют. @@ -100,7 +100,11 @@ buf_0:

╤ючфрхЄ сєЇхЁ эр юёэютх шчюсЁрцхэш  т ЇюЁьрЄх rgb.

buf2d_clear

-

╫шёЄшЄ сєЇхЁ Їюэют√ь ЎтхЄюь.

+

╫шёЄшЄ сєЇхЁ єърчрэ√ь ЎтхЄюь. ╧ЁшьхЁ:

+
buf2d_color equ dword[edi+16] ;ЎтхЄ Їюэр сєЇхЁр
+mov edi,buf_0
+stdcall [buf2d_clear], edi, buf2d_color ;юўш∙рхь ¤ъЁрэ Їюэют√ь ЎтхЄюь
+

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр.

buf2d_draw

╨шёєхЄ сєЇхЁ эр ¤ъЁрэх (ЁрсюЄрхЄ ўхЁхч ёшёЄхьэє■ Ї. 7). ╨шёє■Єё  Єюы№ъю сєЇхЁр ё уыєсшэющ ЎтхЄр 24 сшЄр.

@@ -117,6 +121,10 @@ buf_0:

╨шёєхЄ т сєЇхЁх ышэш■ ё чрфрээ√ь ЎтхЄюь ш ъююЁфшэрЄрьш. ╧ЁшьхЁ:

stdcall [buf2d_line], buf_0, 30,10, 110,70, 0xffff00 ;Ёшёєхь ышэш■

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр т ъюЄюЁюь сєфхЄ ЁшёютрЄ№ё  ышэш ; 30, 10, 110, 70 - ъююЁфшэрЄ√ ышэшш; 0xffff00 - ЎтхЄ ышэшш.

+

─ы  Ёшёютрэш  ёуырцхээющ ышэшш шёяюы№чєщЄх buf2d_line_sm.

+ +

buf2d_line_sm

+

╨шёєхЄ т сєЇхЁх ышэш■ яЁшэшьрхЄ Єръшцх ярЁрьхЄЁ√ ъръ ш ЇєэъЎш  buf2d_line. ─рээр  ЇєэъЎш  ЁшёєхЄ ёуырцхээє■ ышэш■ сюыхх ъЁрёштє■ ўхь buf2d_line, эю ЁрсюЄрхЄ ьхфыхээхх эх╕ чр ёўхЄ т√ўшёыхэш  ёьх°рээ√ї ЎтхЄют Їюэр ш ёрьющ ышэшш.

buf2d_rect_by_size

╨шёєхЄ яЁ ьюєуюы№эє■ Ёрьъє, яю фтєь ъююЁфшэрЄрь, 2-  ъююЁфшэрЄр чрфрэр яю ЁрчьхЁє.

@@ -232,6 +240,7 @@ import_buf2d_lib: buf2d_delete dd sz_buf2d_delete buf2d_resize dd sz_buf2d_resize buf2d_line dd sz_buf2d_line + buf2d_line_sm dd sz_buf2d_line_sm 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 @@ -259,6 +268,7 @@ import_buf2d_lib: sz_buf2d_delete db 'buf2d_delete',0 sz_buf2d_resize db 'buf2d_resize',0 sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_line_sm db 'buf2d_line_sm',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 @@ -291,8 +301,9 @@ import_buf2d_lib:

11.10.10 - шёяЁртыхэю чрфрэшх ЎтхЄют т эхъюЄюЁ√ї ЇєэъЎш ї, ъЁрёэ√щ ш ёшэшщ ЎтхЄр яюьхэ ы ьхёЄрьш. ╥хяхЁ№ ЎтхЄр ёютярфр■Є ё ёшёхьэ√ьш ЇєэъЎш ьш.

02.11.10 - фюсртыхэр ЇєэъЎш  buf2d_flood_fill.

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

-

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

+

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 фы  Ёшёютрэш  ёуырцхээющ ышэшш. \ 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 480d827605..59f5c327ee 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -128,6 +128,55 @@ get_pixel_24: @@: ret +;input: +; ebx = coord x +; ecx = coord y +; edx = pixel color + transparent +; edi = pointer to buffer struct +; t_prop, m_prop - коэфициенты необходимые для вычисления степени прозрачности +align 4 +transp_32 dd 0 ;цвет рисуемой точки + прозрачность +align 4 +proc draw_pixel_transp, t_prop:dword, m_prop:dword + ;cmp buf2d_bits,24 + ;jne @f + bt ebx,31 + jc @f + bt ecx,31 + jc @f + cmp ebx,buf2d_w + jge @f + cmp ecx,buf2d_h + jge @f + push eax ebx edx edi esi + 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 edi,esi ;указатель на цвет фона + mov dword[transp_32],edx ;цвет рисуемой точки + + xor edx,edx + mov eax,[t_prop] + shl eax,8 ;*=256 + mov ebx,[m_prop] + div ebx ;вычисляем коэф. прозрачности (должен быть от 0 до 255) + bt ax,8 + jnc .over_255 + ;если коеф. прозрачности >=256 то уменьшаем его до 255 + mov al,0xff + .over_255: + + mov byte[transp_32+3],al ;прозрачность рисуемой точки + mov esi,dword transp_32 ;указатель на цвет рисуемой точки + + call combine_colors + pop esi edi edx ebx eax + @@: + ret +endp ;создание буфера align 4 @@ -953,8 +1002,6 @@ locals napravl db ? endl pushad - mov edx,dword[color] - mov eax,dword[coord_x1] sub eax,dword[coord_x0] bt eax,31 @@ -964,11 +1011,17 @@ endl @@: mov ebx,dword[coord_y1] sub ebx,dword[coord_y0] + jnz @f + ;если задана горизонтальная линия y0=y1 + stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color] + jmp .coord_end + @@: bt ebx,31 jae @f neg ebx inc ebx @@: + mov edx,dword[color] mov [napravl],byte 0 ;bool steep=false cmp eax,ebx @@ -1060,6 +1113,140 @@ endl ret endp +;рисование сглаженной линии +align 4 +proc buf_line_brs_sm, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword +locals + loc_1 dd ? + loc_2 dd ? + napravl db ? +endl + pushad + mov eax,dword[coord_x1] + sub eax,dword[coord_x0] + bt eax,31 + jae @f + neg eax + inc eax + @@: + mov ebx,dword[coord_y1] + sub ebx,dword[coord_y0] + jnz @f + ;если задана горизонтальная линия y0=y1 + stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color] + jmp .coord_end + @@: + bt ebx,31 + jae @f + neg ebx + inc ebx + @@: + mov edx,dword[color] + + mov [napravl],byte 0 ;bool steep=false + cmp eax,ebx + jle @f + mov [napravl],byte 1 ;bool steep=true + swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0); + swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1); + @@: + mov eax,dword[coord_y0] ;x0 + cmp eax,dword[coord_y1] ;if(x0>x1) + jle @f + swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1); + swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1); + @@: + +; int deltax esi +; int deltay edi +; int error ebp-6 +; int ystep ebp-8 + + mov eax,dword[coord_y0] + mov esi,dword[coord_y1] + sub esi,eax ;deltax = y1-y0 + mov ebx,esi + shr ebx,1 + mov [loc_1],ebx ;error = deltax/2 + + mov eax,dword[coord_x0] + mov edi,dword[coord_x1] + mov [loc_2],dword -1 ;ystep = -1 + cmp eax,edi ;if (x0