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

3
我正在为OpenGL编写一个简单的位图字体渲染器,我想同时渲染一些Unicode字符。然而,在许多字体中,一些字符会丢失并被渲染成方块。这些方块会浪费我的纹理空间,我想把它们去掉。是否有WinAPI函数可以检测在使用特定字体的情况下,某个特定字符是否会被渲染成豆腐块?
我正在使用GDI,使用CreateDIBSection创建离屏位图,然后使用CreateFontIndirect获取字体,并使用ExtTextOutW呈现字形。
目前,我考虑通过比较像素来检测豆腐块的光栅形式,这种方法有点奇怪。它还需要我获取一些特定字体肯定没有的Unicode字符,以便获取“模板”进行比较。我猜我迟早会遇到麻烦。

1
询问 GetFontUnicodeRanges() 函数是否可用? - Alex K.
@AlexK. 这是否支持非BMP字符?WCRANGE 结构没有为代理对保留空间... - andlabs
你是如何准备纹理的呢?使用GDI?GDI+?DirectWrite?还是手动处理TTF/OTF文件? - andlabs
@andlabs 没错,你说得对,我应该提到这一点。我正在使用GDI,使用CreateDIBSection创建一个离屏位图,然后使用CreateFontIndirect获取字体,并使用ExtTextOutW逐个呈现字形。 - the swine
请查看GetGlyphIndices()ScriptGetCMap() - Remy Lebeau
1个回答

2
我曾做过类似的事情,实现自己的字体链接和字体回退,用于为3D渲染器构建字形映射。我使用Uniscribe将字符字符串转换为字体中的字形索引字符串。然后,我使用ScriptGetFontProperties获取字体的wgDefault属性,并将其与每个字形索引的值进行比较。
相对应的GDI等效方法是使用像GetCharacterPlacement这样的东西将文本转换为字形索引(然后使用ETO_GLYPH_INDEX的ExtTextOut),但我不认为它能完成Uniscribe所做的所有关键形状和重新排序。首先,我认为它无法适用于超出BMP以外的任何内容。
您不希望将缺少的符号字形与图形匹配,因为它并不总是一个正方形。例如,在某些字体中,它是一个带问号的黑色钻石。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接