@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            GRA141
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                              ISSUE 11~
~V9 -1
~P
~V9 1
~YGRA141
~S~M~OGRAPHICS UTILITIES IMPLEMENTATION DESCRIPTION
~S~M~OSection 14 Version 1
~S~OSection 14.1 Graphics Hewlett-Packard Plotter Device Driver.~
~S1~O1. General Description
~BThis module is the graphics device driver for a Hewlett-Packard
plotter.  It consists of a set of procedures for
controlling line drawing and text output on an HP plotter.~
~S1~O2. Interface
~
Procedures~
   HP.INIT~
   HP.TERM~
   HP.NEW.FRAME~
   HP.LINE~
   HP.TEXT~
   HP.MARKER~
   HP.ATTR~
   HP.REPORT~
~
Data Structures~
~S1~O2.1 Hardware Specification
~BThe HP plotter is controlled by a dedicated process set
up by the user. Control commands are issued by the device
driver to this process which in turn passes them onto
the plotter's microprocessor.~
~S1~O2.2 Software Interface
~BThis consists of the following procedures.~
~T% 30
~
~
1) HP.INIT ()~IInitialises the plotter.~
~
2) HP.TERM ()~IResets the plotter.~
~
3) HP.NEW.FRAME ()~ISets up the plotter ready to draw a diagram.~
~
4) HP.LINE (X1, Y1, X2, Y2)~IDraws a line from X1, Y1 to X2, Y2 in the
format preselected by the Graphics library.~
~
5) HP.TEXT (X, Y, STRING,~
             LENGTH)~IGenerates a text string
at X, Y with a preselected format and rotation.~
~
6) HP.MARKER (X, Y, SYMBOL)~IGenerates the specified symbol ay X, Y.~
~
7) HP.ATTR (NO.)~ISets the attribute specified by NO.~
~
8) HP.REPORT (RVEC, IVEC)~ISets up the device capabilities in RVEC
and IVEC.  This procedure is irrelevant to SUBSET. It is only used
by the full CORE.~
~S1~O3 Implementation
~S1~O3.1 Outline of Operation
~S1~O3.2 Data Structures
~
None~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H               GRA141
~V9 -1
~F
@TITLE GRA14(1,10)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
HEWLETT-PACKARD PLOTTER DEVICE DRIVER
@BOX 2.0
DECLARATIONS
@BOX 3.0
@BOX 4.0
PROCEDURES IN MODULE
   HP INIT
   HP TERM
   HP NEW FRAME
   HP LINE
   HP TEXT
   HP MARKER
   HP ATTR
   HP REPORT
   HP MOVE
@BOX 5.0
@BOX 6.0
END
@BOX 1.1
$RE VP.XMIN, VP.YMIN, VP.XMAX, VP.YMAX;
$RE WNDW.XMIN, WNDW.YMIN, WNDW.XMAX, WNDW.YMAX;
$IN32 OLD.OUTPUT.STREAM, LANSP, A4, A4Q, C.CHARPATH;
$RE PLTX,PLTY,NDC.SCALE,NDC.HEIGHT, NDC.WIDTH, CHARSZ.WIDTH, CHARSZ.HEIGHT;
MODULE(HP.INIT,HP.TERM,HP.NEW.FRAME,HP.LINE,
   HP.TEXT,HP.MARKER,HP.ATTR,HP.REPORT);
@BOX 2.1
*GLOBAL 7;
$IN X.MOVE, Y.MOVE;
$IN HP.FILE;
*GLOBAL 0;
@BOX 3.1
@BOX 4.1
$PS HP.INIT();$PS HP.TERM();
$PS HP.NEW.FRAME();
$PS HP.LINE($RE,$RE,$RE,$RE);
$PS HP.TEXT($RE,$RE,$AD[$LO8],$IN);
$PS HP.MARKER($RE,$RE,$LO8);
$PS HP.ATTR($IN);
$PS HP.REPORT($AD[$RE],$AD[$IN32]);
$PS HP.MOVE($RE,$RE);
@BOX 5.1
#GRA14.1
#GRA14.2
#GRA14.3
#GRA14.4
#GRA14.5
#GRA14.6
#GRA14.7
#GRA14.8
#GRA14.9
@BOX 6.1
*END
@END
@TITLE GRA14.1(1,10);
@COL 1S-2R-4R-5F
@FLOW 1-2-4-5
@BOX 1.0
HP INITIALISE ()
@BOX 2.0
INITIALISE OUTPUT STREAMS AND PEN POSITION
@BOX 4.0
INITIALISE DEVICE
@BOX 5.0
END
@BOX 1.1
PROC HP.INIT ;
 $DA INIT.HP.DV ($LO8)
  %1B
 ".N;19:"
  %0A
  %1B
 ".I81;;17:"
  %0A
  END
$RE WT,HT;
@BOX 2.1
0 => X.MOVE => Y.MOVE;
0.0 => PLT.X => PLT.Y;
 0 =>LANSP;
 10150.0 => NDC.SCALE;
@BOX 4.1
OUTCH (%0C);
CAPTION (^INIT.HP.DV);
CAPTION (%"IN");
OUT.CH (';);
CAPTION(%"DI");
OUTI(0,0);OUTCH(',);
OUTI(1,0); OUTCH(';);
CAPTION(%"PA;SP1;");
CAPTION (%"PU;PA0,0;DT");
OUTCH(%D);OUTCH(%0A);OUTCH(';);
IF WNDW.XMAX -WNDW.XMIN > WNDW.YMAX -WNDW.YMIN THEN
   1=> LANSP;
   NDC.HEIGHT =>HT; NDC.WIDTH =>WT;
    CAPTION (%"DI");
   OUTI (1, 0); OUTCH (',);
   OUTI (0,0); OUTCH (';);
FI;
@BOX 5.1
END
@END
@TITLE GRA14.2(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PLT TERMINATE ()
@BOX 2.0
FORCE NEW FRAME AND RESET OUTPUT STREAMS
@BOX 3.0
END
@BOX 1.1
PROC HP.TERM ;
@BOX 2.1
::HP.NEW.FRAME ();
@BOX 3.1
END
@END
@TITLE GRA14.3(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
HP NEW FRAME ()
@BOX 2.0
MOVE PAPER ON TO CLEAR AREA
@BOX 3.0
END
@BOX 1.1
PROC HP.NEW.FRAME;
$DA INIT.HP.DV ($LO8)
 %1B
 ".N;19:"
 %0A
 %1B
 ".I81;;17:"
 %0A
END
@BOX 2.1
0.0=>VP.XMIN =>VP.YMIN;
1.0 =>VP.XMAX =>VP.YMAX;
CAPTION (%"PU;PA0,0;SP;");
OUTCH (%0C);
CAPTION (^INIT.HP.DV);
CAPTION (%"IN"); OUTCH (';);
CAPTION (%"DI");
OUTI(0,0); OUTCH(',);
OUTI(1,0); OUTCH(';);
CAPTION (%"PA;SP1;");
CAPTION (%"PU;PA0,0;DT");
OUTCH(%D); OUTCH(%0A); OUTCH(';);
0.0 => PLT.X => PLT.Y;
@BOX 3.1
END
@END
@TITLE GRA14.4(1,10)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
HP LINE (X.MIN, Y.MIN, X.MAX, Y.MAX)
@BOX 2.0
MOVE PEN TO START POINT OF LINE
[GRA14.9]
@BOX 3.0
COMPUTE LINE X AND Y INCREMENTS
@BOX 4.0
ISSUE LINE DRAWING INSTRUCTIONS
@BOX 5.0
RESET PLOTTER CURRENT PEN POSITION
@BOX 6.0
END
@BOX 1.1
PROC HP.LINE (X.MIN, Y.MIN, X.MAX, Y.MAX);
$IN X.INC, Y.INC;
$RE T1, T2;
@BOX 2.1
IF LANSP =0  THEN
NDC.HEIGHT - Y.MIN => T1;
NDC.HEIGHT - Y.MAX => T2;
X.MIN => Y.MIN;
X.MAX => Y.MAX;
T1 => X.MIN;
T2 => X.MAX;
FI
HP.MOVE (X.MIN, Y.MIN);
@BOX 3.1
::OUTREAL(X.MIN,9,3);OUTREAL(YMIN,9,3);
::OUTREAL(XMAX,6,3);OUTREAL(YMAX,6,3);
::NEWLINES(1);OUTREAL(NDC.SCALE,12,5);
X.MAX  * NDC.SCALE +20.0 => X.INC;
Y.MAX  * NDC.SCALE + 300.0 => Y.INC;
@BOX 4.1
CAPTION (%"PD");
OUT.I (X.INC, 0); OUT.CH (',);
OUT.I (Y.INC, 0); OUT.CH (',);
CAPTION (%"PU"); OUT.CH (10);
X.INC=>X.MOVE; Y.INC=>Y.MOVE; ::12/7,83
@BOX 5.1
X.MAX => PLT.X;
Y.MAX => PLT.Y;
@BOX 6.1
END
@END
@TITLE GRA14.5(1,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
HP TEXT (X, Y, STRING)
@BOX 2.0
INITIALISE PEN TO START OF TEXT STRING
[GRA14.9]
@BOX 3.0
ISSUE TEXT DRAWING INSTRUCTION
@BOX 4.0
RESET PEN TO START OF TEXT STRING
@BOX 5.0
END
@BOX 1.1
PROC HP.TEXT (X, Y, STRING, LENGTH);
@BOX 2.1
$RE T1;
IF LANSP /=1  THEN
NDC.HEIGHT - Y => T1;
X => Y;
T1 => X;
FI;
HP.MOVE (X, Y);
@BOX 3.1
CAPTION (%"LB");
CAPTION (STRING); OUT.CH (13);OUTCH(10);
@BOX 4.1
@BOX 5.1
END
@END
@TITLE GRA14.6(1,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
HP MARKER (X, Y, SYMBOL)
@BOX 2.0
SET PEN POSITION TO DRAW MARKER
[GRA14.9]
@BOX 3.0
ISSUE INSTRUCTION TO DRAW MARKER
@BOX 4.0
RESET PEN POSITION
@BOX 5.0
END
@BOX 1.1
PROC HP.MARKER (X, Y, SYMBOL);
$RE T1, T2;
@BOX 2.1
IF LANSP /=1  THEN
NDC.HEIGHT - Y => T1;
X => Y;
T1 => X;
FI;
HP.MOVE (X, Y);
@BOX 3.1
CAPTION (%"LB");
OUT.CH (SYMBOL); OUT.CH (13);OUTCH(10);
@BOX 4.1
@BOX 5.1
END
@END
@TITLE GRA14.7(1,10)
@COL 8R-9R
@COL 1S-2R-3R-4R-5R-6R-7F
@COL 10R-11R
@ROW 8-3-10
@FLOW 1-2
@FLOW 3-4-5-6-7
@FLOW 8-9-7
@FLOW 10-11-7
@BOX 1.0
HP ATTRIBUTE(ATTRIBUTE NUMBER)
@BOX 2.0
SWITCH ON
NUMBER
@BOX 3.0
CHAR SIZE
@BOX 4.0
CONVERT NDC CHAR SIZE TO CM.
@BOX 5.0
COMPUTE TEXT PARAMETERS
@BOX 6.0
ISSUE TEXT DRAWING INSTRUCTION
@BOX 7.0
END
@BOX 8.0
PEN
@BOX 9.0
ISSUE INSTRUCTION TO SELECT
 SPECIFIED PEN
@BOX 10.0
CHAR PATH
@BOX 11.0
SWITCH ON VALUE OF PATH TO COMPUTE
NEW TEXT PARAMETERS
@BOX 1.1
PROC HP.ATTR(NO);
 $RE W , H;
@BOX 2.1
SWITCH NO&7\ IGN,IGN,IGN,CHARSIZE,
   CHARPATH,IGN,PEN,IGN;
@BOX 3.1
CHARSIZE:
CHARSZ.WIDTH * 100.0 / NDC.WIDTH =>W;
CHARSZ.HEIGHT * 100.0 / NDC.HEIGHT =>H;
IF LANSP =0  THEN
  W * 0.48 => W;
 H * 1.1 =>H;
ELSE
  W * 0.69 => W;
  H *0.8 =>H;
FI;
CAPTION (%"SR");
OUTREAL (W, 7, 4);
OUTCH (',);
OUTREAL (H, 7, 4);
OUTCH(%0A);
@BOX 4.1
@BOX 5.1
@BOX 6.1
@BOX 7.1
IGN:
END
@BOX 8.1
PEN:
@BOX 9.1
@BOX 10.1
CHARPATH:
@BOX 11.1
IF LANSP = 0 THEN
 IF C.CHARPATH = 0 THEN
   3 => C.CHARPATH
 ELSE
   1-> C.CHARPATH
 FI
FI
 CAPTION (%"DI");
ALTERNATIVE C.CHARPATH  FROM
  BEGIN
   OUTI(1,0); OUTCH(',);
   OUTI(0,0); OUTCH(';);
  END
  BEGIN
   OUTI(0,0); OUTCH(',);
   OUTI(-1,0); OUTCH(';);
  END
  BEGIN
   OUTI(-1,0); OUTCH(',);
   OUTI(0,0 ); OUTCH(';);
  END
  BEGIN
   OUTI(0,0); OUTCH(',);
   OUTI(1,0); OUTCH(';);
  END
END
@END
@TITLE GRA14.8(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
HP REPORT(REAL ARRAY,INTEGER ARRAY)
@BOX 2.0
WRITE CAPABILITIES
TO ARRAYS
@BOX 3.0
END
@BOX 1.1
PROC HP.REPORT(RVEC,IVEC);
  $IN I ,J;
@BOX 2.1
 FOR I < 36 DO
  0 => IVEC^ [I]
 OD;
 1=>IVEC^[2]=>IVEC^[4]=>IVEC^[12]=>IVEC^[13]=>IVEC^[14];
 1=>IVEC^[15]=>IVEC^[27]=>IVEC^[33];
 5=>IVEC^[6]; 3=>IVEC^[7];
 10 =>IVEC^[10];
 400 =>RVEC^[0]=>RVEC^[1];
 7200 =>RVEC^[2]; 10000 =>RVEC^[3];
 19.1 =>RVEC^[6]; 27.2 =>RVEC^[7];
 1=>RVEC^[8] =>RVEC^[9];
 0=>RVEC^[10]=>RVEC^[11];
 0.0075 =>RVEC^[12]; 0.015 =>RVEC^[13];
 133.3 =>RVEC^[8]; 66.6 =>RVEC^[9];
@BOX 3.1
END
@END
@TITLE GRA14.9(1,10)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
HP MOVE (X, Y)
@BOX 2.0
COMPUTE MOVE INCREMENT
@BOX 3.0
ISSUE INSTRUCTIONS TO MOVE PEN
@BOX 4.0
@BOX 4.0
RESET PEN POSITION
@BOX 5.0
END
@BOX 1.1
PROC HP.MOVE (X, Y);
$IN X.INC, Y.INC;
@BOX 2.1
X  * NDC.SCALE  +20.0 => X.INC;
Y  * NDC.SCALE  +300.0=> Y.INC;
@BOX 3.1
IF X.MOVE /= X.INC OR Y.MOVE /= Y.INC THEN
CAPTION (%"PU");
OUT.I (X.INC, 0); OUT.CH (',);
OUT.I (Y.INC, 0); OUT.CH (';);
 X.INC => X.MOVE; Y.INC => Y.MOVE;
FI;
@BOX 4.1
X => PLT.X; Y => PLT.Y;
@BOX 5.1
END
@END
