December 04, 2020, 11:16:35 AM

Author Topic: [bb] Fast Flood Fill (ProPixel Code) by Snarty [ 1+ years ago ]  (Read 422 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Fast Flood Fill (ProPixel Code)
Author : Snarty
Posted : 1+ years ago

Description : 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.


Code :
Code: BlitzBasic
  1. ; Fill Routines
  2. ; Written By Paul Snart (Snarty)
  3. ; Oct 2001
  4.  
  5. ; RCol = RGB Color to Fill with
  6. ; Ax = X Start on Image to Fill
  7. ; Ay = Y Start on Image to Fill
  8. ; Image = Image to fill on
  9.  
  10. Type Point
  11.      Field x
  12.      Field y
  13. End Type
  14.  
  15. Function FloodFill(RCol,ax,ay,Image)
  16.  
  17.      timeit=MilliSecs()
  18.      
  19.      temp=CreateImage(1,1):SetBuffer ImageBuffer(temp)
  20.      LockBuffer:WritePixelFast 0,0,RCol
  21.      RCol=ReadPixelFast(0,0)
  22.      UnlockBuffer:FreeImage Temp
  23.      SetBuffer ImageBuffer(Image):LockBuffer
  24.      BCol=ReadPixelFast(ax,ay)
  25.      ImW=ImageWidth(Image)
  26.      ImH=ImageHeight(Image)
  27.      
  28.      If BCol<>RCol
  29.           Hlt=-1:Hlb=-1
  30.           Hrt=-1:Hrb=-1
  31.           Entrys=1
  32.           Fp.Point = New Point
  33.           Fpx=ax
  34.           Fpy=ay
  35.           Repeat
  36.                Fp.Point=First Point
  37.                Lx=Fpx:Rx=Fpx+1
  38.                HitL=False:HitR=False
  39.                Hlt=-1:Hlb=-1
  40.                Hrt=-1:Hrb=-1
  41.                Repeat
  42.                     If Lx=>0 And HitL=False
  43.                          CColL=ReadPixelFast(Lx,Fpy)
  44.                          If CColL=BCol
  45.                               WritePixelFast Lx,Fpy,RCol
  46.                               If Fpy>0
  47.                                    CColL=ReadPixelFast(Lx,Fpy-1)
  48.                                    If CColL=BCol
  49.                                         Hlt=Lx
  50.                                    Else
  51.                                         If Hlt<>-1
  52.                                              y=Fpy-1
  53.                                              Fp.Point = New Point
  54.                                              Fpy=y:Fpx=Hlt
  55.                                              Hlt=-1
  56.                                              Fp.Point = First Point
  57.                                              Entrys=Entrys+1
  58.                                         EndIf
  59.                                    EndIf
  60.                               EndIf
  61.                               If Fpy<ImH-1
  62.                                    CColL=ReadPixelFast(Lx,Fpy+1)
  63.                                    If CColL=BCol
  64.                                         Hlb=Lx
  65.                                    Else
  66.                                         If Hlb<>-1
  67.                                              y=Fpy+1
  68.                                              Fp.Point = New Point
  69.                                              Fpy=y:Fpx=Hlb
  70.                                              Hlb=-1
  71.                                              Fp.Point = First Point
  72.                                              Entrys=Entrys+1
  73.                                         EndIf
  74.                                    EndIf
  75.                               EndIf
  76.                               Lx=Lx-1
  77.                          Else
  78.                               HitL=True
  79.                               If Hlt<>-1
  80.                                    y=Fpy-1
  81.                                    Fp.Point = New Point
  82.                                    Fpy=y:Fpx=Hlt
  83.                                    Hlt=-1
  84.                                    Fp.Point = First Point
  85.                                    Entrys=Entrys+1
  86.                               EndIf
  87.                               If Hlb<>-1
  88.                                    y=Fpy+1
  89.                                    Fp.Point = New Point
  90.                                    Fpy=y:Fpx=Hlb
  91.                                    Hlb=-1
  92.                                    Fp.Point = First Point
  93.                                    Entrys=Entrys+1
  94.                               EndIf
  95.                          EndIf
  96.                     Else
  97.                          HitL=True
  98.                          If Hlt<>-1
  99.                               y=Fpy-1
  100.                               Fp.Point = New Point
  101.                               Fpy=y:Fpx=Hlt
  102.                               Hlt=-1
  103.                               Fp.Point = First Point
  104.                               Entrys=Entrys+1
  105.                          EndIf
  106.                          If Hlb<>-1
  107.                               y=Fpy+1
  108.                               Fp.Point = New Point
  109.                               Fpy=y:Fpx=Hlb
  110.                               Hlb=-1
  111.                               Fp.Point = First Point
  112.                               Entrys=Entrys+1
  113.                          EndIf
  114.                     EndIf
  115.                     If Rx<=ImW-1 And HitR=False
  116.                          CColR=ReadPixelFast(Rx,Fpy)
  117.                          If CColR=BCol
  118.                               WritePixelFast Rx,Fpy,RCol
  119.                               If Fpy>0
  120.                                    CColR=ReadPixelFast(Rx,Fpy-1)
  121.                                    If CColR=BCol
  122.                                         Hrt=Rx
  123.                                    Else
  124.                                         If Hrt<>-1
  125.                                              y=Fpy-1
  126.                                              Fp.Point = New Point
  127.                                              Fpy=y:Fpx=Hrt
  128.                                              Hrt=-1
  129.                                              Fp.Point = First Point
  130.                                              Entrys=Entrys+1
  131.                                         EndIf
  132.                                    EndIf
  133.                               EndIf
  134.                               If Fpy<ImH-1
  135.                                    CColR=ReadPixelFast(Rx,Fpy+1)
  136.                                    If CColR=BCol
  137.                                         Hrb=Rx
  138.                                    Else
  139.                                         If Hrb<>-1
  140.                                              y=Fpy+1
  141.                                              Fp.Point = New Point
  142.                                              Fpy=y:Fpx=Hrb
  143.                                              Hrb=-1
  144.                                              Fp.Point = First Point
  145.                                              Entrys=Entrys+1
  146.                                         EndIf
  147.                                    EndIf
  148.                               EndIf
  149.                               Rx=Rx+1
  150.                          Else
  151.                               HitR=True
  152.                               If Hrt<>-1
  153.                                    y=Fpy-1
  154.                                    Fp.Point = New Point
  155.                                    Fpy=y:Fpx=Hrt
  156.                                    Hrt=-1
  157.                                    Fp.Point = First Point
  158.                                    Entrys=Entrys+1
  159.                               EndIf
  160.                               If Hrb<>-1
  161.                                    y=Fpy+1
  162.                                    Fp.Point = New Point
  163.                                    Fpy=y:Fpx=Hrb
  164.                                    Hrb=-1
  165.                                    Fp.Point = First Point
  166.                                    Entrys=Entrys+1
  167.                               EndIf
  168.                          EndIf
  169.                     Else
  170.                          HitR=True
  171.                          If Hrt<>-1
  172.                               y=Fpy-1
  173.                               Fp.Point = New Point
  174.                               Fpy=y:Fpx=Hrt
  175.                               Hrt=-1
  176.                               Fp.Point = First Point
  177.                               Entrys=Entrys+1
  178.                          EndIf
  179.                          If Hrb<>-1
  180.                               y=Fpy+1
  181.                               Fp.Point = New Point
  182.                               Fpy=y:Fpx=Hrb
  183.                               Hrb=-1
  184.                               Fp.Point = First Point
  185.                               Entrys=Entrys+1
  186.                          EndIf
  187.                     EndIf
  188.                Until (HitR=True And HitL=True) Or KeyHit(1)
  189.                Fp.Point=First Point
  190.                Delete Fp
  191.                Entrys=Entrys-1
  192.           Until Entrys=False Or KeyHit(1)
  193.      EndIf
  194.                
  195.      UnlockBuffer
  196.      SetBuffer BackBuffer()
  197.      mhit=False
  198.      DebugLog (Float(MilliSecs()-TimeIt)/1000)+" seconds"
  199.  
  200. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal