LVGL学习之路——基于lv_lib_freetype库的TTF字体文件动态加载中文字体(阿里普惠字体)
前言
在学习lvgl中,在英文字体上很多人都用过,但是中文字体往往需要靠取模去实现。那么我就在想,如何像windows那样加载动态的字体呢,这样想做多大字体都行。于是就开始了字体的移植。
什么是ttf字体:
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字体文件动态加载中文字体(阿里普惠字体)相关推荐
- Kanzi学习之路(7):kanzi的资源预加载
为了便于资源文件的管理,kanzi有着一套自己的资源文件管理系统,将所有的资源文件打包进.kzb文件中.但是资源文件又很庞大,为了加快开机速度,应用程序的响应速度,很多时候我们要选择预加载资源,多线程 ...
- Android插件化学习之路(一)之动态加载综述
前段时间,公司项目完成了插件化的开发,自己也因此学习了很多Android插件化的知识,于是想把这些内容记录下来,本次带来Android插件化的第一篇:动态加载综述 Android插件化学习之路(一)之 ...
- 【胖虎的逆向之路】01——动态加载和类加载机制详解
胖虎的逆向之路 01--动态加载和类加载机制详解 一.前言 二.类的加载器 1. 双亲委派模式 2. Android 中的类加载机制 1)Android 基本类的预加载 2)Android类加载器层级 ...
- android 加载三方so的方法_Android开发教程之动态加载so库文件的方法
Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...
- Android基础——动态加载so库
Android中动态加载so 原因:如果把so文件直接放在libs目录下,在android程序启动的时候会默认加载libs目录下的所有so库,但这些so库可能会在某些地方存在冲突,使用动态加载so库, ...
- Linux动态加载共享库,Linux共享库的动态加载(附测试案例)
共享库的动态加载是指可以在程序运行的过程中去加载所需的共享库.常用于某些系统或者应用程序的自动升级. 在C语言的源程序动态加载共享库,需要调用一组特殊的函数,它们被声明于一个专门的头文件dlfcn.h ...
- 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )
文章目录 一.动态加载 二.第一代加壳技术 ( DEX 整体加固 ) 三.第二代加壳技术 ( 函数抽取 ) 四.第三代加壳技术 ( Java 函数 -> Native 函数 ) 五.so 动态库 ...
- ANDROID动态加载 使用SO库时要注意的一些问题
转载自:http://blog.csdn.net/qq_23331691/article/details/51699888 基本信息 作者:kaedea 项目:android-dynamical-lo ...
- 动态加载器的知识学习及CTFHUB动态加载器解题
目录 动态加载器的了解 CTFHUB-动态加载器 动态加载器的了解 在[维基百科]中动态加载是一种机制,通过该机制,计算机程序可以在运行时将库(或其他二进制)加载到存储器中,检索包含在库中的函数和变量 ...
最新文章
- 【Ansible 文档】【译文】模式
- Direct2D (25) : 将画笔线条所占用的区域转换为路径 - ID2D1Geometry.Widen()
- JavaScript字符串的单引号和双引号问题
- 设置程序中的html,如何在Behat中为HTML格式化程序设置自定义模板
- node 命令行升级版本
- 【HDOJ1043】八数码的八境界
- 物联网智能硬件设备常见攻击方法
- .NET 中的 Worker Service 入门介绍
- bzoj 3172: [Tjoi2013]单词 AC自动机
- Words For Today [2011-07-31]
- mysql主从同步图
- leetcode(90)子集 2
- 判断目录下的文件或者文件夹是否存在
- 乐鑫Esp32学习之旅28 熟悉自定义分区表 partition,拉取阿里云OSS对象存储的单片机/图片等较大文件保存在特定的存储位置,并读取出来做完整性校验,保证数据的完整性。(附带源码)
- 中美线径对照表_中美WG线规对照表
- LaunchAnywhere载入Java VM时windows出现错误:2以及216
- HTML页面楷体gb2312字体,楷体gb2312
- 计算机网络 - UDP/TCP、IP、MAC报文协议格式
- 360cdn能挡住cc攻击_人人用得起的CDN加速服务,可防御CC攻击
- 海尔微型计算机云悦t3G276ia,没了海尔云悦miniA 迷你主机界尽失半壁江山