FreeType如何渲染像ääö这样的特殊字符?

时间:2013-10-04 07:52:30

标签: c++ opengl freetype

我坚持使用FreeType渲染文本。特别是非ascii chars让我头疼。经过一些试验和错误,我设法渲染了一些文字,但我的变音符号没有显示:

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
}

加载字体,获取字形等基本上可以正常工作,但不会渲染“ü”。这就是我的输出:

All characters except the 'ü' get displayed!

显示除“ü”以外的所有字符!

The console output

这最终会出现在我的控制台中,所以我想我对字符串的迭代一定是错的,因为'ü'被分成两个字符。我得到的最后两个字符的字形位图都是宽度和高度0。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

短版

阅读本文: http://www.joelonsoftware.com/articles/Unicode.html

使用此: http://www.pango.org/

长版

您似乎对文本表示和渲染有一些误解(您使用放弃软件来“检查”文本输出显示它)。幸运的是乔尔在描述问题方面做得非常不错:http://www.joelonsoftware.com/articles/Unicode.html

FreeType能够解析True Type文件,并渲染存储在文件中的字形。它不是一个成熟的文本渲染引擎。您使用的字体可能甚至没有渲染所需字符所需的字形,您可以need to combine different glyphs生成所需的输出。

当然,您不会自己实现整个Unicode渲染逻辑,这是一项艰巨的任务。如果你想在它上面抛出“text”并让它渲染,你必须使用更高级别的东西。至少HarfBuzz,或者其中的东西,比如Pango或Qt。关于如何使用Pango + FreeType的一个很好的例子可以在SDL_Pango library中找到。

答案 1 :(得分:0)

您的问题是,并非所有字符都可以用单个字节表示。大多数国际字符(如ü)需要两个(或更多)。您的字符串基本上是一个字符数组,不适合一个字节的字符将被解释为两个字符。

一种解决方案是使用std :: wstring,它基本上是wchar_t的数组。您的代码将变为:

std::wstring text = L"Hauptmenü";
for(std::wstring::iterator it = text.begin(); it != text.end(); ++it) {
    std::wcout << *it;

    FT_Face face = loadFace(faceName);

    FT_Set_Pixel_Sizes(face, 0, fontSize);

    if(FT_Load_Char(face, *it, FT_LOAD_DEFAULT)) {
        std::wcout << L"Could not load character '" << character << L"'" << 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
}

除此之外,还有很多the article链接到DanielKO是一个很好的开始。