sfntly是google提供的开源库,解决字体文件的裁剪问题。sfntly有C++和Java两个版本,其中java版本的示例比较完善,网上可以搜到很多关于 sfnt tool的资源。C++版本的信息几乎没有。在这里将我在项目中经验进行简单的记录。
搭建sfntly的solution:
1. 在sfntly-master\cpp目录下找到CMakeLists.txt, open CMake, 把包含CMakeLIsts的源码作为原目录。
2. CMake的使用很简单,但是我下载的sfntly的CMakeLists.txt报了一个unit_test相关的错,相关代码在sfntly-master\cpp\ext\redist 目录下。
3. 我生成的solution是在VS 2010下运行,遇到了以下一些问题:
1)warning级别偏高,需要调低warning级别:
Properties -> C/C++
WarningLevel, Level3;
Treat warnings as errors, No.
2)编译依赖。需要先编译tinyxml, 其次是sfntly.
3)如果编译不识别std::numeric_limits<int32_t>::max (),改成(std::numeric_limits<int32_t>::max)()
这是由于Microsoft在<windows.h>定义了max宏:#define max(a,b) (((a) > (b)) ? (a) : (b))
boost解决了这个问题,但是很难复制它的方法,简单的做法如上。
4)sfntly使用了icu的库,并且将icu的库放在了ext\redist 目录下,但是我的电脑是64位,只好重新下载一个 icu。
Fix the issue: fatal error C1083: Cannot open include file:'unicode/ucnv.h': No such file or directory
Download ICU: http://site.icu-project.org/download/55#TOC-ICU4C-Download
Choose the proper version:icu4c-55_1-Win64-msvc10.zip
Put icu package under solution folder's sfntly\ext
5)将iccuc.lib在Properties ->Linker里修改为全路径ext\icu\lib64\icuuc.lib
6)如果运行时报错找不到icuuc55.dll, 把sfntly\ext\icu\bin64中的dll文件拷贝到sfntly\bin\Debug。
基本上sfntly的solution就简单搭建好了。
C++版的sfntly的使用:
sfntly提供了几个sample的exe文件:
subsetter.exe:
输入:完整路径的源ttf,完整路径的目标ttf
输出:目标ttf
需要提取的字符写死在代码里, 是一些简单符号的glyphs id。
subtly_debug.exe:
输入:完整路径的源ttf,完整路径的目标ttf
输出:包括了源ttf所有字符的目标ttf
subtly_subsetter.exe:
输入:完整路径的源ttf,完整路径的目标ttf, 需要提取的字符范围(比如 a d)
输出:只包括abcd四个字符的目标ttf
字符的范围只能在127以下,不可以输入汉字。
subtly_merger.exe
输入:完整路径的源ttf若干,完整路径的目标ttf
输出:包含所有源文件字符的目标文件
源文件只能使用subtly_subsetter.exe生成的目标文件,不可以是任意ttf
chrome_subsetter.exe
输入:完整路径的源ttf,完整路径的目标ttf, 需要提取的字符的glyphs id(十六进制)以逗号隔开
输出:只包含需要提取字符的目标文件
以上的示例中,个人觉得将glyphs id作为提取字符的输入并不可取,而且网上搜到的办法对windows的依赖太严重。建议参考subtly_subsetter.exe的方法,将字符转化为unicode作为提取条件输入。
遇到的问题:
Java版本的示例中,生成的字体库非常小,少量字符的情况下只有几K。而C++版本的同样是在少量字符的情况下要超过1000K。原因是java版本生成的是一个全新的字体文件,只包含所需字符的各种属性。而C++版本仍然保留源文件的框架,去掉了不要的字符glyph,保留了需要的字符glyph。
sfntly库主要的作用是对字体文件完整解析,并生成各种tables,C++版本应该可以做到和Java同样的效果,还在调研中。
————————————————
版权声明:本文为CSDN博主「Cplusplus_engineer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Cplusplus_engineer/article/details/72540026