update functions 'buf2d_img_hdiv2' and 'buf2d_img_wdiv2'

git-svn-id: svn://kolibrios.org@2920 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2012-08-11 18:05:17 +00:00
parent 4fcb9b82ce
commit aa35cd36bb
2 changed files with 223 additions and 17 deletions

View File

@ -54,6 +54,9 @@ table { font-size: 15px; }
<ul> <ul>
<li><a href="#f_init">lib_init</a></li> <li><a href="#f_init">lib_init</a></li>
<li><a href="#f_b_create">buf2d_create</a></li> <li><a href="#f_b_create">buf2d_create</a></li>
<li><a href="#f_b_create_f">buf2d_create_f_img</a></li>
<li><a href="#f_b_hdiv2">buf2d_img_hdiv2</a></li>
<li><a href="#f_b_wdiv2">buf2d_img_wdiv2</a></li>
<li><a href="#f_c_color">buf2d_crop_color</a></li> <li><a href="#f_c_color">buf2d_crop_color</a></li>
<li><a href="#f_v_brush_c">buf2d_vox_brush_create</a></li> <li><a href="#f_v_brush_c">buf2d_vox_brush_create</a></li>
</ul> </ul>
@ -71,7 +74,7 @@ table { font-size: 15px; }
Есть функции рисования линий, кривых Безье, прямоугольников, окружностей. Есть функции рисования линий, кривых Безье, прямоугольников, окружностей.
Также есть функции для рисований воксельной графики.</p> Также есть функции для рисований воксельной графики.</p>
<p>Последнее обновление библиотеки 21.06.12.</p> <p>Последнее обновление библиотеки 11.08.12.</p>
<h1><a name="format_buf">Форматы буферов</a></h1> <h1><a name="format_buf">Форматы буферов</a></h1>
<p>Поддерживается 3 формата буферов. <p>Поддерживается 3 формата буферов.
@ -82,7 +85,7 @@ table { font-size: 15px; }
<h4>24 бит</h4> <h4>24 бит</h4>
<p>Данный буфер содержит изображение в формате <b>rgb</b>. Может выводится на экран.</p> <p>Данный буфер содержит изображение в формате <b>rgb</b>. Может выводится на экран.</p>
<h4>32 бит</h4> <h4>32 бит</h4>
<p>Содержит прозрачное изображение в формате <b>rgba</b>. На экран не выводится. Используется для наложения изображений.</p> <p>Содержит прозрачное изображение в формате <b>rgba</b>. На экран не выводится. Используется для наложения изображений. Если <b>a=255</b> то пиксель прозрачный, если <b>0</b> не прозрачный.</p>
<h1><a name="fun">Функции</a></h1> <h1><a name="fun">Функции</a></h1>
@ -108,7 +111,7 @@ buf_0:
<p>где buf_0 - структура буфера.</p> <p>где buf_0 - структура буфера.</p>
<p>Параметры для создания буфера берутся из структуры.</p> <p>Параметры для создания буфера берутся из структуры.</p>
<h4>buf2d_create_f_img</h4> <h4><a name="f_b_create_f">buf2d_create_f_img</a></h4>
<p>Создает буфер на основе изображения в формате <b>rgb</b>.</p> <p>Создает буфер на основе изображения в формате <b>rgb</b>.</p>
<h4>buf2d_clear</h4> <h4>buf2d_clear</h4>
@ -153,10 +156,10 @@ stdcall [buf2d_clear], edi, buf2d_color ;
<pre>stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000</pre> <pre>stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000</pre>
<p>где buf_0 - структура буфера в котором будет рисоваться окружность; 25, 70 - координаты центра; 15 - радиус; 0xff0000 - цвет.</p> <p>где buf_0 - структура буфера в котором будет рисоваться окружность; 25, 70 - координаты центра; 15 - радиус; 0xff0000 - цвет.</p>
<h4>buf2d_img_hdiv2</h4> <h4><a name="f_b_hdiv2">buf2d_img_hdiv2</a></h4>
<p>Сжимает изображение в буфере по высоте в 2 раза, при этом размер самого буфера не уменьшается.</p> <p>Сжимает изображение в буфере по высоте в 2 раза, при этом размер самого буфера не уменьшается.</p>
<h4>buf2d_img_wdiv2</h4> <h4><a name="f_b_wdiv2">buf2d_img_wdiv2</a></h4>
<p>Сжимает изображение в буфере по ширине в 2 раза, при этом размер самого буфера не уменьшается.</p> <p>Сжимает изображение в буфере по ширине в 2 раза, при этом размер самого буфера не уменьшается.</p>
<h4>buf2d_conv_24_to_8</h4> <h4>buf2d_conv_24_to_8</h4>
@ -388,5 +391,6 @@ import_buf2d_lib:
<p>23.02.12 - функция buf2d_bit_blt_alpha может принимать отрицательные координаты в позиции копируемого буфера, небольшие доработки в buf2d_bit_blt_transp</p> <p>23.02.12 - функция buf2d_bit_blt_alpha может принимать отрицательные координаты в позиции копируемого буфера, небольшие доработки в buf2d_bit_blt_transp</p>
<p>11.05.12 - добавлена функция для взятия цвета точки buf2d_get_pixel, доработки в buf2d_set_pixel.</p> <p>11.05.12 - добавлена функция для взятия цвета точки buf2d_get_pixel, доработки в buf2d_set_pixel.</p>
<p>12.06.12 - добавлены функции для рисования воксельной графики.</p> <p>12.06.12 - добавлены функции для рисования воксельной графики.</p>
<p>11.08.12 - функции для сжатия изображений buf2d_img_hdiv2 и buf2d_img_wdiv2 работают с 32 битными буферами.</p>
</body> </body>
</html> </html>

View File

@ -249,7 +249,7 @@ proc draw_pixel_transp, t_prop:dword, m_prop:dword
mov byte[transp_32+3],al ;¯à®§à ç­®áâì à¨á㥬®© â®çª¨ mov byte[transp_32+3],al ;¯à®§à ç­®áâì à¨á㥬®© â®çª¨
mov esi,dword transp_32 ;㪠§ â¥«ì ­  梥â à¨á㥬®© â®çª¨ mov esi,dword transp_32 ;㪠§ â¥«ì ­  梥â à¨á㥬®© â®çª¨
call combine_colors call combine_colors_0
pop esi edi edx ebx eax pop esi edi edx ebx eax
@@: @@:
ret ret
@ -1754,6 +1754,13 @@ proc buf_img_wdiv2, buf_struc:dword
imul ecx,eax imul ecx,eax
stdcall img_rgb24_wdiv2, buf2d_data,ecx stdcall img_rgb24_wdiv2, buf2d_data,ecx
.end_draw_24: .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 popad
ret ret
endp endp
@ -1763,7 +1770,6 @@ endp
;size - count img pixels (size img data / 3(rgb) ) ;size - count img pixels (size img data / 3(rgb) )
align 4 align 4
proc img_rgb24_wdiv2 data_rgb:dword, size:dword proc img_rgb24_wdiv2 data_rgb:dword, size:dword
;push eax ebx ecx edx
mov eax,dword[data_rgb] mov eax,dword[data_rgb]
mov ecx,dword[size] ;ecx = size mov ecx,dword[size] ;ecx = size
lea ecx,[ecx+ecx*2] lea ecx,[ecx+ecx*2]
@ -1800,10 +1806,45 @@ proc img_rgb24_wdiv2 data_rgb:dword, size:dword
add eax,3 add eax,3
add ebx,6 add ebx,6
loop @b loop @b
;pop edx ecx ebx eax
ret ret
endp 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 align 4
proc buf_img_hdiv2, buf_struc:dword proc buf_img_hdiv2, buf_struc:dword
pushad pushad
@ -1815,6 +1856,14 @@ proc buf_img_hdiv2, buf_struc:dword
imul ecx,eax imul ecx,eax
stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax
.end_draw_24: .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 popad
ret ret
endp endp
@ -1825,7 +1874,6 @@ endp
;size_w - width img in pixels ;size_w - width img in pixels
align 4 align 4
proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword
;pushad
mov eax,dword[data_rgb] ;eax = mov eax,dword[data_rgb] ;eax =
mov ecx,dword[size] ;ecx = size mov ecx,dword[size] ;ecx = size
@ -1837,8 +1885,8 @@ proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword
loop @b loop @b
mov eax,dword[data_rgb] ;eax = mov eax,dword[data_rgb] ;eax =
mov edi,dword[size_w] mov esi,dword[size_w]
lea esi,[edi+edi*2] ;esi = width*3(rgb) lea esi,[esi+esi*2] ;esi = width*3(rgb)
mov ebx,esi mov ebx,esi
add ebx,eax add ebx,eax
mov ecx,dword[size] ;ecx = size 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 = mov eax,dword[data_rgb] ;eax =
add eax,esi ;esi = width*3(rgb) add eax,esi ;esi = width*3(rgb)
mov ebx,esi mov ebx,eax
add ebx,eax add ebx,esi
mov ecx,dword[size] ;ecx = size mov ecx,dword[size] ;ecx = size
shr ecx,1 shr ecx,1
sub ecx,dword[size_w] ;«¨è­ïï áâப  ¯¨ªá¥«¥© sub ecx,dword[size_w] ;«¨è­ïï áâப  ¯¨ªá¥«¥©
@ -1886,10 +1934,164 @@ proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword
.old_line_2: .old_line_2:
loop @b loop @b
;popad
ret ret
endp 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-¡¨â­ë© ;¯à¥®¡à §®¢ ­¨¥ ¡ãä¥à  ¨§ 24-¡¨â­®£® ¢ 8-¡¨â­ë©
; spectr - ®¯à¥¤¥«ï¥â ª ª®© ᯥªâà ¡à âì ¯à¨ ¯à¥®¡à §®¢ ­¨¨ 0-ᨭ¨©, 1-§¥«¥­ë©, 2-ªà á­ë© ; spectr - ®¯à¥¤¥«ï¥â ª ª®© ᯥªâà ¡à âì ¯à¨ ¯à¥®¡à §®¢ ­¨¨ 0-ᨭ¨©, 1-§¥«¥­ë©, 2-ªà á­ë©
align 4 align 4
@ -2185,7 +2387,7 @@ endp
;output: ;output:
; [edi] = combine color ; [edi] = combine color
align 4 align 4
combine_colors: combine_colors_0:
push ax bx cx dx push ax bx cx dx
mov bx,0x00ff ;---get transparent--- mov bx,0x00ff ;---get transparent---
movzx cx,byte[esi+3] ;pro 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: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥ .copy_0: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥
mov ecx,eax mov ecx,eax
@@: @@:
call combine_colors call combine_colors_0
add edi,3 add edi,3
add esi,4 add esi,4
loop @b loop @b
@ -2305,7 +2507,7 @@ proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, bu
.copy_1: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã) .copy_1: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã)
mov ecx,eax mov ecx,eax
@@: @@:
call combine_colors call combine_colors_0
add edi,3 add edi,3
add esi,4 add esi,4
loop @b loop @b