C LPPLOT - SUBROUTINE LIBRARY FOR PLOTTING ONTO DOT MATRIX PRINTER. C C THIS PROVIDES A STANDARD INTERFACE BETWEEN THE COMMON PLOTTING ROUTINES C AND A DOT MATRIX PRINTER, IN PARTICULAR THE EPSON FX-80. THE PLOTTING C COMMANDS ARE TRANSLATED INTO VECTORS DRAWN IN A BITMAP WHICH IS THEN C SENT TO A LISTING FILE FOR SUBSEQUENT PRINTING. THIS LISTING FILE IS C CALLED LP.LST; IT IS THE USER'S RESPONSIBILITY TO SEE THAT IT IS C PRINTED. C C NOTE THAT SINCE THERE IS NO HARDWARE CHARACTER SET IN THIS PACKAGE, C IT IS NECESSARY TO USE THE SOFTWARE CHARACTER SET. FAILURE TO DO SO C WILL RESULT IN AN ERROR MESSAGE AND TASK TERMINATION. C C C David Villeneuve C Division of Physics M23A C National Research Council C Ottawa Ont. K1A 0R6 C 613-993-9975 C SUBROUTINE PLOTS C C PLOTS -- INITIALIZE PLOTTING PACKAGE AND START ON NEW PAGE. C CALL LPPLOT (0.0, 0.0, 0) RETURN END SUBROUTINE PLOTF C C PLOTF -- TERMINATE PLOTTING PAGE. C CALL LPPLOT (0.0, 0.0, 999) RETURN END SUBROUTINE PLOT (X, Y, L) C C PLOT -- MOVE PEN OR DRAW LINE C CALL LPPLOT (X, Y, L) RETURN END SUBROUTINE NEWPEN C C NEWPEN -- CHANGE PEN C RETURN END SUBROUTINE SYMBOC (X, Y, HEIGHT, TEXT, ANGLE, NCHARS, ICENTR) C C PLOTS A CHARACTER STRING WITH CHARACTER HEIGHT IN INCHES, C AT DEGREES COUNTERCLOCKWISE FROM THE POSITIVE X-AXIS. C IS THE MAXIMUM NUMBER OF CHARACTERS IN , BUT A ZERO C BYTE WILL ALSO TERMINATE THE STRING. =-1 FOR LEFT JUSTIFIED C TEXT, =0 FOR CENTERED AND +1 FOR RIGHT JUSTIFIED. X,Y IS THE STARTING C LOCATION IN INCHES, AND THE STRING IS POSITIONED ABOUT THIS POINT C DEPENDING ON THE VALUE OF . C BYTE TEXT(1) IF (NCHARS .EQ. 0) RETURN CALL SYMLEN (TEXT, NCHARS, HEIGHT, XLEN) SHIFT = 0.0 !ASSUME LEFT JUSTIFIED IF (ICENTR .EQ. 0) SHIFT = 0.5*XLEN IF (ICENTR .EQ. 1) SHIFT = XLEN XPOS = X - SHIFT*COS(ANGLE/57.3) YPOS = Y - SHIFT*SIN(ANGLE/57.3) CALL SYMBOL (XPOS, YPOS, HEIGHT, TEXT, ANGLE, NCHARS) RETURN END SUBROUTINE SYMBOL C C DUMMY HARDWARE CHARACTER SET SUBROUTINE. C THIS SHOULD NOT BE LOADED IF THE SOFTWARE CHARACTER SET WAS SELECTED. C WRITE (5,10) 10 FORMAT ('0The matrix printer has no hardware character set.'/ 1 ' You must rebuild the program, including a reference to'/ 2 ' the software set.') STOP END SUBROUTINE SYMLEN C C DUMMY SYMBOL LENGTH SUBROUTINE. C THIS SHOULD ALSO NOT BE LOADED IF THE SOFTWARE CHARACTER SET WAS SELECTED. C RETURN END SUBROUTINE SYMTYP RETURN END SUBROUTINE LPPLOT (X, Y, ITYPE) C C GENERAL VECTOR DRAWING SUBROUTINE FOR A MATRIX PRINTER. C THIS MAINTAINS A BIT MAP OF THE PLOTTING SPACE IN MEMORY. C EACH TIME A VECTOR IS DRAWN THE CORRESPONDING BIT IS TURNED ON. C WHEN THE PAGE IS COMPLETE, IT IS SENT TO THE OUTPUT LISTING FILE. C C THE LOGICAL PAGE IS 12 INCHES WIDE BY 10 INCHES HIGH. THIS IS C ROTATED CLOCKWISE 90 DEGREES BEFORE PRINTING, SO THAT IT LOOKS LIKE C C . . C . ------> Y. C . | . C . | . C . | . C . X . C ............ C C THIS WAY SUBSEQUENT GRAPHS PRINT FROM LEFT TO RIGHT WHEN SPREAD C ACROSS YOUR DESK. THE X-AXIS IS PACKED 16 BITS PER WORD, WITH C THE HIGHEST BIT POSITION CORRESPONDING TO THE SMALLEST X. C C DIMENSIONAL REQUIREMENT FOR ARRAYS, AND CONSTANTS: C C X_DENS = DENSITY OF POINTS PER INCH IN X-DIRECTION (VERTICAL PITCH) (72) C Y_DENS = SAME FOR Y-DIRECTION (HORIZONTAL PITCH) (60) C Y_SIZE = WIDTH OF PAPER TO BE USED IN INCHES FOR Y-AXIS (7.5) C FNX = NUMBER OF POINTS ACROSS X-AXIS = 1.2 * Y_SIZE * X_DENS - 1 (647) C FNY = NUMBER OF POINTS ACROSS Y-AXIS = Y_SIZE * Y_DENS - 1 (449) C XSCALE = FNX / 12 (53.915) C YSCALE = FNY / 10 (44.9) C NX = FNX/16 + 1 (41) C NY = FNY + 1 (450) C BITMAP = INTEGER ARRAY DIMENSIONED AS (NX, NY) C LINE = BYTE ARRAY DIMENSIONED AS (NY) C C CALCULATE THESE VALUES FOR YOUR FAVOURITE PRINTER AND ENTER THE C CONSTANTS IN THE DATA STATEMENTS BELOW, AND THE DIMENSIONS TOO. C C For the VAX version, uncomment the .DEFINE VAX line below. C.DEFINE VAX C .IFDF VAX DIMENSION BITMAP(41,450) .ENDC .IFNDF VAX VIRTUAL BITMAP(41,450) .ENDC INTEGER*2 BITMAP INTEGER*2 BIT(16) LOGICAL*1 LINE(450) LOGICAL NEWPLT, OPENF DATA FNX, FNY / 647.0, 449.0 / DATA XSCALE, YSCALE / 53.915, 44.9 / DATA NX, NY / 41, 450 / DATA NEWPLT /.TRUE./, OPENF /.FALSE./ DATA BIT / "100000, 16384, 8192, 4096, 2048, 1024, 512, 1 256, 128, 64, 32, 16, 8, 4, 2, 1 / C C ITYPE=0 -- INITIALIZE NEW PAGE C IFF (ITYPE .EQ. 0) THEN { IF (.NOT. OPENF) 1 OPEN (UNIT=1, NAME='LP.LST', TYPE='NEW', CARRIAGECONTROL='NONE') FOR J=1,NX { FOR K=1,NY BITMAP(J,K) = 0 } XORG = 0.0 YORG = 0.0 X0 = 0.0 Y0 = 0.0 NEWPLT = .TRUE. OPENF = .TRUE. RETURN } C C ITYPE=999 -- TERMINATE PAGE, PRINT BITMAP C IFF (ITYPE .EQ. 999) THEN { IF (NEWPLT) RETURN !NOTHING TO PRINT CALL OUTP (LINE, NX, 8, 0, 1) !SET UP PRINTER PITCH FOR J=1,NX { FOR K=1,NY LINE(K) = ISHFT( BITMAP(J,K), -8 ) !HIGH ORDER BYTE - VAX PROBLEM CALL OUTP (LINE, NY, 8, 1, 0) FOR K=1,NY LINE(K) = BITMAP(J,K) .AND. "377 !LOW ORDER BYTE CALL OUTP (LINE, NY, 8, 1, 0) } CALL OUTP (LINE, NY, 8, 0, 2) !TERMINATE GRAPHICS MODE NEWPLT = .TRUE. RETURN } C C ITYPE=1-3 -- DRAW VECTOR TO X,Y C NEWPLT = .FALSE. X1 = (X+XORG)*XSCALE Y1 = (Y+YORG)*YSCALE X1 = AMAX1( 0.0, AMIN1( X1, FNX ) ) Y1 = AMAX1( 0.0, AMIN1( Y1, FNY ) ) IFF (IABS(ITYPE) .NE. 3) THEN { DX = X1 - X0 DY = Y1 - Y0 SLOPE = 1.0E30 !INFINITE SLOPE IF (DX .NE. 0.0) SLOPE = DY/DX IX00 = X0 + 0.5 !ROUND ENDPOINTS TO NEAREST INTEGER IX01 = X1 + 0.5 IY00 = Y0 + 0.5 IY01 = Y1 + 0.5 IX0 = MIN0( IX00, IX01 ) !SORT ENDPOINTS, FOR FASTER DO LOOPS IX1 = MAX0( IX00, IX01 ) IY0 = MIN0( IY00, IY01 ) IY1 = MAX0( IY00, IY01 ) C C FILL IN THE DOTS ALONG THE LINE. ONE LOOP FOR UP, THE OTHER FOR RIGHT. C IFF (ABS(SLOPE) .LT. 1.0) THEN { FOR IX=IX0,IX1 { IY = SLOPE * (FLOAT(IX)-X0) + Y0 + 0.5 IXWORD = IX/16 + 1 !WORD ADDRESS INTO X IXBIT = IX - (IXWORD-1)*16 + 1 !BIT INDEX BITMAP(IXWORD,IY+1) = BITMAP(IXWORD,IY+1) .OR. BIT(IXBIT) } } ELSE { FOR IY=IY0,IY1 { IX = (FLOAT(IY)-Y0) / SLOPE + X0 + 0.5 IXWORD = IX/16 + 1 !WORD ADDRESS INTO X IXBIT = IX - (IXWORD-1)*16 + 1 !BIT INDEX BITMAP(IXWORD,IY+1) = BITMAP(IXWORD,IY+1) .OR. BIT(IXBIT) } } } C C SAVE LAST PLOTTING POSITION AND ORIGIN C X0 = X1 Y0 = Y1 IFF (ITYPE .LT. 0) THEN { !NEW ORIGIN XORG = X+XORG YORG = Y+YORG } RETURN END SUBROUTINE OUTP (LINE, NBITS, NPINS, IDENS, IOPT) C C OUTPUT ROUTINE FOR TRANSFERRING TO OUTPUT FILE. C IS ALWAYS ZEROED AFTER BEING PRINTED. C C THIS IS SET UP FOR THE EPSON FX-80 PRINTER C C LINE = BYTE ARRAY OF CHARACTERS TO BE PRINTED C NBITS = NUMBER OF BYTES IN LINE C NPINS = NUMBER OF PINS IN PRINT HEAD C IDENS = DENSITY CODE FOR PRINTER. 0 = DON'T PRINT C 1 = 60 BITS PER INCH C 2 = 120 BITS PER INCH C IOPT = OPTION CODE. 0 = PRINT LINE. C 1 = SET UP VERTICAL PITCH, DON'T PRINT LINE. C 2 = TERMINATE GRAPHICS MODE C BYTE LINE(1) IFF (IOPT .EQ. 1) THEN { !SET UP VERTICAL PITCH TO /72 INCHES WRITE (1,100) "14, "15, "33, 'A', NPINS } ELSEIF (IDENS .GT. 0) THEN { FOR J=NBITS,1,-1 !FIND LENGTH OF LINE { LEN = J IF (LINE(J) .NE. 0) GO TO 50 } 50 N2 = LEN/256 N1 = LEN - N2*256 WRITE (1,100) "33, '*', IDENS-1, N1, N2 NREC = LEN/128 NREM = LEN - NREC*128 IFF (NREC .GT. 0) THEN { !BREAK LINE INTO SHORTER LINES OF 128 EACH FOR J=1,NREC { K1 = (J-1)*128 + 1 K2 = K1 + 127 WRITE (1,100) (LINE(K), K=K1,K2) } } K1 = NREC*128 + 1 IF (NREM .GT. 0) WRITE (1,100) (LINE(K), K=K1,LEN) WRITE (1,100) "15, "12 } IFF (IOPT .EQ. 2) THEN { !TERMINATE GRAPHICS MODE WRITE (1,100) "15, "12 } C C ZERO LINE C FOR J=1,NBITS LINE(J) = 0 RETURN 100 FORMAT (128A1) END SUBROUTINE PLOTNM (FILENM, ICODE) C C Dummy routine to match the one used in the PFLIB version, C which specifies the name of an output plot file. C For this library, this subroutine has no effect C BYTE FILENM(40) RETURN END