9

freetype 2.6 ライブラリを使用して、一部の .ttf フォントからカーニング情報を抽出しようとしています。

これは、カーニング情報を取得する方法です(文字をループします):

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

「Times new roman.ttf」、「Tymes.ttf」、「minion.otf」など、いくつかの異なるフォントでプログラムを試しました。Times new Roman フォントのみ、カーニング情報が正しく抽出されていることをログに記録して確認しました。

問題は、他の 2 つのフォントのカーニングが常に 0 (つまり、FT_HAS_KERNING が false を返し、かつ FT_GetKerning が 0 を返す) である理由を理解できないことです。

カーニング情報が "VA" と "To" のペアに存在することを FontForge で確認しました。したがって、.ttf に保存する必要があります。それにもかかわらず、上記のコードでは、「VA」または「To」のカーニングは常に 0 であるか、FT_HAS_KERNING は false を返します。

ここで不足している freetype オプションまたは設定はありますか? どんな種類の啓発も大歓迎です..

編集:顔のサイズを設定しています

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

編集: fontforge の「tymes」フォントのカーニング情報: ここに画像の説明を入力

4

1 に答える 1

7

kernFreetype は、 を使用した OpenType 機能としての最新の実装からではなく、フォントのテーブルからのみカーニング値を取得できますGPOSドキュメントから:

OpenType フォント (OTF) は、OTF ファイルの一部である「kern」テーブルと「GPOS」テーブルをそれぞれ使用して、2 つの異なるカーニング メカニズムを提供することに注意してください。古いフォントには前者のみが含まれますが、最近のフォントには両方のテーブルまたは「GPOS」データのみが含まれます。FreeType は、(かなり単純な) 'kern' テーブルによるカーニングのみをサポートします。(非常に洗練された)「GPOS」テーブルのカーニング データを解釈するには、 ICUHarfBuzzなどの高レベルのライブラリが必要です。これは、コンテキストに依存する可能性があるためです (つまり、カーニングはテキスト文字列内の位置によって異なる場合があります)。例えば)。

FreeType コードは、両方のテーブルが含まれているため、Times New Roman (私の場合は "Monotype:Times New Roman Regular:Version 5.11 (Microsoft)") で動作します。

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

しかし、他のフォントには含まれていませんkern

GPOSkernカーニングは、テーブルを特定のスクリプトと言語にリンクでき、より細かく制御できるため、プレーンよりも優先されます。

1 つのタイプのテーブルのみを含めることにも十分な理由があります。両方が存在する場合、いずれかを選択するのはフォント レンダラー次第です。たとえば、 Microsoft の Recommendations for OpenType Fontsには、次のように記載されています。

OFF 仕様により、CFF OT フォントはカーニング テーブルでカーニングを表現できます。多くの OFF テキスト レイアウト エンジンがこれをサポートしています。ただし、Windows GDI の CFF OT ドライバーは、ペア カーニング API を介して報告するカーニング ペアを準備するときに、CFF OT フォントのカーニング テーブルを無視します。
カーニング テーブルと GPOS テーブルの両方がフォントに存在し、OFF レイアウト エンジンが特定のスクリプトと言語システムのテキストの実行にカーニングを適用するように要求されている場合: (a) 解決済みのカーニング機能ルックアップの数がGPOS テーブルの言語システムがゼロの場合、kern テーブルを適用し、その後に要求された残りの GPOS 機能を適用する必要があります。(b) GPOS テーブルの解決された言語システムのカーニング機能ルックアップの数がゼロでない場合、カーニング ルックアップを含むすべての GPOS ルックアップが通常の方法で適用され、カーニング テーブル データは無視されます。

于 2015-08-04T11:42:21.193 に答える