C++版本的sfntly库使用示例(一)

来源:互联网 发布:创业软件股份 编辑:程序博客网 时间:2024/06/05 18:04

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同样的效果,还在调研中。



        









原创粉丝点击