DEFINITION MODULE LineDrawing;
TYPE PaintMode=(replace,invert,erase);
VAR Px,Py:INTEGER;
 mode:PaintMode;
 width:INTEGER;
 height:INTEGER;
 CharWidth:INTEGER;
 CharHeight:INTEGER;
PROCEDURE dot(c:CARDINAL;x,y:INTEGER);
PROCEDURE line(d,n:CARDINAL);
PROCEDURE area(c:CARDINAL;x,y,w,h:INTEGER);
PROCEDURE copyArea(sx,sy,dx,dy,dw,dh:INTEGER);
PROCEDURE clear;
PROCEDURE Write(ch:CHAR);
PROCEDURE WriteString(s:ARRAY OF CHAR);
END LineDrawing.
IMPLEMENTATION MODULE LineDrawing;
IMPORT GRAPH0;
FROM GRAPH1 IMPORT QLINE,PLOT,AREA,POINT,SETMODE,SETMASK,SETPOS;
FROM SYMBOL IMPORT SYMBOL1;
VAR m:ARRAY PaintMode OF SHORTCARD;
 
PROCEDURE dot(c:CARDINAL;x,y:INTEGER);
BEGIN
IF c=0 THEN SETMODE(0)
 ELSE SETMODE(m[mode])END;
PLOT(x,y);Px:=x;Py:=y;
END dot;
 
VAR [0BD0EH] GPY,GPX:SHORTCARD;
PROCEDURE line(d,n:CARDINAL);
BEGIN SETMODE(m[mode]);
SETPOS(Px,Py);
QLINE(d,n);
Px:=GPX;Py:=191-GPY;
END line;
 
PROCEDURE area(c:CARDINAL;x,y,w,h:INTEGER);
BEGIN
SETMODE(m[mode]);
CASE c OF
 0:SETMODE(0)|
 1:SETMODE(5);SETMASK(11H)|
 2:SETMODE(5);SETMASK(33H) END;
AREA(x,y,w,h)
END area;
 
PROCEDURE copyArea(sx,sy,dx,dy,dw,dh:INTEGER);
VAR x0,y0,x1,y1,xlim,ylim:INTEGER;
BEGIN SETMODE(1);
xlim:=dx+dw;ylim:=dy+dh;
y0:=sy;y1:=dy;
WHILE y1<=ylim DO
  x0:=sx;x1:=dx;
  WHILE x1<xlim DO
    SETMODE(SHORTCARD(POINT(x0,y0)));
    PLOT(x1,y1);
    INC(x0);INC(x1) END;
  INC(y0);INC(y1) END
END copyArea;
 
PROCEDURE clear;
BEGIN GRAPH0.GCLS
END clear;
 
VAR [3D00H] charset:ARRAY [' '..CHR(7FH)],[0..7] OF CHAR;
PROCEDURE Write(ch:CHAR);
BEGIN
SYMBOL1(Px,Py,charset[ch],1);
INC(Px,8);
IF Px>256 THEN DEC(Px,256);INC(Py,8) END
END Write;

PROCEDURE WriteString(s:ARRAY OF CHAR);
VAR i:CARDINAL;ch:CHAR;
BEGIN
FOR i:=0 TO HIGH(s) DO
  ch:=s[i];IF ch=0I THEN RETURN END;
  Write(ch) END
END WriteString;

BEGIN
m[replace]:=1;
m[invert]:=2;
m[erase]:=0;
mode:=replace;
width:=GRAPH0.width;
height:=GRAPH0.height
END LineDrawing.
