我已经弄清楚了这个过程。希望这些信息是有帮助的——尽管我没有声称这是执行任何这些操作的“正确”方法,只是它有效。
首先,设置 FontConfig。在某些系统上这可能不是必需的——在 Linux 上让它自动运行可能是可以的。但是,在 Windows 上,FontConfig 是有问题的。处理它的最简单方法是在内存中创建一个配置并将其指向您希望它查找字体的位置。我将它指向我的程序的资源目录。您可以使用“C:\Windows\Fonts”,但请注意这需要永远加载。加载正确的 font.conf 文件可能是最好的方法,但我自己运气不佳。
gchar* workingDir = g_get_current_dir();
gchar* resourceDir = g_strjoin( NULL, workingDir, "/Resources", (char*)0 );
FcConfigAppFontAddDir( fontConfig, (const FcChar8*)resourceDir );
g_free(workingDir);
g_free(resourceDir);
FcConfigBuildFonts( fontConfig );
FcConfigSetCurrent( fontConfig );
然后,您必须创建字体映射、Pango 上下文和 Pango 布局:
PangoFontMap* fontMap = pango_cairo_font_map_new();
PangoContext* pangoContext = pango_font_map_create_context( fontMap );
PangoLayout* pangoLayout = pango_layout_new( pangoContext );
现在,使用手动创建(不是 from pango_cairo_create_layout()
)布局似乎不会自动加载字体。尝试使用字体映射中但未加载的字体会导致 Pango-Cairo 崩溃(使用未列出的完全未列出的字体只是进入默认值)。因此,加载字体映射中列出的所有字体:
FcPattern *p = FcPatternCreate();
FcObjectSet *os = FcObjectSetBuild(FC_FAMILY,NULL);
FcFontSet *fs = FcFontList(fontConfig, p, os);
FcPatternDestroy( p );
FcObjectSetDestroy( os );
for( int i = 0; i < fs->nfont; ++i )
{
guchar* fontName = FcNameUnparse( fs->fonts[i] );
PangoFontDescription* fontDesc = pango_font_description_from_string( (gchar*)fontName );
pango_font_map_load_font( fontMap, pangoContext, fontDesc );
pango_font_description_free( fontDesc );
g_free(fontName);
}
要指定宽度:
pango_layout_set_width( pangoLayout, sizeX * PANGO_SCALE );
这也是您应该设置对齐/对齐/等的点。
然后你可以插入你的文本:
pango_layout_set_markup( pangoLayout, text.c_str( ), -1 );
在此之后,您可以通过获取布局高度pango_layout_get_pixel_size()
并使用它来创建 Cairo 的对象。然后你可以通过以下方式渲染它:
cairo_move_to(cairoContext, 0, 0);
pango_cairo_update_layout( cairoContext, pangoLayout );
pango_cairo_show_layout( cairoContext, pangoLayout );