Windows系统:获取字形轮廓从其他字体替换字符
-
22-07-2019 - |
题
我需要呈现字体转换为3D游戏世界,所以我用了GetGlyphOutline轮廓函数来获取字形形状渲染到纹理。不过,我希望能够处理其中的字符不存在于给定字体的情况下(通常是亚洲以外的其他国际文的情况下)。 Windows文本渲染将自动替换,因为他们需要的字符的字体。但GetGlyphOutline不会。我如何可以检测到这种情况,并得到轮廓为取代字形? Mac OS X的核心文本具有一个函数来获取匹配的置换字体给定字体和字符串 - 有什么在windows相似?
解决方案
发现我需要知道自己是什么:该 IMLangFontLink介面,尤其是MapFont方法包含所需的功能,以找出哪些替代字体应的窗口上被使用。
其他提示
我也有困惑与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
}
}
不隶属于 StackOverflow