home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
06
/
dtp
/
eps.pas
next >
Wrap
Pascal/Delphi Source File
|
1990-04-09
|
6KB
|
224 lines
(* ------------------------------------------------------ *)
(* EPS.PAS *)
(* macht PostScript-Grafik unter Turbo Pascal verfügbar *)
(* (c) 1990 Cord Jastram & toolbox *)
(* ------------------------------------------------------ *)
UNIT eps;
INTERFACE
USES Dos, Crt, Graph, Fonts, Drivers;
CONST
MaxPunkt = 400;
Offen = FALSE;
Geschlossen = TRUE;
TYPE
PolygonZug = ARRAY [1..2, 1..MaxPunkt] OF REAL;
PROCEDURE GrafikEin(x, y : REAL; DateiName : STRING);
PROCEDURE GrafikAus;
PROCEDURE GehZu(x, y : REAL);
PROCEDURE GehZuRel(DeltaX, DeltaY: REAL);
PROCEDURE LinienDicke(Dicke : REAL);
PROCEDURE LinienTyp(Art : INTEGER);
PROCEDURE LinienEnde(Art : INTEGER);
PROCEDURE Linie(x1, y1, x2, y2 : REAL);
PROCEDURE LinienZug(Punkte : PolygonZug;
Anzahl : INTEGER; gs: BOOLEAN);
PROCEDURE Rechteck(x1, y1, x2, y2 : REAL);
PROCEDURE ZeichenSatz(Name : STRING; Hoehe : REAL);
PROCEDURE Schreiben(Wort : STRING);
PROCEDURE SchreibenXY(x, y : REAL; Wort : STRING);
IMPLEMENTATION
CONST
autor = 'C.J'; { die eigenen Initialen }
fk = 2.834645; { Umrechnung von 1/72 inch in mm }
VAR
datei : TEXT;
dx,dy,dh : REAL;
xmax,ymax : WORD;
FUNCTION Tfx(x : REAL) : INTEGER;
{ Transformation der x-Koordinate }
BEGIN
Tfx := Round(x*dx);
END;
FUNCTION Tfy(y : REAL) : INTEGER;
{ Transformation der y-Koordinate }
BEGIN
Tfy := Round(ymax - y*dy);
END;
PROCEDURE GrafikEin(x, y : REAL; DateiName : STRING);
VAR
GraphMode,GraphDriver : INTEGER;
yr,mth,day,dow,ho,mi,se,hund : WORD;
AspectBild,AspectSchirm : REAL;
BEGIN
GetDate(yr,mth,day,dow);
GetTime(ho,mi,se,hund);
Assign(datei,DateiName);
Rewrite(datei);
Writeln(datei,'%!PS-ADOBE-2.0 EPSF-1.2');
{ Header schreiben }
Write(datei,'%%BoundingBox ');
Writeln(datei,'0 0 ', x*fk:7:2,' ',y*fk:7:2);
Writeln(datei,'%%Creator ',autor);
Writeln(datei,'%%Title ',DateiName);
Write(datei,'%%CreationDate ');
Writeln(datei,day:2,'.',mth:2,'.',
yr:4,' ',ho:2,'.', mi:2);
Writeln(datei,'%%EndComments');
{ IF RegisterBGIdriver(@CGADriverProc) < 0 THEN
IF RegisterBGIdriver(@EGAVGADriverProc) < 0 THEN
IF RegisterBGIdriver(@ATTDriverProc) < 0 THEN
IF RegisterBGIdriver(@PC3270DriverProc) < 0 THEN }
{ Hier den passenden Grafiktreiber registrieren }
IF RegisterBGIDriver(@HercDriverProc) < 0 THEN BEGIN
Writeln('Grafikfehler => Grafikkarte');
Halt(0);
END;
IF RegisterBGIFont(@SansSerIFFontProc) < 0 THEN BEGIN
Writeln('Grafikfehler');
Halt(0);
END;
GraphDriver := Detect;
InitGraph(GraphDriver,GraphMode,' ');
xmax := GetMaxX;
ymax := GetMaxY;
{ Seitenverhältnis von Bildschirm und Abbildung ermitteln }
AspectSchirm := xmax/ymax;
AspectBild := x/y;
{ Zeicheninkremente dx und dy bestimmen }
IF AspectBild < AspectSchirm THEN BEGIN
dx := xmax/x*AspectBild/AspectSchirm;
dy := ymax/y;
END ELSE BEGIN
dx := xmax/x;
dy := ymax/x*AspectSchirm/AspectBild;
END;
Rectangle(Tfx(0),Tfy(0),Tfx(x),Tfy(y));
{ Rechteck um die Bounding-Box }
END;
PROCEDURE GrafikAus;
BEGIN
REPEAT UNTIL KeyPressed;
CloseGraph;
{ Für direkt ausführbare PostScript-Programme: }
{ Writeln(datei,' showpage'}
Close(datei);
END;
PROCEDURE GehZu(x,y : REAL);
BEGIN
MoveTo(Tfx(x),Tfy(y));
Writeln(datei,x*fk:7:2,' ',y*fk:7:2,' moveto');
END;
PROCEDURE GehZuRel(DeltaX,DeltaY : REAL);
BEGIN
MoveRel(Tfx(DeltaX),Round(-dy*DeltaY));
Writeln(datei,DeltaX*fk:7:2,' ',
DeltaY*fk:7:2,' rmoveto');
END;
PROCEDURE Linie(x1,y1,x2,y2 : REAL);
BEGIN
Line(Tfx(x1),Tfy(y1),Tfx(x2),Tfy(y2));
Writeln(datei,fk*x2:7:2,' ',fk*y2:7:2,' moveto');
Writeln(datei,fk*x1:7:2,' ',fk*y1:7:2,
' lineto stroke');
END;
PROCEDURE LinienZug(Punkte : PolygonZug; Anzahl : INTEGER;
gs : BOOLEAN);
VAR
i : INTEGER;
BEGIN
Writeln(datei,' newpath');
Writeln(datei,fk*Punkte[1,1]:7:2,' ',
fk*Punkte[2,1]:7:2,' moveto');
MoveTo(Tfx(Punkte[1,1]),Tfy(Punkte[2,1]));
FOR i:=2 TO Anzahl DO BEGIN
LineTo(Tfx(Punkte[1,i]),Tfy(Punkte[2,i]));
Writeln(datei,fk*Punkte[1,i]:7:2,
' ',fk*Punkte[2,i]:7:2,' lineto');
END;
IF gs THEN BEGIN
LineTO(Tfx(Punkte[1,1]),Tfy(Punkte[2,1]));
Writeln(datei,'closepath');
END;
Writeln(datei,'stroke');
END;
PROCEDURE Schreiben(wort : STRING);
BEGIN
OutText(wort);
Writeln(datei,'(',wort,') show');
END;
PROCEDURE SchreibenXY(x,y : REAL ; wort : STRING);
BEGIN
GehZu(x,y);
Schreiben(wort);
END;
PROCEDURE Zeichensatz(Name : STRING ; hoehe : REAL);
BEGIN
Writeln(datei,'/',Name,' findfont ',
hoehe:6:2,' scalefont setfont');
END;
PROCEDURE LinienDicke(Dicke : REAL);
BEGIN
Writeln(datei,Dicke*fk:7:2,' setlinewidth');
END;
PROCEDURE LinienTyp(Art : INTEGER);
BEGIN
CASE Art OF
0 : Writeln(datei, '[] 0 setdash'); { durchgezogen }
1 : Writeln(datei, '[2] 0 setdash');
2 : Writeln(datei, '[5 2] 1 setdash');
3 : Writeln(datei, '[5 4] 1 setdash');
4 : Writeln(datei, '[6 4] 1 setdash');
END;
END;
PROCEDURE LinienEnde(Art : INTEGER);
BEGIN
CASE Art OF
0 : Writeln(datei, '0 setlinecap');
{ 0 = rechtwinklige Enden }
1 : Writeln(datei, '1 setlinecap');
{ 1 = abgerundete Enden }
2 : Writeln(datei, '2 setlinecap');
{ 2 = rechtwinklige Enden, aber }
{ Linien um die halbe Breite verlängert }
END;
END;
PROCEDURE Rechteck(x1,y1,x2,y2 : Real);
BEGIN
Rectangle(Tfx(x1),Tfy(y1),Tfx(x2),Tfy(y2));
Writeln(datei,'newpath');
Writeln(datei,x1*fk:7:2,' ',y1*fk:7:2,' moveto');
Writeln(datei,x1*fk:7:2,' ',y2*fk:7:2,' lineto');
Writeln(datei,x2*fk:7:2,' ',y2*fk:7:2,' lineto');
Writeln(datei,x2*fk:7:2,' ',y1*fk:7:2,' lineto');
Writeln(datei,x1*fk:7:2,' ',y1*fk:7:2,
' lineto closepath stroke');
END;
END.
(* ------------------------------------------------------ *)
(* Ende von EPS.TPU *)