Erm, I know this is old but where's the rest of the code? :/
Code archives/Graphics/flood fill
This code has not been declared by its author to be Public Domain code, and therefore should not be assumed to be so.
Download source code
| This is my adaption of some qbasic code. Make sure you run the demo with debug enabled. Rem ;read the source for more details. :-) |
; non-recursive flood fill routine ; steven smith.2001 ; Adapted from code by Petter Holmberg. ; Get the original source code from www.basicguru.com/abc/graphics.htm ;********* ;lots of colours Graphics 640,480,32 ; type to hold pixel coords Type point Field x,y End Type ; size of internal stack to hold fill coords. ;Increase this number if you get holes in complex fills. Const fillstack=5000 ;Create a stack of point types Dim pixdata.point(fillstack) For f=0 To fillstack pixdata(f)=New point Next ; Limit the fill routine to screen size. Global fillheight=GraphicsHeight() Global fillwidth=GraphicsWidth() ; ;draw some cicles and fill them with random colours For x=0 To 150 Color Rnd(255),Rnd(255),Rnd(255) Oval Rnd(640),Rnd(480),Rnd(250)+100,Rnd(250)+100,0 Next ;****READ HERE FOR DEBUG DISABLED For f=0 To 1000 mcol=(Rnd(255)*$10000)+Rnd(255)*$100+Rnd(255) floodfill(Rnd(640)+50,Rnd(480)+50,mcol) Flip;rem this out if you have debug disabled If KeyHit(1) Then Exit Next ; WaitKey End ;*************** ; flood fill routine Function floodfill(x,y,col) ;x,y= coords to fill from ;col= colour to fill with LockBuffer FrontBuffer() ;get the background colour bcol=ReadPixelFast(x,y) ;exit if both colours the same.otherwise the function will loop indefinitely. If bcol=col Then Goto endfunc ;clear the coord stack For f=0 To fillstack pixdata(f)\x=0 pixdata(f)\y=0 Next firstentry=0 lastentry=1 Repeat fx=pixdata(firstentry)\x fy=pixdata(firstentry)\y Repeat If ReadPixelFast(x+fx,y+fy)=bcol And x+fx>=0 And x+fx<fillwidth And y+fy>=0 And y+fy<fillheight WritePixelFast x+fx,y+fy,col If ReadPixelFast(x+fx,y+fy-1)=bcol pixdata(lastentry)\x=fx pixdata(lastentry)\y=fy-1 lastentry=lastentry+1 If lastentry=fillstack+1 Then lastentry=0 EndIf If ReadPixelFast(x+fx,y+fy+1)=bcol pixdata(lastentry)\x=fx pixdata(lastentry)\y=fy+1 lastentry=lastentry+1 If lastentry=fillstack+1 Then lastentry=0 EndIf Else Exit EndIf fx=fx+1 Forever fx=pixdata(firstentry)\x-1 fy=pixdata(firstentry)\y Repeat If ReadPixelFast(x+fx,y+fy)=bcol And x+fx>=0 And x+fx<fillwidth And y+fy>=0 And y+fy<fillheight WritePixelFast x+fx,y+fy,col If ReadPixelFast(x+fx,y+fy-1)=bcol pixdata(lastentry)\x=fx pixdata(lastentry)\y=fy-1 lastentry=lastentry+1 If lastentry=fillstack+1 Then lastentry=0 EndIf If ReadPixelFast(x+fx,y+fy+1)=bcol pixdata(lastentry)\x=fx pixdata(lastentry)\y=fy+1 lastentry=lastentry+1 If lastentry=fillstack+1 Then lastentry=0 EndIf Else Exit EndIf fx=fx-1 Forever firstentry=firstentry+1 If firstentry=fillstack+1 Then firstentry=0 Until firstentry=lastentry ; .endfunc UnlockBuffer FrontBuffer() End Function ;********************* |
Comments
Big10p: If you click on the 'download .bb file' link above the main post, you'll get the full source...
Not sure why the visible code in the posting above it truncated.
Not sure why the visible code in the posting above it truncated.
Ah, cheers xlsior. ;)
I get a MAV on a ReadPixelFast