我正在尝试让Pango控制FreeType。我已经成功地将FreeType渲染成位图,但Pango似乎不知道发生了什么,我显然没有正确地做某事。
这是我目前正在使用的代码:
font_map = pango_ft2_font_map_new();
pango_ft2_font_map_set_resolution(PANGO_FT2_FONT_MAP(font_map), 72, 72);
cr = pango_font_map_create_context(PANGO_FONT_MAP(font_map));
font_description = pango_font_description_new ();
pango_font_description_set_family (font_description, "Courier New");
pango_font_description_set_weight (font_description, PANGO_WEIGHT_BOLD);
pango_font_description_set_absolute_size (font_description, 32 * PANGO_SCALE);
layout = pango_layout_new(cr);
pango_layout_set_font_description(layout, font_description);
pango_layout_set_text(layout, "Some sample text!", -1);
pango_context_set_font_description(cr, font_description);
FT_Bitmap bitmap = { 0 };
bitmap.width = drawBitmap.get()->getWidth();
bitmap.rows = drawBitmap.get()->getHeight();
bitmap.pitch = bitmap.width * 4;
bitmap.buffer = (unsigned char*)drawBitmap.get()->getDataPtr();
bitmap.num_grays = 256;
bitmap.pixel_mode = FT_PIXEL_MODE_GRAY;
pango_ft2_render_layout(&bitmap, layout, 100, 100);
drawBitmap
只是我的帮助类,我知道这是有效的,因为我可以用随机颜色填充它们并显示出来。
这是呈现的内容:
我想尝试让该文字正确显示。
编辑:在修复图像的位深度并使用FreeType引擎从裸Pango FreeType切换到Pango Cairo后,问题变得更加清晰。
使用此行:
font_map = pango_cairo_font_map_new_for_font_type(CAIRO_FONT_TYPE_WIN32);
产生
当我浏览pango_font_map_list_families
时,我得到了一个很长的系统安装字体列表。
但是,如果我将其更改为此,请使用FreeType:
font_map = pango_cairo_font_map_new_for_font_type(CAIRO_FONT_TYPE_FT);
它产生
然后我的系统上突然只有3种字体,Sans
,Serif
和Monospace
。
答案 0 :(得分:1)
我刚刚遇到与你自己完全相同的问题,但经过大量的挖掘设法找到了适合我的解决方案。我一直在使用http://www.gtk.org/download/win32.php中预先构建的Pango / FreeType / dependencies库,并将运行时DLL复制到我的exe文件夹中。最后,我还必须从GTK +的一体化版本中复制'/ etc / fonts'文件夹作为我的exe的子文件夹。然后突然我通过Pango / FreeType获得了字体!虽然不确定'fonts'文件夹的来源是什么..
答案 1 :(得分:0)
你可能需要告诉它你的字体文件在哪里手动定位,单独的freetype没有默认字体位置的概念它是一个准系统渲染器(并且它真的不足以显示unicode文本,这就是为什么其他pango引擎添加其他库到混合)
pango-cairo是最完整的pango后端IIRC,除非我错了,否则会引入fontconfig。 fontconfig唯一的目的是管理应用程序的字体文件位置,这就是为什么它开箱即用的原因如果您选择的后端确实使用了fontconfig,请尝试找到其主conf文件,并确保默认目录适合您的系统。然后运行fc-cache