我们如何知道真类型字体是否具有高于0xFFFF的代码点
How do we know if a true type font has code points above 0xFFFF?
我们如何知道真正的字体是否具有高于0xFFFF的代码点?
有一个
API(GetFontUnicodeRanges/GetGlyphIndex),但它并没有超过0xFFFF,我怀疑你知道。
有两种明显的方法可以通过编程方式查找:
- 解析
.ttf
文件(规范是开放的) - 尝试测量您感兴趣的字符的输出,并将测量值与已知的替换字符进行比较
此答案有一个 .NET/C# 解决方案:获取字体支持的字符 - 在 C# 中
如果运行Windows 7+,则可以调用
DirectWrite的IDWriteFontFace::GetGlyphIndices
从给定代码点的cmap中获取名义字形ID,或者如果您只想了解所有范围,则可以调用IDWriteFontFace1::GetUnicodeRanges
(Win 8+或Windows 7的平台更新)。GDI GetGlyphIndices
和 Uniscribe ScriptGetCmap
仅支持基本的多语言平面。
ScriptShape
API 来救援。Windows 7 及更高版本。与ScriptGetCMap
不同,它支持UTF-16代理项对。对于不受字体支持的字符,它将返回零字形索引。
下面的示例假定只有一个字形字符串。缓冲区都是静态的。有关缓冲区大小要求,请参阅 API 文档。
wchar_t ws[] = L" "; // Known astral plane character
SelectObject(hDC, hFont); // Font to analyze - construct your own
SCRIPT_CACHE ScCache = nullptr; //One of those per font, per size.
HRESULT hr;
SCRIPT_ITEM si[3]; // Static buffers here :(
int ci;
WORD Glyphs[10], Clust[10];
SCRIPT_VISATTR sva[10];
hr = ScriptItemize(ws, wcslen(ws), 2, nullptr, nullptr, si, &ci);
int ng;
hr = ScriptShape(hDC, &ScCache, s, s[1] ? 2 : 1, _countof(Glyphs), &si[0].a, Glyphs, Clust, sva, &ng);
// For the win!
bool FontSupportsThisGlyph = (ng == 1 && Glyphs[0] != 0);
相关文章:
- 高于给定值的最小可表达值
- 如何处理高于 7FF.. 64 位和uint64_t类型的十六进制值
- 在数组中搜索复杂度高于 O(n) 的元素
- 如何在结构数组中显示学生姓名以及高于平均 GPA 的 ID
- 在屏幕分辨率高于 1920x1080 时捕获视频
- 如何在C++中生成低于或高于某个数字的任何随机数?
- 如何生成高于或低于之前生成的随机数的随机数?
- 高于平均水平的数字[C ]
- 随机整数仍在生成低于或高于范围的数字?
- 当输入高于最大值的值时,如何将 QSpinBox 的值设置为 max
- RAND()在递归功能中产生的数字高于设定范围
- 无法从欧拉角创建偏航高于 90 glm 的夸特
- 为什么从pmib_tcprow2结构进行dwlocalport时使用0xffff的bitmask
- 测得的 fps 高于理论 fps
- Visual Studio 2010 调用 _locking() 失败 (errno = 22) 当文件指针高于 (2^
- 在C++程序中,IO/文件 IO 操作的优先级是否高于 CPU 操作
- 查找容器中高于阈值的最大值和最小值元素
- Android上的OpenSL以高于应有的速度播放
- CCITT CRC 16位启动值0xffff
- 我们如何知道真类型字体是否具有高于0xFFFF的代码点