Die Tabelle beginnt folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Anzahl Schriftsysteme |
Danach folgt für eine Liste mit einem Eintrag für jedes Schriftsystem:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 4 Byte | char | Schriftsystem-ID |
4 | 2 Byte | uint16 | Position Sprachtabelle |
Liste der Schriftsystem-IDs (bei Microsoft)
Die Position ist gerechnet ab dem Anfang der Schrift/Sprachtabelle. Die Sprachtabelle beginnt folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Position Standardfeaturenummern |
2 | 2 Byte | uint16 | Anzahl Sprachen |
Danach folgt eine Liste mit einem Eintrag für jede Sprache:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 4 Byte | char | Sprachen-ID |
4 | 2 Byte | uint16 | Position Featurenummern |
Liste der Sprach-IDs (bei Microsoft)
Eine Position von 0 bedeutet, das keine Featurenummern zugeordnet sind. Ansonsten ist die Position gerechnet ab dem Anfang der Sprachtabelle. Die Tabelle der Featurenummern beginnt folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | unbenutzt |
2 | 2 Byte | uint16 | benötigtes Feature |
4 | 2 Byte | uint16 | Anzahl Features |
Danach folgt eine Liste mit einem Eintrag für jedes Feature:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Featurenummer |
Ein Wert 65535 für „benötigtes Feature“ bedeutet, dass es kein zwingend benötigtes Feature gibt.
Die Tabelle beginnt folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Anzahl Features |
Danach folgt eine Liste mit einem Eintrag für jedes Feature:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 4 Byte | char | Feature-ID |
4 | 2 Byte | uint16 | Position Lookupnummern |
Die Featurenummer erhält man, indem man die Features ab 0 durchnummeriert.
Liste der Feature-IDs (bei Microsoft)
Die Position ist gerechnet ab dem Anfang der Featuretabelle. Die Tabelle der Lookupnummern beginnt folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | unbenutzt |
2 | 2 Byte | uint16 | Anzahl Lookupeinträge |
Danach folgt eine Liste der Lookupnummern:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Lookupnummer |
Die Tabelle beginnt folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Anzahl Lookupeinträge |
Danach folgt eine Liste mit den Positionen der Lookupeinträge:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Position Lookupeintrag |
Die Lookupnummer erhält man, indem man die Lookupeinträge ab 0 durchnummeriert.
Die Position ist gerechnet ab dem Anfang der Lookuptabelle. Der Lookupeintrag beginnt folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Typ |
2 | 2 Byte | uint16 | Flags |
4 | 2 Byte | uint16 | Anzahl Unterblocks |
Danach folgt eine Liste der Positionen der Unterblocks:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Position Unterblock |
Die Position ist gerechnet ab dem Anfang des Lookupeintrags.
Die Liste beginnt folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Format (immer 1) |
2 | 2 Byte | uint16 | Anzahl Einträge |
Danach folgt eine Liste der GIDs:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | GID |
Die Liste beginnt folgendermassen:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Format (immer 2) |
2 | 2 Byte | uint16 | Anzahl Bereiche |
Danach folgt eine Liste mit einem Eintrag für jeden Bereich:
Position | Länge | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | erste GID |
2 | 2 Byte | uint16 | letzte GID |
4 | 2 Byte | uint16 | erste Indexnummer |
Die Definition beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Format (immer 1) |
2 | 2 Byte | uint16 | erste GID |
4 | 2 Byte | uint16 | Anzahl GIDs |
Danach folgt eine Liste für die GIDs ab der ersten GID:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Klassennummer |
Nicht enthaltene GIDs sind in der Klasse 0.
Die Definition beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Format (immer 2) |
2 | 2 Byte | uint16 | Anzahl GID-Bereiche |
Danach folgt eine Liste mit einem Eintrag für jeden Bereich:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | erste GID |
2 | 2 Byte | uint16 | letzte GID |
4 | 2 Byte | uint16 | Klassennummer |
In keinem Bereich enthaltene GIDs sind in der Klasse 0.
Der Block beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 4 Byte | uint32 | Version |
4 | 2 Byte | uint16 | Position Schrift/Sprachtabelle |
6 | 2 Byte | uint16 | Position Featuretabelle |
8 | 2 Byte | uint16 | Position Lookuptabelle |
Damit lassen sich über das Lookupsystem die Unterblocks ermitteln. Passen mehrere Unterblocks auf ein Feature, so wirken die Einträge kumulativ.
Dieser Typ behandelt paarweise Positionierung.
Der Unterblock beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Format (immer 1) |
2 | 2 Byte | uint16 | Position Zeichenliste |
4 | 2 Byte | uint16 | Werteformat 1 |
6 | 2 Byte | uint16 | Werteformat 2 |
8 | 2 Byte | uint16 | Anzahl Paarlisten |
Die Position ist gerechnet ab dem Anfang des Unterblocks. Die Zeichenliste enthält die möglichen Zeichen links.
Für klassische Unterschneidung gilt: Das Werteformat 1 muss 4 oder 68 sein, das Werteformat 2 muss 0 sein.
Danach folgt eine Liste der Positionen der Paarlisten:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Position Paarliste |
Die Position ist gerechnet ab dem Anfang des Unterblocks.
Jede Paarliste deckt eines der möglichen Zeichen links aus der Zeichenliste ab (identische Reihenfolge). Die Paarliste beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Anzahl Paare |
Danach folgt eine Liste mit einem Eintrag für jedes Paar. Der Inhalt jeden Eintrags ist vom Werteformat 1 abhängig.
Bei einem Wert von 4:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | GID rechts |
2 | 2 Byte | int16 | Unterschneidung |
Bei einem Wert von 68:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | GID rechts |
2 | 2 Byte | int16 | Unterschneidung |
4 | 2 Byte | uint16 | Position Hintingtabelle |
Der Unterblock beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Format (immer 2) |
2 | 2 Byte | uint16 | Position Zeichenliste |
4 | 2 Byte | uint16 | Werteformat 1 |
6 | 2 Byte | uint16 | Werteformat 2 |
8 | 2 Byte | uint16 | Position Klassendefinition links |
10 | 2 Byte | uint16 | Position Klassendefinition rechts |
12 | 2 Byte | uint16 | Anzahl Klassen links |
14 | 2 Byte | uint16 | Anzahl Klassen rechts |
Die Positionen sind gerechnet ab dem Anfang des Unterblocks.
Für klassische Unterschneidung gilt: Das Werteformat 1 muss 4 oder 68 sein, das Werteformat 2 muss 0 sein.
Danach folgt eine Liste mit einem Eintrag für jede mögliche Kombination von Klassen. Dabei werden erst alle möglichen Kombinationen mit der Klasse 0 links gelistet, dann alle möglichen Kombinationen mit der Klasse 1 links, und so weiter. Die Einträge innerhalb einer Klasse links sind geordnet nach den Klassen rechts von 0 an aufsteigend. Der Inhalt jeden Eintrags ist vom Werteformat 1 abhängig.
Bei einem Wert von 4:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | int16 | Unterschneidung |
Bei einem Wert von 68:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | int16 | Unterschneidung |
2 | 2 Byte | uint16 | Position Hintingtabelle |
Dieser Typ verweist auf den eigentlichen Unterblock.
Der Unterblock ist folgendermassen aufgebaut:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Version |
2 | 2 Byte | uint16 | Typ |
4 | 4 Byte | uint32 | Position |
Die Position ist ab dem Anfang des Unterblocks gerechnet.
Der Block beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 4 Byte | uint32 | Version |
4 | 2 Byte | uint16 | Position Schrift/Sprachtabelle |
6 | 2 Byte | uint16 | Position Featuretabelle |
8 | 2 Byte | uint16 | Position Lookuptabelle |
Damit lassen sich über das Lookupsystem die Unterblocks ermitteln. Passen mehrere Unterblocks auf ein Feature, so gilt der erste Unterblock mit einem Treffer für das Zeichen oder die Zeichenkombination.
Dieser Typ behandelt den Ersatz einzelner Zeichen durch ein Alternativzeichen.
Der Unterblock ist folgendermassen aufgebaut:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Format (immer 1) |
2 | 2 Byte | uint16 | Position Zeichenliste |
4 | 2 Byte | uint16 | GID Delta |
Die Position ist gerechnet ab dem Anfang des Unterblocks.
Die Zeichenliste enthält die zu ersetzenden Zeichen. Um das Ersatzzeichen zu erhalten, muss das GID Delta addiert werden. Erhält man dabei eine Zahl grösser 0x10000, so muss 0x10000 abgezogen werden.
Der Unterblock beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Format (immer 2) |
2 | 2 Byte | uint16 | Position Zeichenliste |
4 | 2 Byte | uint16 | Anzahl Zeichen |
Die Position ist gerechnet ab dem Anfang des Unterblocks. Die Zeichenliste enthält die zu ersetzenden Zeichen.
Danach folgt ein Liste mit den Ersatzzeichen für die Einträge der Zeichenliste (identische Reihenfolge):
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | GID Alternativzeichen |
Dieser Typ behandelt den Ersatz von Zeichenkombinationen durch einzelne Zeichen (Ligaturen).
Der Unterblock beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Format (immer 1) |
2 | 2 Byte | uint16 | Position Zeichenliste |
4 | 2 Byte | uint16 | Anzahl Ligatursätze |
Die Position ist gerechnet ab dem Anfang des Unterblocks. Die Zeichenliste enthält die möglichen, ersten Zeichen der Ligaturen. Für jedes dieser Zeichen gibt es einen Ligatursatz.
Danach folgt eine Liste mit den Positionen der Ligatursätze zu den Zeichen (identische Reihenfolge):
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Position Ligatursatz |
Die Position ist ab dem Anfang des Unterblocks gerechnet. Die Ligatursätze beginnen folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Anzahl Ligaturen |
Danach folgt eine Liste mit den Positionen der Ligaturdefinitionen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Position Ligatur |
Die Positionen sind gerechnet ab dem Anfang des Ligatursatzes. Die Ligaturdefinition beginnt folgendermassen:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | GID Ligatur |
2 | 2 Byte | uint16 | Anzahl Zeichen |
Danach folgt eine Liste aller Zeichen, aus dem die Ligatur aufgebaut ist, ausser dem ersten:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | GID Originalzeichen |
Die Liste ist um einen Eintrag kürzer als die „Anzahl Zeichen“, da das erste Zeichen nicht enthalten ist.
Dieser Typ verweist auf den eigentlichen Unterblock.
Der Unterblock ist folgendermassen aufgebaut:
Position | Grösse | Typ | Inhalt |
---|---|---|---|
0 | 2 Byte | uint16 | Version |
2 | 2 Byte | uint16 | Typ |
4 | 4 Byte | uint32 | Position |
Die Position ist ab dem Anfang des Unterblocks gerechnet.
Diskussion