Ita*_*aim 5 c# windows winapi fonts
我正在尝试以字体显示所有字形.我正在使用GetFontUnicodeRanges获取可用字符,然后我创建一个位图,其中包含所有可用字符及其索引旁边的每个字符.
我使用字体"Wingdings 2"作为测试用例,并将其与我在Windows中看到的相比较charmap.exe.我看到,当所有字符出现时,一些字符出现不止一次(非unicode字体总共480个字形),并且位置与charmap中间不同(例如,中等大小的圆形字形,在charmap中定位为0x97,在字体中它是字形0xF097,我也认为它是一个0x2014).
我想使用字体作为"常规"方式,这意味着,我想看到与中相同的数据charmap.exe(并且在旁注中我也想知道字体是unicode字体还是ascii字体,如图charmap所示) .基本上,你可以说我试图charmap从头开始写自己的.
我该如何填写缺失的数据?我正在查看Windows的字体和文本API,但找不到任何可以帮助我的东西,所以我必须缺少一些相关的API.这些是什么?
经过与GetFontData的挣扎以及缺乏文档(好吧,不完全缺乏,但实际上组织得不好,有些数据确实缺失),我找到了编写自己的CharMap的方法.这是我在开发过程中发现的:
文档将告诉您使用"技巧",因为字形位置数据紧跟在cmap表中的数组之后.这并不意味着它是在该cmap表中.实际上,他们在loca桌子上.
您还需要读取head表格中的位置格式标志(偏移量34),以及maxp表格中的字形数量字段(偏移量4).
似乎在符号字体中(如果cmap头编码id为0,您可以判断字体是否为符号字体,至少以TTF格式4,即Microsoft格式),将字符添加0xF000到其实际索引中,对于常规ASCII代码,您将在Unicode表的远端获得Unicode值.我0xF000从每个字符代码中减去并在Wingdings [2,3]和Webdings字体上进行测试,它运行得很好.
我经常使用官方文档:www.microsoft.com/typography/tt/ttf_spec/ttch02.doc,参考代码:http://support.microsoft.com/kb/241020.
参考代码用C语言编写,所以为了在C#中写入,我将所有数据读入byte[]缓冲区,并"手动"从中读取每个元素.
| 归档时间: |
|
| 查看次数: |
4741 次 |
| 最近记录: |