Schriftfeaturesystem

Lookupsystem

Schrift/Sprachtabelle

Details Schrift/Sprachtabelle

Die Tabelle beginnt folgendermassen:

PositionLänge Typ Inhalt
02 Byteuint16Anzahl Schriftsysteme

Danach folgt für eine Liste mit einem Eintrag für jedes Schriftsystem:

PositionLänge Typ Inhalt
04 Bytechar Schriftsystem-ID
42 Byteuint16Position Sprachtabelle

Liste der Schriftsystem-IDs (bei Microsoft)

Die Position ist gerechnet ab dem Anfang der Schrift/Sprachtabelle. Die Sprachtabelle beginnt folgendermassen:

PositionLänge Typ Inhalt
02 Byteuint16Position Standardfeaturenummern
22 Byteuint16Anzahl Sprachen

Danach folgt eine Liste mit einem Eintrag für jede Sprache:

PositionLänge Typ Inhalt
04 Bytechar Sprachen-ID
42 Byteuint16Position 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:

PositionLänge Typ Inhalt
02 Byteuint16unbenutzt
22 Byteuint16benötigtes Feature
42 Byteuint16Anzahl Features

Danach folgt eine Liste mit einem Eintrag für jedes Feature:

PositionLänge Typ Inhalt
02 Byteuint16Featurenummer

Ein Wert 65535 für „benötigtes Feature“ bedeutet, dass es kein zwingend benötigtes Feature gibt.

Featuretabelle

Details Featuretabelle

Die Tabelle beginnt folgendermassen:

PositionLänge Typ Inhalt
02 Byteuint16Anzahl Features

Danach folgt eine Liste mit einem Eintrag für jedes Feature:

PositionLänge Typ Inhalt
04 Bytechar Feature-ID
42 Byteuint16Position 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:

PositionLänge Typ Inhalt
02 Byteuint16unbenutzt
22 Byteuint16Anzahl Lookupeinträge

Danach folgt eine Liste der Lookupnummern:

PositionLänge Typ Inhalt
02 Byteuint16Lookupnummer

Lookuptabelle

Details Lookuptabelle

Die Tabelle beginnt folgendermassen:

PositionLänge Typ Inhalt
02 Byteuint16Anzahl Lookupeinträge

Danach folgt eine Liste mit den Positionen der Lookupeinträge:

PositionLänge Typ Inhalt
02 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:

PositionLänge Typ Inhalt
02 Byte uint16 Typ
22 Byte uint16 Flags
42 Byte uint16 Anzahl Unterblocks

Danach folgt eine Liste der Positionen der Unterblocks:

PositionLänge Typ Inhalt
02 Byte uint16 Position Unterblock

Die Position ist gerechnet ab dem Anfang des Lookupeintrags.

Zeichenliste

Details Zeichenliste

Format 1

Die Liste beginnt folgendermassen:

PositionLänge Typ Inhalt
02 Byteuint16Format (immer 1)
22 Byteuint16Anzahl Einträge

Danach folgt eine Liste der GIDs:

PositionLänge Typ Inhalt
02 Byteuint16GID

Format 2

Die Liste beginnt folgendermassen:

PositionLänge Typ Inhalt
02 Byteuint16Format (immer 2)
22 Byteuint16Anzahl Bereiche

Danach folgt eine Liste mit einem Eintrag für jeden Bereich:

PositionLänge Typ Inhalt
02 Byteuint16erste GID
22 Byteuint16letzte GID
42 Byteuint16erste Indexnummer

Zeichenklassen

Details Zeichenklassen

Format 1

Die Definition beginnt folgendermassen:

PositionGrösseTyp Inhalt
02 Byteuint16Format (immer 1)
22 Byteuint16erste GID
42 Byteuint16Anzahl GIDs

Danach folgt eine Liste für die GIDs ab der ersten GID:

PositionGrösseTyp Inhalt
02 Byteuint16Klassennummer

Nicht enthaltene GIDs sind in der Klasse 0.

Format 2

Die Definition beginnt folgendermassen:

PositionGrösseTyp Inhalt
02 Byteuint16Format (immer 2)
22 Byteuint16Anzahl GID-Bereiche

Danach folgt eine Liste mit einem Eintrag für jeden Bereich:

PositionGrösseTyp Inhalt
02 Byteuint16erste GID
22 Byteuint16letzte GID
42 Byteuint16Klassennummer

In keinem Bereich enthaltene GIDs sind in der Klasse 0.

"GPOS" Block

Details "GPOS" Block

Der Block beginnt folgendermassen:

PositionGrösseTyp Inhalt
04 Byteuint32Version
42 Byteuint16Position Schrift/Sprachtabelle
62 Byteuint16Position Featuretabelle
82 Byteuint16Position Lookuptabelle

Damit lassen sich über das Lookupsystem die Unterblocks ermitteln. Passen mehrere Unterblocks auf ein Feature, so wirken die Einträge kumulativ.

Typ 2

Details GPOS Typ 2

Dieser Typ behandelt paarweise Positionierung.

Format 1

Der Unterblock beginnt folgendermassen:

PositionGrösse Typ Inhalt
02 Byte uint16 Format (immer 1)
22 Byte uint16 Position Zeichenliste
42 Byte uint16 Werteformat 1
62 Byte uint16 Werteformat 2
82 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:

PositionGrösseTyp Inhalt
02 Byteuint16Position 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:

PositionGrösseTyp Inhalt
02 Byteuint16Anzahl 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:

PositionGrösseTyp Inhalt
02 Byteuint16GID rechts
22 Byteint16 Unterschneidung

Bei einem Wert von 68:

PositionGrösseTyp Inhalt
02 Byteuint16GID rechts
22 Byteint16 Unterschneidung
42 Byteuint16Position Hintingtabelle

Format 2

Der Unterblock beginnt folgendermassen:

PositionGrösseTyp Inhalt
02 Byteuint16Format (immer 2)
22 Byteuint16Position Zeichenliste
42 Byteuint16Werteformat 1
62 Byteuint16Werteformat 2
82 Byteuint16Position Klassendefinition links
102 Byteuint16Position Klassendefinition rechts
122 Byteuint16Anzahl Klassen links
142 Byteuint16Anzahl 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:

PositionGrösseTyp Inhalt
02 Byteint16Unterschneidung

Bei einem Wert von 68:

PositionGrösseTyp Inhalt
02 Byteint16 Unterschneidung
22 Byteuint16Position Hintingtabelle

Typ 9

Details GPOS Typ 9

Dieser Typ verweist auf den eigentlichen Unterblock.

Der Unterblock ist folgendermassen aufgebaut:

PositionGrösseTyp Inhalt
02 Byteuint16Version
22 Byteuint16Typ
44 Byteuint32Position

Die Position ist ab dem Anfang des Unterblocks gerechnet.

"GSUB" Block

Details "GSUB" Block

Der Block beginnt folgendermassen:

PositionGrösseTyp Inhalt
04 Byteuint32Version
42 Byteuint16Position Schrift/Sprachtabelle
62 Byteuint16Position Featuretabelle
82 Byteuint16Position 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.

Typ 1

Details GSUB Typ 1

Dieser Typ behandelt den Ersatz einzelner Zeichen durch ein Alternativzeichen.

Format 1

Der Unterblock ist folgendermassen aufgebaut:

PositionGrösseTyp Inhalt
02 Byteuint16Format (immer 1)
22 Byteuint16Position Zeichenliste
42 Byteuint16GID 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.

Format 2

Der Unterblock beginnt folgendermassen:

PositionGrösseTyp Inhalt
02 Byteuint16Format (immer 2)
22 Byteuint16Position Zeichenliste
42 Byteuint16Anzahl 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):

PositionGrösseTyp Inhalt
02 Byteuint16GID Alternativzeichen

Typ 4

Details GSUB Typ 4

Dieser Typ behandelt den Ersatz von Zeichenkombinationen durch einzelne Zeichen (Ligaturen).

Der Unterblock beginnt folgendermassen:

PositionGrösseTyp Inhalt
02 Byteuint16Format (immer 1)
22 Byteuint16Position Zeichenliste
42 Byteuint16Anzahl 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):

PositionGrösseTyp Inhalt
02 Byteuint16Position Ligatursatz

Die Position ist ab dem Anfang des Unterblocks gerechnet. Die Ligatursätze beginnen folgendermassen:

PositionGrösseTyp Inhalt
02 Byteuint16Anzahl Ligaturen

Danach folgt eine Liste mit den Positionen der Ligaturdefinitionen:

PositionGrösseTyp Inhalt
02 Byteuint16Position Ligatur

Die Positionen sind gerechnet ab dem Anfang des Ligatursatzes. Die Ligaturdefinition beginnt folgendermassen:

PositionGrösseTyp Inhalt
02 Byteuint16GID Ligatur
22 Byteuint16Anzahl Zeichen

Danach folgt eine Liste aller Zeichen, aus dem die Ligatur aufgebaut ist, ausser dem ersten:

PositionGrösseTyp Inhalt
02 Byteuint16GID Originalzeichen

Die Liste ist um einen Eintrag kürzer als die „Anzahl Zeichen“, da das erste Zeichen nicht enthalten ist.

Typ 7

Details GSUB Typ 7

Dieser Typ verweist auf den eigentlichen Unterblock.

Der Unterblock ist folgendermassen aufgebaut:

PositionGrösseTyp Inhalt
02 Byteuint16Version
22 Byteuint16Typ
44 Byteuint32Position

Die Position ist ab dem Anfang des Unterblocks gerechnet.