2

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
}

フォントのロード、グリフの取得などは基本的に機能していますが、「ü」はレンダリングされません。これは私の出力がどのように見えるかです:

「ü」以外のすべての文字が表示されます。

「ü」以外のすべての文字が表示されます。

コンソール出力

これは私のコンソールで終わっているので、'ü' が 2 つの文字に分割されているため、文字列の繰り返しに何か問題があるに違いないと思います。最後の 2 文字で取得したグリフ ビットマップは、幅と高さが両方とも 0 です。

どうすればこれを修正できますか?

4

2 に答える 2

0

問題は、すべての文字を 1 バイトで表現できるわけではないことです。ほとんどの国際文字 (ü など) には 2 つ (またはそれ以上) が必要です。文字列は基本的に文字の配列であり、1 バイトに収まらない文字は 2 文字として解釈されます。

1 つの解決策は、代わりに基本的に wchar_t の配列である std::wstring を使用することです。コードは次のようになります。

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
}

これには他にもたくさんありますが、DanielKO がリンクしている記事は非常に良いスタートです。

于 2020-09-10T06:54:51.777 に答える