From 8ec9e02040c3d774adb4042e3a159263864e3d78 Mon Sep 17 00:00:00 2001 From: IgorA Date: Fri, 30 Jan 2015 16:21:33 +0000 Subject: [PATCH] add new function 'buf2d_flip_h' & optimizations git-svn-id: svn://kolibrios.org@5389 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/buf2d/trunk/about.htm | 33 ++- .../develop/libraries/buf2d/trunk/buf2d.asm | 205 +++++++++++++----- 2 files changed, 179 insertions(+), 59 deletions(-) diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm index 3320e729ad..555deeb3fd 100644 --- a/programs/develop/libraries/buf2d/trunk/about.htm +++ b/programs/develop/libraries/buf2d/trunk/about.htm @@ -59,9 +59,16 @@ table { font-size: 15px; }
  • buf2d_draw
  • buf2d_delete
  • buf2d_rotate
  • +
  • buf2d_resize
  • +
  • buf2d_line
  • +
  • buf2d_line_sm
  • +
  • buf2d_rect_by_size
  • +
  • buf2d_filled_rect_by_size
  • +
  • buf2d_circle
  • buf2d_img_hdiv2
  • buf2d_img_wdiv2
  • buf2d_crop_color
  • +
  • buf2d_flip_h
  • buf2d_flip_v
  • buf2d_filter_dither
  • @@ -81,7 +88,7 @@ table { font-size: 15px; } Есть функции рисования линий, кривых Безье, прямоугольников, окружностей. Также есть функции для рисований воксельной графики.

    -

    Последнее обновление библиотеки 15.11.12.

    +

    Последнее обновление библиотеки 30.01.15.

    Форматы буферов

    Поддерживается 3 формата буферов. @@ -139,31 +146,31 @@ stdcall [buf2d_clear], edi, buf2d_color ;

    stdcall [buf2d_rotate], buf_0, 90

    где buf_0 - структура буфера (может быть 8, 24 или 32 битным); 90 - угол поворота.

    -

    buf2d_resize

    +

    buf2d_resize

    Изменяет размеры буфера. Пока поддерживаются буфера с глубиной цвета 24 бита. Пример:

    stdcall [buf2d_resize], buf_0, 0,300 ;изменяем высоту буфера

    где buf_0 - структура буфера в котором будет рисоваться линия; 0 - новая ширина буфера (0 означает не изменять размер); 300 - новая высота буфера.

    -

    buf2d_line

    +

    buf2d_line

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

    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_sm

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

    -

    buf2d_rect_by_size

    +

    buf2d_rect_by_size

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

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

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

    -

    buf2d_filled_rect_by_size

    +

    buf2d_filled_rect_by_size

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

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

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

    -

    buf2d_circle

    +

    buf2d_circle

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

    stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000

    где buf_0 - структура буфера в котором будет рисоваться окружность; 25, 70 - координаты центра; 15 - радиус; 0xff0000 - цвет.

    @@ -256,15 +263,20 @@ stdcall [buf2d_convert_text_matrix], buf_1

    100,150 - координаты точки;

    eax - цвет точки (для 8 и 24 битных буферов не используемые старшие биты в eax равны 0) или значение -1 в случае ошибки.

    +

    buf2d_flip_h

    +

    Отражает изображение в буфере по горизонтали (лево и право меняются местами). Пример:

    +
    stdcall buf2d_flip_h, buf_0
    +

    где buf_0 - структура 24-х или 32-х битного буфера.

    +

    buf2d_flip_v

    Отражает изображение в буфере по вертикали (верх и низ меняются местами). Пример:

    stdcall buf2d_flip_v, buf_0
    -

    где buf_0 - структура 24-х битного буфера.

    +

    где buf_0 - структура 24-х или 32-х битного буфера.

    buf2d_filter_dither

    Фильтр, который преобразует изображение из 24 битного буфера в 8-ми цветное. Разрядность буфера не меняется. Пример:

    stdcall [buf2d_filter_dither], buf_0, 0
    -

    где buf_0 - структура 24-х битного буфера.

    +

    где buf_0 - структура 24-х битного буфера;

    0 - алгоритм (возможные значения: 0 - Sierra Lite, 1 - Floyd-Steinberg, 2 - Burkers, 3 - Heavyiron_mod, 4 - Atkinson).

    buf2d_vox_brush_create

    @@ -359,6 +371,7 @@ import_buf2d_lib: buf2d_flood_fill dd sz_buf2d_flood_fill buf2d_set_pixel dd sz_buf2d_set_pixel buf2d_get_pixel dd sz_buf2d_get_pixel + buf2d_flip_h dd sz_buf2d_flip_h buf2d_flip_v dd sz_buf2d_flip_v buf2d_filter_dither dd sz_buf2d_filter_dither @@ -403,6 +416,7 @@ import_buf2d_lib: sz_buf2d_flood_fill db 'buf2d_flood_fill',0 sz_buf2d_set_pixel db 'buf2d_set_pixel',0 sz_buf2d_get_pixel db 'buf2d_get_pixel',0 + sz_buf2d_flip_h db 'buf2d_flip_h',0 sz_buf2d_flip_v db 'buf2d_flip_v',0 sz_buf2d_filter_dither db 'buf2d_filter_dither',0 @@ -445,5 +459,6 @@ import_buf2d_lib:

    15.11.12 - добавлена функция отражения 24 битных изображений по вертикали buf_flip_v, исправления в функции buf2d_img_hdiv2.

    14.12.12 - добавлена функция наложения фильтра buf2d_filter_dither.

    24.12.12 - добавлены 2 новых алгоритма в функцию наложения фильтра buf2d_filter_dither.

    +

    30.01.15 - добавлена поддержка 32 битных буферов в функцию buf_flip_v, добавлена функция отражения по горизонтали buf_flip_h.

    \ 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 d0645c2d50..8b35ecfe4d 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -1986,52 +1986,156 @@ proc buf_get_pixel uses ebx ecx edi, buf_struc:dword, coord_x:dword, coord_y:dwo ret endp +align 4 +proc buf_flip_h, buf_struc:dword +pushad + mov edi,[buf_struc] + cmp buf2d_bits,24 + jne .end_24 + mov esi,buf2d_data + mov eax,buf2d_w + mov ecx,eax + shr ecx,1 + dec eax + lea eax,[eax+eax*2] + mov ebx,buf2d_h + mov edi,esi + add esi,eax + add eax,3 + cld + .cycle_24: + push ecx edi esi +align 4 + @@: + ;swap word[edi] <-> word[esi] + mov dx,[edi] + movsw + mov [esi-2],dx + ;swap byte[edi] <-> byte[esi] + mov dl,[edi] + movsb + mov [esi-1],dl + sub esi,6 + loop @b + pop esi edi ecx + add edi,eax + add esi,eax + dec ebx + or ebx,ebx + jnz .cycle_24 + jmp .end_32 + .end_24: + cmp buf2d_bits,32 + jne .end_32 + mov esi,buf2d_data + mov eax,buf2d_w + dec eax + shl eax,2 + mov ebx,buf2d_h + mov edi,esi + add esi,eax + add eax,4 + cld + .cycle_32: + mov ecx,eax + shr ecx,3 + push edi esi +align 4 + @@: + ;swap dword[edi] <-> dword[esi] + mov edx,[edi] + movsd + mov [esi-4],edx + sub esi,8 + loop @b + pop esi edi + add edi,eax + add esi,eax + dec ebx + or ebx,ebx + jnz .cycle_32 + .end_32: +popad + ret +endp + ;®ва §Ёвм Ї® ўҐавЁЄ «Ё (ўҐае Ё ­Ё§ ¬Ґ­повбп ¬Ґбв ¬Ё) align 4 proc buf_flip_v, buf_struc:dword locals - line_pix dd ? ;Є®«. ЇЁЄбҐ«Ґ© ў «Ё­ЁЁ ЎгдҐа  - line_2byte dd ? ;Є®«. Ў ©в ў «Ё­ЁЁ ЎгдҐа  * 2 + line_pix dd ? ;Є®«. ЇЁЄбҐ«Ґ© ў «Ё­ЁЁ ЎгдҐа  + line_2byte dd ? ;Є®«. Ў ©в ў «Ё­ЁЁ ЎгдҐа  * 2 endl pushad mov edi,[buf_struc] - cmp buf2d_bits,24 - jne .end_24 - mov edx,buf2d_w - mov [line_pix],edx - mov ebx,buf2d_h - lea edx,[edx+edx*2] - mov esi,edx - imul esi,ebx - sub esi,edx - add esi,buf2d_data ;гЄ § вҐ«м ­  ­Ё¦­оо «Ё­Ёо - shr ebx,1 ;Є®«. «Ё­Ґ©­ле жЁЄ«®ў - shl edx,1 - mov [line_2byte],edx - mov edi,buf2d_data - xchg edi,esi - cld - .flip_24: - cmp ebx,0 - jle .end_24 - mov ecx,[line_pix] - @@: - lodsw - mov dx,word[edi] - mov word[esi-2],dx - mov [edi],ax - lodsb - mov ah,byte[edi+2] - mov byte[esi-1],ah - mov [edi+2],al - add edi,3 - loop @b - sub edi,[line_2byte] - dec ebx - jmp .flip_24 - .end_24: - popad - ret + cmp buf2d_bits,24 + jne .end_24 + mov edx,buf2d_w + mov [line_pix],edx + mov ebx,buf2d_h + lea edx,[edx+edx*2] + mov esi,edx + imul esi,ebx + sub esi,edx + add esi,buf2d_data ;гЄ § вҐ«м ­  ­Ё¦­оо «Ё­Ёо + shr ebx,1 ;Є®«. «Ё­Ґ©­ле жЁЄ«®ў + shl edx,1 + mov [line_2byte],edx + mov edi,buf2d_data + xchg edi,esi + cld + .flip_24: + cmp ebx,0 + jle .end_32 ;§¤Ґбм ўл室 Ё§ дг­ЄжЁЁ (Ї®в®¬г .end_24 ­Ґ Ї®¤е®¤Ёв) + mov ecx,[line_pix] +align 4 + @@: + lodsw + mov dx,word[edi] + mov word[esi-2],dx + stosw + lodsb + mov ah,byte[edi] + mov byte[esi-1],ah + stosb + loop @b + sub edi,[line_2byte] + dec ebx + jmp .flip_24 + .end_24: + cmp buf2d_bits,32 + jne .end_32 + mov edx,buf2d_w + mov [line_pix],edx + mov ebx,buf2d_h + shl edx,2 + mov esi,edx + imul esi,ebx + sub esi,edx + add esi,buf2d_data ;гЄ § вҐ«м ­  ­Ё¦­оо «Ё­Ёо + shr ebx,1 ;Є®«. «Ё­Ґ©­ле жЁЄ«®ў + shl edx,1 + mov [line_2byte],edx + mov edi,buf2d_data + xchg edi,esi + cld + .flip_32: + cmp ebx,0 + jle .end_32 + mov ecx,[line_pix] +align 4 + @@: + lodsd + mov edx,dword[edi] + mov dword[esi-4],edx + stosd + loop @b + sub edi,[line_2byte] + dec ebx + jmp .flip_32 + .end_32: + popad + ret endp align 4 @@ -3318,14 +3422,13 @@ align 4 line_len4i: push ebp mov ebp,esp - finit fild word [ebp+8] fisub word [ebp+12] fmul st0,st0 ;st0=x^2 fild word [ebp+10] fisub word [ebp+14] fmul st0,st0 ;st0=y^2 - fadd st0,st1 + faddp fsqrt fstp dword [ebp+12] pop ebp @@ -3353,6 +3456,7 @@ proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dwor xor ecx,ecx finit + fldz ; calculate delta t stdcall line_len4i, dword[coord_p1],dword[coord_p0] @@ -3374,7 +3478,8 @@ proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dwor @@: fstp dword[delt_t] - finit + ffree st0 ;1.0 + fincstp ;fild word[coord_p2+2] ;y2 fild word[coord_p1+2] ;y1 @@ -3400,10 +3505,9 @@ proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dwor mov esi,dword[opr_param] fstp dword[opr_param] - fldz - fadd st0,st1 ;0+t - fmul st0,st0 ;t*t - fmul st0,st5 ;...*x2 + fld st0 ;st0=t + fmul st0,st0 ;t^2 + fmul st0,st5 ;(t^2)*x2 fadd dword[opr_param] mov dword[opr_param],esi @@ -3424,10 +3528,9 @@ proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dwor mov esi,dword[opr_param] fstp dword[opr_param] - fldz - fadd st0,st1 ;0+t - fmul st0,st0 ;t*t - fimul word[coord_p2+2] ;...*y2 + fld st0 ;st0=t + fmul st0,st0 ;t^2 + fimul word[coord_p2+2] ;(t^2)*y2 fadd dword[opr_param] mov dword[opr_param],esi @@ -5270,6 +5373,7 @@ EXPORTS: dd sz_buf2d_flood_fill, buf_flood_fill dd sz_buf2d_set_pixel, buf_set_pixel dd sz_buf2d_get_pixel, buf_get_pixel + dd sz_buf2d_flip_h, buf_flip_h dd sz_buf2d_flip_v, buf_flip_v dd sz_buf2d_filter_dither, buf_filter_dither dd sz_buf2d_vox_brush_create, vox_brush_create @@ -5311,6 +5415,7 @@ EXPORTS: sz_buf2d_flood_fill db 'buf2d_flood_fill',0 sz_buf2d_set_pixel db 'buf2d_set_pixel',0 sz_buf2d_get_pixel db 'buf2d_get_pixel',0 + sz_buf2d_flip_h db 'buf2d_flip_h',0 sz_buf2d_flip_v db 'buf2d_flip_v',0 sz_buf2d_filter_dither db 'buf2d_filter_dither',0 sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0