2015-08-03 2 views
6

nicht erhalten Ich versuche, Kerning Informationen aus einigen. TTF-Schriftarten mit Freetype 2.6-Bibliothek zu extrahieren. DieseKann das Kerning von bestimmten TTF-Schriftarten mit Freetype

ist, wie ich Kerning Informationen (Durchschleifen Zeichen) erhalten:

if(FT_HAS_KERNING(face->getFace()) && previous){ 
    FT_Vector delta; 
    FT_UInt glyph_index = FT_Get_Char_Index(face->getFace(), character); 
    FT_UInt prev_index = FT_Get_Char_Index(face->getFace(), previous); 
    FT_Get_Kerning(face->getFace(), prev_index, glyph_index, 
         FT_KERNING_DEFAULT, &delta); 
    kerning = delta.x >> 6; 
} 

Ich habe versucht, das Programm mit einigen verschiedenen Schriftarten: "Times New Roman.ttf", "Tymes.ttf", „Untergebener. otf ". Nur für die Times new Roman-Schriftart werden die Kerning-Informationen korrekt extrahiert, und das habe ich überprüft, indem ich die Informationen protokolliert habe.

Das Problem ist, dass ich nicht verstehe, warum das Kerning immer 0 ist (d. H. FT_HAS_KERNING gibt false zurück, UND FT_GetKerning gibt trotzdem 0 zurück) für die anderen 2 Schriftarten.

Ich habe mit fontforge überprüft, dass Kerning-Informationen für Paare "VA" und "To" vorhanden sind, und sie sind da! Sie müssen also in der .ttf gespeichert werden. Mit dem obigen Code ist das Kerning immer gleich 0 für "VA" oder "To", oder FT_HAS_KERNING gibt false zurück.

Gibt es eine Freetype-Option oder Einstellung, die ich hier fehlt? Jede Art von Erleuchtung geschätzt ..

EDIT: ich mit der Gesichtsgröße setze

FT_Set_Pixel_Sizes(face->getFace(), 0, size); 

EDIT: Kerning-Info für "tymes" font in Fontforge: enter image description here

+0

Ermittelt FontForge, ob es sich um TrueType 'kern' Kerning (alias" ye olde style ") oder um eine moderne OpenType' GPOS' Tabelle handelt? "FreeType unterstützt nur Kerning über die (eher einfache) 'kern' Tabelle." (http://www.freetype.org/freetype2/docs/glyphs/glyphs-4.html) – usr2564301

+0

Danke für deine Hilfe! ^^ Ich habe die Kerninfo in fontforge überprüft und es sieht für mich wie "kern Untertabelle" aus einfache Zeichenpaare und ein Wert ist vorhanden .. (siehe Edit), sieht aus wie fontforge benutzt auch freetype, was mich wundert was ich falsch mache – Lake

+0

Die Terminologie "lookup * x * subtable" ist eigentlich OpenType GPOS talk. Wenn Sie einen Online-Download-Speicherort für eine der Schriftarten hinzufügen können, bei denen dies fehlschlägt, kann ich einen Blick hinein werfen. Ich habe mir zu diesem Zweck ein Tool geschrieben. – usr2564301

Antwort

4

Freetype kann Kerning-Werte nur aus der Tabelle kern einer Schriftart abrufen, nicht aus der moderneren Implementierung als OpenType-Feature mit . Vom documentation:

Beachten Sie, dass Opentype-Schriftarten (OTF) für Kerning zwei verschiedene Mechanismen zur Verfügung stellen, mit den ‚kern‘ und ‚GPOS‘ Tabellen verbunden, die einen Teil der OTF-Dateien ist. Ältere Schriftarten enthalten nur die ersteren, während neuere Schriftarten nur Tabellen oder nur 'GPOS'-Daten enthalten. FreeType unterstützt nur Kerning über die (eher einfache) 'Kern'-Tabelle. Für die Interpretation von Kerning-Daten in der (hochentwickelten) 'GPOS'-Tabelle benötigen Sie eine höhere Bibliothek wie ICU oder HarfBuzz, da sie kontextabhängig sein kann (das Kerning kann abhängig von der Position innerhalb einer Textzeichenfolge variieren). beispielsweise).

Ihre Freetype Code arbeitet mit Times New Roman (bei mir ist "Monotypie: Times New Roman Regular: Version 5.11 (Microsoft)"), weil es enthält beide Tabellen:

tag 'GPOS' checksum 5dfeb897 offset 778576 length 43506 
tag 'kern' checksum a677acd1 offset 734088 length  5220 

aber die anderen Schriftarten tun nicht das kern eins enthalten.

Kerning wird gegenüber Plain kern bevorzugt, da seine Tabellen mit einem bestimmten Skript und einer bestimmten Sprache verknüpft werden können und eine feinere Steuerung bietet.

Es gibt auch gute Gründe, nur einen Tabellentyp zu enthalten - wenn beide vorhanden sind, muss der Font-Renderer einen auswählen.Microsoft's Recommendations for OpenType Fonts, zum Beispiel besagt folgendes:

Die OFF-Spezifikation ermöglicht CFF OT-Schriftarten ihr Kerning in einer Kern-Tabelle auszudrücken. Viele OFF Textlayout-Engines unterstützen dies. Der CFF-OT-Treiber von Windows GDI ignoriert jedoch die Kern-Tabelle in einer CFF OT-Schriftart, wenn er Kerning-Paare zum Melden über seine Kerning-API vorbereitet.
Wenn eine Kern-Tabelle und eine GPOS-Tabelle beide in einer Schriftart vorhanden sind und eine OFF-Layout-Engine Kerning auf eine Textausführung eines bestimmten Skript- und Sprachsystems anwenden soll: (a) Wenn die Anzahl der Kern-Feature-Suchen in das aufgelöste Sprachsystem in der GPOS-Tabelle ist Null, dann sollte die Kern-Tabelle angewendet werden, gefolgt von allen verbleibenden GPOS-Funktionen, die angefordert wurden. (b) Wenn die Anzahl der Kern-Feature-Lookups im aufgelösten Sprachsystem in der GPOS-Tabelle nicht Null ist, sollten alle GPOS-Lookups, einschließlich der Kern-Lookups, auf die übliche Weise angewendet und die Kerntabellendaten ignoriert werden.

Verwandte Themen