ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LVGL FreeType 字体支持实战:在 X-TRACK 模拟器中运行时加载 TrueType 字体

LVGL FreeType 字体支持实战:在 X-TRACK 模拟器中运行时加载 TrueType 字体 智能硬件嵌入式硬件开发【免费下载链接】X-TRACKA GPS bicycle speedometer that supports offline maps and track recording项目地址https://gitcode.com/gh_mirrors/xt/X-TRACK点击查看免费下载导读本文围绕 LVGL 官方 FreeType 扩展详见 docs/libs/freetype.md展开系统讲解如何让 LVGL 在运行时直接解析 TrueType/OpenType 字体文件并生成字模位图无需像内置字体那样提前用工具转换。文章覆盖 FreeType 的安装与工程接入、lv_conf.h中缓存相关宏的完整语义、lv_ft_font_init()创建字体与加粗/斜体样式的用法并给出可在 X-TRACK 项目模拟器中直接验证的完整示例代码。读完本文你将能够在基于 LVGL 的界面如 X-TRACK 自行车码表模拟器中动态加载任意 TTF 字体彻底摆脱固定字库的束缚。FreeType 扩展解决什么问题LVGL 自带字体如 X-Track 的 USER/Resource/Font 目录下那些.c文件是预编译字模先用工具把字体转换成 C 数组再编译进固件。这种方式运行时开销小但每改一个字号、字重或语言字符集都要重新生成且无法覆盖全部 Unicode 字符。FreeType 扩展lv_freetype把字模生成从编译期搬到运行时通过接口调用 FreeType 库解析 TTF/OTF 字体文件按需渲染字符位图并缓存在内存中。其核心实现位于 src/extra/libs/freetype/lv_freetype.c对外 API 声明在 src/extra/libs/freetype/lv_freetype.h。需要特别说明的是X-Track 模拟器仓库自带的 lv_conf.h 中LV_USE_FREETYPE默认置为0与官方模板 lv_conf_template.h 一致。因此要启用该能力需要按下文步骤打开开关并接入 FreeType 库。第一步安装 FreeTypeFreeType 是独立于 LVGL 的第三方 C 库需要先安装到你的系统。官方文档给出的是基于源码的安装流程# 1. 从 FreeType 官网/镜像下载源码压缩包并解压 # 2. 进入源码目录编译 make # 3. 安装到系统通常安装到 /usr/local头文件在 /usr/include/freetype2 sudo make install安装完成后可以这样验证头文件是否就位ls /usr/include/freetype2/ft2build.h对于包管理器环境如 Debian/Ubuntu 的libfreetype6-dev、Arch 的freetype2直接安装对应开发包通常也能得到同样结果但需要注意官方安装流程与包管理器安装的产物路径可能不同编译时以实际freetype-config --cflags --libs或pkg-config --cflags --libs freetype2的输出为准。第二步把 FreeType 接入你的 LVGL 工程FreeType 扩展不依赖 LVGL 的文件系统而是直接使用操作系统/平台的 C 标准文件 API 读取字体文件因此需要把 FreeType 的头文件路径和库链接信息加入构建系统。以 GCC 命令行为例官方文档给出的完整参数为# 编译期添加头文件搜索路径 -I/usr/include/freetype2 # 链接期添加库搜索路径并链接 freetype -L/usr/local/lib -lfreetype对应 CMake 工程的写法大致为target_include_directories(your_target PRIVATE /usr/include/freetype2) target_link_libraries(your_target PRIVATE freetype)注意链接顺序与搜索路径应以本机 FreeType 实际安装位置为准/usr/local/lib只是官方文档的默认安装目录。第三步在 lv_conf.h 中开启并配置 FreeType启用 FreeType 扩展需要修改 LVGL 配置文件中的LV_USE_FREETYPE。X-Track 模拟器工程的配置文件位于 lv_conf.h模板见 lv_conf_template.h 第 647 行附近#define LV_USE_FREETYPE 1官方文档与模板中还提供了一组缓存相关宏lv_conf_template.h#if LV_USE_FREETYPE #define LV_FREETYPE_CACHE_SIZE (16 * 1024) #if LV_FREETYPE_CACHE_SIZE 0 #define LV_FREETYPE_SBIT_CACHE 0 #define LV_FREETYPE_CACHE_FT_FACES 0 #define LV_FREETYPE_CACHE_FT_SIZES 0 #endif #endif各宏的完整语义如下宏默认值取值范围与含义LV_FREETYPE_CACHE_SIZE16 * 1024用于缓存字模位图、轮廓、字符映射charmap等数据节点的最大内存字节数。0表示使用 FreeType 缓存的系统默认值 0表示完全禁用缓存。注意该值不包含由缓存实例托管的FT_Face与FT_Size对象所占内存LV_FREETYPE_CACHE_FT_FACES0缓存实例可管理的已打开FT_Face对象的最大数量。0表示使用系统默认值。仅在LV_FREETYPE_CACHE_SIZE 0时有效LV_FREETYPE_CACHE_FT_SIZES0缓存实例可管理的已打开FT_Size对象的最大数量。0表示使用系统默认值。仅在LV_FREETYPE_CACHE_SIZE 0时有效LV_FREETYPE_SBIT_CACHE0当你能确保所有使用的字号都不超过 256px时将其置为1。它改用 FreeType 的 SBitsmall bitmap缓存对小位图的内存效率远高于通用图像缓存这些宏的默认值同样定义在 src/lv_conf_internal.h并且 LVGL 提供了对应的 Kconfig 配置项见 Kconfig在支持 Kconfig 的构建系统中可通过CONFIG_LV_USE_FREETYPE等符号间接配置。缓存开关对实现路径的影响源码级理解从 lv_freetype.c 的代码结构可以清楚地看到两条截然不同的实现分支LV_FREETYPE_CACHE_SIZE 0默认使用 FreeType 的FTC_Manager、FTC_CMapCache并按LV_FREETYPE_SBIT_CACHE选择FTC_SBitCache或FTC_ImageCache。lv_freetype_init()内部依次调用FT_Init_FreeType()、FTC_Manager_New()和FTC_CMapCache_New()见第 100-151 行字模获取回调get_glyph_dsc_cb_cache()通过FTC_CMapCache_Lookup完成 Unicode → glyph index 的映射缓存第 264 行。LV_FREETYPE_CACHE_SIZE 0不创建任何缓存管理器改为用一个链表face_control.face_ll手动管理打开的FT_Face每次渲染直接走FT_Get_Char_IndexFT_Load_GlyphFT_Render_Glyphget_glyph_dsc_cb_nocache第 460-524 行。此时lv_freetype_init()的三个参数被忽略第 145-147 行。两种模式下生成的lv_font_t都通过get_glyph_dsc/get_glyph_bitmap两个回调挂接到 LVGL 字体接口上对上层用法完全透明。第四步用 lv_ft_font_init() 创建字体FreeType 字体与普通 LVGL 字体一样创建前先填充一个lv_ft_info_t结构体。其定义位于 lv_freetype.htypedef struct { const char * name; /* 字体文件的路径使用 C 标准文件系统 */ const void * mem; /* 指向内存中字体数据的指针为 NULL 时按 name 路径读取文件 */ size_t mem_size; /* mem 指向的数据大小 */ lv_font_t * font; /* 成功后由库填充指向生成的 LVGL 字体 */ uint16_t weight; /* 字体像素大小字号 */ uint16_t style; /* 字体样式见下文 FT_FONT_STYLE_* */ } lv_ft_info_t;然后调用lv_ft_font_init()bool lv_ft_font_init(lv_ft_info_t * info);返回值true表示成功同时info-font被填充为一个合法的lv_font_t *之后可以像任何 LVGL 字体一样使用——例如通过lv_style_set_text_font()赋给文本样式。官方还提供了销毁接口lv_ft_font_destroy(lv_font_t * font)用于释放资源以及库级初始化lv_freetype_init(max_faces, max_sizes, max_bytes)/lv_freetype_destroy()见 lv_freetype.h。当LV_FREETYPE_CACHE_SIZE 0时这三个参数会原样传给FTC_Manager_New()置 0 表示使用系统默认值。字体样式普通 / 斜体 / 加粗样式通过位标志组合枚举定义在 lv_freetype.htypedef enum { FT_FONT_STYLE_NORMAL 0, /* 默认样式 */ FT_FONT_STYLE_ITALIC 1 0, /* 斜体 */ FT_FONT_STYLE_BOLD 1 1 /* 加粗 */ } LV_FT_FONT_STYLE;多个样式可以直接按位或组合例如info.style FT_FONT_STYLE_BOLD | FT_FONT_STYLE_ITALIC; /* 粗斜体 */从源码看两种样式的实现各有侧重斜体通过 16.16 定点数矩阵对字形做剪切变换italic_matrix.xy 0x5800见 lv_freetype.c加粗则对轮廓调用FT_Outline_Embolden()加粗强度为1 6第 214-217 行。注意这些变换作用在字形轮廓上因此要求字体本身是矢量格式outline 字形位图格式字体无法套用。完整示例加载 arial.ttf 并显示文本LVGL 仓库在 examples/libs/freetype/ 目录下提供了官方示例含一个可直接使用的arial.ttf字体文件arial.ttf和对应的 C 示例 lv_example_freetype_1.c。完整代码含必要注释/* 用 FreeType 加载一个字体 */ void lv_example_freetype_1(void) { /* 创建字体信息结构体 */ static lv_ft_info_t info; /* FreeType 使用 C 标准文件系统因此路径不需要盘符前缀 */ info.name ./lvgl/examples/libs/freetype/arial.ttf; info.weight 24; /* 字号 24px */ info.style FT_FONT_STYLE_NORMAL; /* 默认样式 */ info.mem NULL; /* 从文件加载而非内存 */ if(!lv_ft_font_init(info)) { LV_LOG_ERROR(create failed.); /* 初始化失败处理 */ } /* 把新字体放入样式 */ static lv_style_t style; lv_style_init(style); lv_style_set_text_font(style, info.font); lv_style_set_text_align(style, LV_TEXT_ALIGN_CENTER); /* 用该样式创建标签 */ lv_obj_t * label lv_label_create(lv_scr_act()); lv_obj_add_style(label, style, 0); lv_label_set_text(label, Hello world\nIm a font created with FreeType); lv_obj_center(label); }其中info.name是相对于进程工作目录的路径示例从 LVGL 仓库根目录运行因为 FreeType 扩展不走 LVGL 文件系统而是用 C 标准库直接打开文件。若改为从内存加载字体则设置info.mem与info.mem_size并将name留作标识即可——缓存模式下font_face_requester会优先走FT_New_Memory_Facelv_freetype.c。在 X-Track 模拟器工程LVGL.Simulator中实践时可把上述逻辑放进页面初始化流程将info.name指向工程内实际存放的字体文件路径并先确认lv_conf.h中LV_USE_FREETYPE已置 1、FreeType 已链接进模拟器构建。关键使用注意点不走 LVGL 文件系统FreeType 扩展直接使用操作系统标准文件 API 读取字体文件因此info.name填写的是系统路径而非 LVGL 驱动盘符路径如A:...路径基准是进程当前工作目录。缓存内存与对象数是两回事LV_FREETYPE_CACHE_SIZE只管位图/轮廓/字符映射等数据节点LV_FREETYPE_CACHE_FT_FACES与LV_FREETYPE_CACHE_FT_SIZES分别限定缓存的FT_Face与FT_Size数量两者内存互不折算。小字号场景开启 SBit 缓存若确认所有字号 ≤ 256px建议把LV_FREETYPE_SBIT_CACHE置 1位图内存利用率更高大字号超大位图场景则应保持 0 使用图像缓存。样式只对矢量轮廓有效加粗/斜体依赖 FreeType 的轮廓变换能力位图型字体如部分 bitmap font无法获得这两类样式效果。关闭缓存的选择内存极度受限时可以令LV_FREETYPE_CACHE_SIZE 0走无缓存路径代价是每个字符每次渲染都重新走加载/渲染管线CPU 开销更高适合字符量极少的使用场景。进一步学习想深入 FreeType 原理可参考其官方入门教程step1 教程覆盖字形加载、渲染与度量概念想理解 LVGL 侧的字形接口契约get_glyph_dsc、get_glyph_bitmap如何被 label 等控件调用可结合 LVGL 字体接口文档学习本仓库内可直接对照研读的实现文件头文件 lv_freetype.h、实现 lv_freetype.c、配置模板 lv_conf_template.h 及示例 lv_example_freetype_1.c。API 速查bool lv_freetype_init(uint16_t max_faces, uint16_t max_sizes, uint32_t max_bytes)初始化 FreeType 库及缓存缓存模式下实例void lv_freetype_destroy(void)销毁 FreeType 库实例bool lv_ft_font_init(lv_ft_info_t * info)按info描述创建 LVGL 字体成功后info-font指向新字体void lv_ft_font_destroy(lv_font_t * font)销毁已创建的 FreeType 字体并释放其内部描述符与缓存面 ID样式枚举FT_FONT_STYLE_NORMAL/FT_FONT_STYLE_ITALIC/FT_FONT_STYLE_BOLD支持按位或组合。赞分享智能硬件嵌入式硬件开发【免费下载链接】X-TRACKA GPS bicycle speedometer that supports offline maps and track recording项目地址https://gitcode.com/gh_mirrors/xt/X-TRACK点击查看免费下载相关推荐10 分钟跑通 CLIP 图文匹配从零到可用的完整路径10 分钟跑通 CLIP 图文匹配从零到可用的完整路径 装完 CLIP一个在海量图片文字配对上训练过的模型你就直接拥有图文匹配能力丢一张图和几句人工智能基础模型大模型多模态计算机视觉GoFPDF字体配置指南TrueType字体支持与自定义字体嵌入GoFPDF字体配置指南TrueType字体支持与自定义字体嵌入 想要在Go语言项目中生成专业PDF文档吗GoFPDF提供了强大的字体配置功能支持TrueOpenPDF字体管理终极指南支持TrueType、OpenType和Unicode字体OpenPDF字体管理终极指南支持TrueType、OpenType和Unicode字体 OpenPDF是一个功能强大的Java库专门用于创建和编辑PDF文后端上一篇whoops进阶SystemFacade类实现系统调用的解耦与模拟下一篇Chromeless网络请求拦截修改HTTP头与响应的技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表