c++ - 在 Windows 中,如何检测 Unicode 字符是否呈现为正方形( bean 腐)?

标签 c++ winapi unicode fonts gdi

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

我正在使用 GDI,我使用 CreateDIBSection 创建了一个屏幕外位图,然后使用 CreateFontIndirect 获取字体并使用 ExtTextOutW 呈现字形。

到目前为止,我一直在考虑检测光栅化形式的 bean 腐(通过比较像素)哪种方法可行,但我想这不是很好。它还要求我获得一些给定字体肯定没有的 Unicode 字符,以便获得要比较的"template"。我想我迟早会惹上麻烦。

最佳答案

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

纯 GDI 等价物是使用类似 GetCharacterPlacement 的东西将文本转换为字形索引(然后将 ExtTextOut 与 ETO_GLYPH_INDEX 一起使用),但我认为这不会完成 Uniscribe 会执行的所有键整形和重新排序。对于初学者,我认为这对 BMP 以外的任何事情都不起作用。

您不想在图形上匹配缺失的符号字形,因为它并不总是正方形。例如,在某些字体中,它是一个带有问号的黑色菱形。

关于c++ - 在 Windows 中,如何检测 Unicode 字符是否呈现为正方形( bean 腐)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40745202/

相关文章:

c++ - 错误 : xxx does not name a type

c++ - 重载赋值运算符 : if we return (*this),,它是指针/地址处的值,赋值运算符的正确语法是什么?

windows - 阻止非管理员在特定时间段内登录 Windows

c++ - 嵌套模板参数

winapi - 学习32位汇编

winapi - Windows 文件历史记录 API : Adding Include Rule

php - 如何导出为阿拉伯语的 excel?

c++ - 模板和字符串文字和 UNICODE

python - 为什么 UnicodeEncodeError 只在 emacs 的 python shell 中引发?

c++ - operator[] 在 C++ 中如何工作(重载用户定义的对象)?