Code archives/Graphics/Fast Flood Fill (ProPixel Code)
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| As I missed the entry for flood fill I had to start from scratch, I've run this one against the other flood fill routine and found this way to be faster. Updated: 18-11-02, Now Generically Coded. | |||||
; Fill Routines
; Written By Paul Snart (Snarty)
; Oct 2001
; RCol = RGB Color to Fill with
; Ax = X Start on Image to Fill
; Ay = Y Start on Image to Fill
; Image = Image to fill on
Type Point
Field x
Field y
End Type
Function FloodFill(RCol,ax,ay,Image)
timeit=MilliSecs()
temp=CreateImage(1,1):SetBuffer ImageBuffer(temp)
LockBuffer:WritePixelFast 0,0,RCol
RCol=ReadPixelFast(0,0)
UnlockBuffer:FreeImage Temp
SetBuffer ImageBuffer(Image):LockBuffer
BCol=ReadPixelFast(ax,ay)
ImW=ImageWidth(Image)
ImH=ImageHeight(Image)
If BCol<>RCol
Hlt=-1:Hlb=-1
Hrt=-1:Hrb=-1
Entrys=1
Fp.Point = New Point
Fp\x=ax
Fp\y=ay
Repeat
Fp.Point=First Point
Lx=Fp\x:Rx=Fp\x+1
HitL=False:HitR=False
Hlt=-1:Hlb=-1
Hrt=-1:Hrb=-1
Repeat
If Lx=>0 And HitL=False
CColL=ReadPixelFast(Lx,Fp\y)
If CColL=BCol
WritePixelFast Lx,Fp\y,RCol
If Fp\y>0
CColL=ReadPixelFast(Lx,Fp\y-1)
If CColL=BCol
Hlt=Lx
Else
If Hlt<>-1
y=Fp\y-1
Fp.Point = New Point
Fp\y=y:Fp\x=Hlt
Hlt=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
EndIf
EndIf
If Fp\y<ImH-1
CColL=ReadPixelFast(Lx,Fp\y+1)
If CColL=BCol
Hlb=Lx
Else
If Hlb<>-1
y=Fp\y+1
Fp.Point = New Point
Fp\y=y:Fp\x=Hlb
Hlb=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
EndIf
EndIf
Lx=Lx-1
Else
HitL=True
If Hlt<>-1
y=Fp\y-1
Fp.Point = New Point
Fp\y=y:Fp\x=Hlt
Hlt=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
If Hlb<>-1
y=Fp\y+1
Fp.Point = New Point
Fp\y=y:Fp\x=Hlb
Hlb=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
EndIf
Else
HitL=True
If Hlt<>-1
y=Fp\y-1
Fp.Point = New Point
Fp\y=y:Fp\x=Hlt
Hlt=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
If Hlb<>-1
y=Fp\y+1
Fp.Point = New Point
Fp\y=y:Fp\x=Hlb
Hlb=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
EndIf
If Rx<=ImW-1 And HitR=False
CColR=ReadPixelFast(Rx,Fp\y)
If CColR=BCol
WritePixelFast Rx,Fp\y,RCol
If Fp\y>0
CColR=ReadPixelFast(Rx,Fp\y-1)
If CColR=BCol
Hrt=Rx
Else
If Hrt<>-1
y=Fp\y-1
Fp.Point = New Point
Fp\y=y:Fp\x=Hrt
Hrt=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
EndIf
EndIf
If Fp\y<ImH-1
CColR=ReadPixelFast(Rx,Fp\y+1)
If CColR=BCol
Hrb=Rx
Else
If Hrb<>-1
y=Fp\y+1
Fp.Point = New Point
Fp\y=y:Fp\x=Hrb
Hrb=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
EndIf
EndIf
Rx=Rx+1
Else
HitR=True
If Hrt<>-1
y=Fp\y-1
Fp.Point = New Point
Fp\y=y:Fp\x=Hrt
Hrt=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
If Hrb<>-1
y=Fp\y+1
Fp.Point = New Point
Fp\y=y:Fp\x=Hrb
Hrb=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
EndIf
Else
HitR=True
If Hrt<>-1
y=Fp\y-1
Fp.Point = New Point
Fp\y=y:Fp\x=Hrt
Hrt=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
If Hrb<>-1
y=Fp\y+1
Fp.Point = New Point
Fp\y=y:Fp\x=Hrb
Hrb=-1
Fp.Point = First Point
Entrys=Entrys+1
EndIf
EndIf
Until (HitR=True And HitL=True) Or KeyHit(1)
Fp.Point=First Point
Delete Fp
Entrys=Entrys-1
Until Entrys=False Or KeyHit(1)
EndIf
UnlockBuffer
SetBuffer BackBuffer()
mhit=False
DebugLog (Float(MilliSecs()-TimeIt)/1000)+" seconds"
End Function |
Comments
None.
Code Archives Forum