home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / sonderh1 / floodita.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-04-15  |  2.8 KB  |  62 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                          FLOODITA.PAS                                   *)
  3. (*        Iterativer Floodfill mit stackartiger Bufferstruktur             *)
  4. (*               um Ausgangspunkte zwischenzuspeichern.                    *)
  5.  
  6. PROCEDURE Fill (xs: x_Koord; ys: y_Koord; SperrFarbe: Sys_Colors);
  7.  
  8. CONST
  9.   StackSize = 100;  (* Groesse d."Stack" fuer noch zu untersuchende Punkte *)
  10.  
  11. VAR
  12.   Stack: ARRAY [0..StackSize] OF PolyPunkt;
  13.   x: x_Koord;
  14.   y: y_Koord;
  15.   StackPointer: INTEGER;
  16.   oben_frei, vorher_oben_frei,            (* Flags: in welche Richtung muss*)
  17.   unten_frei, vorher_unten_frei: BOOLEAN; (* noch geguckt werden.          *)
  18.  
  19. BEGIN
  20.   StackPointer := 0;  x := xs;  y := ys;
  21.   REPEAT
  22.                                                       (* Suche linken Rand *)
  23.     WHILE (NOT GetPixel(x, y, SperrFarbe)) AND (x >= 0) DO x := Pred(x);
  24.     x := Succ(x);
  25.     oben_frei := FALSE;  unten_frei := FALSE;
  26.     WHILE (x <= ScreenXmax) AND  (NOT GetPixel(x, y, SperrFarbe)) DO
  27.     BEGIN                                     (* Zeichne Linie nach rechts *)
  28.       vorher_oben_frei := oben_frei;                   (* Schaue nach oben *)
  29.       oben_frei := NOT GetPixel(x, Pred(y), SperrFarbe);
  30.       IF NOT vorher_oben_frei AND oben_frei THEN
  31.                                     (* Uebergang Sperrfarbe -> Hintergrund *)
  32.                                     (* Punkt im Buffer merken              *)
  33.         IF (StackPointer <= StackSize) AND (y > 0) THEN
  34.         BEGIN
  35.            Stack[StackPointer].x := x;
  36.            Stack[StackPointer].y := Pred(y);
  37.            StackPointer := Succ(StackPointer)
  38.          END;
  39.       vorher_unten_frei := unten_frei;                (* Schaue nach unten *)
  40.       unten_frei := NOT GetPixel(x, Succ(y), SperrFarbe);
  41.       IF NOT vorher_unten_frei AND unten_frei THEN
  42.                                     (* Uebergang Sperrfarbe -> Hintergrund *)
  43.                                     (* Punkt im Buffer merken              *)
  44.         IF (StackPointer <= StackSize) AND (y < ScreenYmax) THEN
  45.         BEGIN
  46.           Stack[StackPointer].x := x;
  47.           Stack[StackPointer].y := Succ(y);
  48.           StackPointer := Succ(StackPointer)
  49.         END;
  50.       point(x,y);                  (* Setze den Punkt und gehe nach rechts *)
  51.       x := Succ(x);
  52.     END;                                  (* von zeichne Linie nach rechts *)
  53.     StackPointer := Pred(StackPointer);
  54.     IF StackPointer >= 0 THEN BEGIN
  55.       x := Stack[StackPointer].x;
  56.       y := Stack[StackPointer].y
  57.     END
  58.   UNTIL StackPointer < 0                        (* bis der Buffer leer ist *)
  59. END;
  60.  
  61. (*-------------------------------------------------------------------------*)
  62. (*                        Ende FLOODITA.PAS                                *)