home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* 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 *)