Dies ist ein binäres Format in Big-Endian Anordnung. Folgende Datentypen kommen zur Anwendung:
char | String mit 8-Bit Kodierung |
---|---|
uint8 | vorzeichenlose 8-Bit Zahl |
int16 | vorzeichenbehaftete 16-Bit Zahl |
uint16 | vorzeichenlose 16-Bit Zahl |
uint24 | vorzeichenlose 24-Bit Zahl |
int32 | vorzeichenbehaftete 32-Bit Zahl |
uint32 | vorzeichenlose 32-Bit Zahl |
Der „CFF “ Block in OpenType enthält eine CFF-Datei.
Die Daten sind in aufeinanderfolgenden Blocks organisiert. Die meisten Blocks verwenden das Format eines CFF Index oder eines CFF Dictionaries.
Ein CFF Index ist ein Block mit ein oder mehreren Werten. Diese Werte können selbst Unterblöcke sein. Ein Index beginnt immer folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Anzahl Werte |
2 | 1 Byte | uint8 | Positionsgrösse |
Darauf folgt eine Liste der Positionen der Werte.
Direkt auf die Positionenliste folgt die Werteliste. Die Werte sind darin direkt hintereinander abgelegt. Die Länge der Werte lässt sich somit aus ihrer Position und der nachfolgenden Position berechnen.
Nach der Werteliste folgt der nächste Block.
Ein CFF Dictionary enthält ein oder mehrere Schlüssel, denen jeweils ein oder mehrere Werte zugeordnet sind. Es werden jeweils der oder die Werte geschrieben, gefolgt vom zugehörigen Schlüssel.
Werte und Schlüssel sind Zahlen in verschiedenen Kodierungen. Ob es sich um einen Wert oder Schlüssel handelt, wird durch das jeweils erste Byte bestimmt, welches als uint8 gelesen werden sollte.
Bytewert | Typ |
---|---|
0-11 | einfacher Schlüssel |
12 | erweiterter Schlüssel |
13-21 | einfacher Schlüssel |
28 | int16 |
29 | int32 |
30 | Dezimalbruch |
32-246 | einfache Zahl |
247-250 | erweiterte, positive Zahl |
251-254 | erweiterte, negative Zahl |
Ein Byte von 0 bis 11 oder 13 bis 21 ist ein einfacher Schlüssel, der nur aus diesem Byte besteht.
Ein Byte von 12 ist der Anfang eines erweiterten Schlüssels. Der Schlüssel besteht aus diesem und dem nächsten Byte, welches als uint8 gelesen werden sollte.
Ein Byte von 28 bedeutet, dass die nachfolgenden 2 Bytes einen int16 Wert enthalten.
Ein Byte von 29 bedeutet, dass die nachfolgenden 4 Bytes einen int32 Wert enthalten.
Ein Byte von 30 bedeutet, dass die nachfolgenden Bytes einen Dezimalbruch in BCD-Notation enthalten. Dabei steht jedes Halbbyte für eine Stelle. Die einzelnen Bytes beschreiben die Zahl von Links nach Rechts, wobei das jeweils höherwertige Halbbyte für die linke, das niederwertige Halbbyte für die rechte Stelle steht. Die möglichen Werte der Halbbytes haben folgende Bedeutung:
Wert | Bedeutung |
---|---|
0-9 | Ziffer 0 - 9 |
10 | Dezimalpunkt |
11 | E |
12 | E- |
14 | Minus |
15 | Ende der Zahl |
Das Halbbyte mit Wert 15 markiert das Ende der Zahl. Falls dies ein oberes Halbbyte ist, muss auch das untere Halbbyte den Wert 15 erhalten.
Ein Byte von 32 bis 246 ist eine einfache Zahl, die nur aus diesem Byte (B1) besteht. Ein Byte von 247 bis 254 ist eine erweiterte Zahl, die aus diesem Byte (B1) und dem nächsten Byte (B2) besteht, welches als uint8 gelesen werden sollte. Der eigentliche Wert errechnet sich wie folgt:
Bytewert | Formel |
---|---|
32-246 | B1 - 139 |
247-250 | (B1 - 247) * 256 + B2 + 108 |
251-254 | 0 - ((B1 - 251) * 256 + B2 + 108) |
Eine CFF-Datei beginnt immer mit folgenden vier Blocks:
Der Header beginnt immer mit folgenden 3 Bytes:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 1 Byte | uint8 | Version |
1 | 1 Byte | uint8 | Unterversion |
2 | 1 Byte | uint8 | Headergrösse |
Anhand der Headergrösse lässt sich die Position des Namenindex ermitteln.
Dieser Index enthält die Postscript-Namen der enthaltenen Schriften in Latin-1 Kodierung. Bei OpenType kann nur eine Schrift enthalten sein, dementsprechend hat der Index immer genau einen Eintrag.
Dieser Index enthält die Top-Dictionaries der enthaltenen Schriften. Bei OpenType kann nur eine Schrift enthalten sein, weswegen nur ein Dictionary vorhanden ist. Das Dictionary kann folgende Schlüssel enthalten:
Schlüssel | Inhalt |
---|---|
0 | Schriftversion (String) |
1 | Hinweis |
2 | erweiterter Schriftname |
3 | Schriftart |
4 | Schriftdicke (String) |
5 | Zeichenumfang |
13 | UUID |
14 | XUID |
15 | Position Zeichensatz |
16 | Position Kodierung |
17 | Position Zeichenbeschreibung |
18 | Position Private-Dictionary |
12/0 | Copyright |
12/1 | Fixbreitenschrift |
12/2 | Schrägung |
12/3 | Unterstreichungsposition |
12/4 | Unterstreichungsdicke |
12/5 | Zeichnungsart |
12/6 | Zeichenbeschreibungsart |
12/7 | Skala |
12/8 | Liniendicke |
12/20 | Basisschrift |
12/21 | Postscript-Code |
12/22 | Basisschriftname |
12/23 | Basisschriftblending |
12/30 | CID Registry/Ordering/Supplement |
12/31 | CID Schriftversion (Nummer) |
12/32 | CID Schriftunterversion (Nummer) |
12/33 | CID Typ (Nummer) |
12/34 | CID Anzahl |
12/35 | CID UUID |
12/36 | CID Schriftdeskriptorarray |
12/37 | CID Schriftdeskriptorselektor |
12/38 | CID Schriftname |
Davon ist für uns insbesondere 12/30 interessant. Dieser Schlüssel kommt nur bei CID-Schriften vor, dort aber immer. Er enthält drei Werte mit der String-ID für Registry, der String-ID für Ordering und der Nummer für Supplement.
Dieser Index enthält die Strings für die String-IDs ab 391. Die Kodierung ist jeweils ISO Latin-1.
Diskussion