我需要将字体渲染到3D游戏世界,所以我使用GetGlyphOutline轮廓函数来将字形形状渲染为纹理。但是,我希望能够处理字符不在给定字体中的情况(亚洲其他国际文本通常是这种情况)。 Windows文本渲染将自动替换具有所需字符的字体。但GetGlyphOutline不会。我如何检测这种情况,并获得替代字形的轮廓? Mac OS X Core Text有一个函数可以为给定的字体和字符串获取匹配的替换字体 - 在Windows上有没有类似的东西?Windows:从其他字体中替换字符的轮廓轮廓
回答
找到我需要了解的我自己:IMLangFontLink interface,特别是MapFont方法包含所需的功能,以找出哪些替代字体应该在Windows上使用。
我也对感到困惑。我不确定您是否能够做到这一点,但我可以使用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
}
}
虽然这可能会起作用,但是不使用LineTo来渲染字体只能为您提供字体轮廓?你也不会得到反锯齿,并且它会正确处理TTF字体中的贝塞尔曲线吗? – 2011-01-20 10:31:22
@jonas:这一切都取决于您正在绘制的设备上下文(以及它如何配置)。此外,如果您在'BeginPath'和'EndPath'内使用'LineTo',那么在使用'StrokePath'或'EndPath'之前不会绘制任何内容。这也只是表明你可以获得路径,一旦你有了路径,你可以将它挤压成3D物体或者在屏幕上绘制它。 – dreamlax 2011-01-20 10:45:32
- 1. 从轮廓中提取最外轮廓
- 2. 轮廓轮廓着色器
- 3. 字体中的红色轮廓
- 4. UIButton中的轮廓文本/字体
- 5. OpenCV:从轮廓树转换为轮廓 - cvContourFromContourTree()
- 6. 轮廓匹配 - 找到轮廓位移
- 7. 绘制轮廓后找到轮廓
- 8. Python clabel文字外轮廓
- 9. 阵营本地字体轮廓/ textShadow
- 10. 轮廓发现
- 11. 轮廓形状
- 12. Opencv轮廓
- 13. 提取轮廓
- 14. OpenCV轮廓?
- 15. 轮廓提取
- 16. 轮廓匹配
- 17. matplotlib中的轮廓不会绘制轮廓的指定数量
- 18. 轮廓的偏度
- 19. 摹轮廓Matlab的
- 20. 缩放的轮廓
- 21. 轮廓线中轮廓线的平滑度
- 22. matplotlib中的轮廓标签填充轮廓错误?
- 23. 在Direct3D中填充文字轮廓
- 24. “大纲”的轮廓全部是*,其内部充满了字符“。”。
- 25. GIF白色轮廓
- 26. 轮廓文本xamarin
- 27. css轮廓左右
- 28. XNA河段轮廓
- 29. 福利奥轮廓
- 30. 覆盖CAShapeLayer轮廓
是的IMLangFontLink接口库总是安装在Windows上? – epotter 2009-12-02 16:19:48
据我所知,它通过Internet Explorer 4.0或更高版本进行安装。我不知道是否可以安全地推测它是在任何Windows系统上,即使IE已被删除。 – 2009-12-02 16:37:29