Bislang haben wir, um eine Figur zu zeichnen, jeweils mit der Anweisung m
einen Anfangspunkt bestimmt, von diesem aus mit l
und c
Anweisungen den Umriss definiert, und die Figur schliesslich mit einer der Anweisungen f
, s
, S
, b
oder B
gezeichnet. Eine Figur kann aber auch aus mehreren Flächen zusammengesetzt werden.
Im Grundsatz ist die Idee einfach: Zunächst wird der Umriss der ersten Fläche wie gehabt mittels m
, l
und c
definiert. Daraufhin definiert man wiederum mittels m
, l
und c
die zweite Fläche. Das wiederholt man, bis alle Flächen definiert sind. Dann erst folgt die Zeichenanweisung.
Eine Besonderheit gilt es noch bei den s
und b
Anweisungen zu beachten. Diese bewirken bekanntlich, dass der gesamte Umriss gezeichnet wird, auch wenn wir die letzte Gerade zurück zum Startpunkt nicht definiert haben. Sind mehrere Flächen definiert, so funktioniert dies aber nur für die letzte Fläche. Die übrigen Flächen bleiben „offen“. Für solche Fälle ist die h
Anweisung nützlich. Sie definiert eine Linie vom aktuellen Punkt zum Startpunkt der aktuellen Fläche.
Genug der Rede. Hier ein Beispiel:
1 0 0 RG 0 g 100 150 m 150 200 l 200 150 l 150 100 l h 250 150 m 300 200 l 350 150 l 300 100 l b
Gut und schön, aber was bringt und das in der Praxis? Nun, es ist die Grundlage für eine simple aber mächtige Technik:
Besteht eine Figur aus mehreren Flächen, so können sich diese natürlich überschneiden. Rücken wir mal die zwei Rhomben von oben etwas zusammen:
1 0 0 RG 0 g 100 150 m 150 200 l 200 150 l 150 100 l h 150 150 m 200 200 l 250 150 l 200 100 l b
So weit, so unspektakulär. Aber ändern wir unser Beispiel doch leicht ab:
1 0 0 RG 0 g 100 150 m 150 200 l 200 150 l 150 100 l h 150 150 m 200 100 l 250 150 l 200 200 l b
Nun ist die Schnittfläche nicht mehr schwarz, sondern weiss. Genaugenommen ist sie nicht mehr Teil der Figur. Hätten wir in der entsprechenden Region vorher etwas gezeichnet, so wäre es durch die Schnittfläche hindurch sichtbar. Wir können Schnittflächen also nutzen, um Löcher in Figuren zu stanzen. Hier ein anderes Beispiel:
100 150 m 150 200 l 200 150 l 150 100 l 125 150 m 150 125 l 175 150 l 150 175 l f
Wie aber definieren wir, ob die Schnittfläche ein Teil der Figur ist, oder nicht? Dafür gibt es zwei Regeln, zwischen denen wir wählen können:
In den obigen drei Beispielen habe ich die Standardregel verwendet. Nach dieser muss der PDF Interpreter die überschneidenden Flächen ermitteln, und zählen, bei wievielen der Umriss im Uhrzeigersinn, und bei wievielen im Gegenuhrzeigersinn definiert wurde. Ist die Anzahl identisch, so gilt die Schnittfläche nicht als Teil der Figur, und wird ausgestanzt. Übrigens: Die re
Anweisung definiert das Rechteck immer im Gegenuhrzeigersinn.
Schauen wir uns die Beispiele oben nochmals an, so kann man erkennen, dass ich zunächst beide Rhomben im Uhrzeigersinn definiert habe. Bei den letzten beiden Beispielen hingegen habe ich den ersten Rhombus im Uhrzeigersinn, den zweiten im Gegenuhrzeigersinn definiert. Somit gab es je eine überschneidende Fläche im Uhrzeigersinn und Gegenuhrzeigersinn, wodurch die Schnittfläche nicht zur Figur gehört.
Diese Regel ist war mächtig, manchmal aber etwas unpraktisch. Darum gibt es noch eine einfachere, alternative Regel:
Bei dieser Regel wird einfach die Anzahl der überschneidenden Flächen gezählt. Ist sie gerade, so ist die Schnittfläche nicht Teil der Figur, ansonsten schon. In den obigen Beispielen wäre die Schnittfläche also immer ausgestanzt worden.
Diese Regel ist in der Vektorgrafik wegen ihrer Einfachheit beliebt. Um sie in PDF zu verwenden, gibt es drei weitere Zeichenanweisungen:
f* | Fläche füllen mit der Gerade/Ungerade-Regel |
---|---|
b* | Kombination von s und f* |
B* | Kombination von S und f* |
Übrigens: Wird eine Fläche so definiert, dass sie sich selbst überschneidet, so werden ebenfalls obige Regeln angewendet. Dabei wird die sich selbst überschneidende Fläche mehrfach gezählt.
Jedesmal wenn wir eine Figur zeichnen, können wir sie als Clipping (Ausschnitt) definieren. Alle folgenden Anweisungen werden nur noch so weit gezeichnet, wie sie sich innerhalb des Clipping befinden. Enthält die Figur dabei mehrere sichtbare Flächen, so gelten sie alle als Teil des Clipping (womit wir einen weiteren Nutzen für Figuren mit mehreren Flächen hätten).
Ein Clipping wirkt sich auch auf nachfolgende Clippings aus. Folglich lässt es sich nicht über eine zweite Definition wieder zurücksetzen. Für diesen Zweck müssen wir Gruppierung verwenden.
Um eine Figur als Clipping zu definieren müssen wir unmittelbar vor die Zeichenanweisung eine der Anweisungen W
oder W*
einsetzen. Erstere verwendet für Überschneidungen die Standardregel, letztere die Gerade/Ungerade-Regel.
Beispiel:
100 150 m 150 200 l 200 150 l 150 100 l 250 150 m 300 200 l 350 150 l 300 100 l W f
Damit zeichnen wir die beiden Rhomben aus dem ersten Beispiel, und definieren sie gleichzeitig als Clipping.
Oftmals will man nur ein Clipping definieren, ohne aber etwas zu zeichnen. Auf die Anweisungen W
und W*
muss aber zwingend immer eine Zeichenanweisung folgen. Für diesen zweck gibt es die „Zeichenanweisung“ n
, welche gar nichts zeichnet. Um also die beiden Rhomben als Clipping zu definieren, ohne sie zu zeichnen, können wir folgendermassen vorgehen:
100 150 m 150 200 l 200 150 l 150 100 l 250 150 m 300 200 l 350 150 l 300 100 l W n
Sowohl in TrueType wie auch in Type1 Schriften (egal ob Postscript oder OpenType) sind die einzelnen Zeichen im Grunde komplexe Figuren wie oben beschrieben. Man kann sich das so vorstellen, wie wenn für jedes Zeichen eine Serie von m
, l
, c
und h
Anweisungen definiert wäre. Für Schnittflächen gilt dabei grundsätzlich die Standardregel1).
Wenn wir in PDF einen Text setzen, so wird für jedes Zeichen der Umriss bestimmt, und dieser anschliessend gefüllt, was der f
Anweisung entspricht. Darum ist die Füllfarbe gleichzeitig die Textfarbe. Wir können das aber ändern, und zwar mit der Tr
Anweisung. Diese erwartet einen Parameter mit einer Zahl. Folgende Zahlen sind dabei möglich:
0 | Zeichen füllen |
---|---|
1 | Zeichenumriss zeichnen |
2 | Zeichen füllen und Umriss zeichnen |
3 | nichts zeichnen |
Die Tr
Anweisung darf innerhalb und ausserhalb von Textobjekten stehen.
Zusätzlich ist es möglich, ein Textobjekt als Clipping zu definieren. Dabei gelten alle Zeichen des Textobjekts als Teil des Clipping. Dies wird ebenfalls mittels Tr
definiert, und zwar über vier weitere mögliche Werte:
4 | Zeichen füllen (Clipping) |
---|---|
5 | Zeichenumriss zeichnen (Clipping) |
6 | Zeichen füllen und Umriss zeichnen (Clipping) |
7 | nichts zeichnen (Clipping) |
In Zusammenhang mit Clipping gibt es eine zusätzliche Regel für Tr
Anweisungen innerhalb von Textobjekten: Namentlich darf nicht innerhalb eines Textobjekts von einem Clippingmodus in einen normalen Zeichenmodus gewechselt werden. Hingegen ist es erlaubt, innerhalb eines Textobjekts von einem normalen Zeichenmodus in einen Clippingmodus zu wechseln. In diesem Fall gehören nur die nachfolgenden Zeichen des Textobjekts zum Clipping.
Beispiel:
q 0 g /F1 24 Tf 4 Tr BT 72 670 Td (Hallo ) Tj 5 Tr (Welt) Tj ET 0 Tr 0 0 1 rg 72 660 200 20 re f Q
Diskussion