From a992134c24c4408598ac7fb490b4e2985a3f172d Mon Sep 17 00:00:00 2001 From: IgorA Date: Fri, 11 May 2012 10:11:27 +0000 Subject: [PATCH] 'buf2d.obj' add new function 'buf2d_get_pixel' git-svn-id: svn://kolibrios.org@2658 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/buf2d/trunk/about.htm | 24 +++- .../develop/libraries/buf2d/trunk/buf2d.asm | 122 +++++++++++++++--- 2 files changed, 122 insertions(+), 24 deletions(-) diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm index 43bae657a6..43d85831e3 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; } С ее помощью можно создавать буфера с изображениями в памяти, и при необходимости выводить их на экран. Изображения можно накладывать одно на другое, поддерживается работа с прозрачными изображениями, есть функция рисования лини пока на этом все.

-

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

+

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

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

Поддерживается 3 формата буферов. @@ -216,11 +216,18 @@ stdcall [buf2d_convert_text_matrix], buf_1 0xff0000 - зависит от значения 4-го параметра, 1) если 0 - цвет до которого будет заливаться область; 2) если 1 - цвет области которая будет заливатся;

buf2d_set_pixel

-

Функция ставит точку, принимает координаты и цвет. Работает на 24-битных буферах.

+

Функция ставит точку, принимает координаты и цвет.

stdcall [buf2d_set_pixel], buf_0, 100,150, 0xff0000
-

где buf_0 - структура буфера; - 100,150 - координаты точки; - 0xff0000 - цвет точки.

+

где buf_0 - структура буфера;

+

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

+

0xff0000 - цвет точки.

+ +

buf2d_get_pixel

+

Функция записывает цвет точки в регистр eax, принимает координаты.

+
stdcall [buf2d_get_pixel], buf_0, 100,150
+

где buf_0 - структура буфера;

+

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

+

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

Константы

BUF2D_OPT_CROP_TOP equ 1

@@ -262,6 +269,7 @@ import_buf2d_lib: buf2d_offset_h dd sz_buf2d_offset_h buf2d_flood_fill dd sz_buf2d_flood_fill buf2d_set_pixel dd sz_buf2d_set_pixel + buf2d_get_pixel dd sz_buf2d_get_pixel dd 0,0 sz_lib_init db 'lib_init',0 @@ -289,7 +297,8 @@ import_buf2d_lib: 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 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + sz_buf2d_get_pixel db 'buf2d_get_pixel',0

История

02.07.10 - самая первая версия библиотеки, 2 примера использования.

@@ -310,6 +319,7 @@ import_buf2d_lib:

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

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

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

-

23.02.12 - функция buf2d_bit_blt_alpha может принимать отрицательные координаты в позиции копируемого буфера, небольшие доработки в buf2d_bit_blt_transp

+

23.02.12 - функция buf2d_bit_blt_alpha может принимать отрицательные координаты в позиции копируемого буфера, небольшие доработки в buf2d_bit_blt_transp

+

11.05.12 - добавлена функция для взятия цвета точки buf2d_get_pixel, доработки в buf2d_set_pixel.

\ 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 853e8e7dfc..db7b1c0f3b 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -84,6 +84,8 @@ draw_pixel: add esi,ebx ;size_x*y+x cmp buf2d_bits,8 je .beg8 + cmp buf2d_bits,32 + je .beg32 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 @@ -94,11 +96,46 @@ draw_pixel: .beg8: ;аЁб®ў ­ЁҐ в®зЄЁ ў 8 ЎЁв­®¬ ЎгдҐаҐ add esi,buf2d_data ;ptr+(size_x*y+x) mov byte[esi],dl + jmp .end_draw + .beg32: ;аЁб®ў ­ЁҐ в®зЄЁ ў 32 ЎЁв­®¬ ЎгдҐаҐ + shl esi,2 + add esi,buf2d_data ;ptr+(size_x*y+x) + mov dword[esi],edx .end_draw: pop esi @@: ret +;input: +; ebx = coord x +; ecx = coord y +; edi = pointer to buffer struct +;output: +; eax = 梥в в®зЄЁ +; ў б«гз Ґ ®иЁЎЄЁ eax = 0xffffffff +align 4 +get_pixel_8: + mov eax,0xffffffff + + bt ebx,31 + jc @f + bt ecx,31 + jc @f + cmp ebx,buf2d_w + jge @f + cmp ecx,buf2d_h + jge @f + push esi + mov esi,buf2d_w ;size x + imul esi,ecx ;size_x*y + add esi,ebx ;size_x*y+x + add esi,buf2d_data ;ptr+(size_x*y+x) + + movzx eax,byte[esi] ;copy pixel color + pop esi + @@: + ret + ;input: ; ebx = coord x ; ecx = coord y @@ -134,6 +171,37 @@ get_pixel_24: @@: ret +;input: +; ebx = coord x +; ecx = coord y +; edi = pointer to buffer struct +;output: +; eax = 梥в в®зЄЁ +; ў б«гз Ґ ®иЁЎЄЁ eax = 0xffffffff +align 4 +get_pixel_32: + mov eax,0xffffffff + + bt ebx,31 + jc @f + bt ecx,31 + jc @f + cmp ebx,buf2d_w + jge @f + cmp ecx,buf2d_h + jge @f + push esi + mov esi,buf2d_w ;size x + imul esi,ecx ;size_x*y + add esi,ebx ;size_x*y+x + shl esi,2 + add esi,buf2d_data ;ptr+(size_x*y+x)*4 + + mov eax,dword[esi] ;copy pixel color + pop esi + @@: + ret + ;input: ; ebx = coord x ; ecx = coord y @@ -1635,21 +1703,40 @@ buf_flood_fill_recurs_1: ;дг­ЄжЁп ¤«п аЁб®ў ­Ёп в®зЄЁ 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 - je @f - jmp .end24 - @@: - mov ebx,dword[coord_x] - mov ecx,dword[coord_y] - mov edx,dword[color] - call draw_pixel - .end24: - popad +proc buf_set_pixel uses ebx ecx edx edi, buf_struc:dword, coord_x:dword, coord_y:dword, color:dword + mov edi,dword[buf_struc] + mov ebx,dword[coord_x] + mov ecx,dword[coord_y] + mov edx,dword[color] + call draw_pixel + ret +endp + +;output: +; eax = 梥в в®зЄЁ +; ў б«гз Ґ ®иЁЎЄЁ eax = 0xffffffff +align 4 +proc buf_get_pixel uses ebx ecx edi, buf_struc:dword, coord_x:dword, coord_y:dword + mov edi,dword[buf_struc] + mov ebx,[coord_x] + mov ecx,[coord_y] + + cmp buf2d_bits,8 + jne @f + call get_pixel_8 + jmp .end_fun + @@: + cmp buf2d_bits,24 + jne @f + call get_pixel_24 + jmp .end_fun + @@: + cmp buf2d_bits,32 + jne @f + call get_pixel_32 + ;jmp .end_fun + @@: + .end_fun: ret endp @@ -2203,7 +2290,7 @@ proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, bu @@: lea ebx,[ebx+ebx*2] ;Є®««ЁзҐбвў® Ў ©в ў 1-© бва®ЄҐ ЎгдҐа  ¬Ё­гб зЁб«® Ў ©в ў 1-© бва®ЄҐ Є®ЇЁа㥬®© Є авЁ­ЄЁ -;g; + cld cmp [right_bytes],0 jg .copy_1 @@ -2751,6 +2838,7 @@ EXPORTS: dd sz_buf2d_offset_h, buf_offset_h 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 0,0 sz_lib_init db 'lib_init',0 sz_buf2d_create db 'buf2d_create',0 @@ -2778,4 +2866,4 @@ EXPORTS: 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 - + sz_buf2d_get_pixel db 'buf2d_get_pixel',0