2

librsvg を使用して SVG ファイルを Cairo コンテキストにレンダリングしています。その後、Pango を使用して上部にテキストを「手動で」レンダリングします。

SVG をレンダリングすると、フォントを読み込めないという Pango の警告が表示されます。
"couldn't load font "'Calibri' Not-Rotated 16", falling back to "Sans Not-Rotated 16", expect ugly output."

その後、Pango を介して手動でテキストをレンダリングすると、問題なく動作します。複数の異なるフォント ファミリを試してみましたが、それらはすべて警告なしで問題なくレンダリングされます。

librsvg のソースをざっと見て、Pango がどのように使用されているかを確認しましたが、私が行っていることと大きな違いは見られませんでした。

この問題のデバッグを続行する方法がわかりません。Pango が Windows でフォントを見つける方法と、それらを見つける能力に影響を与える可能性があるものについてアドバイスをいただければ幸いです。

それが重要な場合:
ここから必要なすべてのバイナリをダウンロードしました: http://sourceforge.net/projects/ezwinports/files/

4

1 に答える 1

7

この問題に費やす時間を考えないように集中しなければなりません。そうしないと、脳が溶けてしまいます。

とにかく、誰かがこの投稿に出くわした場合に備えて、うまくいくまでに私が理解しなければならなかったことを共有します。

  • pango から適切なエラー メッセージを取得するには、glib ログ ハンドラーを登録します。以下を参照してください。
  • Pango は、いくつかのファイルを探すために、pango dll に関連する特定のフォルダー構造を想定しています。pango dll が /foo/bin または /foo にある場合、/foo/etc/pango の下の「pango.modules」を見つけようとします。このファイルには、pango モジュール dll の場所に関する情報が含まれています。私が見つけた最も簡単な方法は、pango モジュール dll を /foo/lib/pango/1.8.0/modules の下に配置し、「pango-querymodules.exe > pango.modules」を実行してモジュール ファイルの内容を生成し、手動で実際の dll ファイル名を除いて、パスを削除します。私のマシンの内容については、以下を参照してください。
  • 見つけるのに何日もかかった実際の問題は次のとおりでした: Adob​​e Illustrator からエクスポートされた SVG を使用しました。これらには、このようなテキスト要素が含まれ
    <text style="font-family:'Arial'; font-size:20;">Foo Bar</text>
    ていて、問題ないように見えましたが、フォント ファミリを囲む単一引用符が含まれているようで、 Pango はフォント「Arial」を見つけることができません。これは、フォント名が実際には「Arial」ではなく「Arial」であるためです。

Pango メッセージハンドラー

void PangoMessageHandler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
{
    //TODO: handle log message
}
g_log_set_handler("Pango", G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, PangoMessageHandler, NULL);

pango.modules

"pango-arabic-lang.dll" ArabicScriptEngineLang PangoEngineLang PangoRenderNone arabic:*
"pango-basic-win32.dll" BasicScriptEngineWin32 PangoEngineShape PangoRenderWin32 common:
"pango-indic-lang.dll" devaIndicScriptEngineLang PangoEngineLang PangoRenderNone devanagari:*
"pango-indic-lang.dll" bengIndicScriptEngineLang PangoEngineLang PangoRenderNone bengali:*
"pango-indic-lang.dll" guruIndicScriptEngineLang PangoEngineLang PangoRenderNone gurmukhi:*
"pango-indic-lang.dll" gujrIndicScriptEngineLang PangoEngineLang PangoRenderNone gujarati:*
"pango-indic-lang.dll" oryaIndicScriptEngineLang PangoEngineLang PangoRenderNone oriya:*
"pango-indic-lang.dll" tamlIndicScriptEngineLang PangoEngineLang PangoRenderNone tamil:*
"pango-indic-lang.dll" teluIndicScriptEngineLang PangoEngineLang PangoRenderNone telugu:*
"pango-indic-lang.dll" kndaIndicScriptEngineLang PangoEngineLang PangoRenderNone kannada:*
"pango-indic-lang.dll" mlymIndicScriptEngineLang PangoEngineLang PangoRenderNone malayalam:*
"pango-indic-lang.dll" sinhIndicScriptEngineLang PangoEngineLang PangoRenderNone sinhala:*
于 2014-10-28T20:52:34.037 に答える