(* 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;