From 1c3a46e4d1a1c9d700d49016d9c9805cfc8416db Mon Sep 17 00:00:00 2001 From: IgorA Date: Mon, 8 Feb 2016 22:26:02 +0000 Subject: [PATCH] modify function 'buf2d_resize', split file 'buf2d.asm' git-svn-id: svn://kolibrios.org@6175 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/info3ds/info3ds.asm | 6 +- .../develop/libraries/buf2d/trunk/about.htm | 14 +- .../develop/libraries/buf2d/trunk/buf2d.asm | 2695 +---------------- .../libraries/buf2d/trunk/fun_draw.inc | 1213 ++++++++ .../libraries/buf2d/trunk/fun_voxel.inc | 1329 ++++++++ .../voxel_editor/utilites/vox_creator.asm | 70 +- 6 files changed, 2735 insertions(+), 2592 deletions(-) create mode 100644 programs/develop/libraries/buf2d/trunk/fun_draw.inc create mode 100644 programs/develop/libraries/buf2d/trunk/fun_voxel.inc diff --git a/programs/develop/info3ds/info3ds.asm b/programs/develop/info3ds/info3ds.asm index 2941b0ef22..1036dead54 100644 --- a/programs/develop/info3ds/info3ds.asm +++ b/programs/develop/info3ds/info3ds.asm @@ -439,7 +439,7 @@ pushad mov word[w_scr_t1.y_size],ax ;новые размеры скроллинга cmp eax,dword[buf_0.h] ;увеличиваем высоту буфера jle @f - stdcall [buf2d_resize],buf_0,0,eax + stdcall [buf2d_resize],buf_0,0,eax,1 mov dword[offs_last_timer],0 ;для обновления буфера в таймере @@: @@ -1419,9 +1419,9 @@ white_light dd 0.8, 0.8, 0.8, 1.0 ; lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; Параметры фонового освещения if lang eq ru -capt db 'info 3ds версия 19.01.16',0 ;подпись окна +capt db 'info 3ds версия 08.02.16',0 ;подпись окна else -capt db 'info 3ds version 19.01.16',0 ;window caption +capt db 'info 3ds version 08.02.16',0 ;window caption end if align 16 diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm index 555deeb3fd..0344c859ad 100644 --- a/programs/develop/libraries/buf2d/trunk/about.htm +++ b/programs/develop/libraries/buf2d/trunk/about.htm @@ -88,7 +88,7 @@ table { font-size: 15px; } ┼ёЄ№ ЇєэъЎшш Ёшёютрэш  ышэшщ, ъЁшт√ї ┴хч№х, яЁ ьюєуюы№эшъют, юъЁєцэюёЄхщ. ╥ръцх хёЄ№ ЇєэъЎшш фы  Ёшёютрэшщ тюъёхы№эющ уЁрЇшъш.

-

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

+

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

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

╧юффхЁцштрхЄё  3 ЇюЁьрЄр сєЇхЁют. @@ -147,9 +147,14 @@ stdcall [buf2d_clear], edi, buf2d_color ;

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр (ьюцхЄ с√Є№ 8, 24 шыш 32 сшЄэ√ь); 90 - єуюы яютюЁюЄр.

buf2d_resize

-

╚чьхэ хЄ ЁрчьхЁ√ сєЇхЁр. ╧юър яюффхЁцштр■Єё  сєЇхЁр ё уыєсшэющ ЎтхЄр 24 сшЄр. ╧ЁшьхЁ:

-
stdcall [buf2d_resize], buf_0, 0,300 ;шчьхэ хь т√ёюЄє сєЇхЁр
-

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр т ъюЄюЁюь сєфхЄ ЁшёютрЄ№ё  ышэш ; 0 - эютр  °шЁшэр сєЇхЁр (0 ючэрўрхЄ эх шчьхэ Є№ ЁрчьхЁ); 300 - эютр  т√ёюЄр сєЇхЁр.

+

╚чьхэ хЄ ЁрчьхЁ√ сєЇхЁр шыш шчюсЁрцхэш  т сєЇхЁх. ╧юър яюффхЁцштр■Єё  сєЇхЁр ё уыєсшэющ ЎтхЄр 24 сшЄр.

+

╧ЁшьхЁ 1:

+
stdcall [buf2d_resize], buf_0, 0,300, 1 ;шчьхэ хь т√ёюЄє сєЇхЁр
+

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр т ъюЄюЁюь сєфхЄ ЁшёютрЄ№ё  ышэш ; 0 - эютр  °шЁшэр сєЇхЁр (0 ючэрўрхЄ эх шчьхэ Є№ ЁрчьхЁ); 300 - эютр  т√ёюЄр сєЇхЁр; 1 - ярЁрьхЄЁ єърч√тр■∙шщ ўЄю шчьхэ ■Єё  ЁрчьхЁ√ сєЇхЁр.

+

╧ЁшьхЁ 2:

+
stdcall [buf2d_resize], buf_0, 250,0, 2 ;шчьхэ хь шчюсЁрцхэшх т сєЇхЁх
+

уфх 250 - эютр  °шЁшэр сєЇхЁр; 0 - эютр  т√ёюЄр сєЇхЁр (0 ючэрўрхЄ эх шчьхэ Є№ ЁрчьхЁ); 2 - ярЁрьхЄЁ єърч√тр■∙шщ ўЄю шчьхэ хь шчюсЁрцхэшх т сєЇхЁх.

+

┼ёыш яюёыхфэшщ ярЁрьхЄЁ Ёртхэ 2 Єю ЁрчьхЁ сєЇхЁр юёЄрхЄё  эхшчьхээ√ь ш ЇєэъЎш  ЁрсюЄрхЄ рэрыюушўэю Єръ ъръ ш ЇєэъЎшш buf2d_img_hdiv2, buf2d_img_wdiv2. ╨рчэшЎр т Єюь, ўЄю buf2d_resize ьюцхЄ ёцшьрЄ№ шчюсЁрцхэш  фю чрфрээюую ЁрчьхЁр, р эх Ёютэю т 2 Ёрчр.

buf2d_line

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

@@ -460,5 +465,6 @@ import_buf2d_lib:

14.12.12 - фюсртыхэр ЇєэъЎш  эрыюцхэш  Їшы№ЄЁр buf2d_filter_dither.

24.12.12 - фюсртыхэ√ 2 эют√ї рыуюЁшЄьр т ЇєэъЎш■ эрыюцхэш  Їшы№ЄЁр buf2d_filter_dither.

30.01.15 - фюсртыхэр яюффхЁцър 32 сшЄэ√ї сєЇхЁют т ЇєэъЎш■ buf_flip_v, фюсртыхэр ЇєэъЎш  юЄЁрцхэш  яю уюЁшчюэЄрыш buf_flip_h.

+

09.02.16 - шчьхэхэр ЇєэъЎш  buf2d_resize фюсртыхэ фюяюыэшЄхы№э√щ ярЁрьхЄЁ, ъюЄюЁ√щ єърч√трхЄ ьхэ Є№ ыш шчюсЁрцхэшх шыш ЁрчьхЁ√ сєЇхЁр.

\ 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 8b35ecfe4d..39173ef19d 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -48,9 +48,6 @@ BUF2D_BIT_OPT_CROP_LEFT equ 1 BUF2D_BIT_OPT_CROP_BOTTOM equ 2 BUF2D_BIT_OPT_CROP_RIGHT equ 3 -vox_offs_tree_table equ 4 -vox_offs_data equ 12 - ;input: ; eax = указатель на функцию выделения памяти ; ebx = ... освобождения памяти @@ -64,196 +61,7 @@ lib_init: mov dword[dll.load], edx ret -;input: -; ebx = coord x -; ecx = coord y -; edx = pixel color -; edi = pointer to buffer struct -align 4 -draw_pixel: - ;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 esi - mov esi,buf2d_w ;size x - imul esi,ecx ;size_x*y - 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 - ror edx,16 - mov byte[esi+2],dl - ror edx,16 - jmp .end_draw - .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 -; edi = pointer to buffer struct -;output: -; eax = цвет точки -; в случае ошибки eax = 0xffffffff -align 4 -get_pixel_24: - 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 - lea esi,[esi+esi*2] ;(size_x*y+x)*3 - add esi,buf2d_data ;ptr+(size_x*y+x)*3 - - xor eax,eax - mov ax,word[esi] ;copy pixel color - ror eax,16 - mov al,byte[esi+2] - ror eax,16 - pop esi - @@: - 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 -; 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_0 - pop esi edi edx ebx eax - @@: - ret -endp +include 'fun_draw.inc' ;функции рисования в буфере ;создание буфера align 4 @@ -314,50 +122,6 @@ proc buf_create_f_img, buf_struc:dword, rgb_data:dword ret endp -align 4 -proc buf_clear, buf_struc:dword, color:dword ;очистка буфера заданым цветом - pushad - mov edi,dword[buf_struc] - - mov ecx,buf2d_w - mov ebx,buf2d_h - imul ecx,ebx - - cld - - cmp buf2d_bits,8 - jne .end_clear_8 - mov edi,buf2d_data - mov al,byte[color] - rep stosb - jmp .end_clear_32 - .end_clear_8: - - cmp buf2d_bits,24 - jne .end_clear_24 - mov edi,buf2d_data - mov eax,dword[color] - mov ebx,eax - shr ebx,16 - @@: - stosw - mov byte[edi],bl - inc edi - loop @b - jmp .end_clear_32 - .end_clear_24: - - cmp buf2d_bits,32 - jne .end_clear_32 - mov edi,buf2d_data - mov eax,dword[color] - rep stosd - ;jmp .end_clear_32 - .end_clear_32: - popad - ret -endp - ;функция для обрезания буферов 8 и 24 битных, по заданому цвету. ;параметр opt задается комбинацией констант: ; BUF2D_OPT_CROP_TOP - обрезка сверху @@ -1009,32 +773,6 @@ proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;сдв ret endp - -align 4 -proc buf_draw_buf, buf_struc:dword - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,24 - jne .error - mov eax,7 - mov ebx,buf2d_data - - mov ecx,buf2d_w - ror ecx,16 - mov edx,buf2d_h - mov cx,dx - - mov edx,buf2d_size_lt - ror edx,16 - int 0x40 - jmp .end_draw_24 - .error: - stdcall print_err,sz_buf2d_draw,txt_err_n24b - .end_draw_24: - popad - ret -endp - align 4 proc buf_delete, buf_struc:dword push eax edi @@ -1044,12 +782,52 @@ proc buf_delete, buf_struc:dword ret endp +;input: +; new_w - новая ширина (если 0 то не меняется) +; new_h - новая высота (если 0 то не меняется) +; options - параметры изменения буфера (1 - изменять размер буфера, +; 2 - изменять изображение в буфере, 3 - изменять буфер и изображение) align 4 -proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword +proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword, options:dword pushad mov edi,dword[buf_struc] + cmp buf2d_bits,8 + jne .8bit + bt dword[options],1 ;сжатие изобр. + jnc @f + ;... + @@: + bt dword[options],0 ;измен. буфер + jnc .end_f + ;... + jmp .end_f + .8bit: cmp buf2d_bits,24 jne .24bit + bt dword[options],1 ;сжатие изобр. + jnc .24_end_r + mov eax,dword[new_w] + cmp eax,1 + jl @f + cmp eax,buf2d_w + jge @f + ;сжатие по ширине + stdcall img_rgb24_wresize, buf2d_data,buf2d_w,buf2d_h,eax + jmp .24_r_h + @@: + mov eax,buf2d_w + .24_r_h: ;eax - ширина буфера или ширина сжатого изображения + mov ebx,dword[new_h] + cmp ebx,1 + jl @f + cmp ebx,buf2d_h + jge @f + ;сжатие по высоте + ;... еще не поддерживается ... + @@: + .24_end_r: + bt dword[options],0 ;измен. буфер + jnc .end_f mov eax,dword[new_w] cmp eax,1 jl @f @@ -1067,6 +845,7 @@ proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword invoke mem.realloc,buf2d_data,ecx ;изменяем память занимаемую буфером mov buf2d_data,eax ;на случай если изменился указатель на данные .24bit: + .end_f: popad ret endp @@ -1314,678 +1093,6 @@ endl ret endp -align 4 -proc buf_line_brs, 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 (x0x1) - 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 x1 то меняем местами x0 и x1 - @@: - bt ebx,31 - jae @f - ;если координата x0 отрицательная - xor ebx,ebx - @@: - cmp esi,buf2d_w - jl @f - ;если координата x0 больше ширины буфера - mov esi,buf2d_w - dec esi - @@: - cmp ebx,esi - jg .end24 ;если x0 > x1 может возникнуть когда обе координаты x0, x1 находились за одним из пределов буфера - - cmp buf2d_bits,24 - je .beg24 - ;рисование в 8 битном буфере - ;в edx вычисляем начало 1-й точки линии в буфере изображения - mov edx,buf2d_w ;size x - imul edx,ecx ;size_x*y - add edx,ebx ;size_x*y+x - add edx,buf2d_data ;ptr+(size_x*y+x) - mov edi,edx ;теперь можем портить указатель на буфер - - mov ecx,esi - sub ecx,ebx ;в ecx колличество точек линии выводимых в буфер - inc ecx ;что-бы последняя точка линии также отображалась - mov eax,dword[color] ;будем использовать только значение в al - cld - rep stosb ;цикл по оси x от x0 до x1 (включая x1) - jmp .end24 - - .beg24: ;рисование в 24 битном буфере - ;в eax вычисляем начало 1-й точки линии в буфере изображения - mov eax,buf2d_w ;size x - imul eax,ecx ;size_x*y - add eax,ebx ;size_x*y+x - lea eax,[eax+eax*2] ;(size_x*y+x)*3 - add eax,buf2d_data ;ptr+(size_x*y+x)*3 - - mov ecx,esi - sub ecx,ebx ;в ecx колличество точек линии выводимых в буфер - inc ecx ;что-бы последняя точка линии также отображалась - mov edx,dword[color] - mov ebx,edx ;координата x0 в ebx уже не нужна - ror edx,16 ;поворачиваем регистр что бы 3-й байт попал в dl - cld - @@: ;цикл по оси x от x0 до x1 (включая x1) - mov word[eax],bx ;copy pixel color - mov byte[eax+2],dl - add eax,3 - loop @b - .end24: - popfd - popad - ret -endp - -align 4 -proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword -pushad - mov edi,[buf_struc] - cmp buf2d_bits,8 - je @f - cmp buf2d_bits,24 - je @f - jmp .coord_end - @@: - - mov eax,[coord_x] - mov ebx,[coord_y] - mov ecx,[w] - ;cmp ecx,1 - ;jl .coord_end - cmp ecx,0 - je .coord_end - jg @f - add eax,ecx - inc eax - neg ecx - @@: - add ecx,eax - dec ecx - mov edx,[h] - ;cmp edx,1 - ;jl .coord_end - cmp edx,0 - je .coord_end - jg @f - add ebx,edx - inc ebx - neg edx - @@: - - add edx,ebx - dec edx - mov esi,dword[color] - stdcall buf_line_h, edi, eax, ebx, ecx, esi ;линия - - stdcall buf_line_brs, edi, eax, ebx, eax, edx, esi ;линия | - stdcall buf_line_h, edi, eax, edx, ecx, esi ;линия - - stdcall buf_line_brs, edi, ecx, ebx, ecx, edx, esi ;линия | - .coord_end: -popad - ret -endp - -align 4 -proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword -pushad - mov edi,[buf_struc] - cmp buf2d_bits,8 - je @f - cmp buf2d_bits,24 - je @f - jmp .coord_end - @@: - mov eax,[coord_x] - mov ebx,[coord_y] - mov edx,[w] - cmp edx,0 - je .coord_end ;если высота 0 пикселей - jg @f ;если высота положительная - add eax,edx - inc eax - neg edx ;ширину делаем положительной - ;inc edx ;почему тут не добавляем 1-цу я не знаю, но с ней работает не правильно - @@: - add edx,eax - dec edx - mov ecx,[h] - cmp ecx,0 - je .coord_end ;если высота 0 пикселей - jg @f ;если высота положительная - add ebx,ecx ;сдвигаем верхнюю координату прямоугольника - inc ebx - neg ecx ;высоту делаем положительной - ;inc ecx ;почему тут не добавляем 1-цу я не знаю, но с ней работает не правильно - @@: - mov esi,dword[color] - cld - @@: - stdcall buf_line_h, edi, eax, ebx, edx, esi ;линия - - inc ebx - loop @b - .coord_end: -popad - ret -endp - -align 4 -proc buf_circle, buf_struc:dword, coord_x:dword, coord_y:dword, r:dword, color:dword -locals - po_x dd ? - po_y dd ? -endl - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,8 - je @f - cmp buf2d_bits,24 - je @f - jmp .error - @@: - mov edx,dword[color] - - finit - fild dword[coord_x] - fild dword[coord_y] - fild dword[r] - fldz ;px=0 - fld st1 ;py=r - - fldpi - fmul st0,st3 - fistp dword[po_x] - mov esi,dword[po_x] ;esi=pi*r - shl esi,1 ;esi=2*pi*r - - ;st0 = py - ;st1 = px - ;st2 = r - ;st3 = y - ;st4 = x - - @@: - ;Point(px + x, y - py) - fld st1 ;st0=px - fadd st0,st5 ;st0=px+x - fistp dword[po_x] - mov ebx,dword[po_x] - fld st3 ;st0=y - fsub st0,st1 ;st0=y-py - fistp dword[po_y] - mov ecx,dword[po_y] - call draw_pixel - ;px += py/r - fld st0 ;st0=py - fdiv st0,st3 ;st0=py/r - faddp st2,st0 ;st3+=st0 - ;py -= px/r - fld st1 ;st0=px - fdiv st0,st3 ;st0=px/r - fsubp st1,st0 ;st2-=st0 - - dec esi - cmp esi,0 - jge @b - jmp .exit_fun - .error: - stdcall print_err,sz_buf2d_circle,txt_err_n8_24b - .exit_fun: - - popad - ret -endp - -;функция для заливки области выбранным цветом -align 4 -proc buf_flood_fill, buf_struc:dword, coord_x:dword, coord_y:dword, mode:dword, color_f:dword, color_b:dword - pushad - mov edi,[buf_struc] - cmp buf2d_bits,24 - jne .end24 - - mov ebx,dword[coord_x] - mov ecx,dword[coord_y] - mov edx,dword[color_f] - mov esi,dword[color_b] - - cmp dword[mode],1 ;в зависимости от 'mode' определяем каким алгоритмом будем пользоваться - je @f - call buf_flood_fill_recurs_0 ;заливаем до пикселей цвета esi - jmp .end24 - @@: - call buf_flood_fill_recurs_1 ;заливаем пиксели имеющие цвет esi - - .end24: - popad - ret -endp - -;input: -; ebx = coord_x -; ecx = coord_y -; edx = цвет заливки -; esi = цвет границы, до которой будет ити заливка -; edi = buf_struc -;output: -; eax = портится -align 4 -buf_flood_fill_recurs_0: - call get_pixel_24 - cmp eax,0xffffffff ;if error coords - je .end_fun - cmp eax,edx ;если цвет пикселя совпал с цветом заливки, значит заливка в этой области уже была сделана - je .end_fun - - call draw_pixel - - dec ebx - call get_pixel_24 - cmp eax,esi - je @f - call buf_flood_fill_recurs_0 - @@: - inc ebx - - - inc ebx - call get_pixel_24 - cmp eax,esi - je @f - call buf_flood_fill_recurs_0 - @@: - dec ebx - - dec ecx - call get_pixel_24 - cmp eax,esi - je @f - call buf_flood_fill_recurs_0 - @@: - inc ecx - - inc ecx - call get_pixel_24 - cmp eax,esi - je @f - call buf_flood_fill_recurs_0 - @@: - dec ecx - - .end_fun: - ret - -;input: -; ebx = coord_x -; ecx = coord_y -; edx = цвет заливки -; esi = цвет пикселей, по которым будет ити заливка -; edi = buf_struc -;output: -; eax = портится -align 4 -buf_flood_fill_recurs_1: - call get_pixel_24 - cmp eax,0xffffffff ;if error coords - je .end_fun - cmp eax,edx ;если цвет пикселя совпал с цветом заливки, значит заливка в этой области уже была сделана - je .end_fun - cmp eax,esi ;если цвет пикселя не совпал с заливаемым цветом заливки, то прекращаем заливку - jne .end_fun - - call draw_pixel - - dec ebx - call get_pixel_24 - cmp eax,esi - jne @f - call buf_flood_fill_recurs_1 - @@: - inc ebx - - - inc ebx - call get_pixel_24 - cmp eax,esi - jne @f - call buf_flood_fill_recurs_1 - @@: - dec ebx - - dec ecx - call get_pixel_24 - cmp eax,esi - jne @f - call buf_flood_fill_recurs_1 - @@: - inc ecx - - inc ecx - call get_pixel_24 - cmp eax,esi - jne @f - call buf_flood_fill_recurs_1 - @@: - dec ecx - - .end_fun: - ret - -;функция для рисования точки -align 4 -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 - align 4 proc buf_flip_h, buf_struc:dword pushad @@ -2138,6 +1245,8 @@ align 4 ret endp +;description: +; сжатие изображения по ширине в 2 раза (размеры буфера не меняются) align 4 proc buf_img_wdiv2, buf_struc:dword pushad @@ -2287,7 +1396,7 @@ proc img_rgba32_wdiv2 data_rgba:dword, size:dword endp ;description: -; сжатие изображения по высоте (высота буфера не меняется) +; сжатие изображения по высоте в 2 раза (высота буфера не меняется) align 4 proc buf_img_hdiv2, buf_struc:dword pushad @@ -2381,7 +1490,6 @@ proc img_8b_hdiv2, data_8b:dword, size:dword, size_w:dword xor edi,edi .old_line_2: loop @b - ret endp @@ -2426,7 +1534,6 @@ proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword .old_line: loop @b - mov eax,dword[data_rgb] ;eax = add eax,esi ;esi = width*3(rgb) mov ebx,eax @@ -2450,7 +1557,6 @@ proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword xor edi,edi .old_line_2: loop @b - ret endp @@ -2482,7 +1588,6 @@ proc img_rgba32_hdiv2, data_rgba:dword, size:dword, size_w_b:dword .old_line: loop @b - mov eax,dword[data_rgba] ;eax = mov ebx,dword[size_w_b] add eax,ebx @@ -2505,7 +1610,6 @@ proc img_rgba32_hdiv2, data_rgba:dword, size:dword, size_w_b:dword xor edi,edi .old_line_2: loop @b - ret endp @@ -2622,6 +1726,110 @@ pop ebx eax ret endp +;description: +; сжатие изображения по ширине (размеры буфера не меняются) +;input: +; data_rgb - pointer to rgb data +; size_w - width img in pixels +; size_h - height img in pixels +; size_w_new - new width img in pixels +align 16 +proc img_rgb24_wresize, data_rgb:dword, size_w:dword, size_h:dword, size_w_new:dword +locals + pr dd 0 + pg dd 0 + pb dd 0 + img_n dd ? ;указатель на данные нового изображения + lines dd ? +endl +pushad +;eax - delta for inp. img +;ebx - delta for outp. img +;esi - pointer to data_rgb + mov esi,[data_rgb] + mov [img_n],esi + mov eax,[size_h] + mov [lines],eax +align 4 + .cycyle_0: + mov eax,[size_w_new] + mov ecx,[size_w] + mov ebx,ecx +align 4 + .cycyle_1: + cmp eax,ebx + jg .else_0 + ;копируемый пиксель максимально влияет на результат + ;накапливаем rgb для интерполяции пикселей + mov edx,[size_w_new] + movzx edi,byte[esi] + imul edi,edx + add [pb],edi + movzx edi,byte[esi+1] + imul edi,edx + add [pg],edi + movzx edi,byte[esi+2] + imul edi,edx + add [pr],edi + cmp eax,ebx + je .d2_add + jmp .if_0_end + .else_0: + ;копируемый пиксель попадет на границу пикселей + mov edx,ebx + sub edx,eax + add edx,[size_w_new] + movzx edi,byte[esi] + imul edi,edx + add [pb],edi + movzx edi,byte[esi+1] + imul edi,edx + add [pg],edi + movzx edi,byte[esi+2] + imul edi,edx + add [pr],edi + ;сохраняем готовое rgb + .d2_add: + push eax + mov edi,[img_n] + mov eax,[pb] + xor edx,edx + div dword[size_w] ;eax /= [size_w] + stosb + mov eax,[pg] + xor edx,edx + div dword[size_w] ;eax /= [size_w] + stosb + mov eax,[pr] + xor edx,edx + div dword[size_w] ;eax /= [size_w] + stosb + pop eax + add dword[img_n],3 ;next pixel + ;обновляем rgb для нового пикселя + mov edx,eax + sub edx,ebx + movzx edi,byte[esi] + imul edi,edx + mov [pb],edi + movzx edi,byte[esi+1] + imul edi,edx + mov [pg],edi + movzx edi,byte[esi+2] + imul edi,edx + mov [pr],edi + add ebx,[size_w] + .if_0_end: + add eax,[size_w_new] + add esi,3 ;next pixel + dec ecx + jnz .cycyle_1 + dec dword[lines] + jnz .cycyle_0 +popad + ret +endp + ;преобразование буфера из 24-битного в 8-битный ; spectr - определяет какой спектр брать при преобразовании 0-синий, 1-зеленый, 2-красный align 4 @@ -3249,144 +2457,6 @@ proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf ret endp -;преобразование 8-битного буфера размером 16*16 в размер 1*256 символов -align 4 -proc buf_convert_text_matrix, buf_struc:dword - locals - tmp_mem dd ? - c1 dw ? - c2 dd ? - c3 dw ? - endl - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,8 - jne .error - mov ecx,buf2d_h - mov ebx,ecx - shr ebx,4 ;предполагаем что в буфере 16 строк с символами, потому делим на 2^4 - mov edx,buf2d_w - imul ecx,edx ;ecx = size 8 b - invoke mem.alloc,ecx ;выделяем временную память - mov [tmp_mem],eax ;eax - new memory - - shr edx,4 ;предполагаем что в буфере 16 колонок с символами, потому делим на 2^4 - mov eax,ebx - imul ebx,edx ;вычисляем кооличество пикселей на 1 символ - ;eax = bhe - высота буквы - ;ebx = bwi*bhe - колличество пикселей в 1-й букве - ;edx = bwi - ширина буквы - ;ecx,esi,edi - используются в цикле .c_0 - shr buf2d_w,4 - shl buf2d_h,4 ;преобразовываем размеры буфера - - cld - mov esi,buf2d_data - mov edi,[tmp_mem] - mov word[c3],16 - .c_3: - mov dword[c2],eax - .c_2: - mov word[c1],16 - .c_1: - mov ecx,edx ;.c_0: - rep movsb - add edi,ebx - sub edi,edx ;edi+=(bwi*bhe-bwi) - dec word[c1] - cmp word[c1],0 - jg .c_1 - add edi,edx - shl ebx,4 - sub edi,ebx ;edi-=(16*bwi*bhe-bwi) - shr ebx,4 - dec dword[c2] - cmp dword[c2],0 - jg .c_2 - sub edi,ebx - shl ebx,4 - add edi,ebx ;edi+=(15*bwi*bhe) - shr ebx,4 - dec word[c3] - cmp word[c3],0 - jg .c_3 - - mov edi,dword[buf_struc] ;копирование новой матрицы в основной буфер - mov edi,buf2d_data - mov esi,[tmp_mem] - mov ecx,ebx - shl ecx,8 - rep movsb - invoke mem.free,[tmp_mem] ;чистим временную память - jmp .end_conv - .error: - stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_n8b - .end_conv: - popad - ret -endp - -align 4 -buf_s_matr buf_2d_header ? ;локальная матрица символа - -align 4 -proc buf_draw_text, buf_struc:dword, buf_t_matr:dword, text:dword, coord_x:dword, coord_y:dword, color:dword - locals - buf_t_matr_offs dd ? - endl - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,24 - jne .error2 - mov edi,dword[buf_t_matr] - cmp buf2d_bits,8 - jne .error1 - mov edx,buf2d_data - mov [buf_t_matr_offs],edx - mov ecx,BUF_STRUCT_SIZE ;копируем структуру текстовой матрицы - mov esi,edi - lea edi,[buf_s_matr] - cld - rep movsb - lea edi,[buf_s_matr] - shr buf2d_h,8 ;делим высоту символьного буфера на 256, для нахождения высоты 1-го символа - mov ebx,buf2d_h ;берем высоту символа - mov ecx,buf2d_w ;берем ширину символа - - mov eax,[coord_x] - mov esi,[text] - cmp byte[esi],0 - je .end_draw ;если пустая строка - @@: - xor edx,edx - mov dl,byte[esi] ;берем код символа - imul edx,ebx ;умножаем его на высоту символа - imul edx,ecx ;умножаем на ширину символа - add edx,[buf_t_matr_offs] ;прибавляем смещение 0-го символа, т. е. получается смещение выводимого символа - mov buf2d_data,edx ;в локальный буфер символа, ставим указатель на нужный символ из буфера buf_t_matr - stdcall buf_bit_blt_alpha, [buf_struc], eax,[coord_y], edi,[color] - add eax,ecx - .new_s: - inc esi - cmp byte[esi],13 - jne .no_13 - mov eax,[coord_x] - add [coord_y],ebx - jmp .new_s - .no_13: - cmp byte[esi],0 - jne @b - jmp .end_draw - .error1: - stdcall print_err,sz_buf2d_draw_text,txt_err_n8b - jmp .end_draw - .error2: - stdcall print_err,sz_buf2d_draw_text,txt_err_n24b - .end_draw: - popad - ret -endp - align 4 proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки pushad @@ -3415,145 +2485,6 @@ proc print_err, fun:dword, mes:dword ; ret endp -;input: -; ebp+8 = p0 -; ebp+12 = p1 -align 4 -line_len4i: - push ebp - mov ebp,esp - 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 - faddp - fsqrt - fstp dword [ebp+12] - pop ebp - ret 4 ;8 - -align 4 -proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dword, color:dword - locals - delt_t dd ? - opr_param dd ? - v_poi_0 dd ? - endl - pushad - -;float t, xt,yt; -;for(t=.0;t<1.;t+=.005){ -; xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2; -; yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2; -; dc.SetPixel(xt,yt,255L); -;} - - mov edx,[color] ;set curve color - mov edi,[buffer] - xor ebx,ebx - xor ecx,ecx - - finit - fldz - - ; calculate delta t - stdcall line_len4i, dword[coord_p1],dword[coord_p0] - fadd dword[esp] - add esp,4 ;pop ... - - stdcall line_len4i, dword[coord_p2],dword[coord_p1] - fadd dword[esp] - add esp,4 ;pop ... - - fadd st0,st0 ; len*=2 - ftst - fstsw ax - - fld1 - sahf - jle @f ;избегаем деления на 0 - fdiv st0,st1 - @@: - fstp dword[delt_t] - - ffree st0 ;1.0 - fincstp - - ;fild word[coord_p2+2] ;y2 - fild word[coord_p1+2] ;y1 - fild word[coord_p0+2] ;y0 - fild word[coord_p2] ;x2 - fild word[coord_p1] ;x1 - fild word[coord_p0] ;x0 - fld dword[delt_t] - fldz ;t=.0 - - @@: - fld1 - fsub st0,st1 ;1.-t - fmul st0,st0 ;pow(1.-t,2) - fmul st0,st3 ;...*x0 - fstp dword[opr_param] - - fld1 - fsub st0,st1 ;1.-t - fmul st0,st1 ;(1.-t)*t - fadd st0,st0 - fmul st0,st4 ;...*x1 - mov esi,dword[opr_param] - fstp dword[opr_param] - - fld st0 ;st0=t - fmul st0,st0 ;t^2 - fmul st0,st5 ;(t^2)*x2 - - fadd dword[opr_param] - mov dword[opr_param],esi - fadd dword[opr_param] - fistp word[v_poi_0] ;x - - fld1 - fsub st0,st1 ;1.-t - fmul st0,st0 ;pow(1.-t,2) - fmul st0,st6 ;...*y0 - fstp dword[opr_param] - - fld1 - fsub st0,st1 ;1.-t - fmul st0,st1 ;(1.-t)*t - fadd st0,st0 - fmul st0,st7 ;...*y1 - mov esi,dword[opr_param] - fstp dword[opr_param] - - 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 - fadd dword[opr_param] - fistp word[v_poi_0+2] ;y - - mov eax,1 - mov bx,word[v_poi_0+2] - mov cx,word[v_poi_0] - call draw_pixel - - fadd st0,st1 ;t+dt - - fld1 - fcomp - fstsw ax - sahf - jae @b - - popad - ret -endp - ;фильтр align 4 proc buf_filter_dither, buffer:dword, algor:dword @@ -4011,1332 +2942,8 @@ dither_4: ; Atkinson algorithm ret -;*** функции для работы с воксельной графикой *** - - -;создание воксельных кистей -align 4 -proc vox_brush_create uses eax ebx ecx edi, h_br:dword, buf_z:dword - mov edi,[h_br] - movzx ecx,byte[edi+3] - add edi,4 - - ; *** создание единичной кисти *** - mov eax,[buf_z] - mov buf2d_data,eax - movzx eax,byte[edi-4] ;ширина единичной кисти - mov buf2d_w,eax ;ширина буфера - movzx eax,byte[edi-4+1] ;высота единичной кисти - mov buf2d_h,eax ;высота буфера - mov buf2d_size_lt,0 ;отступ слева и справа для буфера - mov buf2d_color,0 ;цвет фона буфера - mov buf2d_bits,32 ;количество бит в 1-й точке изображения - - ; *** создание следующих кистей *** - cmp ecx,1 - jl .end_creat - movzx ebx,byte[edi-4+2] ;высота основания единичной кисти - shr ebx,1 - cld - @@: - mov eax,edi - add edi,BUF_STRUCT_SIZE - stdcall vox_create_next_brush, eax, edi, ebx - shl ebx,1 - loop @b - .end_creat: - ret -endp - -;удаление воксельных кистей -align 4 -proc vox_brush_delete uses ecx edi, h_br:dword - mov edi,[h_br] - movzx ecx,byte[edi+3] - add edi,4 - - ; *** удаление кистей *** - cmp ecx,1 - jl .end_delete - cld - @@: - add edi,BUF_STRUCT_SIZE - stdcall buf_delete, edi - loop @b - .end_delete: - ret -endp - -;функция для создания вокселя следующего порядка -; buf_v1 - буфер с исходным вокселем -; buf_v2 - буфер с увеличеным вокселем -; h - высота основания исходного вокселя : 2 -align 4 -proc vox_create_next_brush uses eax ebx ecx edx edi, buf_v1:dword, buf_v2:dword, h:dword - mov edi,[buf_v1] - mov ebx,buf2d_h - mov ecx,buf2d_w - mov edi,[buf_v2] - mov buf2d_h,ebx - shl buf2d_h,1 - mov buf2d_w,ecx - shl buf2d_w,1 - mov buf2d_color,0 - mov buf2d_bits,32 - - stdcall buf_create, [buf_v2] ;создание буфера глубины - shr ecx,1 - mov edx,[h] - shl edx,1 - sub ebx,edx - ;ecx - ширина исходного вокселя : 2 - ;ebx - высота исходного вокселя (без основания) - ;edx - высота основания исходного вокселя - mov eax,[h] - cmp eax,0 - je @f - stdcall vox_add, [buf_v2], [buf_v1], ecx,0,0 - stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,0 - - stdcall vox_add, [buf_v2], [buf_v1], 0,eax,eax - push eax ;stdcall ... - add eax,ebx - stdcall vox_add, [buf_v2], [buf_v1], 0,eax ;,... - sub eax,ebx - shl ecx,1 - - ;ecx - ширина исходного вокселя - stdcall vox_add, [buf_v2], [buf_v1], ecx,eax,eax - push eax ;stdcall ...,[h] - add eax,ebx - stdcall vox_add, [buf_v2], [buf_v1], ecx,eax;,[h] - ;sub eax,ebx - shr ecx,1 - - ;ecx - ширина исходного вокселя : 2 - stdcall vox_add, [buf_v2], [buf_v1], ecx,edx,edx - add ebx,edx - stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,edx - - jmp .end_0 - @@: - ;если h = 0, тогда получаем кисть на 2 грани - ;в таком случае для получения глубины берем ширину / 2 - mov eax,ecx - ;2 левых вокселя - stdcall vox_add, [buf_v2], [buf_v1], 0,0,eax - stdcall vox_add, [buf_v2], [buf_v1], 0,ebx,eax - shl eax,1 - ;2 центральных передних вокселя (задние центральные не выводим) - stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax - stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax - shr eax,1 - shl ecx,1 - ;2 правых вокселя - stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax - stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax - - .end_0: - - - ret -endp - -; -align 4 -proc vox_add, buf_v1:dword, buf_v2:dword, coord_x:dword, coord_y:dword, coord_z:dword -pushad - mov ebx,[coord_x] - mov eax,[coord_y] - mov edi,[buf_v2] - mov ecx,buf2d_h - mov esi,buf2d_w - imul ecx,esi - add esi,ebx - mov edx,buf2d_data - cld - ;ecx - count pixels in voxel - ;edx - указатель на данные в воксельном буфере - ;edi - указатель на воксельный буфер - ;esi - width voxel buffer add coord x - .cycle: - cmp dword[edx],0 - je @f - ;проверяем буфер глубины - push eax ecx edi esi - mov ecx,eax - mov edi,[buf_v1] - call get_pixel_32 ;stdcall buf_get_pixel, [buf_v1],ebx,ecx - mov esi,[edx] - add esi,[coord_z] - cmp eax,esi - jge .end_draw - stdcall buf_set_pixel, [buf_v1],ebx,ecx,esi ;esi = new coord z - .end_draw: - pop esi edi ecx eax - @@: - add edx,4 - inc ebx - cmp ebx,esi - jl @f - inc eax - sub ebx,buf2d_w - @@: - loop .cycle -popad - ret -endp - -;description: -; возврашает ширину воксельного изображения с 3-мя гранями -; принимает указатель на кисть и масштаб -align 4 -proc buf_vox_obj_get_img_w_3g uses ecx, h_br:dword,k_scale:dword - mov ecx,[h_br] - - movzx eax,byte[ecx] - cmp dword[k_scale],1 - jl .end_c0 - mov ecx,[k_scale] - shl eax,cl - .end_c0: - ret -endp - -;description: -; возврашает высоту воксельного изображения с 3-мя гранями -; принимает указатель на кисть и масштаб -align 4 -proc buf_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword - mov ecx,[h_br] - - movzx eax,byte[ecx+1] - cmp dword[k_scale],1 - jl .end_c0 - mov ecx,[k_scale] - shl eax,cl - .end_c0: - ret -endp - -;description: -; функция рисующая воксельный объект (видна 1 грань) -;input: -; buf_i - буфер в котором рисуется (24 бита) -; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) -align 4 -proc buf_vox_obj_draw_1g, buf_i:dword, buf_z:dword, v_obj:dword, coord_x:dword,\ -coord_y:dword, k_scale:dword - cmp [k_scale],0 - jl .end_f -pushad - mov edi,[buf_i] - cmp buf2d_bits,24 - jne .error1 - mov edi,[buf_z] - cmp buf2d_bits,32 - jne .error2 - - mov ecx,[k_scale] - mov ebx,[coord_x] - mov edx,[coord_y] - mov edi,[v_obj] - add edi,vox_offs_data - xor esi,esi - stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj] - - jmp .end_0 - .error1: - stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n24b - jmp .end_0 - .error2: - stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n32b - .end_0: -popad - .end_f: - ret -endp - -;input: -; ebx - coord_x -; edx - coord_y -; esi - coord_z -; ecx - уровень текушего узла -; edi - указатель на данные воксельного объекта -align 4 -proc draw_sub_vox_obj_1g, buf_i:dword, buf_z:dword, v_obj:dword - cmp byte[edi+3],0 ;смотрим есть ли поддеревья - je .sub_trees - - ;прорисовка рамки если размер узла = 1 - cmp ecx,0 - jne @f - ;проверка глубины esi - stdcall buf_get_pixel, [buf_z], ebx,edx, esi - cmp eax,esi - jge @f - push ecx - mov ecx,dword[edi] - and ecx,0xffffff - stdcall buf_set_pixel, [buf_i], ebx,edx, ecx - stdcall buf_set_pixel, [buf_z], ebx,edx, esi - pop ecx - @@: - - ;рекурсивный перебор поддеревьев - push edx - ;вход внутрь узла - dec ecx - - mov eax,1 - cmp ecx,1 - jl @f - shl eax,cl - @@: - - add edx,eax ;коректировка высоты под воксель нижнего уровня - - mov ah,byte[edi+3] - add edi,4 - mov al,8 - .cycle: - bt ax,8 ;тестируем только ah - jnc .c_next - push eax ebx edx esi - stdcall vox_corect_coords_pl, [v_obj],1 - stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj] - pop esi edx ebx eax - .c_next: - shr ah,1 - dec al - jnz .cycle - ;выход из узла - inc ecx - pop edx - jmp .end_f - .sub_trees: - cmp ecx,0 - jl .end_0 ;не рисуем очень маленькие воксели - - ;рисуем узел - mov eax,[edi] - and eax,0xffffff - - cmp ecx,1 - jl @f - ;квадрат больше текущего масштаба - stdcall vox_draw_square_1g, [buf_i],[buf_z],eax - jmp .end_0 - @@: - ;квадрат текущего масштаба - push ecx - mov ecx,eax - stdcall buf_get_pixel, [buf_z], ebx,edx - cmp eax,esi - jge .end_1 - stdcall buf_set_pixel, [buf_i], ebx,edx,ecx - stdcall buf_set_pixel, [buf_z], ebx,edx,esi - .end_1: - pop ecx - .end_0: - add edi,4 - .end_f: - ret -endp - -;output: -; eax - разрушается -align 4 -proc vox_draw_square_1g uses ecx edx edi, buf_i:dword, buf_z:dword, color:dword -locals - img_size dd ? - coord_y dd ? -endl - mov edi,[buf_z] - xor eax,eax - inc eax - shl eax,cl - mov [img_size],eax - mov [coord_y],eax - .cycle_0: - push ebx - mov ecx,[img_size] - cld - .cycle_1: - push ecx - mov ecx,edx - call get_pixel_32 - pop ecx - cmp eax,esi - jge @f - stdcall buf_set_pixel, [buf_i], ebx,edx, [color] - stdcall buf_set_pixel, edi, ebx,edx, esi - @@: - inc ebx - loop .cycle_1 - pop ebx - inc edx - dec dword[coord_y] - jnz .cycle_0 - ret -endp - -;description: -; функция рисующая воксельный объект (видно 3 грани) -;input: -; buf_i - буфер в котором рисуется (24 бита) -; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) -; h_br - кисть с изображениями вокселей (32 бита) -; v_obj - воксельный объект -; k_scale - коэф. для масштабирования изображения -align 4 -proc buf_vox_obj_draw_3g, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ -coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword -pushad - mov edi,[v_obj] - mov ecx,[k_scale] - mov ebx,[coord_x] - mov edx,[coord_y] - add edi,vox_offs_data - mov esi,[coord_z] - stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] -popad - ret -endp - -;description: -; функция рисующая часть воксельного объекта -;input: -; buf_i - буфер в котором рисуется (24 бита) -; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) -; h_br - кисть с изображениями вокселей (32 бита) -; v_obj - воксельный объект -; k_scale - коэф. для масштабирования изображения -align 4 -proc buf_vox_obj_draw_3g_scaled, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ -coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword,\ -s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword,b_color:dword -pushad -locals - p_node dd 0 ;родительский узел -endl - mov edi,[v_obj] - add edi,vox_offs_data - - mov ecx,[k_scale] - mov ebx,[coord_x] - - ;тестовая рамка - mov eax,[h_br] - - movzx edx,byte[eax] - movzx esi,byte[eax+1] - cmp ecx,1 - jl .end_c0 - shl edx,cl - shl esi,cl - .end_c0: - ;stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color] - - ;вертикальная полоса - add ebx,edx - shr edx,cl - stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color] - mov ecx,[s_k_scale] - shr esi,cl - xor eax,eax - inc eax - shl eax,cl - dec eax - sub eax,[s_c_z] ;значения по оси z возрастают с низу вверх - imul eax,esi - add eax,[coord_y] - stdcall buf_filled_rect_by_size, [buf_i], ebx,eax,edx,esi, [b_color] - mov ebx,[coord_y] - shl esi,cl - add ebx,esi - stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale] - shr eax,1 - mov esi,[h_br] - movzx esi,byte[esi+1] - ;ползунок - stdcall draw_polz_hor, [buf_i], [coord_x],ebx,eax,esi, [s_c_x], [s_k_scale], [b_color] - mov edx,[coord_x] - add edx,eax - ;ползунок - stdcall draw_polz_hor, [buf_i], edx,ebx,eax,esi, [s_c_y], [s_k_scale], [b_color] -;--- - - mov esi,[s_k_scale] - cmp esi,1 - jl .end_2 - - ; *** (1) *** - .found: - stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi - movzx bx,byte[edi+3] - mov [p_node],edi - add edi,4 - cmp eax,0 - je .end_1 - mov ecx,eax - cld - @@: ;цикл для пропуска предыдущих поддеревьев в узле - bt bx,0 ;проверяем есть ли дочерние узлы - jnc .end_0 - xor eax,eax - stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви - .end_0: - shr bx,1 - loop @b - .end_1: - bt bx,0 - jnc .end_2 ;если поддерева не существует - dec esi - cmp esi,0 - jg .found - - ; *** (2) *** - ;рисование части объекта - mov ecx,[k_scale] - mov ebx,[coord_x] - mov edx,[coord_y] - mov esi,[coord_z] - stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] - .end_2: - -popad - ret -endp - -;input: -; h_br - кисть с изображениями вокселей (32 бита) -; ebx - coord_x -; edx - coord_y -; esi - coord_z -; ecx - уровень текушего узла -; edi - указатель на данные воксельного объекта -align 4 -proc vox_go_in_node, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword - cmp byte[edi+3],0 ;смотрим есть ли поддеревья - je .sub_trees - ;рекурсивный перебор поддеревьев - push eax edx - - ;прорисовка рамки если размер узла = 1 - cmp ecx,0 - jne .end_2 - push eax - stdcall vox_get_sub_brush,[h_br],0 ;определяем кисть для рисования - cmp eax,0 ;если кисть не найдена - je @f - stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi] - @@: - pop eax - .end_2: - - ;вход внутрь узла - dec ecx -;--- - push ebx - ;mov eax,(h-h_osn/2) - mov ebx,[h_br] - movzx eax,byte[ebx+1] - cmp byte[ebx+2],0 - je @f - ;если кисть с 3-мя гранями - movzx ebx,byte[ebx+2] - shr ebx,1 - sub eax,ebx - jmp .end_0 - @@: - ;если кисть с 2-мя гранями - movzx ebx,byte[ebx] - shr ebx,1 - .end_0: - cmp ecx,1 - jl @f - shl eax,cl - shl ebx,cl - @@: - add esi,ebx - pop ebx - add edx,eax ;коректировка высоты под воксель нижнего уровня -;--- - mov ah,byte[edi+3] - add edi,4 - mov al,8 - .cycle: - bt ax,8 ;тестируем только ah - jnc .c_next - push ebx edx esi - stdcall vox_corect_coords, [h_br], [v_obj] - stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] - pop esi edx ebx - .c_next: - shr ah,1 - dec al - jnz .cycle - - ;выход из узла - inc ecx - pop edx eax - - jmp .end_f - .sub_trees: - ;рисуем узел - push eax - stdcall vox_get_sub_brush,[h_br],ecx ;определяем кисть для рисования - cmp eax,0 ;если кисть не найдена - je @f - stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi] - @@: - pop eax - - add edi,4 - .end_f: - ret -endp - -;description: -; функция рисующая одиночный воксел -;input: -; buf_i - буфер в котором рисуется (24 бита) -; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) -; buf_v - буфер с изображением вокселя (32 бита) -; v_color - цвет -align 4 -proc draw_vox, buf_i:dword, buf_z:dword, buf_v:dword,\ -coord_x:dword, coord_y:dword, coord_z:dword, v_color:dword -pushad - mov eax,[coord_x] - mov ebx,[coord_y] - mov edi,[buf_v] - mov ecx,buf2d_h - mov esi,buf2d_w - imul ecx,esi - add esi,eax - mov edx,buf2d_data - cld - ;ecx - count pixels in voxel - ;edx - указатель на данные в воксельном буфере - ;edi - указатель на воксельный буфер - ;esi - width voxel buffer add coord x - .cycle: - cmp dword[edx],0 - je @f - ;проверяем буфер глубины - push eax - stdcall buf_get_pixel, [buf_z],eax,ebx - sub eax,[coord_z] - cmp eax,[edx] - jl .dr_pixel - pop eax - jmp @f - .dr_pixel: - ;рисуем точку - pop eax - stdcall buf_set_pixel, [buf_i],eax,ebx,[v_color] - push ecx - mov ecx,[coord_z] - add ecx,[edx] - stdcall buf_set_pixel, [buf_z],eax,ebx,ecx - pop ecx - @@: - add edx,4 - inc eax - cmp eax,esi - jl @f - inc ebx - sub eax,buf2d_w - @@: - loop .cycle -popad - ret -endp - -;description: -;функция для коректировки координат -;направления осей координат в вокселе: -;*z -;| -;+ -; * y -; / -;+ -; \ -; * x -;input: -; al - номер узла в дереве (от 1 до 8) -; ebx - координата x -; edx - координата y -; esi - координата z -; ecx - уровень текушего узла -;output: -; ebx - новая координата x -; edx - новая координата y -; esi - новая координата z -align 4 -proc vox_corect_coords, h_br:dword, v_obj:dword -locals - osn_w_2 dd ? ;ширина основания единичного вокселя : 2 - vox_h dd ? ;высота единичного вокселя -endl - cmp ecx,0 - jl .end_f ;для ускорения отрисовки - - push eax edi - and eax,15 ;выделяем номер узла в дереве - mov edi,[v_obj] - add edi,vox_offs_tree_table - add edi,8 - sub edi,eax - - push ebx ecx - mov ebx,[h_br] - - movzx ecx,byte[ebx] - shr ecx,1 - mov dword[osn_w_2],ecx - - movzx ecx,byte[ebx+2] - movzx ebx,byte[ebx+1] - sub ebx,ecx - mov dword[vox_h],ebx - shr ecx,1 - mov eax,ecx ;eax - высота основания единичного вокселя : 2 - pop ecx ebx - - cmp ecx,1 - jl @f ;во избежание зацикливания - shl eax,cl - shl dword[osn_w_2],cl - shl dword[vox_h],cl - @@: - -; add esi,eax ;меняем глубину для буфера z (компенсация для координаты y) - bt word[edi],0 ;test voxel coord x - jnc @f - add ebx,[osn_w_2] - cmp eax,0 - jne .end_0 - add esi,[osn_w_2] ;меняем глубину для буфера z - jmp @f - .end_0: - add edx,eax - add esi,eax ;меняем глубину для буфера z - @@: - bt word[edi],1 ;test voxel coord y - jnc @f - add ebx,[osn_w_2] - cmp eax,0 - jne .end_1 - sub esi,[osn_w_2] ;меняем глубину для буфера z - jmp @f - .end_1: - sub edx,eax - sub esi,eax ;меняем глубину для буфера z - @@: - bt word[edi],2 ;test voxel coord z - jnc @f - sub edx,[vox_h] - @@: - pop edi eax - .end_f: - ret -endp - -;извлекаем из h_br указатель на буфер с изображением вокселя, указанного порядка n -align 4 -proc vox_get_sub_brush uses ebx ecx, h_br:dword, n:dword - xor eax,eax - mov ebx,[n] - cmp ebx,0 - jl @f - mov ecx,[h_br] - cmp bl,byte[ecx+3] - jg @f - add ecx,4 - imul ebx,BUF_STRUCT_SIZE - mov eax,ebx - add eax,ecx - @@: - ret -endp - -;description: -; функция рисующая срез воксельного обьекта -;input: -; v_size - размер квадрата с вокселем -; k_scale - степень детализации изображения -; n_plane - номер плоскости сечния (в пределах от 0 до 2^k_scale - 1) -; b_color - цвет границы -align 4 -proc buf_vox_obj_draw_pl, buf_i:dword, v_obj:dword, coord_x:dword,\ -coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword - cmp [k_scale],0 - jl .end_f -pushad - mov eax,[v_size] - mov ecx,[k_scale] - mov ebx,eax - cmp ecx,1 - jl @f - shl ebx,cl - @@: - ;ebx - полный размер изображения - stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;рамка на рисунок - mov edx,ebx - add ebx,[coord_y] - stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;ползунок, показывающий номер сечения - - ;рисование точек для сетки - push ecx - mov edi,1 - cmp ecx,1 - jl @f - shl edi,cl - @@: - dec edi - cmp edi,1 - jl .end_0 - mov ecx,edi - imul ecx,edi - mov ebx,[coord_x] - mov edx,[coord_y] - add edx,eax - xor esi,esi - cld - @@: - add ebx,eax - inc esi - stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color] - cmp esi,edi - jl .end_1 - ;переход точек на новую строку - xor esi,esi - mov ebx,[coord_x] - add edx,eax - .end_1: - loop @b - .end_0: - pop ecx - - ;eax - размер одного квадрата - ;edi - указатель на рисуемые данные из объекта - mov ebx,[coord_x] - mov edx,[coord_y] - mov edi,[v_obj] - add edi,vox_offs_data - xor esi,esi - push eax - mov eax,1 - shl eax,cl - dec eax - sub eax,[n_plane] - stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],eax -popad - .end_f: - ret -endp - -;description: -; функция рисующая срез части воксельного обьекта -;input: -; s_c_x, s_c_y, s_c_z, s_k_scale - параметры определяющие часть воксельного объекта, которая будет рисоваться -align 4 -proc buf_vox_obj_draw_pl_scaled, buf_i:dword, v_obj:dword, coord_x:dword,\ -coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword,\ -s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword - cmp [k_scale],0 - jl .end_f -pushad -locals - p_node dd 0 ;родительский узел -endl - mov eax,[v_size] - mov ecx,[k_scale] - mov ebx,eax - cmp ecx,1 - jl @f - shl ebx,cl - @@: - ;ebx - полный размер изображения - stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;рамка на рисунок - mov edx,ebx - add ebx,[coord_y] - stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;ползунок, показывающий номер сечения - - ;рисование точек для сетки - push ecx - mov edi,1 - cmp ecx,1 - jl @f - shl edi,cl - @@: - dec edi - cmp edi,1 - jl .end_3 - mov ecx,edi - imul ecx,edi - mov ebx,[coord_x] - mov edx,[coord_y] - add edx,eax - xor esi,esi - cld - @@: - add ebx,eax - inc esi - stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color] - cmp esi,edi - jl .end_4 - ;переход точек на новую строку - xor esi,esi - mov ebx,[coord_x] - add edx,eax - .end_4: - loop @b - .end_3: - pop ecx - - mov esi,[s_k_scale] - cmp esi,1 - jl .end_2 - mov edi,[v_obj] - add edi,vox_offs_data - - ; *** (1) *** - .found: - stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi - movzx bx,byte[edi+3] - mov [p_node],edi - add edi,4 - cmp eax,0 - je .end_1 - mov ecx,eax - cld - @@: ;цикл для пропуска предыдущих поддеревьев в узле - bt bx,0 ;проверяем есть ли дочерние узлы - jnc .end_0 - xor eax,eax - stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви - .end_0: - shr bx,1 - loop @b - .end_1: - bt bx,0 - jnc .end_2 ;если поддерева не существует - dec esi - cmp esi,0 - jg .found - - mov eax,[v_size] - ;eax - размер одного квадрата - ;edi - указатель на рисуемые данные из объекта - mov ecx,[k_scale] - mov ebx,[coord_x] - mov edx,[coord_y] - xor esi,esi - push eax - mov eax,1 - shl eax,cl - dec eax - sub eax,[n_plane] - stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax - - .end_2: -popad - .end_f: - ret -endp - -;description: -; определение позиции узла в дереве (от 0 до 7) -align 4 -proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\ -coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword - mov ecx,[k_scale] - dec ecx - mov eax,[coord_x] - mov ebx,[coord_y] - mov edi,[coord_z] - cmp ecx,1 - jl .end_0 - shr eax,cl - shr ebx,cl - shr edi,cl - .end_0: - and eax,1 - bt ebx,0 - jnc @f - bts eax,1 - @@: - bt edi,0 - jnc @f - bts eax,2 - @@: - - mov edi,[v_obj] - add edi,vox_offs_tree_table - @@: - cmp al,byte[edi] - je @f - inc edi - jmp @b - @@: - sub edi,[v_obj] - sub edi,vox_offs_tree_table - mov eax,edi - - ret -endp - -;input: -; edi - указатель на данные воксельного объекта -;output: -; eax - eax + число узлов в данных вокс. объекта -; edi - указатель на смещенные данные вокс. объекта -align 4 -proc vox_obj_rec0 - inc eax - cmp byte[edi+3],0 ;смотрим есть ли поддеревья - je .sub_trees - - ;рекурсивный перебор поддеревьев - push ebx ecx - mov bh,byte[edi+3] - add edi,4 - mov bl,8 - .cycle: - bt bx,8 ;тестируем только bh - jnc .c_next - stdcall vox_obj_rec0 - .c_next: - shr bh,1 - dec bl - jnz .cycle - pop ecx ebx - - jmp .end_f - .sub_trees: - add edi,4 - .end_f: - ret -endp - -;description: -; функция рисующая горизонтальную полосу с ползунком -align 4 -proc draw_polz_hor uses eax ebx ecx, buf:dword, coord_x:dword, coord_y:dword,\ -size_x:dword, size_y:dword, pos:dword, k_scale:dword, color:dword - mov ebx,[size_x] - stdcall buf_rect_by_size, [buf], [coord_x],[coord_y],ebx,[size_y], [color] - mov ecx,[k_scale] - shr ebx,cl - mov eax,[pos] - imul eax,ebx - add eax,[coord_x] - stdcall buf_filled_rect_by_size, [buf], eax,[coord_y],ebx,[size_y], [color] - ret -endp - -;input: -; ebx - coord_x -; edx - coord_y -; esi - coord_z -; ecx - уровень текушего узла -; edi - указатель на данные воксельного объекта -align 4 -proc draw_sub_vox_obj_pl, buf_i:dword, v_obj:dword, clip_z:dword,\ -v_size:dword - cmp byte[edi+3],0 ;смотрим есть ли поддеревья - je .sub_trees - - ;прорисовка рамки если размер узла = 1 - cmp ecx,0 - jne @f - ;проверка глубины esi - ;clip_z=n_plane - stdcall vox_is_clip, [clip_z];,[v_size] - cmp eax,0 - je @f - push ecx - mov ecx,dword[edi] - and ecx,0xffffff - stdcall buf_rect_by_size, [buf_i], ebx,edx, [v_size],[v_size],ecx - pop ecx - @@: - - ;рекурсивный перебор поддеревьев - push edx - ;вход внутрь узла - dec ecx - - mov eax,[v_size] - cmp ecx,1 - jl @f - shl eax,cl - @@: - - add edx,eax ;коректировка высоты под воксель нижнего уровня - - mov ah,byte[edi+3] - add edi,4 - mov al,8 - .cycle: - bt ax,8 ;тестируем только ah - jnc .c_next - push eax ebx edx esi - stdcall vox_corect_coords_pl, [v_obj],[v_size] - stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],[clip_z],[v_size] - pop esi edx ebx eax - .c_next: - shr ah,1 - dec al - jnz .cycle - ;выход из узла - inc ecx - pop edx - jmp .end_f - .sub_trees: - cmp ecx,0 - jl .end_0 ;не рисуем очень маленькие воксели - - ;проверка глубины esi - ;clip_z=n_plane - stdcall vox_is_clip, [clip_z] - cmp eax,0 - je .end_0 - - ;рисуем узел - mov eax,[edi] - and eax,0xffffff - push eax ;цвет узла - - mov eax,[v_size] - cmp ecx,1 - jl @f - ;квадрат больше текущего масштаба - shl eax,cl ;размер узла - stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax - push ebx edx esi - mov esi,eax - inc ebx - inc edx - sub esi,2 - mov eax,[buf_i] - push dword 128 - push dword[eax+16] ;+16 - b_color - stdcall combine_colors_3,[edi] - stdcall buf_rect_by_size, [buf_i], ebx,edx, esi,esi,eax - pop esi edx ebx - jmp .end_0 - @@: - ;квадрат текущего масштаба - stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax - .end_0: - add edi,4 - .end_f: - ret -endp - -;description: -; вспомогательная функция для проверки глубины esi -;input: -; ecx - уровень текушего узла -; esi - coord z -; clip_z - n_plane -;output: -; eax - 0 if no draw, 1 if draw -align 4 -proc vox_is_clip uses ebx edi, clip_z:dword - xor eax,eax - mov ebx,[clip_z] - mov edi,1 - cmp ecx,1 - jl @f - shl edi,cl - @@: - ;edi = 2^ecx - add edi,esi - cmp edi,ebx ;if (esi+2^ecx <= n_plane) no draw - jle @f - inc ebx - cmp esi,ebx ;if (esi >= (n_plane+1)) no draw - jge @f - inc eax - @@: - ret -endp - -;функция для коректировки координат -;направления осей координат в вокселе: -;*z -;| -;+-* x -;input: -; al - номер узла в дереве (от 1 до 8) -; ebx - координата x -; edx - координата y -; esi - координата z -; ecx - уровень текушего узла -;output: -; ebx - новая координата x -; edx - новая координата y -; esi - новая координата z -align 4 -proc vox_corect_coords_pl, v_obj:dword, v_size:dword - cmp ecx,0 - jl .end_f ;для ускорения отрисовки - - push eax edi - and eax,15 ;выделяем номер узла в дереве - mov edi,[v_obj] - add edi,vox_offs_tree_table - add edi,8 - sub edi,eax - - mov eax,[v_size] - cmp ecx,1 - jl @f - shl eax,cl - @@: - - bt word[edi],0 ;test voxel coord x - jnc @f - add ebx,eax - @@: - bt word[edi],2 ;test voxel coord z - jnc @f - sub edx,eax - @@: - bt word[edi],1 ;test voxel coord y - jc @f - mov eax,1 - cmp ecx,1 - jl .end_0 - shl eax,cl - .end_0: - add esi,eax ;меняем глубину для буфера z - @@: - pop edi eax - .end_f: - ret -endp - -;description: -; функция рисующая тени -;input: -; buf_i - буфер в котором рисуется (24 бита) -; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) -; h_br - кисть с изображениями вокселей (32 бита) -; k_scale - коэф. для масштабирования изображения -align 4 -proc buf_vox_obj_draw_3g_shadows, buf_i:dword, buf_z:dword, h_br:dword, \ -coord_x:dword, coord_y:dword, color:dword, k_scale:dword, prop:dword -locals - correct_z dd 0 ;коректировка для буфера глубины -endl -pushad - mov eax,[k_scale] - add eax,[prop] - mov dword[correct_z],8 - sub [correct_z],eax - mov ebx,[coord_x] - ;correct_z = 8-k_scale-prop - - stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale] - mov edx,eax ;edx - ширина изображения - stdcall buf_vox_obj_get_img_h_3g, [h_br],[k_scale] - mov esi,eax - - mov edi,[coord_y] - mov ecx,edx - add edx,ebx ;ширина + отступ слева - imul ecx,esi - cld - .cycle_0: - stdcall buf_get_pixel, [buf_z],ebx,edi - cmp eax,0 - je @f - stdcall vox_correct_z, [correct_z] - push eax - stdcall buf_get_pixel, [buf_i],ebx,edi - stdcall combine_colors_3,eax,[color] ;,eax - stdcall buf_set_pixel, [buf_i],ebx,edi,eax - @@: - inc ebx - cmp ebx,edx - jl @f - mov ebx,[coord_x] - inc edi - @@: - loop .cycle_0 - -popad - ret -endp - -;output: -; eax - scaled coord z -align 4 -proc vox_correct_z uses ecx, correct_z:dword - mov ecx,[correct_z] - cmp ecx,0 - je .end_f - jl .end_0 - shl eax,cl - jmp .end_f - .end_0: - neg ecx - inc ecx - shr eax,cl - .end_f: - ret -endp - -;output: -; eax - color -align 4 -proc combine_colors_3 uses ebx ecx edx edi esi, col_0:dword, col_1:dword, alpha:dword - - mov ebx,[col_0] - mov ecx,[col_1] - movzx di,byte[alpha] ;pro - mov si,0x00ff ;---get transparent--- - sub si,di ;256-pro - - ;---blye--- - movzx ax,bl - imul ax,si - movzx dx,cl - imul dx,di - add ax,dx - mov cl,ah - ;---green--- - movzx ax,bh - imul ax,si - movzx dx,ch - imul dx,di - add ax,dx - mov ch,ah - shr ebx,16 - ror ecx,16 - ;---red--- - movzx ax,bl - imul ax,si - movzx dx,cl - imul dx,di - add ax,dx - - shl eax,8 - ror ecx,16 - mov ax,cx - and eax,0xffffff - - ret -endp +include 'fun_voxel.inc' ;функции для работы с воксельной графикой txt_err_n8b db 'need buffer 8 bit',13,10,0 txt_err_n24b db 'need buffer 24 bit',13,10,0 diff --git a/programs/develop/libraries/buf2d/trunk/fun_draw.inc b/programs/develop/libraries/buf2d/trunk/fun_draw.inc new file mode 100644 index 0000000000..1705def746 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/fun_draw.inc @@ -0,0 +1,1213 @@ +; +;*** функции рисования в буфере *** +; + +align 16 +proc buf_draw_buf, buf_struc:dword + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,24 + jne .error + mov eax,7 + mov ebx,buf2d_data + + mov ecx,buf2d_w + ror ecx,16 + mov edx,buf2d_h + mov cx,dx + + mov edx,buf2d_size_lt + ror edx,16 + int 0x40 + jmp .end_draw_24 + .error: + stdcall print_err,sz_buf2d_draw,txt_err_n24b + .end_draw_24: + popad + ret +endp + +;input: +; ebx = coord x +; ecx = coord y +; edx = pixel color +; edi = pointer to buffer struct +align 4 +draw_pixel: + ;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 esi + mov esi,buf2d_w ;size x + imul esi,ecx ;size_x*y + 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 + ror edx,16 + mov byte[esi+2],dl + ror edx,16 + jmp .end_draw + .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 +; edi = pointer to buffer struct +;output: +; eax = цвет точки +; в случае ошибки eax = 0xffffffff +align 4 +get_pixel_24: + 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 + lea esi,[esi+esi*2] ;(size_x*y+x)*3 + add esi,buf2d_data ;ptr+(size_x*y+x)*3 + + xor eax,eax + mov ax,word[esi] ;copy pixel color + ror eax,16 + mov al,byte[esi+2] + ror eax,16 + pop esi + @@: + 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 +; edx = pixel color + transparent +; edi = pointer to buffer struct +; t_prop, m_prop - коэфициенты необходимые для вычисления степени прозрачности +align 16 +proc draw_pixel_transp, t_prop:dword, m_prop:dword +locals + transp_32 dd 0 ;цвет рисуемой точки + прозрачность +endl + ;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 [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 esi,ebp + sub esi,4 ;указатель на transp_32 + mov byte[esi+3],al ;прозрачность рисуемой точки + + call combine_colors_0 + pop esi edi edx ebx eax + @@: + ret +endp + +align 4 +proc buf_clear, buf_struc:dword, color:dword ;очистка буфера заданым цветом + pushad + mov edi,dword[buf_struc] + + mov ecx,buf2d_w + mov ebx,buf2d_h + imul ecx,ebx + + cld + + cmp buf2d_bits,8 + jne .end_clear_8 + mov edi,buf2d_data + mov al,byte[color] + rep stosb + jmp .end_clear_32 + .end_clear_8: + + cmp buf2d_bits,24 + jne .end_clear_24 + mov edi,buf2d_data + mov eax,dword[color] + mov ebx,eax + shr ebx,16 + @@: + stosw + mov byte[edi],bl + inc edi + loop @b + jmp .end_clear_32 + .end_clear_24: + + cmp buf2d_bits,32 + jne .end_clear_32 + mov edi,buf2d_data + mov eax,dword[color] + rep stosd + ;jmp .end_clear_32 + .end_clear_32: + popad + ret +endp + +align 4 +proc buf_line_brs, 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 (x0x1) + 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 x1 то меняем местами x0 и x1 + @@: + bt ebx,31 + jae @f + ;если координата x0 отрицательная + xor ebx,ebx + @@: + cmp esi,buf2d_w + jl @f + ;если координата x0 больше ширины буфера + mov esi,buf2d_w + dec esi + @@: + cmp ebx,esi + jg .end24 ;если x0 > x1 может возникнуть когда обе координаты x0, x1 находились за одним из пределов буфера + + cmp buf2d_bits,24 + je .beg24 + ;рисование в 8 битном буфере + ;в edx вычисляем начало 1-й точки линии в буфере изображения + mov edx,buf2d_w ;size x + imul edx,ecx ;size_x*y + add edx,ebx ;size_x*y+x + add edx,buf2d_data ;ptr+(size_x*y+x) + mov edi,edx ;теперь можем портить указатель на буфер + + mov ecx,esi + sub ecx,ebx ;в ecx колличество точек линии выводимых в буфер + inc ecx ;что-бы последняя точка линии также отображалась + mov eax,dword[color] ;будем использовать только значение в al + cld + rep stosb ;цикл по оси x от x0 до x1 (включая x1) + jmp .end24 + + .beg24: ;рисование в 24 битном буфере + ;в eax вычисляем начало 1-й точки линии в буфере изображения + mov eax,buf2d_w ;size x + imul eax,ecx ;size_x*y + add eax,ebx ;size_x*y+x + lea eax,[eax+eax*2] ;(size_x*y+x)*3 + add eax,buf2d_data ;ptr+(size_x*y+x)*3 + + mov ecx,esi + sub ecx,ebx ;в ecx колличество точек линии выводимых в буфер + inc ecx ;что-бы последняя точка линии также отображалась + mov edx,dword[color] + mov ebx,edx ;координата x0 в ebx уже не нужна + ror edx,16 ;поворачиваем регистр что бы 3-й байт попал в dl + cld + @@: ;цикл по оси x от x0 до x1 (включая x1) + mov word[eax],bx ;copy pixel color + mov byte[eax+2],dl + add eax,3 + loop @b + .end24: + popfd + popad + ret +endp + +align 4 +proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword +pushad + mov edi,[buf_struc] + cmp buf2d_bits,8 + je @f + cmp buf2d_bits,24 + je @f + jmp .coord_end + @@: + + mov eax,[coord_x] + mov ebx,[coord_y] + mov ecx,[w] + ;cmp ecx,1 + ;jl .coord_end + cmp ecx,0 + je .coord_end + jg @f + add eax,ecx + inc eax + neg ecx + @@: + add ecx,eax + dec ecx + mov edx,[h] + ;cmp edx,1 + ;jl .coord_end + cmp edx,0 + je .coord_end + jg @f + add ebx,edx + inc ebx + neg edx + @@: + + add edx,ebx + dec edx + mov esi,dword[color] + stdcall buf_line_h, edi, eax, ebx, ecx, esi ;линия - + stdcall buf_line_brs, edi, eax, ebx, eax, edx, esi ;линия | + stdcall buf_line_h, edi, eax, edx, ecx, esi ;линия - + stdcall buf_line_brs, edi, ecx, ebx, ecx, edx, esi ;линия | + .coord_end: +popad + ret +endp + +align 4 +proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword +pushad + mov edi,[buf_struc] + cmp buf2d_bits,8 + je @f + cmp buf2d_bits,24 + je @f + jmp .coord_end + @@: + mov eax,[coord_x] + mov ebx,[coord_y] + mov edx,[w] + cmp edx,0 + je .coord_end ;если высота 0 пикселей + jg @f ;если высота положительная + add eax,edx + inc eax + neg edx ;ширину делаем положительной + ;inc edx ;почему тут не добавляем 1-цу я не знаю, но с ней работает не правильно + @@: + add edx,eax + dec edx + mov ecx,[h] + cmp ecx,0 + je .coord_end ;если высота 0 пикселей + jg @f ;если высота положительная + add ebx,ecx ;сдвигаем верхнюю координату прямоугольника + inc ebx + neg ecx ;высоту делаем положительной + ;inc ecx ;почему тут не добавляем 1-цу я не знаю, но с ней работает не правильно + @@: + mov esi,dword[color] + cld + @@: + stdcall buf_line_h, edi, eax, ebx, edx, esi ;линия - + inc ebx + loop @b + .coord_end: +popad + ret +endp + +align 4 +proc buf_circle, buf_struc:dword, coord_x:dword, coord_y:dword, r:dword, color:dword +locals + po_x dd ? + po_y dd ? +endl + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,8 + je @f + cmp buf2d_bits,24 + je @f + jmp .error + @@: + mov edx,dword[color] + + finit + fild dword[coord_x] + fild dword[coord_y] + fild dword[r] + fldz ;px=0 + fld st1 ;py=r + + fldpi + fmul st0,st3 + fistp dword[po_x] + mov esi,dword[po_x] ;esi=pi*r + shl esi,1 ;esi=2*pi*r + + ;st0 = py + ;st1 = px + ;st2 = r + ;st3 = y + ;st4 = x + + @@: + ;Point(px + x, y - py) + fld st1 ;st0=px + fadd st0,st5 ;st0=px+x + fistp dword[po_x] + mov ebx,dword[po_x] + fld st3 ;st0=y + fsub st0,st1 ;st0=y-py + fistp dword[po_y] + mov ecx,dword[po_y] + call draw_pixel + ;px += py/r + fld st0 ;st0=py + fdiv st0,st3 ;st0=py/r + faddp st2,st0 ;st3+=st0 + ;py -= px/r + fld st1 ;st0=px + fdiv st0,st3 ;st0=px/r + fsubp st1,st0 ;st2-=st0 + + dec esi + cmp esi,0 + jge @b + jmp .exit_fun + .error: + stdcall print_err,sz_buf2d_circle,txt_err_n8_24b + .exit_fun: + + popad + ret +endp + +;функция для заливки области выбранным цветом +align 4 +proc buf_flood_fill, buf_struc:dword, coord_x:dword, coord_y:dword, mode:dword, color_f:dword, color_b:dword + pushad + mov edi,[buf_struc] + cmp buf2d_bits,24 + jne .end24 + + mov ebx,dword[coord_x] + mov ecx,dword[coord_y] + mov edx,dword[color_f] + mov esi,dword[color_b] + + cmp dword[mode],1 ;в зависимости от 'mode' определяем каким алгоритмом будем пользоваться + je @f + call buf_flood_fill_recurs_0 ;заливаем до пикселей цвета esi + jmp .end24 + @@: + call buf_flood_fill_recurs_1 ;заливаем пиксели имеющие цвет esi + + .end24: + popad + ret +endp + +;input: +; ebx = coord_x +; ecx = coord_y +; edx = цвет заливки +; esi = цвет границы, до которой будет ити заливка +; edi = buf_struc +;output: +; eax = портится +align 4 +buf_flood_fill_recurs_0: + call get_pixel_24 + cmp eax,0xffffffff ;if error coords + je .end_fun + cmp eax,edx ;если цвет пикселя совпал с цветом заливки, значит заливка в этой области уже была сделана + je .end_fun + + call draw_pixel + + dec ebx + call get_pixel_24 + cmp eax,esi + je @f + call buf_flood_fill_recurs_0 + @@: + inc ebx + + + inc ebx + call get_pixel_24 + cmp eax,esi + je @f + call buf_flood_fill_recurs_0 + @@: + dec ebx + + dec ecx + call get_pixel_24 + cmp eax,esi + je @f + call buf_flood_fill_recurs_0 + @@: + inc ecx + + inc ecx + call get_pixel_24 + cmp eax,esi + je @f + call buf_flood_fill_recurs_0 + @@: + dec ecx + + .end_fun: + ret + +;input: +; ebx = coord_x +; ecx = coord_y +; edx = цвет заливки +; esi = цвет пикселей, по которым будет ити заливка +; edi = buf_struc +;output: +; eax = портится +align 4 +buf_flood_fill_recurs_1: + call get_pixel_24 + cmp eax,0xffffffff ;if error coords + je .end_fun + cmp eax,edx ;если цвет пикселя совпал с цветом заливки, значит заливка в этой области уже была сделана + je .end_fun + cmp eax,esi ;если цвет пикселя не совпал с заливаемым цветом заливки, то прекращаем заливку + jne .end_fun + + call draw_pixel + + dec ebx + call get_pixel_24 + cmp eax,esi + jne @f + call buf_flood_fill_recurs_1 + @@: + inc ebx + + + inc ebx + call get_pixel_24 + cmp eax,esi + jne @f + call buf_flood_fill_recurs_1 + @@: + dec ebx + + dec ecx + call get_pixel_24 + cmp eax,esi + jne @f + call buf_flood_fill_recurs_1 + @@: + inc ecx + + inc ecx + call get_pixel_24 + cmp eax,esi + jne @f + call buf_flood_fill_recurs_1 + @@: + dec ecx + + .end_fun: + ret + +;функция для рисования точки +align 4 +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 + +;преобразование 8-битного буфера размером 16*16 в размер 1*256 символов +align 4 +proc buf_convert_text_matrix, buf_struc:dword + locals + tmp_mem dd ? + c1 dw ? + c2 dd ? + c3 dw ? + endl + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,8 + jne .error + mov ecx,buf2d_h + mov ebx,ecx + shr ebx,4 ;предполагаем что в буфере 16 строк с символами, потому делим на 2^4 + mov edx,buf2d_w + imul ecx,edx ;ecx = size 8 b + invoke mem.alloc,ecx ;выделяем временную память + mov [tmp_mem],eax ;eax - new memory + + shr edx,4 ;предполагаем что в буфере 16 колонок с символами, потому делим на 2^4 + mov eax,ebx + imul ebx,edx ;вычисляем кооличество пикселей на 1 символ + ;eax = bhe - высота буквы + ;ebx = bwi*bhe - колличество пикселей в 1-й букве + ;edx = bwi - ширина буквы + ;ecx,esi,edi - используются в цикле .c_0 + shr buf2d_w,4 + shl buf2d_h,4 ;преобразовываем размеры буфера + + cld + mov esi,buf2d_data + mov edi,[tmp_mem] + mov word[c3],16 + .c_3: + mov dword[c2],eax + .c_2: + mov word[c1],16 + .c_1: + mov ecx,edx ;.c_0: + rep movsb + add edi,ebx + sub edi,edx ;edi+=(bwi*bhe-bwi) + dec word[c1] + cmp word[c1],0 + jg .c_1 + add edi,edx + shl ebx,4 + sub edi,ebx ;edi-=(16*bwi*bhe-bwi) + shr ebx,4 + dec dword[c2] + cmp dword[c2],0 + jg .c_2 + sub edi,ebx + shl ebx,4 + add edi,ebx ;edi+=(15*bwi*bhe) + shr ebx,4 + dec word[c3] + cmp word[c3],0 + jg .c_3 + + mov edi,dword[buf_struc] ;копирование новой матрицы в основной буфер + mov edi,buf2d_data + mov esi,[tmp_mem] + mov ecx,ebx + shl ecx,8 + rep movsb + invoke mem.free,[tmp_mem] ;чистим временную память + jmp .end_conv + .error: + stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_n8b + .end_conv: + popad + ret +endp + +align 4 +proc buf_draw_text, buf_struc:dword, buf_t_matr:dword, text:dword, coord_x:dword, coord_y:dword, color:dword + locals + buf_t_matr_offs dd ? + buf_s_matr buf_2d_header ? ;ebp-BUF_STRUCT_SIZE локальная матрица символа + endl + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,24 + jne .error2 + mov edi,dword[buf_t_matr] + cmp buf2d_bits,8 + jne .error1 + mov edx,buf2d_data + mov [buf_t_matr_offs],edx + mov ecx,BUF_STRUCT_SIZE ;копируем структуру текстовой матрицы + mov esi,edi + mov edi,ebp + sub edi,BUF_STRUCT_SIZE ;&buf_s_matr + cld + rep movsb + sub edi,BUF_STRUCT_SIZE ;&buf_s_matr + shr buf2d_h,8 ;делим высоту символьного буфера на 256, для нахождения высоты 1-го символа + mov ebx,buf2d_h ;берем высоту символа + mov ecx,buf2d_w ;берем ширину символа + + mov eax,[coord_x] + mov esi,[text] + cmp byte[esi],0 + je .end_draw ;если пустая строка + @@: + xor edx,edx + mov dl,byte[esi] ;берем код символа + imul edx,ebx ;умножаем его на высоту символа + imul edx,ecx ;умножаем на ширину символа + add edx,[buf_t_matr_offs] ;прибавляем смещение 0-го символа, т. е. получается смещение выводимого символа + mov buf2d_data,edx ;в локальный буфер символа, ставим указатель на нужный символ из буфера buf_t_matr + stdcall buf_bit_blt_alpha, [buf_struc], eax,[coord_y], edi,[color] + add eax,ecx + .new_s: + inc esi + cmp byte[esi],13 + jne .no_13 + mov eax,[coord_x] + add [coord_y],ebx + jmp .new_s + .no_13: + cmp byte[esi],0 + jne @b + jmp .end_draw + .error1: + stdcall print_err,sz_buf2d_draw_text,txt_err_n8b + jmp .end_draw + .error2: + stdcall print_err,sz_buf2d_draw_text,txt_err_n24b + .end_draw: + popad + ret +endp + +;input: +; ebp+8 = p0 +; ebp+12 = p1 +align 4 +line_len4i: + push ebp + mov ebp,esp + 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 + faddp + fsqrt + fstp dword [ebp+12] + pop ebp + ret 4 ;8 + +align 4 +proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dword, color:dword + locals + delt_t dd ? + opr_param dd ? + v_poi_0 dd ? + endl + pushad + +;float t, xt,yt; +;for(t=.0;t<1.;t+=.005){ +; xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2; +; yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2; +; dc.SetPixel(xt,yt,255L); +;} + + mov edx,[color] ;set curve color + mov edi,[buffer] + xor ebx,ebx + xor ecx,ecx + + finit + fldz + + ; calculate delta t + stdcall line_len4i, dword[coord_p1],dword[coord_p0] + fadd dword[esp] + add esp,4 ;pop ... + + stdcall line_len4i, dword[coord_p2],dword[coord_p1] + fadd dword[esp] + add esp,4 ;pop ... + + fadd st0,st0 ; len*=2 + ftst + fstsw ax + + fld1 + sahf + jle @f ;избегаем деления на 0 + fdiv st0,st1 + @@: + fstp dword[delt_t] + + ffree st0 ;1.0 + fincstp + + ;fild word[coord_p2+2] ;y2 + fild word[coord_p1+2] ;y1 + fild word[coord_p0+2] ;y0 + fild word[coord_p2] ;x2 + fild word[coord_p1] ;x1 + fild word[coord_p0] ;x0 + fld dword[delt_t] + fldz ;t=.0 + + @@: + fld1 + fsub st0,st1 ;1.-t + fmul st0,st0 ;pow(1.-t,2) + fmul st0,st3 ;...*x0 + fstp dword[opr_param] + + fld1 + fsub st0,st1 ;1.-t + fmul st0,st1 ;(1.-t)*t + fadd st0,st0 + fmul st0,st4 ;...*x1 + mov esi,dword[opr_param] + fstp dword[opr_param] + + fld st0 ;st0=t + fmul st0,st0 ;t^2 + fmul st0,st5 ;(t^2)*x2 + + fadd dword[opr_param] + mov dword[opr_param],esi + fadd dword[opr_param] + fistp word[v_poi_0] ;x + + fld1 + fsub st0,st1 ;1.-t + fmul st0,st0 ;pow(1.-t,2) + fmul st0,st6 ;...*y0 + fstp dword[opr_param] + + fld1 + fsub st0,st1 ;1.-t + fmul st0,st1 ;(1.-t)*t + fadd st0,st0 + fmul st0,st7 ;...*y1 + mov esi,dword[opr_param] + fstp dword[opr_param] + + 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 + fadd dword[opr_param] + fistp word[v_poi_0+2] ;y + + mov eax,1 + mov bx,word[v_poi_0+2] + mov cx,word[v_poi_0] + call draw_pixel + + fadd st0,st1 ;t+dt + + fld1 + fcomp + fstsw ax + sahf + jae @b + + popad + ret +endp diff --git a/programs/develop/libraries/buf2d/trunk/fun_voxel.inc b/programs/develop/libraries/buf2d/trunk/fun_voxel.inc new file mode 100644 index 0000000000..1e82f55ba4 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/fun_voxel.inc @@ -0,0 +1,1329 @@ +; +;*** функции для работы с воксельной графикой *** +; + +vox_offs_tree_table equ 4 +vox_offs_data equ 12 + +;создание воксельных кистей +align 4 +proc vox_brush_create uses eax ebx ecx edi, h_br:dword, buf_z:dword + mov edi,[h_br] + movzx ecx,byte[edi+3] + add edi,4 + + ; *** создание единичной кисти *** + mov eax,[buf_z] + mov buf2d_data,eax + movzx eax,byte[edi-4] ;ширина единичной кисти + mov buf2d_w,eax ;ширина буфера + movzx eax,byte[edi-4+1] ;высота единичной кисти + mov buf2d_h,eax ;высота буфера + mov buf2d_size_lt,0 ;отступ слева и справа для буфера + mov buf2d_color,0 ;цвет фона буфера + mov buf2d_bits,32 ;количество бит в 1-й точке изображения + + ; *** создание следующих кистей *** + cmp ecx,1 + jl .end_creat + movzx ebx,byte[edi-4+2] ;высота основания единичной кисти + shr ebx,1 + cld + @@: + mov eax,edi + add edi,BUF_STRUCT_SIZE + stdcall vox_create_next_brush, eax, edi, ebx + shl ebx,1 + loop @b + .end_creat: + ret +endp + +;удаление воксельных кистей +align 4 +proc vox_brush_delete uses ecx edi, h_br:dword + mov edi,[h_br] + movzx ecx,byte[edi+3] + add edi,4 + + ; *** удаление кистей *** + cmp ecx,1 + jl .end_delete + cld + @@: + add edi,BUF_STRUCT_SIZE + stdcall buf_delete, edi + loop @b + .end_delete: + ret +endp + +;функция для создания вокселя следующего порядка +; buf_v1 - буфер с исходным вокселем +; buf_v2 - буфер с увеличеным вокселем +; h - высота основания исходного вокселя : 2 +align 4 +proc vox_create_next_brush uses eax ebx ecx edx edi, buf_v1:dword, buf_v2:dword, h:dword + mov edi,[buf_v1] + mov ebx,buf2d_h + mov ecx,buf2d_w + mov edi,[buf_v2] + mov buf2d_h,ebx + shl buf2d_h,1 + mov buf2d_w,ecx + shl buf2d_w,1 + mov buf2d_color,0 + mov buf2d_bits,32 + + stdcall buf_create, [buf_v2] ;создание буфера глубины + shr ecx,1 + mov edx,[h] + shl edx,1 + sub ebx,edx + ;ecx - ширина исходного вокселя : 2 + ;ebx - высота исходного вокселя (без основания) + ;edx - высота основания исходного вокселя + mov eax,[h] + cmp eax,0 + je @f + stdcall vox_add, [buf_v2], [buf_v1], ecx,0,0 + stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,0 + + stdcall vox_add, [buf_v2], [buf_v1], 0,eax,eax + push eax ;stdcall ... + add eax,ebx + stdcall vox_add, [buf_v2], [buf_v1], 0,eax ;,... + sub eax,ebx + shl ecx,1 + + ;ecx - ширина исходного вокселя + stdcall vox_add, [buf_v2], [buf_v1], ecx,eax,eax + push eax ;stdcall ...,[h] + add eax,ebx + stdcall vox_add, [buf_v2], [buf_v1], ecx,eax;,[h] + ;sub eax,ebx + shr ecx,1 + + ;ecx - ширина исходного вокселя : 2 + stdcall vox_add, [buf_v2], [buf_v1], ecx,edx,edx + add ebx,edx + stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,edx + + jmp .end_0 + @@: + ;если h = 0, тогда получаем кисть на 2 грани + ;в таком случае для получения глубины берем ширину / 2 + mov eax,ecx + ;2 левых вокселя + stdcall vox_add, [buf_v2], [buf_v1], 0,0,eax + stdcall vox_add, [buf_v2], [buf_v1], 0,ebx,eax + shl eax,1 + ;2 центральных передних вокселя (задние центральные не выводим) + stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax + stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax + shr eax,1 + shl ecx,1 + ;2 правых вокселя + stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax + stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax + + .end_0: + + + ret +endp + +; +align 4 +proc vox_add, buf_v1:dword, buf_v2:dword, coord_x:dword, coord_y:dword, coord_z:dword +pushad + mov ebx,[coord_x] + mov eax,[coord_y] + mov edi,[buf_v2] + mov ecx,buf2d_h + mov esi,buf2d_w + imul ecx,esi + add esi,ebx + mov edx,buf2d_data + cld + ;ecx - count pixels in voxel + ;edx - указатель на данные в воксельном буфере + ;edi - указатель на воксельный буфер + ;esi - width voxel buffer add coord x + .cycle: + cmp dword[edx],0 + je @f + ;проверяем буфер глубины + push eax ecx edi esi + mov ecx,eax + mov edi,[buf_v1] + call get_pixel_32 ;stdcall buf_get_pixel, [buf_v1],ebx,ecx + mov esi,[edx] + add esi,[coord_z] + cmp eax,esi + jge .end_draw + stdcall buf_set_pixel, [buf_v1],ebx,ecx,esi ;esi = new coord z + .end_draw: + pop esi edi ecx eax + @@: + add edx,4 + inc ebx + cmp ebx,esi + jl @f + inc eax + sub ebx,buf2d_w + @@: + loop .cycle +popad + ret +endp + +;description: +; возврашает ширину воксельного изображения с 3-мя гранями +; принимает указатель на кисть и масштаб +align 4 +proc buf_vox_obj_get_img_w_3g uses ecx, h_br:dword,k_scale:dword + mov ecx,[h_br] + + movzx eax,byte[ecx] + cmp dword[k_scale],1 + jl .end_c0 + mov ecx,[k_scale] + shl eax,cl + .end_c0: + ret +endp + +;description: +; возврашает высоту воксельного изображения с 3-мя гранями +; принимает указатель на кисть и масштаб +align 4 +proc buf_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword + mov ecx,[h_br] + + movzx eax,byte[ecx+1] + cmp dword[k_scale],1 + jl .end_c0 + mov ecx,[k_scale] + shl eax,cl + .end_c0: + ret +endp + +;description: +; функция рисующая воксельный объект (видна 1 грань) +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +align 4 +proc buf_vox_obj_draw_1g, buf_i:dword, buf_z:dword, v_obj:dword, coord_x:dword,\ +coord_y:dword, k_scale:dword + cmp [k_scale],0 + jl .end_f +pushad + mov edi,[buf_i] + cmp buf2d_bits,24 + jne .error1 + mov edi,[buf_z] + cmp buf2d_bits,32 + jne .error2 + + mov ecx,[k_scale] + mov ebx,[coord_x] + mov edx,[coord_y] + mov edi,[v_obj] + add edi,vox_offs_data + xor esi,esi + stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj] + + jmp .end_0 + .error1: + stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n24b + jmp .end_0 + .error2: + stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n32b + .end_0: +popad + .end_f: + ret +endp + +;input: +; ebx - coord_x +; edx - coord_y +; esi - coord_z +; ecx - уровень текушего узла +; edi - указатель на данные воксельного объекта +align 4 +proc draw_sub_vox_obj_1g, buf_i:dword, buf_z:dword, v_obj:dword + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + + ;прорисовка рамки если размер узла = 1 + cmp ecx,0 + jne @f + ;проверка глубины esi + stdcall buf_get_pixel, [buf_z], ebx,edx, esi + cmp eax,esi + jge @f + push ecx + mov ecx,dword[edi] + and ecx,0xffffff + stdcall buf_set_pixel, [buf_i], ebx,edx, ecx + stdcall buf_set_pixel, [buf_z], ebx,edx, esi + pop ecx + @@: + + ;рекурсивный перебор поддеревьев + push edx + ;вход внутрь узла + dec ecx + + mov eax,1 + cmp ecx,1 + jl @f + shl eax,cl + @@: + + add edx,eax ;коректировка высоты под воксель нижнего уровня + + mov ah,byte[edi+3] + add edi,4 + mov al,8 + .cycle: + bt ax,8 ;тестируем только ah + jnc .c_next + push eax ebx edx esi + stdcall vox_corect_coords_pl, [v_obj],1 + stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj] + pop esi edx ebx eax + .c_next: + shr ah,1 + dec al + jnz .cycle + ;выход из узла + inc ecx + pop edx + jmp .end_f + .sub_trees: + cmp ecx,0 + jl .end_0 ;не рисуем очень маленькие воксели + + ;рисуем узел + mov eax,[edi] + and eax,0xffffff + + cmp ecx,1 + jl @f + ;квадрат больше текущего масштаба + stdcall vox_draw_square_1g, [buf_i],[buf_z],eax + jmp .end_0 + @@: + ;квадрат текущего масштаба + push ecx + mov ecx,eax + stdcall buf_get_pixel, [buf_z], ebx,edx + cmp eax,esi + jge .end_1 + stdcall buf_set_pixel, [buf_i], ebx,edx,ecx + stdcall buf_set_pixel, [buf_z], ebx,edx,esi + .end_1: + pop ecx + .end_0: + add edi,4 + .end_f: + ret +endp + +;output: +; eax - разрушается +align 4 +proc vox_draw_square_1g uses ecx edx edi, buf_i:dword, buf_z:dword, color:dword +locals + img_size dd ? + coord_y dd ? +endl + mov edi,[buf_z] + xor eax,eax + inc eax + shl eax,cl + mov [img_size],eax + mov [coord_y],eax + .cycle_0: + push ebx + mov ecx,[img_size] + cld + .cycle_1: + push ecx + mov ecx,edx + call get_pixel_32 + pop ecx + cmp eax,esi + jge @f + stdcall buf_set_pixel, [buf_i], ebx,edx, [color] + stdcall buf_set_pixel, edi, ebx,edx, esi + @@: + inc ebx + loop .cycle_1 + pop ebx + inc edx + dec dword[coord_y] + jnz .cycle_0 + ret +endp + +;description: +; функция рисующая воксельный объект (видно 3 грани) +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; h_br - кисть с изображениями вокселей (32 бита) +; v_obj - воксельный объект +; k_scale - коэф. для масштабирования изображения +align 4 +proc buf_vox_obj_draw_3g, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ +coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword +pushad + mov edi,[v_obj] + mov ecx,[k_scale] + mov ebx,[coord_x] + mov edx,[coord_y] + add edi,vox_offs_data + mov esi,[coord_z] + stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] +popad + ret +endp + +;description: +; функция рисующая часть воксельного объекта +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; h_br - кисть с изображениями вокселей (32 бита) +; v_obj - воксельный объект +; k_scale - коэф. для масштабирования изображения +align 4 +proc buf_vox_obj_draw_3g_scaled, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ +coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword,\ +s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword,b_color:dword +pushad +locals + p_node dd 0 ;родительский узел +endl + mov edi,[v_obj] + add edi,vox_offs_data + + mov ecx,[k_scale] + mov ebx,[coord_x] + + ;тестовая рамка + mov eax,[h_br] + + movzx edx,byte[eax] + movzx esi,byte[eax+1] + cmp ecx,1 + jl .end_c0 + shl edx,cl + shl esi,cl + .end_c0: + ;stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color] + + ;вертикальная полоса + add ebx,edx + shr edx,cl + stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color] + mov ecx,[s_k_scale] + shr esi,cl + xor eax,eax + inc eax + shl eax,cl + dec eax + sub eax,[s_c_z] ;значения по оси z возрастают с низу вверх + imul eax,esi + add eax,[coord_y] + stdcall buf_filled_rect_by_size, [buf_i], ebx,eax,edx,esi, [b_color] + mov ebx,[coord_y] + shl esi,cl + add ebx,esi + stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale] + shr eax,1 + mov esi,[h_br] + movzx esi,byte[esi+1] + ;ползунок + stdcall draw_polz_hor, [buf_i], [coord_x],ebx,eax,esi, [s_c_x], [s_k_scale], [b_color] + mov edx,[coord_x] + add edx,eax + ;ползунок + stdcall draw_polz_hor, [buf_i], edx,ebx,eax,esi, [s_c_y], [s_k_scale], [b_color] +;--- + + mov esi,[s_k_scale] + cmp esi,1 + jl .end_2 + + ; *** (1) *** + .found: + stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi + movzx bx,byte[edi+3] + mov [p_node],edi + add edi,4 + cmp eax,0 + je .end_1 + mov ecx,eax + cld + @@: ;цикл для пропуска предыдущих поддеревьев в узле + bt bx,0 ;проверяем есть ли дочерние узлы + jnc .end_0 + xor eax,eax + stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви + .end_0: + shr bx,1 + loop @b + .end_1: + bt bx,0 + jnc .end_2 ;если поддерева не существует + dec esi + cmp esi,0 + jg .found + + ; *** (2) *** + ;рисование части объекта + mov ecx,[k_scale] + mov ebx,[coord_x] + mov edx,[coord_y] + mov esi,[coord_z] + stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] + .end_2: + +popad + ret +endp + +;input: +; h_br - кисть с изображениями вокселей (32 бита) +; ebx - coord_x +; edx - coord_y +; esi - coord_z +; ecx - уровень текушего узла +; edi - указатель на данные воксельного объекта +align 4 +proc vox_go_in_node, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + ;рекурсивный перебор поддеревьев + push eax edx + + ;прорисовка рамки если размер узла = 1 + cmp ecx,0 + jne .end_2 + push eax + stdcall vox_get_sub_brush,[h_br],0 ;определяем кисть для рисования + cmp eax,0 ;если кисть не найдена + je @f + stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi] + @@: + pop eax + .end_2: + + ;вход внутрь узла + dec ecx +;--- + push ebx + ;mov eax,(h-h_osn/2) + mov ebx,[h_br] + movzx eax,byte[ebx+1] + cmp byte[ebx+2],0 + je @f + ;если кисть с 3-мя гранями + movzx ebx,byte[ebx+2] + shr ebx,1 + sub eax,ebx + jmp .end_0 + @@: + ;если кисть с 2-мя гранями + movzx ebx,byte[ebx] + shr ebx,1 + .end_0: + cmp ecx,1 + jl @f + shl eax,cl + shl ebx,cl + @@: + add esi,ebx + pop ebx + add edx,eax ;коректировка высоты под воксель нижнего уровня +;--- + mov ah,byte[edi+3] + add edi,4 + mov al,8 + .cycle: + bt ax,8 ;тестируем только ah + jnc .c_next + push ebx edx esi + stdcall vox_corect_coords, [h_br], [v_obj] + stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] + pop esi edx ebx + .c_next: + shr ah,1 + dec al + jnz .cycle + + ;выход из узла + inc ecx + pop edx eax + + jmp .end_f + .sub_trees: + ;рисуем узел + push eax + stdcall vox_get_sub_brush,[h_br],ecx ;определяем кисть для рисования + cmp eax,0 ;если кисть не найдена + je @f + stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi] + @@: + pop eax + + add edi,4 + .end_f: + ret +endp + +;description: +; функция рисующая одиночный воксел +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; buf_v - буфер с изображением вокселя (32 бита) +; v_color - цвет +align 4 +proc draw_vox, buf_i:dword, buf_z:dword, buf_v:dword,\ +coord_x:dword, coord_y:dword, coord_z:dword, v_color:dword +pushad + mov eax,[coord_x] + mov ebx,[coord_y] + mov edi,[buf_v] + mov ecx,buf2d_h + mov esi,buf2d_w + imul ecx,esi + add esi,eax + mov edx,buf2d_data + cld + ;ecx - count pixels in voxel + ;edx - указатель на данные в воксельном буфере + ;edi - указатель на воксельный буфер + ;esi - width voxel buffer add coord x + .cycle: + cmp dword[edx],0 + je @f + ;проверяем буфер глубины + push eax + stdcall buf_get_pixel, [buf_z],eax,ebx + sub eax,[coord_z] + cmp eax,[edx] + jl .dr_pixel + pop eax + jmp @f + .dr_pixel: + ;рисуем точку + pop eax + stdcall buf_set_pixel, [buf_i],eax,ebx,[v_color] + push ecx + mov ecx,[coord_z] + add ecx,[edx] + stdcall buf_set_pixel, [buf_z],eax,ebx,ecx + pop ecx + @@: + add edx,4 + inc eax + cmp eax,esi + jl @f + inc ebx + sub eax,buf2d_w + @@: + loop .cycle +popad + ret +endp + +;description: +;функция для коректировки координат +;направления осей координат в вокселе: +;*z +;| +;+ +; * y +; / +;+ +; \ +; * x +;input: +; al - номер узла в дереве (от 1 до 8) +; ebx - координата x +; edx - координата y +; esi - координата z +; ecx - уровень текушего узла +;output: +; ebx - новая координата x +; edx - новая координата y +; esi - новая координата z +align 4 +proc vox_corect_coords, h_br:dword, v_obj:dword +locals + osn_w_2 dd ? ;ширина основания единичного вокселя : 2 + vox_h dd ? ;высота единичного вокселя +endl + cmp ecx,0 + jl .end_f ;для ускорения отрисовки + + push eax edi + and eax,15 ;выделяем номер узла в дереве + mov edi,[v_obj] + add edi,vox_offs_tree_table + add edi,8 + sub edi,eax + + push ebx ecx + mov ebx,[h_br] + + movzx ecx,byte[ebx] + shr ecx,1 + mov dword[osn_w_2],ecx + + movzx ecx,byte[ebx+2] + movzx ebx,byte[ebx+1] + sub ebx,ecx + mov dword[vox_h],ebx + shr ecx,1 + mov eax,ecx ;eax - высота основания единичного вокселя : 2 + pop ecx ebx + + cmp ecx,1 + jl @f ;во избежание зацикливания + shl eax,cl + shl dword[osn_w_2],cl + shl dword[vox_h],cl + @@: + +; add esi,eax ;меняем глубину для буфера z (компенсация для координаты y) + bt word[edi],0 ;test voxel coord x + jnc @f + add ebx,[osn_w_2] + cmp eax,0 + jne .end_0 + add esi,[osn_w_2] ;меняем глубину для буфера z + jmp @f + .end_0: + add edx,eax + add esi,eax ;меняем глубину для буфера z + @@: + bt word[edi],1 ;test voxel coord y + jnc @f + add ebx,[osn_w_2] + cmp eax,0 + jne .end_1 + sub esi,[osn_w_2] ;меняем глубину для буфера z + jmp @f + .end_1: + sub edx,eax + sub esi,eax ;меняем глубину для буфера z + @@: + bt word[edi],2 ;test voxel coord z + jnc @f + sub edx,[vox_h] + @@: + pop edi eax + .end_f: + ret +endp + +;извлекаем из h_br указатель на буфер с изображением вокселя, указанного порядка n +align 4 +proc vox_get_sub_brush uses ebx ecx, h_br:dword, n:dword + xor eax,eax + mov ebx,[n] + cmp ebx,0 + jl @f + mov ecx,[h_br] + cmp bl,byte[ecx+3] + jg @f + add ecx,4 + imul ebx,BUF_STRUCT_SIZE + mov eax,ebx + add eax,ecx + @@: + ret +endp + +;description: +; функция рисующая срез воксельного обьекта +;input: +; v_size - размер квадрата с вокселем +; k_scale - степень детализации изображения +; n_plane - номер плоскости сечния (в пределах от 0 до 2^k_scale - 1) +; b_color - цвет границы +align 4 +proc buf_vox_obj_draw_pl, buf_i:dword, v_obj:dword, coord_x:dword,\ +coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword + cmp [k_scale],0 + jl .end_f +pushad + mov eax,[v_size] + mov ecx,[k_scale] + mov ebx,eax + cmp ecx,1 + jl @f + shl ebx,cl + @@: + ;ebx - полный размер изображения + stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;рамка на рисунок + mov edx,ebx + add ebx,[coord_y] + stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;ползунок, показывающий номер сечения + + ;рисование точек для сетки + push ecx + mov edi,1 + cmp ecx,1 + jl @f + shl edi,cl + @@: + dec edi + cmp edi,1 + jl .end_0 + mov ecx,edi + imul ecx,edi + mov ebx,[coord_x] + mov edx,[coord_y] + add edx,eax + xor esi,esi + cld + @@: + add ebx,eax + inc esi + stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color] + cmp esi,edi + jl .end_1 + ;переход точек на новую строку + xor esi,esi + mov ebx,[coord_x] + add edx,eax + .end_1: + loop @b + .end_0: + pop ecx + + ;eax - размер одного квадрата + ;edi - указатель на рисуемые данные из объекта + mov ebx,[coord_x] + mov edx,[coord_y] + mov edi,[v_obj] + add edi,vox_offs_data + xor esi,esi + push eax + mov eax,1 + shl eax,cl + dec eax + sub eax,[n_plane] + stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],eax +popad + .end_f: + ret +endp + +;description: +; функция рисующая срез части воксельного обьекта +;input: +; s_c_x, s_c_y, s_c_z, s_k_scale - параметры определяющие часть воксельного объекта, которая будет рисоваться +align 4 +proc buf_vox_obj_draw_pl_scaled, buf_i:dword, v_obj:dword, coord_x:dword,\ +coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword,\ +s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword + cmp [k_scale],0 + jl .end_f +pushad +locals + p_node dd 0 ;родительский узел +endl + mov eax,[v_size] + mov ecx,[k_scale] + mov ebx,eax + cmp ecx,1 + jl @f + shl ebx,cl + @@: + ;ebx - полный размер изображения + stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;рамка на рисунок + mov edx,ebx + add ebx,[coord_y] + stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;ползунок, показывающий номер сечения + + ;рисование точек для сетки + push ecx + mov edi,1 + cmp ecx,1 + jl @f + shl edi,cl + @@: + dec edi + cmp edi,1 + jl .end_3 + mov ecx,edi + imul ecx,edi + mov ebx,[coord_x] + mov edx,[coord_y] + add edx,eax + xor esi,esi + cld + @@: + add ebx,eax + inc esi + stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color] + cmp esi,edi + jl .end_4 + ;переход точек на новую строку + xor esi,esi + mov ebx,[coord_x] + add edx,eax + .end_4: + loop @b + .end_3: + pop ecx + + mov esi,[s_k_scale] + cmp esi,1 + jl .end_2 + mov edi,[v_obj] + add edi,vox_offs_data + + ; *** (1) *** + .found: + stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi + movzx bx,byte[edi+3] + mov [p_node],edi + add edi,4 + cmp eax,0 + je .end_1 + mov ecx,eax + cld + @@: ;цикл для пропуска предыдущих поддеревьев в узле + bt bx,0 ;проверяем есть ли дочерние узлы + jnc .end_0 + xor eax,eax + stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви + .end_0: + shr bx,1 + loop @b + .end_1: + bt bx,0 + jnc .end_2 ;если поддерева не существует + dec esi + cmp esi,0 + jg .found + + mov eax,[v_size] + ;eax - размер одного квадрата + ;edi - указатель на рисуемые данные из объекта + mov ecx,[k_scale] + mov ebx,[coord_x] + mov edx,[coord_y] + xor esi,esi + push eax + mov eax,1 + shl eax,cl + dec eax + sub eax,[n_plane] + stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax + + .end_2: +popad + .end_f: + ret +endp + +;description: +; определение позиции узла в дереве (от 0 до 7) +align 4 +proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\ +coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword + mov ecx,[k_scale] + dec ecx + mov eax,[coord_x] + mov ebx,[coord_y] + mov edi,[coord_z] + cmp ecx,1 + jl .end_0 + shr eax,cl + shr ebx,cl + shr edi,cl + .end_0: + and eax,1 + bt ebx,0 + jnc @f + bts eax,1 + @@: + bt edi,0 + jnc @f + bts eax,2 + @@: + + mov edi,[v_obj] + add edi,vox_offs_tree_table + @@: + cmp al,byte[edi] + je @f + inc edi + jmp @b + @@: + sub edi,[v_obj] + sub edi,vox_offs_tree_table + mov eax,edi + + ret +endp + +;input: +; edi - указатель на данные воксельного объекта +;output: +; eax - eax + число узлов в данных вокс. объекта +; edi - указатель на смещенные данные вокс. объекта +align 4 +proc vox_obj_rec0 + inc eax + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + + ;рекурсивный перебор поддеревьев + push ebx ecx + mov bh,byte[edi+3] + add edi,4 + mov bl,8 + .cycle: + bt bx,8 ;тестируем только bh + jnc .c_next + stdcall vox_obj_rec0 + .c_next: + shr bh,1 + dec bl + jnz .cycle + pop ecx ebx + + jmp .end_f + .sub_trees: + add edi,4 + .end_f: + ret +endp + +;description: +; функция рисующая горизонтальную полосу с ползунком +align 4 +proc draw_polz_hor uses eax ebx ecx, buf:dword, coord_x:dword, coord_y:dword,\ +size_x:dword, size_y:dword, pos:dword, k_scale:dword, color:dword + mov ebx,[size_x] + stdcall buf_rect_by_size, [buf], [coord_x],[coord_y],ebx,[size_y], [color] + mov ecx,[k_scale] + shr ebx,cl + mov eax,[pos] + imul eax,ebx + add eax,[coord_x] + stdcall buf_filled_rect_by_size, [buf], eax,[coord_y],ebx,[size_y], [color] + ret +endp + +;input: +; ebx - coord_x +; edx - coord_y +; esi - coord_z +; ecx - уровень текушего узла +; edi - указатель на данные воксельного объекта +align 4 +proc draw_sub_vox_obj_pl, buf_i:dword, v_obj:dword, clip_z:dword,\ +v_size:dword + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + + ;прорисовка рамки если размер узла = 1 + cmp ecx,0 + jne @f + ;проверка глубины esi + ;clip_z=n_plane + stdcall vox_is_clip, [clip_z];,[v_size] + cmp eax,0 + je @f + push ecx + mov ecx,dword[edi] + and ecx,0xffffff + stdcall buf_rect_by_size, [buf_i], ebx,edx, [v_size],[v_size],ecx + pop ecx + @@: + + ;рекурсивный перебор поддеревьев + push edx + ;вход внутрь узла + dec ecx + + mov eax,[v_size] + cmp ecx,1 + jl @f + shl eax,cl + @@: + + add edx,eax ;коректировка высоты под воксель нижнего уровня + + mov ah,byte[edi+3] + add edi,4 + mov al,8 + .cycle: + bt ax,8 ;тестируем только ah + jnc .c_next + push eax ebx edx esi + stdcall vox_corect_coords_pl, [v_obj],[v_size] + stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],[clip_z],[v_size] + pop esi edx ebx eax + .c_next: + shr ah,1 + dec al + jnz .cycle + ;выход из узла + inc ecx + pop edx + jmp .end_f + .sub_trees: + cmp ecx,0 + jl .end_0 ;не рисуем очень маленькие воксели + + ;проверка глубины esi + ;clip_z=n_plane + stdcall vox_is_clip, [clip_z] + cmp eax,0 + je .end_0 + + ;рисуем узел + mov eax,[edi] + and eax,0xffffff + push eax ;цвет узла + + mov eax,[v_size] + cmp ecx,1 + jl @f + ;квадрат больше текущего масштаба + shl eax,cl ;размер узла + stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax + push ebx edx esi + mov esi,eax + inc ebx + inc edx + sub esi,2 + mov eax,[buf_i] + push dword 128 + push dword[eax+16] ;+16 - b_color + stdcall combine_colors_3,[edi] + stdcall buf_rect_by_size, [buf_i], ebx,edx, esi,esi,eax + pop esi edx ebx + jmp .end_0 + @@: + ;квадрат текущего масштаба + stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax + .end_0: + add edi,4 + .end_f: + ret +endp + +;description: +; вспомогательная функция для проверки глубины esi +;input: +; ecx - уровень текушего узла +; esi - coord z +; clip_z - n_plane +;output: +; eax - 0 if no draw, 1 if draw +align 4 +proc vox_is_clip uses ebx edi, clip_z:dword + xor eax,eax + mov ebx,[clip_z] + mov edi,1 + cmp ecx,1 + jl @f + shl edi,cl + @@: + ;edi = 2^ecx + add edi,esi + cmp edi,ebx ;if (esi+2^ecx <= n_plane) no draw + jle @f + inc ebx + cmp esi,ebx ;if (esi >= (n_plane+1)) no draw + jge @f + inc eax + @@: + ret +endp + +;функция для коректировки координат +;направления осей координат в вокселе: +;*z +;| +;+-* x +;input: +; al - номер узла в дереве (от 1 до 8) +; ebx - координата x +; edx - координата y +; esi - координата z +; ecx - уровень текушего узла +;output: +; ebx - новая координата x +; edx - новая координата y +; esi - новая координата z +align 4 +proc vox_corect_coords_pl, v_obj:dword, v_size:dword + cmp ecx,0 + jl .end_f ;для ускорения отрисовки + + push eax edi + and eax,15 ;выделяем номер узла в дереве + mov edi,[v_obj] + add edi,vox_offs_tree_table + add edi,8 + sub edi,eax + + mov eax,[v_size] + cmp ecx,1 + jl @f + shl eax,cl + @@: + + bt word[edi],0 ;test voxel coord x + jnc @f + add ebx,eax + @@: + bt word[edi],2 ;test voxel coord z + jnc @f + sub edx,eax + @@: + bt word[edi],1 ;test voxel coord y + jc @f + mov eax,1 + cmp ecx,1 + jl .end_0 + shl eax,cl + .end_0: + add esi,eax ;меняем глубину для буфера z + @@: + pop edi eax + .end_f: + ret +endp + +;description: +; функция рисующая тени +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; h_br - кисть с изображениями вокселей (32 бита) +; k_scale - коэф. для масштабирования изображения +align 4 +proc buf_vox_obj_draw_3g_shadows, buf_i:dword, buf_z:dword, h_br:dword, \ +coord_x:dword, coord_y:dword, color:dword, k_scale:dword, prop:dword +locals + correct_z dd 0 ;коректировка для буфера глубины +endl +pushad + mov eax,[k_scale] + add eax,[prop] + mov dword[correct_z],8 + sub [correct_z],eax + mov ebx,[coord_x] + ;correct_z = 8-k_scale-prop + + stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale] + mov edx,eax ;edx - ширина изображения + stdcall buf_vox_obj_get_img_h_3g, [h_br],[k_scale] + mov esi,eax + + mov edi,[coord_y] + mov ecx,edx + add edx,ebx ;ширина + отступ слева + imul ecx,esi + cld + .cycle_0: + stdcall buf_get_pixel, [buf_z],ebx,edi + cmp eax,0 + je @f + stdcall vox_correct_z, [correct_z] + push eax + stdcall buf_get_pixel, [buf_i],ebx,edi + stdcall combine_colors_3,eax,[color] ;,eax + stdcall buf_set_pixel, [buf_i],ebx,edi,eax + @@: + inc ebx + cmp ebx,edx + jl @f + mov ebx,[coord_x] + inc edi + @@: + loop .cycle_0 + +popad + ret +endp + +;output: +; eax - scaled coord z +align 4 +proc vox_correct_z uses ecx, correct_z:dword + mov ecx,[correct_z] + cmp ecx,0 + je .end_f + jl .end_0 + shl eax,cl + jmp .end_f + .end_0: + neg ecx + inc ecx + shr eax,cl + .end_f: + ret +endp + +;output: +; eax - color +align 4 +proc combine_colors_3 uses ebx ecx edx edi esi, col_0:dword, col_1:dword, alpha:dword + + mov ebx,[col_0] + mov ecx,[col_1] + movzx di,byte[alpha] ;pro + mov si,0x00ff ;---get transparent--- + sub si,di ;256-pro + + ;---blye--- + movzx ax,bl + imul ax,si + movzx dx,cl + imul dx,di + add ax,dx + mov cl,ah + ;---green--- + movzx ax,bh + imul ax,si + movzx dx,ch + imul dx,di + add ax,dx + mov ch,ah + shr ebx,16 + ror ecx,16 + ;---red--- + movzx ax,bl + imul ax,si + movzx dx,cl + imul dx,di + add ax,dx + + shl eax,8 + ror ecx,16 + mov ax,cx + and eax,0xffffff + + ret +endp diff --git a/programs/media/voxel_editor/utilites/vox_creator.asm b/programs/media/voxel_editor/utilites/vox_creator.asm index cf39120f53..1538012a30 100644 --- a/programs/media/voxel_editor/utilites/vox_creator.asm +++ b/programs/media/voxel_editor/utilites/vox_creator.asm @@ -1,16 +1,11 @@ use32 org 0x0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 0x1 - dd start - dd i_end ;размер приложения - dd mem - dd stacktop - dd 0 - dd sys_path + dd 1,start,i_end,mem,stacktop,0,sys_path include '../../../../programs/macros.inc' include '../../../../programs/proc32.inc' +include '../../../../programs/KOSfuncs.inc' include '../../../../programs/develop/libraries/box_lib/load_lib.mac' include '../../../../programs/dll.inc' include '../trunk/str.inc' @@ -21,7 +16,7 @@ txt_buf rb 8 include '../trunk/vox_rotate.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Voxel creator 29.01.15',0 ;подпись окна +caption db 'Voxel creator 08.02.16',0 ;подпись окна struct FileInfoBlock Function dd ? @@ -70,24 +65,22 @@ macro load_image_file path,buf,size { ; db 0 @@: ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0x0 + copy_path .path_str,[32],file_name,0 else - copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой end if stdcall mem.Alloc, dword size ;выделяем память для изображения mov [buf],eax - mov eax,70 ;70-я функция работа с файлами - mov [run_file_70.Function], 0 + mov [run_file_70.Function], SSF_READ_FILE mov [run_file_70.Position], 0 mov [run_file_70.Flags], 0 mov [run_file_70.Count], dword size - m2m [run_file_70.Buffer], [buf] + mov [run_file_70.Buffer], eax mov byte[run_file_70+20], 0 mov [run_file_70.FileName], file_name - mov ebx,run_file_70 - int 0x40 ;загружаем файл изображения + mcall SF_FILE,run_file_70 ;загружаем файл изображения cmp ebx,0xffffffff je @f ;определяем вид изображения и переводим его во временный буфер image_data @@ -109,10 +102,10 @@ start: mov ebp,lib_0 cmp dword [ebp+ll_struc_size-4],0 jz @f - mcall -1 ;exit not correct + mcall SF_TERMINATE_PROCESS @@: - mcall 48,3,sc,sizeof.system_colors - mcall 40,0x27 + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors + mcall SF_SET_EVENTS_MASK,0x27 stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога stdcall [buf2d_create], buf_0 ;создание буфера @@ -126,7 +119,7 @@ start: stdcall mem.Alloc,max_open_file_size mov dword[open_file_img],eax - mcall 26,9 + mcall SF_SYSTEM_GET,SSF_TIME_COUNT mov [last_time],eax align 4 @@ -135,7 +128,7 @@ red_win: align 4 still: - mcall 26,9 + mcall SF_SYSTEM_GET,SSF_TIME_COUNT mov ebx,[last_time] add ebx,10 ;задержка cmp ebx,eax @@ -143,11 +136,7 @@ still: mov ebx,eax @@: sub ebx,eax - ;cmp ebx,10 ;задержка - ;ja timer_funct - ;test ebx,ebx - ;jz timer_funct - mcall 23 + mcall SF_WAIT_EVENT_TIMEOUT cmp eax,0 je timer_funct @@ -166,7 +155,7 @@ timer_funct: je still pushad - mcall 26,9 + mcall SF_SYSTEM_GET,SSF_TIME_COUNT mov [last_time],eax ; скидываем указатели буферов buf_npl_p, buf_npl, buf_npl_n @@ -394,17 +383,16 @@ need_node: align 4 draw_window: pushad - mcall 12,1 + mcall SF_REDRAW,SSF_BEGIN_DRAW ; *** рисование главного окна (выполняется 1 раз при запуске) *** - xor eax,eax mov edx,[sc.work] or edx,(3 shl 24)+0x30000000 - mcall ,(20 shl 16)+410,(20 shl 16)+520,,,caption + mcall SF_CREATE_WINDOW,(20 shl 16)+410,(20 shl 16)+520,,,caption ; *** создание кнопок на панель *** mov esi,[sc.work_button] - mcall 8,(5 shl 16)+20,(5 shl 16)+20,3 + mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3 mov ebx,(30 shl 16)+20 mov edx,4 @@ -444,7 +432,7 @@ pushad ; *** рисование иконок на кнопках *** mov edx,(7 shl 16)+7 ;icon new - mcall 7,[image_data_toolbar],(16 shl 16)+16 + mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16 add ebx,IMAGE_TOOLBAR_ICON_SIZE add edx,(25 shl 16) ;icon open @@ -478,7 +466,7 @@ pushad call draw_buffers call draw_pok - mcall 12,2 + mcall SF_REDRAW,SSF_END_DRAW popad ret @@ -513,19 +501,19 @@ draw_pok: mov ecx,[sc.work_text] or ecx,0x80000000 or (1 shl 30) mov edi,[sc.work] ;цвет фона окна - mcall 4,(275 shl 16)+7,,txt_f_size + mcall SF_DRAW_TEXT,(275 shl 16)+7,,txt_f_size ret align 4 key: - mcall 2 + mcall SF_GET_KEY jmp still align 4 button: - mcall 17 + mcall SF_GET_BUTTON cmp ah,3 jne @f call but_new_file @@ -581,7 +569,7 @@ button: stdcall mem.Free,[image_data_toolbar] stdcall mem.Free,[open_file_vox] stdcall mem.Free,[open_file_img] - mcall -1 + mcall SF_TERMINATE_PROCESS align 4 @@ -641,7 +629,7 @@ but_open_file: cmp bx,28 ;28=0+1+2+...+7 jne .err_open - mcall 71,1,openfile_path + mcall SF_SET_CAPTION,1,openfile_path stdcall buf2d_vox_obj_get_size,[open_file_vox] mov [vox_obj_size],eax call draw_object @@ -1108,11 +1096,11 @@ proc but_run uses eax ebx edi, mode_add:dword jmp .end_0 @@: ; *** изменяем размеры буферов - stdcall [buf2d_resize], edi, eax,eax + stdcall [buf2d_resize], edi, eax,eax,1 mov edi,buf_npl_p - stdcall [buf2d_resize], edi, eax,eax + stdcall [buf2d_resize], edi, eax,eax,1 mov edi,buf_npl_n - stdcall [buf2d_resize], edi, eax,eax + stdcall [buf2d_resize], edi, eax,eax,1 .end_0: mov dword[n_plane],1 mov byte[calc],1 @@ -1205,7 +1193,7 @@ proc open_image_in_buf, buf:dword @@: mov ebx,dword[eax+4] mov ecx,dword[eax+8] - stdcall [buf2d_resize], edi, ebx,ecx ;изменяем размеры буфера + stdcall [buf2d_resize], edi, ebx,ecx,1 ;изменяем размеры буфера imul ecx,ebx lea ecx,[ecx+ecx*2] mov edi,buf2d_data