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