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

{
> > I've got some source (a unit) for printing a graphic screen on a HP and
> > Epson compatibles. If youre printer can emulate these 2 printers than
> > you can use this. There are maybe some other folks interested in the
> > source. Just ask for it, i'll send it to you the other day (only in the
> > week, not on weekends).

{----------------BEGIN OF PASCAL SOURCE---------------------------------}

UNIT GRPRINT;

INTERFACE

Uses CRT,DOS,GRAPH;

Type PrinterTypen = (HP,EPSON);

Const PrinterType: PrinterTypen = HP;

Var PRN: Text;

Procedure DrukVenster(AchterGrondKleur,DichtHeid: Word);
{;Procedure PrintScreen(BackColor,Resolution: Word); (translated)}

IMPLEMENTATION

Const ESC = #27;

Var   AKleur,Breedte,Hoogte: Word;
      ViewPort: ViewportType;
      Intro: String[10];

Function NulFunctie(Rec: TextRec): Integer; FAR;
Begin
  NulFunctie := 0;
end;

Function UitVoerNaarPrinter(VAR Rec: TextRec): Integer; FAR;
Var Regs: Registers;
    Wijzer: Word;

Begin
  With Rec do
    Begin
      Wijzer := 0;
      Regs.AH := 16;
      While (Wijzer < BufPos) and (Regs.AH and 16 = 16) do
        Begin
          Regs.AH := 0;
          Regs.AL := Ord(BufPtr^[Wijzer]);
          Regs.DX := UserData[1];
          Intr($17,Regs);
          INC(Wijzer);
        end; { WHILE }
      BufPos := 0;
      If Regs.AH and 16 = 16 then
         UitVoerNaarPrinter := 0
      Else
         If Regs.AH and 32 = 32 then
            UitVoerNaarPrinter := 159
         Else
            UitVoerNaarPrinter := 160;
    end; { WITH }
end;

Procedure InitHP(DichtHeid: Integer);
Const CursorPositie: String = '5';
Var PuntenPerInch: String[3];

 Begin
   Case DichtHeid of
     1: PuntenPerInch := '75';
     2: PuntenPerInch := '100';
     3: PuntenPerInch := '150';
     4: PuntenPerInch := '300';
     Else PuntenPerInch := '100';
   end; { CASE }
   Write(PRN,ESC+'E');
   Write(PRN,ESC+'*t'+PuntenPerInch+'R');
   Write(PRN,ESC+'&a'+CursorPositie+'C');
   Write(PRN,ESC+'*r1A');
 end;

 Procedure InitEpson(DichtHeid: Integer);
 Var RegelAfstand: String[10];
 Begin
   RegelAfstand := #27+'3'+#24;
   Case DichtHeid of
     1: Intro := #27+'K';
     2: Intro := #27+'L';
     3: Intro := #27+'Y';
     4: Intro := #27+'Z';
     Else Intro := #27+'L';
   end; { CASE }
   Write(PRN,RegelAfStand);
 end;

 Procedure SluitHp;
 Begin
   Write(PRN,ESC+'*rB');
   Write(PRN,ESC+'E');
 end;

 Procedure SluitEpson;
 Begin
   Write(PRN,#12);
   Write(PRN,#27+'@');
 end;

 Procedure HPAfdruk(DichtHeid: Word);
 Var RegelLengte: String[2];
     i: Integer;

 Procedure PuntenLijn(Y: Word);
 Var Regel: String;
     Basis: Word;
     BitNr,ByteNr,DataByte: Byte;
     Kleur: Word;

 Begin
   Regel := Intro;
   For ByteNr := 0 to Breedte do
     Begin
       DataByte := 0;
       Basis := 8 * ByteNr;
       For BitNr := 0 to 7 do
         Begin
           Kleur := GetPixel(BitNr+Basis,Y);
           If Kleur <> AKleur then
              DataByte := DataByte + 128 SHR BitNr;
         end; { FOR }
       Regel := Regel + Chr(DataByte);
     end; { FOR }
   Write(PRN,Regel);
 end;

 Begin { HPAfdruk }
   GetViewSettings(ViewPort);
   With ViewPort do
     Begin
       Breedte := (X2+1)-X1;
       Hoogte := (Breedte-7) div 8;
     end; { WITH }
   Str(Breedte+1,RegelLengte);
   Intro := ESC+'*b'+RegelLengte+'W';
   InitHp(DichtHeid);
   For i := 0 to Hoogte +1 do
     PuntenLijn(i);
   SluitHp;
 end;

 Procedure EpAfdruk(DichtHeid: Word);
 Var X,Y,YOfs: Integer;
     BitGegevens,Bits: Byte;
     Kleur: Byte;

 Begin
   GetViewSettings(ViewPort);
   With ViewPort do
     Begin
       Hoogte := Y2-Y1;
       Breedte := X2+1-X1;
     end; { WITH }
   InitEpson(DichtHeid);
   Y := 0;
   While Y < Hoogte do
     Begin
       Write(PRN,Intro,Chr(Lo(Breedte)),Chr(Hi(Breedte)));
       For X := 0 to Breedte - 1 do
         Begin
           BitGegevens := 0;
           If Y + 7 <= Hoogte then
              Bits := 7
           Else
              Bits := Hoogte - Y;
           For YOfs := 0 to Bits do
             Begin
               Kleur := GetPixel(X,YOfs+Y);
               If Kleur <> AKleur then
                  BitGegevens := BitGegevens + 128 SHR YOfs;
             end; { FOR }
           Write(PRN,Chr(BitGegevens));
         end; { FOR }
       Writeln(PRN);
       INC(Y,8);
     end; { WHILE }
   SluitEpson;
 end;

 Procedure DrukVenster(AchterGrondKleur,DichtHeid: Word);
 Begin
   AKleur := AchterGrondKleur;
   CASE PrinterType of
     HP:    HPAfdruk(DichtHeid);
     EPSON: EpAfdruk(DichtHeid);
   end; { CASE }
 end;

 Begin { GrPrint }
   With TextRec(PRN) do
     Begin
       Mode := FmOutPut;
       BufSize := SizeOf(Buffer);
       BufPtr := @Buffer;
       BufPos := 0;
       OpenFunc := @NulFunctie;
       InOutFunc := @UitVoerNaarPrinter;
       FlushFunc := @UitVoerNaarPrinter;
       CloseFunc := @UitVoerNaarPrinter;
       UserData[1] := 0;
     end; { WITH }
 end.

 ------------------END OF PASCAL SOURCE-----------------------------

First set PrinterType to HP or EPSON, then call 'DrukVenster' with the
backgroundcolor and resolution. This routine prints the current viewport.

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