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