[Back to PRINTING SWAG index] [Back to Main SWAG index] [Original]

    {
    433: PRINTING GRAPHICS TO AN EPSON COMPATIBLE PRINTER
       Pascal   All       TI-09/30/94

    Printing Graphics to a Epson compatible printer.  Printing your graphic
    screens created with the BGI Graphics format to Epson compatible printers.

      PRODUCT  :  Pascal                                 NUMBER  :  433
      VERSION  :  All
           OS  :  DOS
         DATE  :  September 30, 1994                       PAGE  :  1/1

        TITLE  :  PRINTING GRAPHICS TO AN EPSON COMPATIBLE PRINTER
     }
    { 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  these routines.              }

    Unit GraphPRN;

    { This  unit is  designed to send  graphics images  to Epson }
    { Compatible  and  late  model  IBM  ProPrinter  Dot  Matrix }
    { printers.  It takes the  image from  the currently  active }
    { Viewport, determined  by  a call  to  GetViewSettings, and }

    { transfers that image to the printer.                       }

    Interface

    Uses Dos, Graph;     { Used to get the Image from the Screen }

    Var
       LST : Text;

    Procedure HardCopy (Gmode: Integer);
    { Procedure HardCopy prints the current ViewPort    }
    {   To an IBM or Epson compatible graphics printer. }
    {                                                   }
    { Valid Gmode numbers are :                         }
    {     -4 to -1 for Epson and IBM Graphic Printers   }

    {      0 to 7  for Epson Printers                   }

    Implementation

    Procedure HardCopy {Gmode: Integer};

    Const
       Bits : Array [0..7] of Byte = (128,64,32,16,8,4,2,1);

    Var
        X,Y,YOfs        : Integer;   { Screen  location variables }
        BitData,MaxBits : Byte;      { Number of Bits to transfer }
        Vport           : ViewPortType;{Used to get view settings }
        Height, Width   : Word;      { Size of image  to transfer }
        HiBit, LoBit    : Char;      {     Char size of image     }

        LineSpacing,                 { Additional  Info for  dump }
        GraphixPrefix   : String[10];{      "        "   "     "  }

    Begin
      LineSpacing   := #27+'3'+#24; { 24/216 inch line spacing    }
      Case Gmode Of
           -1: GraphixPrefix := #27+'K'; { Std. Density           }
           -2: GraphixPrefix := #27+'L'; { Double Density         }
           -3: GraphixPrefix := #27+'Y'; { Dbl. Density Dbl. Speed}
           -4: GraphixPrefix := #27+'Z'; { Quad. Density          }

         0..7: GraphixPrefix := #27+'*'+Chr(Gmode);{ 8-Pin Bit Img}
        Else
         Exit;                           { Invalid Mode Selection }
      End;
      GetViewSettings( Vport );          { Get  size  of image to }
      Height := Vport.Y2 - Vport.Y1;     { be printed             }
      Width  := ( Vport.X2 + 1 ) - Vport.X1;
      HiBit := Chr(Hi(Width));           {Translate sizes to char }
      LoBit := Chr(Lo(Width));           { for  output to printer }
      Write( LST, LineSpacing );

      Y := 0;
      While Y < Height Do
      Begin
         Write( LST,GraphixPrefix,LoBit,HiBit );
         For X := 0 to Width-1 Do
         Begin
            BitData := 0;
            If y + 7 <= Height
              Then MaxBits := 7
            Else
              MaxBits := Height - Y;
            For YOfs := 0 to MaxBits do
            Begin
             If GetPixel( X, YOfs+Y ) > 0
               Then BitData := BitData or Bits[YOfs];
            End;
            Write( LST, Chr(BitData) );
         End;
         WriteLn ( LST );

         Inc(Y,8);
      End;
    End;

    {$F+}

    {      LSTNoFunction performs a NUL operation for a Reset or  }
    { Rewrite on LST (Just in case)                               }

    Function LSTNoFunction( Var F: TextRec ): integer;
    Begin
      LSTNoFunction := 0;                    { No error           }
    end;

    {      LSTOutputToPrinter sends the output to the Printer     }
    { port number stored in the first byte of the UserData area   }
    { of the Text Record.                                         }

    Function LSTOutputToPrinter( Var F: TextRec ): integer;
    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-}

    {      AssignLST both sets up the LST text file record as     }
    { would ASSIGN, and initializes it as would a RESET.  It also }
    { stores the Port number in the first Byte of the UserData    }
    { area.                                                       }

    Procedure AssignLST( Port:Byte );

    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;  { We subtract one because }
      end;                          { Dos Counts from zero.   }

    end;

    Begin
       AssignLST( 1 );           { Sets output printer to LPT1 by }
                                 { default.  Change this value to }
                                 { a 2 to select LPT2.            }
    End.                         { Note: BIOS only handles LPT1   }
                                                {      and      LPT2.
    }

    DISCLAIMER: You have the right to use this technical information
    subject to the terms of the No-Nonsense License Statement that

    you received with the Borland product to which this information
    pertains.
    PACHXA296:PACHXA296

[Back to PRINTING SWAG index] [Back to Main SWAG index] [Original]