From aa35cd36bb03865a162e9baba6805bb6246bf22e Mon Sep 17 00:00:00 2001 From: IgorA Date: Sat, 11 Aug 2012 18:05:17 +0000 Subject: [PATCH] update functions 'buf2d_img_hdiv2' and 'buf2d_img_wdiv2' git-svn-id: svn://kolibrios.org@2920 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/buf2d/trunk/about.htm | 14 +- .../develop/libraries/buf2d/trunk/buf2d.asm | 226 +++++++++++++++++- 2 files changed, 223 insertions(+), 17 deletions(-) diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm index cc65d82027..81bf65772a 100644 --- a/programs/develop/libraries/buf2d/trunk/about.htm +++ b/programs/develop/libraries/buf2d/trunk/about.htm @@ -54,6 +54,9 @@ table { font-size: 15px; } @@ -71,7 +74,7 @@ table { font-size: 15px; } Есть функции рисования линий, кривых Безье, прямоугольников, окружностей. Также есть функции для рисований воксельной графики.

-

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

+

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

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

Поддерживается 3 формата буферов. @@ -82,7 +85,7 @@ table { font-size: 15px; }

24 бит

Данный буфер содержит изображение в формате rgb. Может выводится на экран.

32 бит

-

Содержит прозрачное изображение в формате rgba. На экран не выводится. Используется для наложения изображений.

+

Содержит прозрачное изображение в формате rgba. На экран не выводится. Используется для наложения изображений. Если a=255 то пиксель прозрачный, если 0 не прозрачный.

Функции

@@ -108,7 +111,7 @@ buf_0:

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

Параметры для создания буфера берутся из структуры.

-

buf2d_create_f_img

+

buf2d_create_f_img

Создает буфер на основе изображения в формате rgb.

buf2d_clear

@@ -153,10 +156,10 @@ stdcall [buf2d_clear], edi, buf2d_color ;
stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000

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

-

buf2d_img_hdiv2

+

buf2d_img_hdiv2

Сжимает изображение в буфере по высоте в 2 раза, при этом размер самого буфера не уменьшается.

-

buf2d_img_wdiv2

+

buf2d_img_wdiv2

Сжимает изображение в буфере по ширине в 2 раза, при этом размер самого буфера не уменьшается.

buf2d_conv_24_to_8

@@ -388,5 +391,6 @@ import_buf2d_lib:

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

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

12.06.12 - добавлены функции для рисования воксельной графики.

+

11.08.12 - функции для сжатия изображений buf2d_img_hdiv2 и buf2d_img_wdiv2 работают с 32 битными буферами.

\ 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 945871c2e4..d5847604ab 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -249,7 +249,7 @@ proc draw_pixel_transp, t_prop:dword, m_prop:dword mov byte[transp_32+3],al ;Їа®§а з­®бвм аЁб㥬®© в®зЄЁ mov esi,dword transp_32 ;гЄ § вҐ«м ­  梥в аЁб㥬®© в®зЄЁ - call combine_colors + call combine_colors_0 pop esi edi edx ebx eax @@: ret @@ -1754,6 +1754,13 @@ proc buf_img_wdiv2, buf_struc:dword imul ecx,eax stdcall img_rgb24_wdiv2, buf2d_data,ecx .end_draw_24: + cmp buf2d_bits,32 + jne .end_draw_32 + mov eax,buf2d_w + mov ecx,buf2d_h + imul ecx,eax + stdcall img_rgb32_wdiv2, buf2d_data,ecx + .end_draw_32: popad ret endp @@ -1763,7 +1770,6 @@ endp ;size - count img pixels (size img data / 3(rgb) ) align 4 proc img_rgb24_wdiv2 data_rgb:dword, size:dword - ;push eax ebx ecx edx mov eax,dword[data_rgb] mov ecx,dword[size] ;ecx = size lea ecx,[ecx+ecx*2] @@ -1800,10 +1806,45 @@ proc img_rgb24_wdiv2 data_rgb:dword, size:dword add eax,3 add ebx,6 loop @b - ;pop edx ecx ebx eax ret endp +;input: +;data_rgb - pointer to rgb data +;size - count img pixels (size img data / 3(rgb) ) +align 4 +proc img_rgb32_wdiv2 data_rgb:dword, size:dword + mov eax,dword[data_rgb] + + mov eax,dword[data_rgb] + mov ebx,eax + add ebx,4 + mov ecx,dword[size] ;ecx = size + shr ecx,1 + @@: ;ᬥ訢 ­ЁҐ 梥⮢ ЇЁЄбҐ«Ґ© + call combine_colors_1 + mov [eax],edx + add eax,8 ;=2*4 + add ebx,8 + loop @b + + mov eax,dword[data_rgb] + add eax,4 + mov ebx,eax + add ebx,4 + mov ecx,dword[size] ;ecx = size + shr ecx,1 + dec ecx ;«Ёи­Ё© ЇЁЄбҐ«м + @@: ;Ї®¤¦ вЁҐ ЇЁЄбҐ«Ґ© + mov edx,dword[ebx] + mov dword[eax],edx + + add eax,4 + add ebx,8 + loop @b + ret +endp + align 4 proc buf_img_hdiv2, buf_struc:dword pushad @@ -1815,6 +1856,14 @@ proc buf_img_hdiv2, buf_struc:dword imul ecx,eax stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax .end_draw_24: + cmp buf2d_bits,32 + jne .end_draw_32 + mov eax,buf2d_w + mov ecx,buf2d_h + imul ecx,eax + shl eax,2 + stdcall img_rgb32_hdiv2, buf2d_data,ecx,eax + .end_draw_32: popad ret endp @@ -1825,7 +1874,6 @@ endp ;size_w - width img in pixels align 4 proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword - ;pushad mov eax,dword[data_rgb] ;eax = mov ecx,dword[size] ;ecx = size @@ -1837,8 +1885,8 @@ proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword loop @b mov eax,dword[data_rgb] ;eax = - mov edi,dword[size_w] - lea esi,[edi+edi*2] ;esi = width*3(rgb) + mov esi,dword[size_w] + lea esi,[esi+esi*2] ;esi = width*3(rgb) mov ebx,esi add ebx,eax mov ecx,dword[size] ;ecx = size @@ -1864,8 +1912,8 @@ proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword mov eax,dword[data_rgb] ;eax = add eax,esi ;esi = width*3(rgb) - mov ebx,esi - add ebx,eax + mov ebx,eax + add ebx,esi mov ecx,dword[size] ;ecx = size shr ecx,1 sub ecx,dword[size_w] ;«Ёи­пп бва®Є  ЇЁЄбҐ«Ґ© @@ -1886,10 +1934,164 @@ proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword .old_line_2: loop @b - ;popad ret endp +;input: +;data_rgb - pointer to rgb data +;size - count img pixels (size img data / 3(rgb) ) +;size_w_b - width img in bytes +align 4 +proc img_rgb32_hdiv2, data_rgb:dword, size:dword, size_w_b:dword + + mov eax,dword[data_rgb] ;eax = + mov ebx,dword[size_w_b] + add ebx,eax + mov ecx,dword[size] ;ecx = size + shr ecx,1 + xor edi,edi + @@: ;ᬥ訢 ­ЁҐ 梥⮢ ЇЁЄбҐ«Ґ© + call combine_colors_1 + mov dword[eax],edx + + add eax,4 + add ebx,4 + add edi,4 + cmp edi,dword[size_w_b] + jl .old_line + add eax,dword[size_w_b] + add ebx,dword[size_w_b] + xor edi,edi + .old_line: + loop @b + + + mov eax,dword[data_rgb] ;eax = + mov ebx,dword[size_w_b] + add eax,ebx + add ebx,eax + mov ecx,dword[size] ;ecx = size + shl ecx,1 + sub ecx,dword[size_w_b] ;«Ёи­пп бва®Є  ЇЁЄбҐ«Ґ© + shr ecx,2 + xor edi,edi + @@: ;Ї®¤¦ вЁҐ ЇЁЄбҐ«Ґ© + mov edx,dword[ebx] ;Є®ЇЁа㥬 梥⠭Ё¦­ҐЈ® ЇЁЄбҐ«п + mov dword[eax],edx + + add eax,4 + add ebx,4 + add edi,4 + cmp edi,dword[size_w_b] + jl .old_line_2 + add ebx,dword[size_w_b] + xor edi,edi + .old_line_2: + loop @b + + ret +endp + +;input: +; eax - гЄ § вҐ«м ­  32-ЎЁв­л© 梥в +; ebx - гЄ § вҐ«м ­  32-ЎЁв­л© 梥в +;output: +; edx - 32-ЎЁв­л© 梥в ᬥ蠭­л© б гзҐв®¬ Їа®§а з­®бвЁ +;destroy: +; esi +align 4 +proc combine_colors_1 uses ecx edi +locals + c_blye dd ? + c_green dd ? + c_red dd ? +endl + movzx edi,byte[eax+3] + cmp edi,255 + je .c0z + movzx esi,byte[ebx+3] + cmp esi,255 + je .c1z + + ;ЇҐаҐў®а зЁў Ґ¬ §­ зҐ­Ёп Їа®§а з­®б⥩ + neg edi + inc edi + add edi,255 + neg esi + inc esi + add esi,255 + + movzx ecx,byte[eax] + imul ecx,edi + mov [c_blye],ecx + movzx ecx,byte[ebx] + imul ecx,esi + add [c_blye],ecx + + movzx ecx,byte[eax+1] + imul ecx,edi + mov [c_green],ecx + movzx ecx,byte[ebx+1] + imul ecx,esi + add [c_green],ecx + + movzx ecx,byte[eax+2] + imul ecx,edi + mov [c_red],ecx + movzx ecx,byte[ebx+2] + imul ecx,esi + add [c_red],ecx + +push eax ebx + xor ebx,ebx + mov eax,[c_red] + xor edx,edx + mov ecx,edi + add ecx,esi + div ecx + mov bl,al + shl ebx,16 + mov eax,[c_green] + xor edx,edx + div ecx + mov bh,al + mov eax,[c_blye] + xor edx,edx + div ecx + mov bl,al + + shr ecx,1 + ;ЇҐаҐў®а зЁў Ґ¬ §­ зҐ­Ёп Їа®§а з­®бвЁ + neg ecx + inc ecx + add ecx,255 + + shl ecx,24 + add ebx,ecx + mov edx,ebx +pop ebx eax + + jmp .end_f + .c0z: ;Ґб«Ё 梥⠢ eax Їа®§а з­л© + mov edx,dword[ebx] + movzx edi,byte[ebx+3] + jmp @f + .c1z: ;Ґб«Ё 梥⠢ ebx Їа®§а з­л© + mov edx,dword[eax] + @@: + add edi,255 ;¤Ґ« Ґ¬ 梥⠭  Ї®«®ўЁ­г Їа®§а з­л¬ + shr edi,1 + cmp edi,255 + jl @f + mov edi,255 ;¬ ЄбЁ¬ «м­ п Їа®§а з­®бвм ­Ґ Ў®«ҐҐ 255 + @@: + shl edi,24 + and edx,0xffffff ;б­Ё¬ Ґ¬ бв аго Їа®§а з­®бвм + add edx,edi + .end_f: + ret +endp + ;ЇаҐ®Ўа §®ў ­ЁҐ ЎгдҐа  Ё§ 24-ЎЁв­®Ј® ў 8-ЎЁв­л© ; spectr - ®ЇаҐ¤Ґ«пҐв Є Є®© бЇҐЄва Ўа вм ЇаЁ ЇаҐ®Ўа §®ў ­ЁЁ 0-бЁ­Ё©, 1-§Ґ«Ґ­л©, 2-Єа б­л© align 4 @@ -2185,7 +2387,7 @@ endp ;output: ; [edi] = combine color align 4 -combine_colors: +combine_colors_0: push ax bx cx dx mov bx,0x00ff ;---get transparent--- movzx cx,byte[esi+3] ;pro @@ -2293,7 +2495,7 @@ proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, bu .copy_0: ;Їа®б⮥ Є®ЇЁа®ў ­ЁҐ mov ecx,eax @@: - call combine_colors + call combine_colors_0 add edi,3 add esi,4 loop @b @@ -2305,7 +2507,7 @@ proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, bu .copy_1: ;­Ґ Їа®б⮥ Є®ЇЁа®ў ­ЁҐ (Є авЁ­Є  ўл« §Ёв §  Їа ўго бв®а®­г) mov ecx,eax @@: - call combine_colors + call combine_colors_0 add edi,3 add esi,4 loop @b