956 lines
18 KiB
PHP
956 lines
18 KiB
PHP
|
; 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:
|
|||
|
|
|||
|
imul ebx,edi
|
|||
|
add ebx,esi
|
|||
|
lea ebx,[ebx+ebx*2]
|
|||
|
add eax,ebx
|
|||
|
mov ebx,[eax]
|
|||
|
and ebx,0xffffff
|
|||
|
mov eax,ebx
|
|||
|
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:
|
|||
|
;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>न<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>⥪<EFBFBD>
|
|||
|
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:
|
|||
|
;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㥬 <EFBFBD><EFBFBD><EFBFBD>ᥫ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
mov eax,[pointer_to_screen]
|
|||
|
mov ebx,[screen_size_x]
|
|||
|
mov esi,edx
|
|||
|
mov edi,[sy]
|
|||
|
call GetColorOfPixel
|
|||
|
push eax
|
|||
|
|
|||
|
cmp eax,[c] ;<EFBFBD> 梥<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>אַ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ᥫ<EFBFBD> <EFBFBD><EFBFBD> ࠢ<EFBFBD><EFBFBD> <EFBFBD>,<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᨬ <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>⥪
|
|||
|
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:
|
|||
|
|
|||
|
;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㥬 <EFBFBD><EFBFBD><EFBFBD>ᥫ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
mov eax,[pointer_to_screen]
|
|||
|
mov ebx,[screen_size_x]
|
|||
|
mov esi,edx
|
|||
|
mov edi,[sy]
|
|||
|
call GetColorOfPixel
|
|||
|
push eax
|
|||
|
|
|||
|
cmp eax,[c] ;<EFBFBD> 梥<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>אַ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ᥫ<EFBFBD> <EFBFBD><EFBFBD> ࠢ<EFBFBD><EFBFBD> <EFBFBD>,<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᨬ <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>⥪
|
|||
|
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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>⥪<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>窨(<EFBFBD><EFBFBD><EFBFBD>न<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
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
|
|||
|
;-----------------------------
|