2

我需要将字体渲染到 3d 游戏世界中,因此我使用 GetGlyphOutline 轮廓函数来获取要渲染到纹理的字形形状。但是,我希望能够处理给定字体中不存在字符的情况(亚洲其他国际文本通常是这种情况)。Windows 文本渲染将自动替换具有所需字符的字体。但 GetGlyphOutline 不会。如何检测这种情况,并获取替换字形的轮廓?Mac OS X Core Text 具有为给定字体和字符串获取匹配替换字体的功能 - Windows 上有类似的东西吗?

4

2 回答 2

2

找出我自己需要了解的内容:IMLangFontLink 接口,尤其是 MapFont 方法包含了找出应该在 Windows 上使用哪些替换字体所需的功能。

于 2009-12-01T17:06:50.883 回答
1

我也有疑惑GetGlyphOutline。我不确定您是否能够做到这一点,但我能够通过与,和.TextOut()结合使用来获得混合脚本文本大纲。BeginPath()EndPath()GetPath()

例如,即使使用 Arial 字体,我也能得到日文文本「テスト」的路径(使用 C++,但在 C 中也可以轻松完成):

SelectObject(hdc, hArialFont);
BeginPath(hdc);
TextOut(hdc, 100, 100, L"\u30c6\u30b9\u30c8"); // auto font subbing
EndPath(hdc);

// get number of points in path
int pc = GetPath(hdc, NULL, NULL, 0);

if (pc > 0)
{
    std::vector<POINT> points(pc);
    std::vector<BYTE> types(pc); // PT_MOVETO, PT_LINETO, PT_BEZIERTO

    GetPath(hdc, &points[0], &types[0], pc);

    // it seems the first four points are the bounding rect
    // subsequent points match up to their types

    for (int i = 4; i < pc; i++)
    {
        if (types[i] == PT_LINETO)
            LineTo(hdc, points[i].x, points[i].y); // etc
    }
}
于 2011-01-06T03:46:14.483 回答