在Windows中,如何检测Unicode字符是否呈现为方形(豆腐)?

时间:2016-11-22 15:02:29

标签: c++ winapi unicode fonts gdi

我正在为OpenGL编写一个简单的位图字体渲染器,我也想渲染一些Unicode。但是,在许多字体中,某些字符缺失并呈现为正方形。因此,我的纹理浪费了空间,我想摆脱它们。是否有WinAPI函数来检测某个字符是否会使用某种字体呈现为豆腐方块?

我正在使用GDI,我使用CreateDIBSection制作屏幕外位图,然后使用CreateFontIndirect获取字体并使用ExtTextOutW渲染字形。

到目前为止,我一直在考虑检测光栅化形式的豆腐(通过比较像素)哪种有效,但我想这不是很好。它还要求我获得一些肯定没有给定字体的Unicode字符,以便获得要比较的“模板”。我想我迟早会遇到麻烦。

1 个答案:

答案 0 :(得分:2)

在为3D渲染器构建字形地图时,我必须做类似的事情来实现我自己的字体链接和字体后退。我使用Uniscribe将字符串转换为字形索引字符串。然后我用ScriptGetFontProperties获取字体的wgDefault属性,并将值与每个字形索引进行比较。

纯GDI等价物将使用GetCharacterPlacement之类的东西将文本转换为字形索引(然后将ExtTextOut与ETO_GLYPH_INDEX一起使用),但我不认为这样可以完成所有关键的修改和重新排序Uniscribe会做。对于初学者来说,我不认为他们会为BMP之外的任何事情工作。

您不希望以图形方式匹配丢失的符号字形,因为它并不总是正方形。例如,在某些字体中,它是一个带有问号的黑色钻石。