CFF

Details

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
uint16vorzeichenlose 16-Bit Zahl
uint24vorzeichenlose 24-Bit Zahl
int32 vorzeichenbehaftete 32-Bit Zahl
uint32vorzeichenlose 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.

CFF Index

Ein CFF Index ist ein Block mit ein oder mehreren Werten. Diese Werte können selbst Unterblöcke sein. Ein Index beginnt immer folgendermassen:

PositionLänge Typ Inhalt
02 Byteuint16Anzahl Werte
21 Byteuint8 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.

CFF Dictionary

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.

BytewertTyp
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

Schlüssel

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.

int16/int32

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.

Dezimalbruch

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:

WertBedeutung
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.

einfache und erweiterte Zahlen

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:

BytewertFormel
32-246 B1 - 139
247-250 (B1 - 247) * 256 + B2 + 108
251-254 0 - ((B1 - 251) * 256 + B2 + 108)

Dateiaufbau

Eine CFF-Datei beginnt immer mit folgenden vier Blocks:

  1. Header
  2. Namenindex
  3. Top Dictionaryindex
  4. Stringindex

Der Header beginnt immer mit folgenden 3 Bytes:

PositionLänge Typ Inhalt
01 Byteuint8Version
11 Byteuint8Unterversion
21 Byteuint8Headergrösse

Anhand der Headergrösse lässt sich die Position des Namenindex ermitteln.

Namenindex

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.

Top Dictionaryindex

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üsselInhalt
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/30CID 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.

Stringindex

Dieser Index enthält die Strings für die String-IDs ab 391. Die Kodierung ist jeweils ISO Latin-1.