app/mpg/2.2/src/matrix printer

Raw file
Back to index

(* Version vom 21.10.87 BJ *) 
(* Standardoperationen *) 
(*   printer line - Linienalgorithmus *) 
(*   printer fill - Fuellalgorithmus *) 
 
PROC printer line (INT CONST x1,y1,x2,y2,
                   PROC (INT CONST, INT CONST) p set pixel): 
  INT VAR x,y,z,             
          a,b,d, 
          dx :: abs(x2-x1), 
          dy :: abs(y2-y1), 
          dp,dq; 
  IF dx <> 0 AND dy <> 0 
    THEN IF dy <= dx 
           THEN draw line 1 
           ELSE draw line 2 
         FI 
    ELSE IF dx = 0 AND dy <> 0 
            THEN draw vertical line 
            ELSE draw horizontal line 
         FI 
  FI. 
 
  draw line 1: 
    x := x1;
    y := y1; 
    z := x2; 
    a := sign(x2-x1); 
    b := sign(y2-y1);
    dp := dy * 2; 
    d := dp - dx; 
    dq := dp - 2 * dx; 
    setpoint; 
    WHILE x <> z REP 
      x := x + a;
      IF d < 0 
        THEN d := d + dp 
        ELSE y := y + b; 
             d := d + dq
      FI; 
      setpoint 
    PER. 
 
  draw line 2: 
    x := x1;
    y := y1; 
    z := y2; 
    b := sign(x2-x1); 
    a := sign(y2-y1);
    dp := dx * 2; 
    d := dp - dy; 
    dq := dp - 2 * dy; 
    setpoint; 
    WHILE y <> z REP 
      y := y + a;
      IF d < 0 
        THEN d := d + dp 
        ELSE x := x + b; 
             d := d + dq
      FI; 
      setpoint 
    PER. 

  draw vertical line: 
    a := sign(y2-y1); 
    x := x1; 
    y := y1; 
    z := y2; 
    setpoint; 
    WHILE y <> z REP 
      y := y + a; 
      setpoint 
    PER. 
 
  draw horizontal line: 
    a := sign(x2-x1); 
    x := x1; 
    y := y1; 
    z := x2; 
    setpoint; 
    WHILE x <> z REP 
      x := x + a; 
      setpoint 
    PER. 
 
  setpoint: 
    p set pixel (x,y) 
END PROC printer line; 
 
PROC printer fill (INT CONST xl, xr, y, dir,
                   BOOL PROC (INT CONST, INT CONST) point,
                   PROC (INT CONST, INT CONST) pset):
  INT VAR xl1 :: xl; 
  WHILE point(xl1,y) REP 
    xl1 INCR 1;
    IF xl1 >= xr
      THEN LEAVE printer fill
    FI
  PER;
  INT VAR xrn :: xl1+1, 
          xln :: xl1; 
  WHILE NOT point(xrn,y) REP 
    pset(xrn,y); 
    xrn INCR 1 
  PER;
  WHILE NOT point(xln,y) REP 
    pset(xln,y); 
    xln DECR 1 
  PER; 
  IF xrn > xr 
    THEN printer fill (xr, xrn-1,y-dir,-dir, 
                       BOOL PROC (INT CONST, INT CONST) point,
                       PROC (INT CONST, INT CONST) pset)
    ELSE printer fill (xrn, xr, y, dir, 
                       BOOL PROC (INT CONST, INT CONST) point,
                       PROC (INT CONST, INT CONST) pset)
  FI; 
  IF xln < xl 
    THEN printer fill (xln+1,xl, y-dir,-dir, 
                       BOOL PROC (INT CONST, INT CONST) point,
                       PROC (INT CONST, INT CONST) pset)
    ELSE printer fill (xl,xln, y, dir, 
                       BOOL PROC (INT CONST, INT CONST) point,
                       PROC (INT CONST, INT CONST) pset)
  FI; 
  printer fill(xln+1, xrn-1, y+dir, dir, 
               BOOL PROC (INT CONST, INT CONST) point,
               PROC (INT CONST, INT CONST) pset)
END PROC printer fill;