标题
[重要基础库系列] freetype 在 cfree 5 下的编译
clq
浏览(493) +
2021-08-21 19:43:34 发表
编辑
关键字:
[2021-08-21 19:50:48 最后更新]
[重要基础库系列] freetype 在 cfree 5 下的编译 freetype 早前我在 xcode 已经编译通过了,因为当前我用无脚本的 ide 方式编译了几个视频库和图形库后已经知道不一定非要用脚本了。所以这次在我的 4k 显示器中调整好 cfree 5 后我几乎可以肯定 cfree 5 是可以编译成功的。 大概花了我一下午的时间,确实 cfree 5 对比 xcode 这样的最新的 ide 已经落后了,我用 xcode 应该没到 1 小时就移植好了。因为 xcode 在编译失败时甚至能提示失败的函数是在哪里被调用的,以及这个调用又是来自哪里 ... 一直递归到它最开始的地方,相当于调用堆栈!我们可以称之为编译错误信息的编译堆栈,当然了它具体的术语我还不清楚,估计不久后会成为各 ide 的标配,这样它就会有一个正式的术语了。 有了这个“编译错误调用堆栈”后要修复开源代码真的是太方便了! 所以我这份代码是在 xcode 中已经编译成功了的 ios/macos 代码,大概修改的地方一是禁用了 windows 的 相关字体(其实这样仍然能用 windows 下的各个字体,未细究,可能只是禁用了一些 windows 的 api 调用,而其他模块是能兼容 windows 的字体的)。另外一个比较重要的修改是将各个模块下的自定义错误前缀恢复为默认的,这个在最后的 api 已经是取消了的,可能有些模块还没来得及更新代码。 有了这份代码后编译到 windows 下轻松多了,特别是我知道了 freetype 是各个 c 文件在模块中是独立放到一个 c 文件中的,这就更是方便了,意味着不用将太多的 c 文件加入到 ide 中,只要将各个模块领头的那个 .c 文件加入就可以了。 因为这个文件已经包含了它模块下的所有其他的 .c 文件(不过 base 目录下的有些文件没有全部在),而我用的 ide 并不固定,想尽量减少加入工程的 .c 文件,最后我只用了一个 .c 就加入了全部的源码! 这个方法比较巧妙,不过 freetype 这个代码模块分离得很好的才能这样,估计其他项目不一定好用。另外在 ffmpeg 里也有很多一个 .c 里又 include 其他 .c 的情况,所以您编译 ff 失败的话可以看看是否有 .c 文件已经 include 到其他文件里了 不要再独立编译它。 我的这个 .c 文件如下,看到的朋友有福了 :) (开个玩笑,大家共同进步啦!) 这里比较令人意外的是 sfnt 模块并不能取消,否则连早期的 宋体 ttf 文件都打不开。没有细究原因。另外这些模块确实是可以选择的,具体在 ftmodule.h 中。 另外,原代码中的错误前缀还是有点验证修正的,我改了好多个地方。应该有更简单的地方,修改的内容基本上都是重定义错误前缀,如下,如果报错误前缀相关的就恢复成系统默认的就可以了. 完整代码以后再上吧,不过早几年我放过 vc6 编译的版本,有需要的大家可找找。想想以前年轻时干劲也是足居然用微软编译器去编译开源代码。好在现在 windows 下用 gcc/苹果系c 也很方便了,编译起来要方便得多了。 至于脚本这种东西主要是难维护,你看 ndk 都用 cmake 配置文件了。不过有个特例 x264 会需要脚本辅助编译为 10bit 和 8bit 的两种版本代码,另外 ios 还要脚本合并库(我不合并,我用其他的方式 :) )。 ---------------------------------------------------------------- ---------------------------------------------------------------- #define FT_ERR_PREFIX FT_Err_ //clq add for FT_THROW //在报错的代码前重写这个,不过有一两个地方并不能简单的这样处理 ---------------------------------------------------------------- ---------------------------------------------------------------- //尝试将各个 c 文件加入到这个单一的 .c 文件中,以便在各个 ide 中简化编译 //#include "freetype\src\base\ftinit.c" // FT_Init_FreeType( FT_Library *alibrary ) //#include "freetype\src\base\ftobjs.c" //FT_New_Face //#include "freetype\src\base\ftutil.c" //`ft_mem_alloc' //#include "freetype\src\base\ftstream.c" //`FT_Stream_Close' //#include "freetype\src\raster\ftraster.c" //`FT_Outline_Get_CBox' #include "freetype\src\base\ftbase.c" #include "freetype\src\base\ftsystem.c" // `FT_Stream_Open' //奇怪,还要加这个 //#include "freetype\src\raster\ftraster.c" #include "freetype\src\base\ftinit.c" // `FT_Init_FreeType' #include "freetype\src\base\ftbitmap.c" // `FT_Bitmap_Init' //---------------------------------------------------------------- #include "freetype\src\autofit\autofit.c" // `autofit_module_class' #include "freetype\src\truetype\truetype.c" // `tt_driver_class' //[Error] D:\test1\cf5\cf5t1\freetype\src\base\ftadvanc.c:145: undefined reference to `t1_driver_class' #include "freetype\src\type1\type1.c" // `t1_driver_class' #include "freetype\src\type42\type42.c" // `t42_driver_class' #include "freetype\src\cff\cff.c" // `cff_driver_class' #include "freetype\src\cid\type1cid.c" // `t1cid_driver_class' #include "freetype\src\pfr\pfr.c" // `pfr_driver_class' #include "freetype\src\pcf\pcf.c" // `pcf_driver_class' //#include "freetype\src\winfonts\winfnt.c" //winfnt_driver_class //奇怪,这个无法禁用 //还是可以禁用的 #include "freetype\src\psaux\psaux.c" #include "freetype\src\psnames\psnames.c" #include "freetype\src\pshinter\pshinter.c" #include "freetype\src\bdf\bdf.c" #include "freetype\src\smooth\smooth.c" #include "freetype\src\raster\raster.c" //clq 暂时禁用//不行,不能少,否则windows 的宋体都打不开 #include "freetype\src\sfnt\sfnt.c" #include "freetype\src\base\ftdebug.c" //`FT_Trace_Disable' #include "freetype\src\base\ftglyph.c" //FT_Get_Glyph #include "freetype\src\gzip\ftgzip.c" //FT_Stream_OpenGzip #include "freetype\src\lzw\ftlzw.c"" //FT_Stream_OpenLZW ---------------------------------------------------------------- ---------------------------------------------------------------- ftmodule.h 的内容如下 /* * This file registers the FreeType modules compiled into the library. * * If you use GNU make, this file IS NOT USED! Instead, it is created in * the objects directory (normally `/objs/`) based on information * from `/modules.cfg`. * * Please read `docs/INSTALL.ANY` and `docs/CUSTOMIZE` how to compile * FreeType without GNU make. * */ //clq 这里应该是可以禁用不同的字体 FT_USE_MODULE( FT_Module_Class, autofit_module_class ) FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) //clq// //FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) //clq// FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) FT_USE_MODULE( FT_Module_Class, psaux_module_class ) FT_USE_MODULE( FT_Module_Class, psnames_module_class ) FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) //clq//不行,不能少,否则windows 的宋体都打不开 FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) /* EOF */
clq
2021-08-21 19:46:00 发表
编辑
忘记说了,用 cfree5 是因为我是它的正版注册用户 :) 它好久没升级了,希望作者升一下,至少支持 4k 显示器嘛。我自己折腾了一下,效果还是差一点,主要是图标太小了,凑合用用。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.