前言

  在学习lvgl中,在英文字体上很多人都用过,但是中文字体往往需要靠取模去实现。那么我就在想,如何像windows那样加载动态的字体呢,这样想做多大字体都行。于是就开始了字体的移植。

什么是ttf字体:

  字库是输出设备的一个组成部分。由于汉字不同于西方字体,字符集非常庞大,不能用单字节表示,因此postscript level i的rip不能使用汉字,很多西文软件也不支持汉字。
桌面出版系统使用的字库有两种标准: postscript字库和truetype字库。这两种字体标准都是采用曲线方式描述字体轮廓,因此都可以输出很高质量的字形。
常用的字库标准是truetype字库,truetype字体是windows操作系统使用的唯一字体标准,macintosh计算机也用 truetype字体作为系统字体。truetype字体的最大优点是可以很方便地把字体轮廓转换成曲线,可以对曲线进行填充,制成各种颜色和效果,它可以进一步变形,制作特殊效果字体,因此经常用来制作一些标题字或花样字。 truetype字便宜,字款丰富。但一般情况厂truetype字不能直接由rip输出。需要经过特殊处理,比如转成曲线或输出时下载,使用起来较麻烦。速度也要慢一些,尤其是处理大量文字时很不方便,因此不适合用来作为页面的正文文字使用。
  truetype字体也用来作为postscript字库的显示字用,各字库公司同时都有这两种标准的产品。因此当使用truetype字体制作版面时,输出时仍然可以将它代换成postscript字库输出
在一些特殊的场合,系统字符集不包含你要用的字体,这时候必须使用自己的字体文件,如甲骨文等古文字处理,一般在系统盘\WINDOWS\Fonts里,直接双击能查看是什么样的字体。

ttf字体解析器

 我们一般用开源的freetype去解析.ttf字体文件,然后在lvgl官方给的库lv_lib_freetype封装成lvgl的api去使用。经过我苦找关于二者的联动任然只有官方的README可用,而它的README也就寥寥数语。于是我就开始了自己摸索的过程。

移植过程

 首先最重要的就是确定我们的硬件,找到对应的交叉编译工具,比如我这里是arm-linux-gnueabihf-gcc然后点击下载freetype源码https://download.savannah.gnu.org/releases/freetype/freetype-2.10.0.tar.gz

wget https://download.savannah.gnu.org/releases/freetype/freetype-2.10.0.tar.gz # 下载
tar zxvf freetype-2.10.0.tar.gz # 解压freetype
cd freetype-2.10.0/             # 进入freetype文件夹内
./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux --prefix=$PWD/INSTALL --with-zlib=no --with-png=no             # 主要是CC这里填交叉编译工具
make
make install

最后会生成一个INSTALL文件夹,使用tree看一下INSTALL文件结构

.
├── include
│   └── freetype2
│       ├── freetype
│       │   ├── config
│       │   │   ├── ftconfig.h
│       │   │   ├── ftheader.h
│       │   │   ├── ftmodule.h
│       │   │   ├── ftoption.h
│       │   │   └── ftstdlib.h
│       │   ├── freetype.h
│       │   ├── ftadvanc.h
│       │   ├── ftbbox.h
│       │   ├── ftbdf.h
│       │   ├── ftbitmap.h
│       │   ├── ftbzip2.h
│       │   ├── ftcache.h
│       │   ├── ftchapters.h
│       │   ├── ftcid.h
│       │   ├── ftcolor.h
│       │   ├── ftdriver.h
│       │   ├── fterrdef.h
│       │   ├── fterrors.h
│       │   ├── ftfntfmt.h
│       │   ├── ftgasp.h
│       │   ├── ftglyph.h
│       │   ├── ftgxval.h
│       │   ├── ftgzip.h
│       │   ├── ftimage.h
│       │   ├── ftincrem.h
│       │   ├── ftlcdfil.h
│       │   ├── ftlist.h
│       │   ├── ftlzw.h
│       │   ├── ftmac.h
│       │   ├── ftmm.h
│       │   ├── ftmodapi.h
│       │   ├── ftmoderr.h
│       │   ├── ftotval.h
│       │   ├── ftoutln.h
│       │   ├── ftparams.h
│       │   ├── ftpfr.h
│       │   ├── ftrender.h
│       │   ├── ftsizes.h
│       │   ├── ftsnames.h
│       │   ├── ftstroke.h
│       │   ├── ftsynth.h
│       │   ├── ftsystem.h
│       │   ├── fttrigon.h
│       │   ├── fttypes.h
│       │   ├── ftwinfnt.h
│       │   ├── t1tables.h
│       │   ├── ttnameid.h
│       │   ├── tttables.h
│       │   └── tttags.h
│       └── ft2build.h
├── lib
│   ├── libfreetype.a
│   ├── libfreetype.la
│   ├── libfreetype.so -> libfreetype.so.6.17.0
│   ├── libfreetype.so.6 -> libfreetype.so.6.17.0
│   ├── libfreetype.so.6.17.0
│   └── pkgconfig
│       └── freetype2.pc
└── share└── aclocal└── freetype2.m48 directories, 57 files

下载我们的lv_lib_freetype的库,并把freetype库中的freetype2文件夹和它合并

lv_lib_freetype/
├── freetype
│   ├── config
│   │   ├── ftconfig.h
│   │   ├── ftheader.h
│   │   ├── ftmodule.h
│   │   ├── ftoption.h
│   │   └── ftstdlib.h
│   ├── freetype.h
│   ├── ftadvanc.h
│   ├── ftbbox.h
│   ├── ftbdf.h
│   ├── ftbitmap.h
│   ├── ftbzip2.h
│   ├── ftcache.h
│   ├── ftchapters.h
│   ├── ftcid.h
│   ├── fterrdef.h
│   ├── fterrors.h
│   ├── ftgasp.h
│   ├── ftglyph.h
│   ├── ftgxval.h
│   ├── ftgzip.h
│   ├── ftimage.h
│   ├── ftincrem.h
│   ├── ftlcdfil.h
│   ├── ftlist.h
│   ├── ftlzw.h
│   ├── ftmac.h
│   ├── ftmm.h
│   ├── ftmodapi.h
│   ├── ftmoderr.h
│   ├── ftotval.h
│   ├── ftoutln.h
│   ├── ftpfr.h
│   ├── ftrender.h
│   ├── ftsizes.h
│   ├── ftsnames.h
│   ├── ftstroke.h
│   ├── ftsynth.h
│   ├── ftsystem.h
│   ├── fttrigon.h
│   ├── fttypes.h
│   ├── ftwinfnt.h
│   ├── ftxf86.h
│   ├── t1tables.h
│   ├── ttnameid.h
│   ├── tttables.h
│   ├── tttags.h
│   └── ttunpat.h
├── ft2build.h
├── lv_freetype.c
├── lv_freetype.h
└── lv_freetype.mk

这里的lv_freetype.mk是我自己加的,里面将.h的路径放入到自己inculde path中,将.c放入编译行列中。这部分不同的硬件编译makefile有所不同,总而言之就是把文件夹加入自己的工程里。然后别忘了添加动态库

lib
└── libfreetype.so0 directories, 1 file

在makefile里也要用 -L./lib -lfreetype将动态库编译进去,此时我们的就可以写例子了
根据官方github的示例,我们修改一下

lv_freetype_init(64); /*Cache max 64 glyphs*//*Create a font*/
static lv_font_t font1;
lv_freetype_font_init(&font1, "./Alibaba-PuHuiTi-Regular.ttf", 32);/*Create style with the new font*/
static lv_style_t style;
lv_style_init(&style);
lv_style_set_text_font(&style, LV_STATE_DEFAULT, &font1);/*Create a label with the new style*/
lv_obj_t * label = lv_label_create(lv_scr_act(), NULL);
lv_obj_add_style(label, LV_LABEL_PART_MAIN, &style);
lv_label_set_text(label, "你好,世界!");

这个字体是阿里普惠字体可以从https://alibabafont.taobao.com/wow/alibabafont/act/alifont下载,我们make一下发现,会出现如下错误

/home/kirto/8ms-sstar/lv_lib_freetype/lv_freetype.c: In function ‘get_glyph_dsc_cache_cb’:
/home/kirto/8ms-sstar/lv_lib_freetype/lv_freetype.c:69:72: error: ‘lv_font_t’ {aka ‘const struct _lv_font_struct’} has no member named ‘user_data’lv_font_fmt_freetype_dsc_t * dsc = (lv_font_fmt_freetype_dsc_t *)(font->user_data);^~
/home/kirto/8ms-sstar/lv_lib_freetype/lv_freetype.c: In function ‘lv_freetype_font_init’:
/home/kirto/8ms-sstar/lv_lib_freetype/lv_freetype.c:249:9: error: ‘lv_font_t’ {aka ‘struct _lv_font_struct’} has no member named ‘user_data’font->user_data = dsc;^~
Makefile:29: recipe for target 'lv_freetype.o' failed
make: *** [lv_freetype.o] Error 1

这里是说lv_font_t这个结构体没有user_data这个属性,这里是被宏定义注释了,我们需要从lv_config里找到这个宏定义,打开这个属性

/*1: Add a `user_data` to drivers and objects*/
#define LV_USE_USER_DATA        1

再make就完成了,运行的时候需要加入字体文件和依赖库libfreetype.so.6(我也奇怪为什么是.6文件),然后运行就可以看到结果了

LVGL学习之路——基于lv_lib_freetype库的TTF字体文件动态加载中文字体(阿里普惠字体)相关推荐

  1. Kanzi学习之路(7):kanzi的资源预加载

    为了便于资源文件的管理,kanzi有着一套自己的资源文件管理系统,将所有的资源文件打包进.kzb文件中.但是资源文件又很庞大,为了加快开机速度,应用程序的响应速度,很多时候我们要选择预加载资源,多线程 ...

  2. Android插件化学习之路(一)之动态加载综述

    前段时间,公司项目完成了插件化的开发,自己也因此学习了很多Android插件化的知识,于是想把这些内容记录下来,本次带来Android插件化的第一篇:动态加载综述 Android插件化学习之路(一)之 ...

  3. 【胖虎的逆向之路】01——动态加载和类加载机制详解

    胖虎的逆向之路 01--动态加载和类加载机制详解 一.前言 二.类的加载器 1. 双亲委派模式 2. Android 中的类加载机制 1)Android 基本类的预加载 2)Android类加载器层级 ...

  4. android 加载三方so的方法_Android开发教程之动态加载so库文件的方法

    Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...

  5. Android基础——动态加载so库

    Android中动态加载so 原因:如果把so文件直接放在libs目录下,在android程序启动的时候会默认加载libs目录下的所有so库,但这些so库可能会在某些地方存在冲突,使用动态加载so库, ...

  6. Linux动态加载共享库,Linux共享库的动态加载(附测试案例)

    共享库的动态加载是指可以在程序运行的过程中去加载所需的共享库.常用于某些系统或者应用程序的自动升级. 在C语言的源程序动态加载共享库,需要调用一组特殊的函数,它们被声明于一个专门的头文件dlfcn.h ...

  7. 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )

    文章目录 一.动态加载 二.第一代加壳技术 ( DEX 整体加固 ) 三.第二代加壳技术 ( 函数抽取 ) 四.第三代加壳技术 ( Java 函数 -> Native 函数 ) 五.so 动态库 ...

  8. ANDROID动态加载 使用SO库时要注意的一些问题

    转载自:http://blog.csdn.net/qq_23331691/article/details/51699888 基本信息 作者:kaedea 项目:android-dynamical-lo ...

  9. 动态加载器的知识学习及CTFHUB动态加载器解题

    目录 动态加载器的了解 CTFHUB-动态加载器 动态加载器的了解 在[维基百科]中动态加载是一种机制,通过该机制,计算机程序可以在运行时将库(或其他二进制)加载到存储器中,检索包含在库中的函数和变量 ...

最新文章

  1. 【Ansible 文档】【译文】模式
  2. Direct2D (25) : 将画笔线条所占用的区域转换为路径 - ID2D1Geometry.Widen()
  3. JavaScript字符串的单引号和双引号问题
  4. 设置程序中的html,如何在Behat中为HTML格式化程序设置自定义模板
  5. node 命令行升级版本
  6. 【HDOJ1043】八数码的八境界
  7. 物联网智能硬件设备常见攻击方法
  8. .NET 中的 Worker Service 入门介绍
  9. bzoj 3172: [Tjoi2013]单词 AC自动机
  10. Words For Today [2011-07-31]
  11. mysql主从同步图
  12. leetcode(90)子集 2
  13. 判断目录下的文件或者文件夹是否存在
  14. 乐鑫Esp32学习之旅28 熟悉自定义分区表 partition,拉取阿里云OSS对象存储的单片机/图片等较大文件保存在特定的存储位置,并读取出来做完整性校验,保证数据的完整性。(附带源码)
  15. 中美线径对照表_中美WG线规对照表
  16. LaunchAnywhere载入Java VM时windows出现错误:2以及216
  17. HTML页面楷体gb2312字体,楷体gb2312
  18. 计算机网络 - UDP/TCP、IP、MAC报文协议格式
  19. 360cdn能挡住cc攻击_人人用得起的CDN加速服务,可防御CC攻击
  20. 海尔微型计算机云悦t3G276ia,没了海尔云悦miniA 迷你主机界尽失半壁江山

热门文章

  1. dll文件丢失怎么恢复?文件恢复,只需要这3个方法
  2. 游戏中的一些属性英文缩写
  3. Python实现多进程间通信的方法总结
  4. 高达1万欧元!AI所绘制的画作出现在佳士出场
  5. maven在线搜索jar组件坐标
  6. redis的安装与应用
  7. Visual Studio 设置增量编译
  8. java poi 数据透视,java 利用poi导出默认以表格展示的excel透视表
  9. @Retention元注解的使用
  10. ubuntu系统怎样卸载火狐浏览器