|
|
|
|
PostScript | Abfrage Operatoren (cgi) | Abfrage Operatoren (php) Ein paar einfache PostScript-BeispielePostScript examples (in German)Der PostScript-Programmierer muss unbedingt mit dem Operanden-Stack, dem Koordinatensystem, dem grafischen Status und dem Dictionary vertraut sein. Haben Sie die Einführung Die PostScript-Sprache (13 Seiten, pdf, fünf Abbildungen) schon gelesen?
1. Die deutsche Flagge![]() Wenn wir einen geschlossenen Pfad gebildet haben, können wir die Fläche mit einer Farbe füllen (area filling). Dazu dient die Kombination der Operatoren setrgbcolor und fill. Wir zeichnen die deutsche Flagge, indem wir die drei Balken mit je einer anderen Farbe bzw. Farbmischung versehen. Die drei Operanden von setrgbcolor müssen alle im Bereich von 0 bis 1 liegen, der erste Operand gibt den Rot-Anteil, der zweite den Grün-Anteil und der dritte den Blau-Anteil. Die gelbe Farbe kann beispielsweise mit "1 1 0 setrgbcolor" erzeugt werden. Voraussetzung für das Arbeiten mit setrgbcolor ist der Zugang zu einem PostScript-Gerät, das farbig drucken kann. Ein Schwarz/Weiss-Drucker wandelt die Farben allerdings in entsprechende Graustufen um! Die deutsche Flagge. %!PS-Adobe-2.0 EPSF-2.0 %%Title: fill.ps %%BoundingBox: 100 100 330 250 %%EndComments % Modell RGB % Farben rot-gruen-blau 100 100 translate newpath 0 0 moveto 230 0 lineto 230 50 lineto 0 50 lineto closepath % Pfad schliessen 1 1 0 setrgbcolor % gelb fill % fuellen newpath 0 50 moveto 230 50 lineto 230 100 lineto 0 100 lineto closepath % Pfad schliessen 1 0 0 setrgbcolor % rot fill % fuellen newpath 0 100 moveto 230 100 lineto 230 150 lineto 0 150 lineto closepath % Pfad schliessen 0 0 0 setrgbcolor % schwarz fill % fuellen showpage %%TrailerPostScript unterstützt nicht nur das additive RGB-Farbmodell, sondern u.a. auch das subtraktive CMYK-Modell. Der entsprechende Operator nennt sich setcmykcolor. Die vier Buchstaben bedeuten:
Hausaufgabe: modifizieren Sie das obige Programm für die österreichische Flagge. 2. Text drucken (Beispiel Zapf Dingbats)Alle PostScript-Drucker und Satzmaschinen kennen mindestens 13 Standard-Fonts. Bei den Standard-Fonts handelt es sich um Times normal, kursiv, fett und fett-kursiv; Helvetica normal, kursiv, fett und fett-kursiv; Courier normal, kursiv, fett und fett-kursiv, und um den Symbol Font. Seit 1988 haben die meisten Drucker mindestens 35 eingebaute Fonts; dazu zählt auch der Font Zapf Dingbats im Beispiel.Die Adobe Type Bibliothek enthält jedoch eine grosse Zahl weiterer Schriften, so zum Beispiel: Palatino, Garamond, Korinna, Letter Gothic, Helvetica Condensed, Sonata (für Musiknoten), usw. usw. Der Font Zapf Dingbats. Die Prozedur showline hat zwei Funktionen:
Ausser showline und ScaleTo definieren wir keine weiteren Prozeduren.
%!PS Sample
%%DocumentFonts: ZapfDingbats
/showline {
gsave show grestore 0 lineskip rmoveto}
def
/ScaleTo {
dup neg /lineskip exch def
/ZapfDingbats findfont exch scalefont
setfont } def
%%EndProlog
% Schrift in Punktgroesse 60:
60 ScaleTo
% gehe auf der Seite nach oben:
36 700 moveto
(ABCDEFGHIJKLM) showline % Zeile drucken
(NOPQRSTUVWXYZ) showline
(abcdefghijklm) showline
(nopqrstuvwxyz) showline
(à1234567890-=) showline
(~!@#$%^&*()_+) showline
([]\{}|;':",./<>?) showline
( ) showline
% Punktgroesse reduzieren:
24 ScaleTo
(The quick brown fox jumps over the lazy dog. 0123456789)
showline % Zeile drucken
18 ScaleTo
(The quick brown fox jumps over the lazy dog. 0123456789)
showline
12 ScaleTo
(The quick brown fox jumps over the lazy dog. 0123456789)
showline
6 ScaleTo
(The quick brown fox jumps over the lazy dog. 0123456789)
showline
/showline { gsave show grestore 0 -12 rmoveto }
def
/Times-Roman findfont 12 scalefont setfont
/s40 40 string def
( ) showline % Leerzeile
(Total memory: ) showline
vmstatus s40 cvs showline % 1.Wert von vmstatus
(Memory used: ) showline
s40 cvs showline pop % 2.Wert von vmstatus
( Free memory: ) showline
vmstatus exch sub s40 cvs showline
% 1.Wert - 2.Wert
pop
showpage
Siehe auch
Font-Darstellung, Zeichenbeschreibung.
3. Firmensignete und LogosDie Seitenbeschreibungssprache PostScript eignet sich auch dazu, Logos oder Firmensignete zu konstruieren. Das Beispiel BOZEN illustriert die Integration von Text und Grafik. Wir konstruieren je eine Prozedur zum Zeichnen der Berge und der Sonne und zum Drucken des Textes.BOZEN-Logo Version 0Als Schrift wählen wir "Helvetica fett" in einer Grösse von 24 Punkt. Der definierte Operator fourpops dient lediglich dazu, vier überflüssige Objekte auf dem Stack zu vernichten. Diese vier Objekte werden von arcto erzeugt.Der Operator fill füllt wiederum den aktuellen Pfad mit einer Farbe auf. Der Operator stringwidth gibt die Länge des Strings (Zeichenkette, Schriftzug) zurück. Position des String-Anfangs = (108-Länge)/2. Diese Formel sorgt dafür, dass der String "BOZEN" schön zentriert wird. Das Logo BOZEN
%!PS-Adobe-2.0 EPSF-2.0
%%Title: (Logo, Version 0)
%%BoundingBox: 288 99 398 200
%%DocumentFonts: Helvetica-Bold
%%EndComments
/Helvetica-Bold findfont 24 scalefont setfont
/fourpops
{4 {pop} repeat} def
/berge
{ 0 setgray % schwarz
0 18 moveto
10 72 lineto 30 62 lineto
60 72 lineto 108 36 lineto
108 0 0 0 18 arcto fourpops
0 0 0 72 18 arcto fourpops
fill } def
/sonne
{ newpath .6 setgray % grau
91 55 18 0 360 arc fill
} def
/text
{ 1 setgray % weiss
0 -1 moveto
(BOZEN) stringwidth pop
108 exch sub 2 div
0 rmoveto
(BOZEN) show } def
%%EndProlog
% Jetzt folgt das Script:
288 100 translate
sonne
berge
text
showpage
BOZEN-Logo Version 1In einer anderen Version des Programms wandeln wir das Beispiel leicht ab, indem wir die Schriftzeichen bei konstanter Breite höher machen. "1 2 scale" lautet der zusätzliche Befehl, die Breite wird mit 1, die Höhe mit 2 multipliziert. Den gleichen Effekt hätten wir auch mit dem Operator makefont erzielen können. Der Operator "24 scalefont" müsste lediglich durch "[24 0 0 48 0 0] makefont" ersetzt werden.
%!PS-Adobe-2.0 EPSF-2.0
%%Title: (Logo, Version 1)
%%BoundingBox: 288 99 398 200
%%DocumentFonts: Helvetica-Bold
%%EndComments
/Helvetica-Bold findfont 24 scalefont setfont
/fourpops
{4 {pop} repeat} def
/berge
{ 0 setgray % schwarz
0 18 moveto
10 72 lineto 30 62 lineto
60 72 lineto 108 36 lineto
108 0 0 0 18 arcto fourpops
0 0 0 72 18 arcto fourpops
fill } def
/sonne
{ newpath .6 setgray % grau
91 55 18 0 360 arc fill
} def
/text
{ 1 setgray % weiss
0 -1 moveto
1 2 scale % Zeichen hoeher machen
(BOZEN) stringwidth pop
108 exch sub 2 div
0 rmoveto
(BOZEN) show } def
%%EndProlog
288 100 translate
sonne
berge
text
showpage
Nachdem der Operator translate den Ursprung des
Koordinatensystems
verschoben hat, ruft das Script der Reihe nach die Routinen sonne, berge und text auf.
Das Logo BOZEN mit hohen Schriftzeichen Integration von Text und Grafik bedeutet nicht nur das Mischen von Text- und Grafik-Elementen, sondern auch das Einbeziehen und Abwandeln von typografischem Material (es muss nicht immer Helvetica sein). Beispiel Weinflasche (gif). 4. Der Operator forall
Der Operator forall zählt alle Elemente eines Zahlenvektors, d.h. eines
Arrays, auf. In unserem Beispiel sind die einzelnen Buchstaben von
"ORGELKONZERT" die Vektorelemente. Innerhalb der Schleife wird der aktuelle
Buchstabe der Variablen buchstabe zugewiesen (/buchstabe exch def).
Die Schriftgrösse wird bei jedem Durchgang um einen Punkt reduziert. Die Zeile "ps ps 1 sub def" bewirkt, dass der erste Buchstabe von "ORGELKONZERT" in der Grösse von 24 Punkt, der zweite Buchstabe in 23 Punkt, der dritte Buchstabe in 22 Punkt, usw. gesetzt wird.
Der Operator show, der sich ebenfalls innerhalb der Schleife befindet, setzt Buchstabe um Buchstabe. Der Operator showpage gibt das bedruckte Blatt letztendlich aus.
%!PS-Adobe-2.0 EPSF-2.0
%%DocumentFonts: Times-Roman
%%Title: forall.ps
%%BoundingBox: 96 100 240 160
%%EndComments
/ps 25 def % Schrifthoehe (point size)
/T /Times-Roman findfont def
%%EndProlog
100 100 translate
20 rotate % alles um 20 Grad drehen
0 0 moveto
% Jetzt folgt die forall-Schleife:
[(O)(R)(G)(E)(L)(K)(O)(N)(Z)(E)(R)(T)]
{
/buchstabe exch def
/ps ps 1 sub def
T ps scalefont setfont
buchstabe show
} forall % Ende der Schleife
showpage
%%Trailer
ORGELKONZERT mit dem Operator forall.
5. Rechteck-OperatorenRechtecke sind ein häufiges Gestaltungselement. Betrachten wir deshalb, wie man einen Rahmen mit Schatten zeichnet. Wir lösen das Problem mit einer wiederverwendbaren Prozedur:
% x y w h rect -
/rect {
/h exch def % Hoehe
/w exch def % Breite
/y exch def % Y-Position
/x exch def % X-Position
x y moveto
w 0 rlineto 0 h rlineto w neg 0 rlineto
closepath
} def
gsave
.6 setgray
9 -9 translate
50 550 500 200 rect fill % Schatten
grestore
gsave
1 setgray
50 550 500 200 rect fill % Hintergrund weiss
0 setgray
50 550 500 200 rect stroke % Umriss schwarz
grestore
showpage
Abbildung:
Rahmen mit Schatten.
Wie der Name rect sagt, baut die Prozedur rect einen Rechteck-Pfad auf. Dabei geben x und y die untere linke Ecke an, und w und h die Breite und Höhe des Rechtecks. Die Sequenz moveto-rlineto-rlineto-rlineto-closepath wird in PostScript Level 1 sehr häufig verwendet. Im ersten gsave/grestore-Segment wird der Schatten des Rechtecks gezeichnet, im zweiten Segment das Rechteck selbst (weiss fill) und dessen Umrisse (schwarz stroke). Die Verschiebung um 9 Punkt bewirkt, dass der grösste Teil des dunkeln Rechtecks unsichtbar ist, da dieses unter dem weissen Rechteck liegt. Für PostScript Level 2 ist die Prozedur unnötig, denn rectfill ist (wie auch rectstroke) ein neuer Operator. Hier sieht das Beispiel so aus: % neue Rechteck-Operatoren von Level 2: gsave .6 setgray 9 -9 translate 50 550 500 200 rectfill % Schatten grestore gsave 1 setgray 50 550 500 200 rectfill % Hintergrund weiss 0 setgray 50 550 500 200 rectstroke % Umriss schwarz grestore showpageAuf einer Workstation sind nicht nur die Fenster, sondern auch viele andere Objekte rechteckig. Das folgende Beispiel zeichnet ein kleines weisses Quadrat:
bool
{
1 setgray % weiss
X 2 sub Y 2 sub 4 4 rectfill % Rechteck
}
if
Das kleine Quadrat wird aber nur dann gezeichnet, wenn die Variable bool true ist. Haben Sie sich inzwischen daran gewöhnt, dass der PostScript-Operator nach den Operatoren steht? In anderen Sprachen würde der Operator "if" gewöhnlich zuerst kommen:
if (bool) PSrectfill(...) ;PostScript verwendet jedoch eine Postfix-Notation. 6. Die StrichstärkeDie Strichstärke kann mit dem Operator setlinewidth festgelegt werden. Beispiel:1 setlinewidth % 1 typograph. PunktDie Strichdicke ist ein Element des grafischen Status, der global für alle grafischen Objekte gilt. 7. Weitere ThemenSiehe auch Ablaufkontrolle..., Speicherplatz-Verwaltung..., der Clip-Pfad..., Text setzen..., Bézier-Kurven..., der Operator makefont..., der Operator image..., der PostScript-Zeichensatz...;PostScript-Operatoren:
LiteraturVollenweider, Peter: PostScript, 2. Auflage, Carl Hanser Verlag, München und Wien, 1991. Auflagen von 2000 und 1000 Ex. sind vergriffen.
PostScript
| Abfrage Operatoren (cgi)
| Abfrage Operatoren (php)
|