2014-10-28 9 views
1

Я использую librsvg для рендеринга SVG-файла в контексте Каира. Впоследствии я «вручную» отрисовываю текст сверху с помощью Pango.Pango не может найти шрифты с librsvg

При визуализации SVG я получаю PanGo предупреждения, что он не может загрузить шрифты:
"couldn't load font "'Calibri' Not-Rotated 16", falling back to "Sans Not-Rotated 16", expect ugly output."

Ручной рендеринг текста с помощью Панго потом отлично работает. Я попробовал несколько разных семейств шрифтов, и все они отлично выглядят без каких-либо предупреждений.

Я даже просмотрел источник librsvg, чтобы узнать, как он использует Pango, но я не видел никаких существенных отличий от того, что я делаю.

Я понятия не имею, как продолжить отладку этой проблемы, любые советы о том, как Pango находит шрифты под Windows, и что может повлиять на его способность находить их, очень ценится.

Если это имеет значение:
Я скачал все необходимые исполняемые файлы здесь: http://sourceforge.net/projects/ezwinports/files/

ответ

4

я должен сосредоточиться, чтобы не думать о том, сколько времени тратится на этом вопросе или мой мозг будет таять.

В любом случае, в случае, если кто-то приходит через этот пост я буду делиться тем, что я должен был выяснить, пока он работал:

  • Чтобы получить соответствующие сообщения об ошибках Панго зарегистрировать бойкий обработчик журнала, смотрите ниже.
  • Pango предполагает определенную структуру папок относительно dll pango для поиска некоторых файлов. Если dll pango находится в/foo/bin или/foo, он попытается найти «pango.modules» под/foo/etc/pango. Этот файл содержит информацию о том, где найти DLL-модули pango. Самый простой способ, который я нашел, - разместить DLL-модули pango в /foo/lib/pango/1.8.0/modules, а затем выполнить «pango-querymodules.exe> ​​pango.modules», чтобы сгенерировать содержимое файла модулей, а затем вручную удалите путь, за исключением фактического имени файла dll. См. Ниже содержимое моей машины.
  • Реальная проблема, которая мне потребовалось дней, чтобы выяснить, был такой: я использовал SVGs, которые были экспортированы из Adobe Illustrator и они содержат элементы текста, как этот
    <text style="font-family:'Arial'; font-size:20;">Foo Bar</text>
    , который выглядел хорошо для меня, но одиночные кавычки Семьи шрифтов, кажется, включены и заставляют Pango не найти шрифт Arial, потому что имя шрифта, конечно, фактически Arial, а не Arial, если вы знаете, что я имею в виду.

Панго обработчик сообщений

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:*