home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* FLOODITA.PAS *)
- (* Iterativer Floodfill mit stackartiger Bufferstruktur *)
- (* um Ausgangspunkte zwischenzuspeichern. *)
-
- PROCEDURE Fill (xs: x_Koord; ys: y_Koord; SperrFarbe: Sys_Colors);
-
- CONST
- StackSize = 100; (* Groesse d."Stack" fuer noch zu untersuchende Punkte *)
-
- VAR
- Stack: ARRAY [0..StackSize] OF PolyPunkt;
- x: x_Koord;
- y: y_Koord;
- StackPointer: INTEGER;
- oben_frei, vorher_oben_frei, (* Flags: in welche Richtung muss*)
- unten_frei, vorher_unten_frei: BOOLEAN; (* noch geguckt werden. *)
-
- BEGIN
- StackPointer := 0; x := xs; y := ys;
- REPEAT
- (* Suche linken Rand *)
- WHILE (NOT GetPixel(x, y, SperrFarbe)) AND (x >= 0) DO x := Pred(x);
- x := Succ(x);
- oben_frei := FALSE; unten_frei := FALSE;
- WHILE (x <= ScreenXmax) AND (NOT GetPixel(x, y, SperrFarbe)) DO
- BEGIN (* Zeichne Linie nach rechts *)
- vorher_oben_frei := oben_frei; (* Schaue nach oben *)
- oben_frei := NOT GetPixel(x, Pred(y), SperrFarbe);
- IF NOT vorher_oben_frei AND oben_frei THEN
- (* Uebergang Sperrfarbe -> Hintergrund *)
- (* Punkt im Buffer merken *)
- IF (StackPointer <= StackSize) AND (y > 0) THEN
- BEGIN
- Stack[StackPointer].x := x;
- Stack[StackPointer].y := Pred(y);
- StackPointer := Succ(StackPointer)
- END;
- vorher_unten_frei := unten_frei; (* Schaue nach unten *)
- unten_frei := NOT GetPixel(x, Succ(y), SperrFarbe);
- IF NOT vorher_unten_frei AND unten_frei THEN
- (* Uebergang Sperrfarbe -> Hintergrund *)
- (* Punkt im Buffer merken *)
- IF (StackPointer <= StackSize) AND (y < ScreenYmax) THEN
- BEGIN
- Stack[StackPointer].x := x;
- Stack[StackPointer].y := Succ(y);
- StackPointer := Succ(StackPointer)
- END;
- point(x,y); (* Setze den Punkt und gehe nach rechts *)
- x := Succ(x);
- END; (* von zeichne Linie nach rechts *)
- StackPointer := Pred(StackPointer);
- IF StackPointer >= 0 THEN BEGIN
- x := Stack[StackPointer].x;
- y := Stack[StackPointer].y
- END
- UNTIL StackPointer < 0 (* bis der Buffer leer ist *)
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Ende FLOODITA.PAS *)