home *** CD-ROM | disk | FTP | other *** search
- {
- > 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.
- }