[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]

    {
    > Does anyone have any code to flood fill an area? I need the code to do
    > both, a fill to a certain border colour, or a fill to ANY
    > colour other then the one the fill started on.
    }

    var fillVal:byte;
    {This routine only called by fill}
    function lineFill(x,y,d,prevXL,prevXR:integer):integer;
     var xl,xr,i:integer;
    begin
     xl:=x;xr:=x;
     repeat dec(xl); until(scrn(xl,y)<>fillVal)or(xl<0); inc(xl);
     repeat inc(xr); until(scrn(xr,y)<>fillVal)or(xr>xMax); dec(xr);
     hLin(xl,xr,y);
     inc(y,d);
     if word(y)<=yMax then
      for x:=xl to xr do
       if(scrn(x,y)=fillVal)then begin
        x:=lineFill(x,y,d,xl,xr);
        if word(x)>xr then break;
        end;
     dec(y,d+d); asm neg d;end;
     if word(y)<=yMax then begin
      for x:=xl to prevXL do
       if(scrn(x,y)=fillVal)then begin
        i:=lineFill(x,y,d,xl,xr);
        if word(x)>prevXL then break;
        end;
      for x:=prevXR to xr do
       if(scrn(x,y)=fillVal)then begin
        i:=lineFill(x,y,d,xl,xr);
        if word(x)>xr then break;
        end;
      end;
     lineFill:=xr;
     end;

    procedure fill(x,y:integer);begin
     fillVal:=scrn(x,y);if fillVal<>color then lineFill(x,y,1,x,x);
     end;

    {
    This one's too recursive for anything really complicated (blows the stack). But
    it works. You'll find that making it do a border fill instead isn't hard at
    all. You'll need to provide your own hLin and scrn routines.

    hLin draws a horizontal line from X,to X2,at Y scrn reads the pixel at X,Y and
    returns its color color is a global byte variable in this incarnation. The fill
    happens in this color.
    }

[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]