我一直坚持使用 FreeType 渲染文本。尤其是非ascii字符让我头疼。经过一番尝试和错误后,我设法呈现一些文本,但我的变音符号没有显示:
std::string text = "Hauptmenü";
for(std::string::iterator it = text.begin(); it != text.end(); ++it) {
std::cout << *it;
FT_Face face = loadFace(faceName);
FT_Set_Pixel_Sizes(face, 0, fontSize);
if(FT_Load_Char(face, *it, FT_LOAD_DEFAULT)) {
std::cout << "Could not load character '" << character << "'" << std::endl;
}
FT_Get_Glyph(face->glyph, &glyph);
FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
//render the glyphs to screen and so on
}
加载字体、获取字形等基本上都可以工作,但是“ü”没有渲染。这就是我的输出:
除“ü”之外的所有字符都会显示!
这最终出现在我的控制台中,所以我猜想我对字符串的迭代一定有问题,因为“ü”被分成了两个字符。我获得的最后两个字符的字形位图的宽度和高度均为 0。
我怎样才能解决这个问题?
简洁版本
读这个:http://www.joelonsoftware.com/articles/Unicode.html
用这个:http://www.pango.org/
长版
您似乎对文本表示和渲染有一些误解(您使用废弃软件来“检查”文本输出显示了这一点)。幸运的是,乔尔在描述这个问题方面做得相当不错:http://www.joelonsoftware.com/articles/Unicode.html
FreeType 能够解析 True Type 文件,并渲染存储在文件中的字形。它不是一个成熟的文本渲染引擎。您正在使用的字体甚至可能没有呈现您想要的字符所需的字形,您可能需要组合不同的字形产生所需的输出。
当然,您不会自己实现整个 Unicode 渲染逻辑,这是一项艰巨的任务。如果您只想向其扔“文本”并使其呈现,则必须使用更高级别的东西。至少是 HarfBuzz,或者它之上的其他东西,比如 Pango 或 Qt。关于如何使用 Pango+FreeType 的一个很好的例子可以在SDL_Pango 库.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)