MODULE DDRGL; (* This module takes a Gfile and plots the graphics instructions on a VT125 or PRO-350 (under POS communications mode). To use this driver type $ ddrgl gfile Where gfile is the file containing graphics commands. 1. INIT baudrate 2. ERAS 3. WIND lowerx,lowery,upperx,uppery 4. MAPW xmin,ymin,xmax,ymax 5. MOVE x,y 6. DRAW x,y 7. PLIN pcount,x[1],y[1],...,x[pcount],y[pcount] 8. LPAT SOLI|DASH|DOTT 9. FONT HARD|ROMA|STIC|SCRI|GOTH 10. CSIZ cht,cwid,slant,hindex,vindex 11. COLO BLAC|BLUE|GREE|REDD 12. LORG 3|6|9 13. TEXT x,y,rotation,charcount 20 words for 80 byte string 14. *EOG *) FROM CmdLineArgs IMPORT Getarg; FROM FileSystem IMPORT File; FROM GfileManager IMPORT OpenGfile, GetW, GetWords, CloseGfile; IMPORT RGL; FROM InOut IMPORT WriteString, WriteLn; PROCEDURE MakePrompt( s : ARRAY OF CHAR ); VAR i : CARDINAL; BEGIN FOR i := 0 TO HIGH( s ) DO prompt[i+1] := s[i] END; prompt[ HIGH(s)+2 ] := 0C END MakePrompt; PROCEDURE cmp( s, t : ARRAY OF CHAR ) : BOOLEAN; VAR i : CARDINAL; BEGIN FOR i := 0 TO HIGH( s ) DO IF s[i] # t[i] THEN RETURN FALSE END END; RETURN TRUE END cmp; PROCEDURE PolyLine( ); VAR pc : INTEGER; x,y: REAL; i : CARDINAL; BEGIN ok := GetW( gf, pc ); IF pc <= 0 THEN RETURN END; ok := GetW( gf, x ); ok := GetW( gf, y ); RGL.Move( x, y ); FOR i := 2 TO CARDINAL( pc ) DO ok := GetW( gf, x ); ok := GetW( gf, y ); RGL.Line( x,y ); END; END PolyLine; PROCEDURE FireUp; BEGIN IF NOT Getarg( argv ) THEN WriteString(" Error in processing command line args" ); WriteLn; HALT END; IF NOT OpenGfile( gf, argv, TRUE ) THEN WriteString("Error opening " ); WriteString( argv ); WriteLn; HALT END; hcopy := FALSE; IF Getarg( argv ) THEN hcopy := ( argv[1] = '-' ) AND ( argv[2] = 'H' ); END; END FireUp; VAR argv, prompt : ARRAY [1..80] OF CHAR; hcopy : BOOLEAN; status, cmdlen : INTEGER; gf : File; ok : BOOLEAN; gcmd : ARRAY [1..4] OF CHAR; lowerx,lowery,upperx,uppery, xmin,ymin,xmax,ymax : REAL; pc : CARDINAL; BaudRate : INTEGER; x, y : REAL; cht, cwid : REAL; rotation : REAL; slant : REAL; hcindex : INTEGER; vcindex : INTEGER; int : INTEGER; BEGIN FireUp( ); int := 5; RGL.Init_Graphics( int ); RGL.Set_Color( 'Blue', 1 ); RGL.Set_Color( 'Green', 2 ); RGL.Set_Color( 'Red', 3 ); RGL.Set_Color( ' ', 2 ); ok := GetW( gf, gcmd ); WHILE ok DO IF cmp( gcmd, "DRAW" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); RGL.Line( x, y ) ELSIF cmp( gcmd, "MOVE" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); RGL.Move( x, y ) ELSIF cmp( gcmd, "PLIN" ) THEN PolyLine( ); ELSIF cmp( gcmd, "TEXT" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); ok := GetW( gf, rotation ); ok := GetW( gf, int ); (* char count *) ok := GetWords( gf, argv, 20 ); RGL.Move( x,y ); RGL.Text( argv ) ELSIF cmp( gcmd, "COLO" ) THEN ok := GetW( gf, gcmd ); IF cmp( gcmd, "BLAC" ) THEN RGL.Set_Color( ' ', 0 ) ELSIF cmp( gcmd, "BLUE" ) THEN RGL.Set_Color( ' ', 1 ) ELSIF cmp( gcmd, "GREE" ) THEN RGL.Set_Color( ' ', 2 ) ELSIF cmp( gcmd, "REDD" ) THEN RGL.Set_Color( ' ', 3) END ELSIF cmp( gcmd, "LPAT" ) THEN ok := GetW( gf, gcmd ); IF cmp( gcmd, "SOLI" ) THEN RGL.Set_LinePattern( 1, 2 ) ELSIF cmp( gcmd, "DASH" ) THEN RGL.Set_LinePattern( 2, 2 ) ELSIF cmp( gcmd, "DOTT" ) THEN RGL.Set_LinePattern( 6, 2 ) ELSE RGL.Set_LinePattern( 1, 2 ) END ELSIF cmp( gcmd, "CSIZ" ) THEN ok := GetW( gf, cht ); ok := GetW( gf, cwid ); ok := GetW( gf, slant ); ok := GetW( gf, hcindex ); ok := GetW( gf, vcindex ); RGL.Set_Degrees( ); RGL.Set_Italic( slant ); RGL.Set_TextSize( hcindex, vcindex ); RGL.Set_Radians( ) ELSIF cmp( gcmd, "LORG" ) THEN ok := GetW( gf, int ) (* ignore this in RGL *) ELSIF cmp( gcmd, "FONT" ) THEN ok := GetW( gf, gcmd ) (* ignore font in RGL *) ELSIF cmp( gcmd, "WIND" ) THEN ok := GetW( gf, lowerx ); ok := GetW( gf, lowery ); ok := GetW( gf, upperx ); ok := GetW( gf, uppery ); (* RGL.Set_Viewport( lowerx, lowery, upperx, uppery ) *) ELSIF cmp( gcmd, "MAPW" ) THEN ok := GetW( gf, xmin ); ok := GetW( gf, ymin ); ok := GetW( gf, xmax ); ok := GetW( gf, ymax ); RGL.Set_Window( xmin,ymin, xmax,ymax ) ELSIF cmp( gcmd, "INIT" ) THEN ok := GetW( gf, int ) (* skip the baud *) ELSIF cmp( gcmd, "ERAS" ) THEN RGL.Clear_Screen( ); RGL.Clear_Text( ) ELSIF cmp( gcmd, "*EOG" ) THEN ok := FALSE END; IF ok THEN ok := GetW( gf, gcmd ) (* get next command *) END END; (* WHILE *) ok := CloseGfile( gf ); IF hcopy THEN RGL.Copy_Screen( ); END; END DDRGL.