[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]