home *** CD-ROM | disk | FTP | other *** search
- PRODUCT : TURBO PASCAL NUMBER : 432
- VERSION : 4.0
- OS : PC-DOS 2.X, 3.X
- DATE : MAY 3, 1988
-
- TITLE : PRINTING GRAPHICS TO A HEWLETT-PACKARD LASERJET
-
- { The following example routines are public domain programs }
- { that have been uploaded to our Forum on CompuServe. As a }
- { courtesy to our users that do not have immediate access }
- { to CompuServe, Technical Support distributes these }
- { routines free of charge. }
- { }
- { However, because these routines are public domain programs,}
- { not developed by Borland International, we are unable to }
- { provide any Technical Support or assistance using these }
- { routines. If you need assistance using these routines, }
- { or are experiencing difficulties, we recommend that }
- { you log onto CompuServe and request assistance from the }
- { Forum members that developed the routines. }
-
- Unit HpCopy;
- { This unit is designed to dump graphics images produced }
- { by Turbo Pascal 4.0's Graph Unit to a Hewlett-Packard }
- { LaserJet printer. }
- { }
- { You MUST set the Aspect Ratio to 4950 before drawing a }
- { circular object on the screen. The procedure to accomplish }
- { this is also contained in this handout. }
- { }
- { If the Aspect Ratio is NOT set, the image produced by this }
- { routine will appear ellipsoid. }
-
- Interface
-
- Uses Crt, Dos, Graph;
-
- Var
- LST : Text; { MUST Redefine because Turbo's Printer }
- { Unit does not open LST with the File }
- { Mode as BINARY. }
-
- Procedure HPHardCopy;
- { Procedure to be called when the desired image is on the }
- { screen. }
-
- Procedure SetAspectRatio( NewAspect : Word );
- { Procedure to be called to set the aspect ratio such that }
- { circular objects will appear correctly on the printout }
- { generated by HpHardCopy. NOTE that the image on the }
- { screen WILL appear ellipsoid. This is NORMAL! }
-
- Function GetAspectX : Word;
- { This Function will return the currently set aspect ratio }
- { to allow the user to save the default ratio, set it to }
- { the ratio required by HpHardCopy (4950) and then restore }
- { it to the default value. }
-
- Implementation
-
- Var
- Width, Height : Word; { Variables used to store settings }
- Vport : ViewPortType; { Used in the call GetViewSettings }
-
- {$F+}
- Function LSTNoFunction ( Var F : TextRec ) : Integer;
- { This function performs a NUL operation for a Reset or }
- { Rewrite on LST. }
-
- Begin
- LSTNoFunction := 0;
- End;
-
- Function LSTOutPutToPrinter( Var F : TextRec ) : Integer;
- { LSTOutPutToPrinter sends the output to the Printer port }
- { number stored in the first byte of the UserData area of }
- { the Text Record. }
-
- Var
- Regs : Registers;
- P : Word;
-
- Begin
- With F Do
- Begin
- P := 0;
- Regs.AH := 16;
- While( P < BufPos ) and ( ( Regs.AH And 16 ) = 16 ) Do
- Begin
- Regs.AL := Ord( BufPtr^[P] );
- Regs.AH := 0;
- Regs.DX := UserData[1];
- Intr( $17, Regs );
- Inc( P );
- End;
- BufPos := 0;
- End;
- If( ( Regs.AH And 16 ) = 16 ) Then
- LstOutPutToPrinter := 0 { No Error }
- Else
- If( ( Regs.AH And 32 ) = 32 ) Then
- LSTOutPutToPrinter := 159 { Out of Paper }
- Else
- LSTOutPutToPrinter := 160; { Device Write Fault }
- End;
- {$F-}
-
- Procedure AssignLST( Port : Byte );
- { AssignLST both sets up the LST text file record as would }
- { ASSIGN, and initializes it as would a RESET. }
- { }
- { The parameter passed to this procedure corresponds to }
- { DOS's LPT number. It is set to 1 by default, but can }
- { easily be changed to any LPT number by changing the }
- { parameter passed to this procedure in this unit's }
- { initialization code. }
-
- Begin
- With TextRec( Lst ) Do
- Begin
- Handle := $FFF0;
- Mode := fmOutput;
- BufSize := SizeOf( Buffer );
- BufPtr := @@Buffer;
- BufPos := 0;
- OpenFunc := @@LSTNoFunction;
- InOutFunc := @@LSTOutPutToPrinter;
- FlushFunc := @@LSTOutPutToPrinter;
- CloseFunc := @@LSTOutPutToPrinter;
- UserData[1] := Port - 1;
- End;
- End;
-
- Function GetAspectX : Word;
-
- Begin
- GetAspectX := Word( Ptr( Seg( GraphFreeMemPtr ),
- Ofs( GraphFreeMemPtr ) + 277 ) ^ );
- End;
-
- Procedure SetAspectRatio{ NewAspect : Word };
-
- Begin
- Word( Ptr( Seg( GraphFreeMemPtr ),
- Ofs( GraphFreeMemPtr ) + 277 ) ^ ) := NewAspect;
- End;
-
- Procedure HPHardCopy;
- { Produces hard copy of a graph on Hewlett-Packard Laserjet }
- { printer By Joseph J. Hansen 9-15-87 }
- { Modified Extensively for compatibility with Version 4.0's }
- { Graph Unit By Gary Stoker }
- { }
- { Unlike Graphix Toolbox procedure HardCopy, this procedure }
- { has no parameters, though it could easily be rewritten to }
- { include resolution in dots per inch, starting column, }
- { inverse image, etc. }
- { }
-
- Const DotsPerInch = '100';
- { 100 dots per inch gives full-screen }
- { width of 7.2 inches for Hercules card }
- { graphs, 6.4 inches for IBM color card }
- { and 6.4 inches for EGA card. Other }
- { allowable values are 75, 150, and 300.}
- { 75 dots per inch will produce a }
- { larger full-screen graph which may be }
- { too large to fit on an 8 1/2 inch }
- { page; 150 and 300 dots per inch will }
- { produce smaller graphs }
-
- CursorPosition = '5';
- { Column position of left side of graph }
- Esc = #27;
- { Escape character }
-
- Var LineHeader : String[6];
- { Line Header used for each line sent }
- { to the LaserJet printer. }
- LineLength : String[2];
- { Length in bytes of the line to be }
- { sent to the LaserJet. }
- Y : Integer;
- { Temporary loop Varible. }
-
- Procedure DrawLine ( Y : Integer );
- { Draws a single line of dots. No of Bytes sent to printer }
- { is Width + 1. Argument of the procedure is the row no, Y }
-
- Var GraphStr : String[255]; { String used for OutPut }
- Base : Word; { Starting position of }
- { output byte. }
- BitNo, { Bit Number worked on }
- ByteNo, { Byte number worked on }
- DataByte : Byte; { Data Byte being built }
-
- Begin
- FillChar( GraphStr, SizeOf( GraphStr ), #0 );
- GraphStr := LineHeader;
- For ByteNo := 0 to Width Do
- Begin
- DataByte := 0;
- Base := 8 * ByteNo;
- For BitNo := 0 to 7 Do
- Begin
- If GetPixel( BitNo+Base, Y ) > 0
- Then
- Begin
- DataByte := DataByte + 128 Shr BitNo;
- End;
- End;
- GraphStr := GraphStr + Chr (DataByte)
- End;
-
- Write (Lst, GraphStr)
-
- End; {Of Drawline}
-
- Begin {Main procedure HPCopy}
- FillChar( LineLength, SizeOf( LineLength ), #0 );
- FillChar( LineHeader, SizeOf( LineHeader ), #0 );
-
- GetViewSettings( Vport );
- Width := ( Vport.X2 + 1 ) - Vport.X1;
- Width := ( ( Width - 7 ) Div 8 );
- Height := Vport.Y2 - Vport.Y1;
-
- Write (Lst, Esc + 'E'); { Reset Printer }
- Write (Lst, Esc+'*t'+DotsPerInch+'R'); { Set density in }
- { dots per inch }
- Write (Lst, Esc+'&a'+CursorPosition+'C');{ Move cursor to }
- { starting col }
- Write (Lst, Esc + '*r1A'); { Begin raster graphics }
-
- Str (Width + 1, LineLength);
- LineHeader := Esc + '*b' + LineLength + 'W';
-
-
- For Y := 0 To Height + 1 Do
- Begin
- DrawLine ( Y );
- DrawLine ( Y );
- End;
-
- Write (Lst, Esc + '*rB'); { End Raster graphics }
- Write (Lst, Esc + 'E'); { Reset printer and }
- { eject page }
- End;
-
- Begin
- AssignLST( 1 ); { This is the parameter to change }
- { if you want the output to be }
- { directed to a different LST }
- { device. }
- End.
-