Files
kolibrios/programs/media/animage/graphlib.inc
Andrew 7e63294b5e Post-SVN clean up (#244)
- Move source code from `trunk` into program root directory.
- Fix build and ASM files.
- Translated a few RU comments to en_US.
- Note: Line endings standardised from `CRLF` > `LF`, so best to view diffs with whitespace changes hidden.

(Work towards #75, point 3)

Reviewed-on: KolibriOS/kolibrios#244
Reviewed-by: Gleb Zaharov <risdeveau@codrs.ru>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: Andrew <dent.ace@gmail.com>
Co-committed-by: Andrew <dent.ace@gmail.com>
2025-05-20 17:36:10 +02:00

960 lines
18 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; mov [pointer_to_screen],eax
; mov [output_array],ebx
; mov [screen_size_x],ecx
;setpixel (pixel_x,pixel_y)
setpixel:
mov ecx,[output_array]
mov eax,[pixel_y]
mov ebx,[screen_size_x]
imul eax,ebx
add eax,[pixel_x]
lea eax,[eax+eax*2]
add eax,[pointer_to_screen]
mov [ecx],eax
add [output_array],4
ret
; procedure <<<<<<PutPixel>>>>>>
; IN
; eax - pointer to picture
; ebx - picture size x
; ecx - color of pixel
; esi - x coordinat of pixel
; edi - y coordinat of pixel
; OUT
; not returned value
PutPixel:
imul ebx,edi
add ebx,esi
lea ebx,[ebx+ebx*2]
add eax,ebx
mov ebx,ecx
shr ebx,16
mov [eax],cx
mov [eax+2],bl
ret
; function <<<<<<GetColorOfPixel>>>>>>
; IN
; eax - pointer to picture
; ebx - picture size x
; esi - x coordinat of pixel
; edi - y coordinat of pixel
; OUT
; eax - color of pixel in coordinats (x,y)
GetColorOfPixel:
cmp esi,ebx
jb @f
xor eax,eax
dec eax
ret
@@:
imul ebx,edi
add ebx,esi
lea ebx,[ebx+ebx*2]
mov eax,[eax+ebx]
and eax,0xffffff
ret
;procedure <<<<calculate line>>>>
; IN
;eax - pointer to screen
;ebx - output array
;ecx - (screen size x)*bytes per pixel
;edx - x1*65536+y1
;esi x2
;edi - y2
; OUT
;eax - number of pixels
calculate_line:
mov [pointer_to_screen],eax
mov [output_array],ebx
mov [screen_size_x],ecx
mov eax,edx
and eax,0xffff
shr edx,16
mov [x_l],edx ;x=x1
mov [y_l],eax ;y=y1
mov [sx],1
mov [sy],1
mov edx,[output_array]
sub esi,[x_l] ;esi=x2-x1
jnz no_0_x
and esi,0
jmp x_no_minus
no_0_x:
jns x_no_minus
neg esi
mov [sx],-1 ;sx=-sx
x_no_minus:
sub edi,[y_l] ;edi=y2-y1
jnz no_0_y
and edi,0
jmp y_no_minus
no_0_y:
jns y_no_minus
neg edi
mov [sy],-1 ;sy=-sy
y_no_minus:
mov [_dx],esi
mov [_dy],edi
cmp [_dx],0 ;if (dx=0 & dy=0) { }
jnz no_null_d
cmp [_dy],0
jnz no_null_d
mov eax,[x_l]
mov ebx,[y_l]
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel ;setpixel(x1,y1)
mov eax,1
ret
no_null_d:
cmp edi,esi ;if (dy>dx) { }
jle no_bigger
mov eax,[_dx]
mov [z],eax ;z=dx
mov eax,[_dy]
mov [_dx],eax ;dx=dy
mov eax,[z]
mov [_dy],eax ;dy=z
mov [_ch],dword 1 ;ch=true
jmp exit_if2
no_bigger: ;else {}
and [_ch],0
exit_if2:
mov eax,[_dy]
shl eax,1
sub eax,[_dx]
mov [e],eax ;e=2*dy-dx
mov esi,1 ;counter
mov edi,[sx]
mov ebp,[sy]
do:
mov eax,[x_l]
mov ebx,[y_l]
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
cmp [e],0
js while_e
mov eax,[_ch]
test eax,eax
jz ch_else
add [x_l],edi
jmp exit_if3
ch_else:
add [y_l],ebp
exit_if3:
mov eax,[_dx]
shl eax,1
sub [e],eax ;e=e-2*dx
while_e:
mov eax,[_ch]
test eax,eax
jz ch_else2
add [y_l],ebp
jmp exit_if4
ch_else2:
add [x_l],edi
exit_if4:
mov eax,[_dy]
shl eax,1
add [e],eax ;e=e+2*dy
inc esi
mov ecx,[_dx]
cmp esi,ecx
jle do ;while (i<=dx)
mov eax,[x_l]
mov ebx,[y_l]
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[output_array]
sub eax,edx
shr eax,2
ret
;---------------------------
;procedure calculate <<<<<rectangle>>>>>>>
; IN
;eax - pointer to screen
;ebx - output array
;ecx - (screen size x)
;edx - x1*65536+y1
;esi x2
;edi - y2
; OUT
;eax - number of pixels
calculate_rectangle:
mov [pointer_to_screen],eax
mov [output_array],ebx
mov [screen_size_x],ecx
mov eax,edx
and eax,0xffff
shr edx,16
mov [x_l],edx ;x=x1
mov [y_l],eax ;y=y1
mov [x2],esi ;x2
mov [y2],edi ;y2
mov [sx],1
mov [sy],1
mov edx,[output_array]
sub esi,[x_l] ;esi=x2-x1
jnz no_0_x_r
and esi,0
jmp x_no_minus_r
no_0_x_r:
jns x_no_minus_r
neg esi
mov [sx],-1 ;sx=-sx
x_no_minus_r:
sub edi,[y_l] ;edi=y2-y1
jnz no_0_y_r
and edi,0
jmp y_no_minus_r
no_0_y_r:
jns y_no_minus_r
neg edi
mov [sy],-1 ;sy=-sy
y_no_minus_r:
mov [_dx],esi
mov [_dy],edi
cmp [_dx],0 ;if (dx=0 & dy=0) { }
jnz no_null_r
cmp [_dy],0
jnz no_null_r
mov eax,[x_l]
mov ebx,[y_l]
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel ;setpixel(x1,y1)
mov eax,1
ret
no_null_r:
mov edi,[_dx]
mov esi,[x_l] ;x1
horizontal_lines:
mov eax,esi ;x
mov ebx,[y_l] ;y1
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,esi ;x
mov ebx,[y2] ;y2
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
add esi,[sx]
dec edi
jns horizontal_lines
mov edi,[_dy]
mov esi,[y_l] ;y1
vertical_lines:
mov eax,[x_l] ;x1
mov ebx,esi ;y
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[x2] ;x2
mov ebx,esi ;y
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
add esi,[sy]
dec edi
jns vertical_lines
mov eax,[output_array]
sub eax,edx
shr eax,2
ret
;procedure <<<<<<calculate_circle>>>>>>
; IN
;eax - pointer to screen
;ebx - output array
;ecx - (screen size x)*bytes per pixel
;edx - x_c*65536+y_c
;esi r
; OUT
;eax - number of pixels
calculate_circle:
mov [pointer_to_screen],eax
mov [output_array],ebx
mov [screen_size_x],ecx
mov eax,edx
and eax,0xffff
shr edx,16
mov [x2],edx ;circle centr x
mov [y2],eax ;circle centr y
mov [r],esi ;radius of cicrle
mov edx,[output_array]
mov [x_l],0 ;x=0
mov [y_l],esi ;y=r
mov [d],3
mov eax,[r]
shl eax,1
sub [d],eax ;d=3-2*r
while_circle:
mov esi,[y_l]
mov edi,[x_l]
sub esi,edi ;while y>=x
js exit_while_circle
mov eax,[x_l] ;x
mov ebx,[y_l] ;y
add eax,[x2] ;x+xc
add ebx,[y2] ;y+yc
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[x_l] ;x
mov ebx,[y2] ;yc
add eax,[x2] ;x+xc
sub ebx,[y_l] ;yc-y
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[x2] ;xc
mov ebx,[y2] ;yc
sub eax,[x_l] ;xc-x
add ebx,[y_l] ;yc+y
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[x2] ;xc
mov ebx,[y2] ;yc
sub eax,[x_l] ;xc-x
sub ebx,[y_l] ;yc-y
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[x2] ;xc
mov ebx,[y2] ;yc
add eax,[y_l] ;xc+y
add ebx,[x_l] ;yc+x
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[x2] ;xc
mov ebx,[y2] ;yc
add eax,[y_l] ;xc+y
sub ebx,[x_l] ;yc-x
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[x2] ;xc
mov ebx,[y2] ;yc
sub eax,[y_l] ;xc-y
add ebx,[x_l] ;x+yc
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[x2] ;xc
mov ebx,[y2] ;yc
sub eax,[y_l] ;xc-y
sub ebx,[x_l] ;yc-x
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
cmp [d],0
jns if1_d
mov eax,[x_l]
shl eax,2
add eax,6
add [d],eax ;d=d+4*x+6
jmp exit_if1_d
if1_d:
mov eax,[x_l]
sub eax,[y_l]
shl eax,2
add eax,10
add [d],eax ;d=d+4*(x-y)+10
dec [y_l]
exit_if1_d:
inc [x_l]
jmp while_circle
exit_while_circle:
mov eax,[output_array]
sub eax,edx
shr eax,2
ret
;procedure <<<<<<flood fill>>>>>
;IN
;eax - pointer to screen
;ebx - pointer to output array
;ecx - picture size x
;edx - x0*65536+y0
;esi - x_max*65536+y_max
;edi - color of flood fill arrea
flood_fill:
mov [pointer_to_screen],eax
mov [output_array],ebx
mov [screen_size_x],ecx
mov eax,edx
and edx,0xffff
shr eax,16
mov [sx],eax ;x0
mov [sy],edx ;y0
mov eax,esi
and esi,0xffff
shr eax,16
mov [m_x],eax ;maximum x size of picture
mov [m_y],esi ;maximum y size of picture
mov [c_f],edi ;color of feel
mov eax,[output_array] ; stek
mov [eax],dword 1 ; number of pointes in stek
mov esi,[sx]
mov edi,[sy]
mov [eax+4],si ;x0
mov [eax+4+2],di ;y0
mov eax,[pointer_to_screen]
mov ebx,[screen_size_x]
call GetColorOfPixel
mov [c],eax
cmp eax,[c_f]
jne can_flood_fill
mov eax,[output_array]
mov [eax],dword 0
ret
can_flood_fill:
while_no_null:
;¨§¢«¥ª ¥¬ ª®®à¤¨­ âë ¨§ á⥪ 
mov eax,[output_array]
mov ebx,[eax]
dec ebx
shl ebx,2 ;ebx=ebx*8
add ebx,4 ;ebx=ebx*8+4
xor esi,esi
xor edi,edi
mov si,[eax+ebx] ;x
mov di,[eax+ebx+2] ;y
mov [x2],esi
mov [y2],edi
mov [sy],edi
mov eax,[output_array]
mov ebx,[eax]
dec ebx
mov [eax],ebx ;
; go to right until color=c or until x<MaxXPicture
mov edx,[x2]
go_to_right:
mov eax,[pointer_to_screen]
mov ebx,[screen_size_x]
mov esi,edx;
mov edi,[sy]
call GetColorOfPixel
cmp eax,[c]
jne not_color_of_feeling_arrea_right
mov eax,[pointer_to_screen]
mov ebx,[screen_size_x]
mov ecx,[c_f] ;color of filinf flood
mov esi,edx
mov edi,[sy]
call PutPixel
inc edx
mov eax,edx
cmp eax,[m_x]
jle go_to_right
not_color_of_feeling_arrea_right:
mov eax,edx
dec eax ;----------------------------------
mov [x_r],eax ; save right absciss
; go to left until color=c or until x>0
mov esi,[x2]
mov edi,[y2]
dec esi
mov edx,esi
mov [sy],edi
go_to_left:
mov eax,[pointer_to_screen]
mov ebx,[screen_size_x]
mov esi,edx
mov edi,[sy]
call GetColorOfPixel
cmp eax,[c]
jne not_color_of_feeling_arrea_left
mov eax,[pointer_to_screen]
mov ebx,[screen_size_x]
mov ecx,[c_f] ;color of filing flood
mov esi,edx
mov edi,[sy]
call PutPixel
dec edx
jns go_to_left
not_color_of_feeling_arrea_left:
mov eax,edx
inc eax ;----------------------------------------
mov [x_l],eax ; save left absciss
mov edi,[y2]
dec edi
jns no_null_1_floodfill
mov edi,1
no_null_1_floodfill:
mov [sy],edi
mov eax,[output_array]
mov ebx,[eax]
mov [l_s],ebx ; save total number of points in stek
mov [l_c],-1 ; last color = -1
mov edx,[x_l]
analizing_from_left_to_right_upper:
; ­ «¨§¨à㥬 ¯¨ªá¥«¨ ­ ¤ «¨­¨¥© á «¥¢®£® ªà ï
mov eax,[pointer_to_screen]
mov ebx,[screen_size_x]
mov esi,edx
mov edi,[sy]
call GetColorOfPixel
push eax
cmp eax,[c] ;¥á«¨ 梥⠯஢¥àאַ£® ¯¨ªá¥«ï ­¥ à ¢¥­ á, â® ­¥ § ­®á¨¬ ¥£® ¢ á⥪
jne no_fill_1
mov ebx,[l_c]
cmp ebx,[c]
jne no_fill_1
mov edi,[sy]
mov eax,[output_array]
mov ebx,[eax]
inc ebx
mov [eax],ebx
dec ebx
shl ebx,2
add ebx,4
mov esi,edx
dec esi
mov [eax+ebx],si
mov [eax+ebx+2],di
no_fill_1:
pop [l_c]
inc edx
cmp edx,[x_r]
jle analizing_from_left_to_right_upper
mov ebx,[l_c]
cmp ebx,[c] ;last color is c(color of filing arrea) ?
jne have_changes_in_stek_1
;save last color in stek
mov edi,[sy]
mov eax,[output_array]
mov ebx,[eax]
inc ebx
mov [eax],ebx
dec ebx
shl ebx,2
add ebx,4
mov esi,edx
dec esi
mov [eax+ebx],si
mov [eax+ebx+2],di
have_changes_in_stek_1:
mov edi,[y2]
inc edi
cmp edi,[m_y]
jle no_max_1_floodfill
mov edi,[m_y]
no_max_1_floodfill:
mov [sy],edi
mov eax,[output_array]
mov ebx,[eax]
mov [l_s],ebx ; save total number of points in stek
mov [l_c],-1 ; last color = -1
mov edx,[x_l]
analizing_from_left_to_right_down:
; ­ «¨§¨à㥬 ¯¨ªá¥«¨ ¯®¤ «¨­¨¥© á «¥¢®£® ªà ï
mov eax,[pointer_to_screen]
mov ebx,[screen_size_x]
mov esi,edx
mov edi,[sy]
call GetColorOfPixel
push eax
cmp eax,[c] ;¥á«¨ 梥⠯஢¥àאַ£® ¯¨ªá¥«ï ­¥ à ¢¥­ á, â® ­¥ § ­®á¨¬ ¥£® ¢ á⥪
je no_fill_3
mov ebx,[l_c]
cmp ebx,[c]
jne no_fill_3
mov edi,[sy]
mov eax,[output_array]
mov ebx,[eax]
inc ebx
mov [eax],ebx
dec ebx
shl ebx,2
add ebx,4
mov esi,edx
dec esi
mov [eax+ebx],si
mov [eax+ebx+2],di
no_fill_3:
pop [l_c]
inc edx
cmp edx,[x_r]
jle analizing_from_left_to_right_down
mov ebx,[l_c]
cmp ebx,[c] ;last color is c(color of filing arrea) ?
jne have_changes_in_stek_2
;save last color in stek
mov edi,[sy]
mov eax,[output_array]
mov ebx,[eax]
inc ebx
mov [eax],ebx
dec ebx
shl ebx,2
add ebx,4
mov esi,edx
dec esi
mov [eax+ebx],si
mov [eax+ebx+2],di
have_changes_in_stek_2:
mov ebx,[output_array] ;while stek have points ¯®ª  ¢ á⥪¥ ¥áâì â®çª¨(ª®®à¤¨­ âë)
mov ecx,[ebx]
test ecx,ecx
jnz while_no_null
ret
; procedure <<<<<<calculate ellips>>>>>>
; IN
; eax - pointer to picture
; ebx - output array
; ecx - picture size x
; edx - x0*65536+y0
; esi - a*65536+b
; edi - color
; OUT
; procedure not return value
calculate_ellips:
mov [pointer_to_screen],eax
mov [output_array],ebx
mov [screen_size_x],ecx
mov [e],ebx
mov eax,edx
and eax,0xffff
shr edx,16
mov [x2],edx ; centr x
mov [y2],eax ; centr y
mov eax,esi
and eax,0xffff ;eax=b
shr esi,16 ;esi=a
mov [a],esi
mov [b],eax
mov [c],edi ;color
mov [row],eax ;b
imul esi,esi ;a*a
imul eax,eax ;b*b
mov [a_square],esi
mov [b_square],eax
and [col],0
shl esi,1
shl eax,1
mov [two_a_square],esi
mov [two_b_square],eax
shl esi,1
shl eax,1
mov [four_a_square],esi
mov [four_b_square],eax
mov eax,[row] ;eax=row
mov ebx,eax
dec ebx ;ebx=(row-1)
imul ebx,eax ;ebx=(row-1)*row
imul ebx,[two_a_square] ;ebx=two_a_square*((row-1)*row)
mov ecx,[a_square] ;ecx=a_square
mov eax,1
sub eax,ecx ;eax=(1-a_square)
imul eax,[two_b_square] ;eax=two_b_square*(1-a_square)
add ebx,[a_square] ;ebx=two_a_square*((row-1)*row)+a_square
add eax,ebx ;eax=two_a_square*((row-1)*row)+a_square+two_b_square*(1-a_square)
mov [d],eax
mov edx,[x2] ;x
mov ebp,[y2] ;y
while_ellips_1:
mov esi,[a_square]
mov edi,[b_square]
imul esi,[row]
imul edi,[col]
cmp esi,edi
jle no_while_ellips_1
mov eax,edx ;x
mov ebx,ebp ;y
add eax,[col] ;x+col
add ebx,[row] ;y+row
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,edx ;x
mov ebx,ebp ;y
add eax,[col] ;x+col
sub ebx,[row] ;y-row
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,edx ;x
mov ebx,ebp ;y
sub eax,[col] ;x-col
add ebx,[row] ;y+row
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,edx ;x
mov ebx,ebp ;y
sub eax,[col] ;x-col
sub ebx,[row] ;y-row
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[d]
cmp eax,0
js lab33 ;>=0
dec [row]
mov ebx,[four_a_square]
mov ecx,[row]
imul ebx,ecx ;ebx=four_a_square*(row)
sub [d],ebx ;d=d-four_a_square*(row)
lab33:
mov eax,[col]
shl eax,1
add eax,3
imul eax,[two_b_square]
add [d],eax ;d=d+two_b_square*(3+(col*2))
inc [col]
jmp while_ellips_1
no_while_ellips_1:
mov eax,[col]
inc eax
imul eax,[col]
imul eax,[two_b_square] ;eax=two_b_square*((col+1)*col)
mov ebx,[row]
sub ebx,2
imul ebx,[row]
inc ebx
imul ebx,[two_a_square] ;ebx=two_a_square*((row-2)*row+1)
mov ecx,1
sub ecx,[two_a_square]
imul ecx,[b_square] ;ecx=(1-two_a_square)*b_square
add eax,ebx
add eax,ecx
mov [d],eax ;two_b_square*(col+1)*col+two_a_square*(row*(row-2)+1)+(1-two_a_square)*b_square
mov edx,[x2] ;x
mov ebp,[y2] ;y
while_ellips_2:
mov esi,[row]
inc esi
test esi,esi
jz no_while_ellips_2
mov eax,edx ;x
mov ebx,ebp ;y
add eax,[col] ;x+col
add ebx,[row] ;y+row
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,edx ;x
mov ebx,ebp ;y
add eax,[col] ;x+col
sub ebx,[row] ;y-row
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,edx ;x
mov ebx,ebp ;y
sub eax,[col] ;x-col
add ebx,[row] ;y+row
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,edx ;x
mov ebx,ebp ;y
sub eax,[col] ;x-col
sub ebx,[row] ;y-row
mov [pixel_x],eax
mov [pixel_y],ebx
call setpixel
mov eax,[d]
cmp eax,0
jns lab34
inc [col]
mov ebx,[col]
imul ebx,[four_b_square]
add [d],ebx ;d=d+four_b_square*col
lab34:
dec [row]
mov ebx,[row]
shl ebx,1
mov eax,3
sub eax,ebx
imul eax,[two_a_square]
add [d],eax ;d=d+two_b_square*(3-(row*2))
jmp while_ellips_2
no_while_ellips_2:
mov eax,[output_array]
sub eax,[e]
shr eax,2
ret
;---------------------------
x_l dd ?
y_l dd ?
x_r dd ?
y_r dd ?
_dx dd ?
_dy dd ?
sx dd ?
sy dd ?
z dd ?
e dd ?
i dd ?
_ch dd ?
x2 dd ?
y2 dd ?
d dd ?
r dd ?
m_x dd ?
m_y dd ?
c dd ?
c_f dd ?
l_c dd ?
l_s dd ?
;---------------------------
pointer_to_screen dd 0
screen_size_x dd 0
output_array dd 0
pixel_x dd 0
pixel_y dd 0
;---------------------------
a dd 0
b dd 0
col dd 0
row dd 0
bnew dd 0
a_square dd 0
b_square dd 0
two_a_square dd 0
two_b_square dd 0
four_a_square dd 0
four_b_square dd 0
;-----------------------------