2015-08-03 13 views
6

Próbuję wyodrębnić informacje kerningu z niektórych czcionek .ttf z biblioteki freetype 2.6.Nie można uzyskać kerningu niektórych określonych czcionek .ttf z typem wolnego

ten sposób uzyskać kerningu informacje (przelotowego znaków):

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; 
} 

Próbowałem programu z kilku różnych czcionek: "Times New roman.ttf", "Tymes.ttf", „miniona. otf ". Tylko dla czcionek Times New Roman informacje o kerningu są poprawnie wyodrębniane, a ja sprawdziłem je, rejestrując informacje.

Problem polega na tym, że nie rozumiem, dlaczego kerning ma zawsze wartość 0 (tzn. FT_HAS_KERNING zwraca wartość FAŁSZ, A FT_GetKerning zwraca wartość 0 mimo to) dla pozostałych 2 czcionek.

Sprawdziłem za pomocą fontforge, że informacje o kerningu są obecne dla par "VA" i "To", i są tam! Więc muszą być przechowywane w .ttf. Niemniej jednak, powyższym kerningiem jest zawsze 0 dla "VA" lub "To", lub FT_HAS_KERNING zwraca false.

Czy istnieje opcja lub ustawienie freetingu, którego tutaj brakuje? Wszelkiego rodzaju oświecenia jest doceniana ..

EDIT: ja ustawienie rozmiaru twarz z

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

EDIT: Kerning informacji dla "Tymes" czcionki w FontForge: enter image description here

+0

Czy FontForge powie Ci, czy jest to TrueType 'kern' kerning (aka." Stary styl "), czy używasz nowoczesnej tabeli OpenOSP GPOS? "FreeType obsługuje tylko kerning za pomocą (raczej prostej) tabeli" kern "." (http://www.freetype.org/freetype2/docs/glyphs/glyphs-4.html) – usr2564301

+0

Dziękuję za pomoc! ^^ Sprawdziłem informacje o kern w fontforge i wygląda mi to jak "podtable Kern" zawierające proste pary znaków i jedna wartość jest obecna .. (patrz edit), wygląda na to, że fontforge używa również freetype, co sprawia, że ​​zastanawiam się, co robię źle – Lake

+0

Terminologia "lookup * x * subtable" jest w rzeczywistości rozmową OpenOS z GPOS. Jeśli możesz dodać lokalizację pobierania online dla jednej z czcionek, na których się to nie udaje, mogę zajrzeć do środka. Napisałem sobie narzędzie do tego celu. – usr2564301

Odpowiedz

4

Freetype może tylko pobierać wartości kerningu z tabeli kern czcionki, a nie z bardziej nowoczesnej implementacji jako funkcji OpenType przy użyciu . Z documentation:

Należy pamiętać, że czcionki OpenType (OTF) zapewniają dwa odrębne mechanizmy kerningu, używając „kerningowych” i tabele „GPO”, odpowiednio, które są częścią plików OTF. Starsze czcionki zawierają tylko ten pierwszy, a ostatnie czcionki zawierają tylko tabele, a nawet dane "GPOS". FreeType obsługuje tylko kerning za pomocą (raczej prostej) tabeli "kern". Do interpretacji danych kerningu w (bardzo wyrafinowanej) tabeli "GPOS" potrzebna jest biblioteka wyższego poziomu, taka jak ICU lub HarfBuzz, ponieważ może być zależna od kontekstu (kerning może się różnić w zależności od pozycji w ciągu tekstowym, na przykład).

Kod FreeType współpracuje z Times New Roman (kopalnia "Monotype: Times New Roman Regular: Version 5.11 (Microsoft)"), ponieważ zawiera zarówno tabele:

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

ale inne czcionki zrobienia nie zawiera numeru kern.

Kerning jest preferowany w stosunku do zwykłego kern, ponieważ jego tabele mogą być połączone z określonym skryptem i językiem, i oferuje lepszą kontrolę.

Istnieje również dobry powód, aby zawrzeć tylko jeden typ tabeli - jeśli oba są obecne, do renderowania czcionek należy wybór.Na przykład: Microsoft's Recommendations for OpenType Fonts:

Specyfikacja WYŁ. Umożliwia fontom CFF OT wyrażanie ich kerningu w tablicy kernela. Wiele silników układu tekstu OFF obsługuje to. Sterownik CFF OT systemu Windows GDI ignoruje jednak tabelę kern w czcionce CFF OT, gdy przygotowuje pary kerningu do raportowania za pośrednictwem interfejsu API kerningu par.
Gdy tabela kernela i tabela GPOS są obecne w czcionce, a silnik układu OFF jest żądany do zastosowania kerningu do uruchomienia tekstu określonego skryptu i systemu językowego: (a) Jeśli liczba wyszukiwań funkcji kern w Rozdzielony system językowy w tabeli GPOS wynosi zero, następnie należy zastosować tabelę kernela, a następnie wszelkie pozostałe wymagane funkcje GPOS. (b) Jeśli liczba wyszukiwań funkcji jądra w rozwiązanym systemie językowym w tabeli GPOS jest różna od zera, wówczas wszystkie wyszukiwania GPOS, w tym wyszukiwania kerningu, powinny być stosowane w zwykły sposób, a dane tabeli kerningu są ignorowane.

Powiązane problemy