ESP32 LVGL使用外部FLASH字体BIN文件

2023-11-03

ESP32 LVGL使用外部FLASH字体BIN文件

生成字体文件

使用LvglFontTool 这个工具,生成类型勾选XBF字体,外部BIN文件
在这里插入图片描述
会生成两个文件,一个myFont.c 和一个bin文件
在这里插入图片描述
然后把bin文件放到spiffs分区 编译的时候会自动烧录到flash里面

改动myFont.c以获取bin文件数据


#include "lvgl.h"
#include "stdio.h"
#include <stdlib.h>
#include <string.h>
#include "esp_system.h"

#include "esp_vfs.h"
#include "esp_spiffs.h"


typedef struct
{
	uint16_t min;
	uint16_t max;
	uint8_t bpp;
	uint8_t reserved[3];
} x_header_t;
typedef struct
{
	uint32_t pos;
} x_table_t;
typedef struct
{
	uint8_t adv_w;
	uint8_t box_w;
	uint8_t box_h;
	int8_t ofs_x;
	int8_t ofs_y;
	uint8_t r;
} glyph_dsc_t;

static x_header_t __g_xbf_hd = {
	.min = 0x0020,
	.max = 0xff1a,
	.bpp = 4,
};
char *Font_buff = NULL;
// static uint8_t __g_font_buf[240]; //如bin文件存在SPI FLASH可使用此buff
static void init_font(void)
{
	FILE *ff = fopen("/spiffs/myFont.bin", "r");
	if (ff == NULL)
	{
		printf("Failed to open file for reading");
		return;
	}
	fseek(ff, 0, SEEK_END);
	long lSize = ftell(ff);
	rewind(ff);
	printf("Lsize %ld", lSize);
	static uint8_t first_in = 1;
	if (first_in == 1)
	{
		first_in = 0;
		Font_buff = (char *)malloc(sizeof(char) * lSize);
	}
	int br = fread(Font_buff, 1, lSize, ff);
	printf("Bytes read %d", br);
	fclose(ff);
}
static uint8_t *__user_font_getdata(int offset, int size)
{
	//如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
	//如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset);
	static uint8_t first_in = 1;
	if (first_in == 1)//第一次进入的时候初始化外部字体
	{
		first_in = 0;
		init_font();
	}
	return (uint8_t*)(Font_buff+offset);
	// return __g_font_buf;
}

static const uint8_t *__user_font_get_bitmap(const lv_font_t *font, uint32_t unicode_letter)
{
	if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min)
	{
		return NULL;
	}
	uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4;
	uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4);
	if (p_pos[0] != 0)
	{
		uint32_t pos = p_pos[0];
		glyph_dsc_t *gdsc = (glyph_dsc_t *)__user_font_getdata(pos, sizeof(glyph_dsc_t));
		return __user_font_getdata(pos + sizeof(glyph_dsc_t), gdsc->box_w * gdsc->box_h * __g_xbf_hd.bpp / 8);
	}
	return NULL;
}

static bool __user_font_get_glyph_dsc(const lv_font_t *font, lv_font_glyph_dsc_t *dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next)
{
	if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min)
	{
		return NULL;
	}
	uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4;
	uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4);
	if (p_pos[0] != 0)
	{
		glyph_dsc_t *gdsc = (glyph_dsc_t *)__user_font_getdata(p_pos[0], sizeof(glyph_dsc_t));
		dsc_out->adv_w = gdsc->adv_w;
		dsc_out->box_h = gdsc->box_h;
		dsc_out->box_w = gdsc->box_w;
		dsc_out->ofs_x = gdsc->ofs_x;
		dsc_out->ofs_y = gdsc->ofs_y;
		dsc_out->bpp = __g_xbf_hd.bpp;
		return true;
	}
	return false;
}

//AliHYAiHei-Beta,,-1
//字模高度:24
//XBF字体,外部bin文件
lv_font_t myFont = {
	.get_glyph_bitmap = __user_font_get_bitmap,
	.get_glyph_dsc = __user_font_get_glyph_dsc,
	.line_height = 24,
	.base_line = 0,
};


使用字体

	LV_FONT_DECLARE(myFont);
	lv_obj_t *label = lv_label_create(obj, NULL);
	lv_obj_set_style_local_text_font(label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &myFont);

得到效果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32 LVGL使用外部FLASH字体BIN文件 的相关文章

  • spring框架历史漏洞复现

    目录 一 docker 1 启动docker 2 列出容器 3 关闭容器 4 进入docker 二 CVE 2016 4977 原理 1 登陆 2 访问url 3 构造payload 4 测试 5 反弹shell 6 编码后的命令结合poc
  • An ASIC Low Power Primer by J. bhaskar

    原文链接 https www academia edu 33242660 An ASIC Low Power Primer by J bhaskar Vlsi Design Power Electronics VLSI VLSI and C
  • jacoco简单教程

    问题 2023 06 06 10 45 52 974563 jacoco简单教程 答案 Jacoco是一个Java代码覆盖率工具 可以帮助开发人员了解他们的代码被测试的程度 以下是Jacoco的简单教程 添加Jacoco插件 在项目的bui

随机推荐

  • golang类型转换与类型断言

    类型转换在程序设计中都是不可避免的问题 当然有一些语言将这个过程给模糊了 大多数时候开发者并不需要去关注这方面的问题 但是golang中的类型匹配是很严格的 不同的类型之间通常需要手动转换 编译器不会代你去做这个事 我之所以说通常需要手动转
  • AD设置某个焊盘铺铜连接方式

    AD设置某个焊盘铺铜连接方式 在规则中创建个别焊盘铺铜连接方式 目的 PCB布板时 将表贴焊盘与铺铜连接方式设置为花焊盘 十字连接 将螺钉孔与铺铜连接方式设置为全连接 步骤一 所有焊盘与铜皮默认为十字连接 单独设置螺钉孔与铜皮全连接 步骤二
  • MYSQL相关问题解惑

    MYSQL如何查看默认存储引擎 方式1 使用show engines语句查看系统中所有的存储引擎 Support列的值表示某种引擎是否能使用 YES表示可以使用 NO表示不能使用 DEFAULT表示该引擎为当前默认存储引擎 方式2 也可以使
  • Linux基本操作指令

    Linnux课程框架学习 LINUX 初识阶段 常用操作 常用工具 1 Linux 系统编程阶段 1 gt 进程概念 2 gt 进程控制 3 gt 基础IO 4 gt 进程间通信 5 gt 进程信号 6 gt 多线程 2 LINUX 网络编
  • 魔兽怀旧服联盟服务器不稳定,魔兽世界怀旧服转服服务关闭最后一天,联盟部落新的对抗...

    魔兽世界这款经典了十几年的游戏有好多的话题可聊 不过恒古不变的热门话题中 联盟与部落的对抗永不过时 在经典怀旧服暂停转服服务即将到来的前一天 某知名论坛又出现了单边大服中阵营之争的唇枪舌战 具体是什么原因引起的 暂时还没有本服大佬出面解释
  • 最全的雅思8000词汇pdf_雅思剑桥1-14同义词汇总,屠鸭必备!(含剑14)

    剑14真题出来之后很多烤鸭私聊哥说什么时候有剑14的同义词替换啊 这不 哥这就来分享了 一个合格的雅思考生的词汇量要在7000左右 而在雅思考试中关于词汇的运用最重要的一部分是 同义词替换 同义词的考察贯穿了雅思考试听说读写的每一项 Lis
  • 【unity笔记】OnCollision和OnTrigger方法使用的一个误区【2D】

    最近在做2D游戏 所以经常使用到两个检测碰撞的方法 OnCollisionXX 方法或OnTriggerXX方法 两个方法的使用大致相同 传入的参数略有差别 void OnCollisionEnter2D Collision2D colli
  • 博弈论【算法】

    目录 定义 巴什博弈 减法博弈 威佐夫博弈 定义 博弈论主要研究公式化了的激励结构间的相互作用 是研究具有斗争或竞争性质现象的数学理论和方法 博弈论考虑游戏中的个体的预测行为和实际行为 并研究它们的优化策略 如囚徒困境 链接 在算法竞赛中出
  • 设计模式—单例模式

    文章目录 为什么使用单例模式 实现 预加载 懒加载 懒加载 线程安全 synchronized synchronized volatile 为什么使用单例模式 单例最有代表就是我们耳熟能详的 windows 任务管理器 无论我们创建多少次
  • 记录一下项目踩到的一些坑(不断更新)

    1 HTTPS 问题排查 相信大家PHP在做第三接口或者一些接口调用的时候都会用到curl 在本地部署开发没问题 但是部署到正式服务器的时候就会导致返回一些无知错误 解决方案排查 可以考虑一下是否在curl 的时候做了HTTPS的校验 2
  • Java中为什么要引入泛型

    优点1 没有使用泛型 向list集合中添加非字符串 运行时会报错 类型不匹配 ObjectList java package cn nxl2018 import java util ArrayList import java util Li
  • 解决 : ValidationError: Invalid options object. PostCSS Loader ......

    问题背景 使用 vue cli 5 x 脚手架工具搭建一个初始化项目架子 在 vue config js 里面 配置 移动端 的 适配性插件 postcss pxtorem 的代码时 运行启动项目时报错如下图 Compiled with p
  • openfeign get请求的正确写法

    openfeign 请求get自动变成post 这里试过很多方法都不行 比如 SpringQueryMap 使用如下方法可以方便解决 记录一下方便后人 RequestLine GET api daily param1 param1 para
  • 如何从技术岗位转为管理岗位呢?

    很多做技术的人 做多了几年总是担心自己的职业生涯发展道路 对自己的职业生涯发展缺乏方向和清晰的目标 而且 不少技术岗位的人员都认为技术不能干一辈子 总是希望有更好的机会 然而如何从技术岗位转型为管理岗位呢 这难倒了不少技术岗位的人 毕竟技术
  • X2000 SDK 开发笔记

    SDK编译 1 设置环境变量 在工程目录下执行命令 source build envsetup sh 2 选择 device 在工程目录下执行命令 lunch 根据硬件底板版本选择v10 v20 v30 根据开发板flash默认选择nand
  • 谷歌云平台及其产品介绍

    谷歌云平台 Google Cloud Platform 是谷歌所提供的一套公有云计算服务 该平台包括一系列在 Google 硬件上运行的用于计算 存储和应用程序开发的托管服务 软件开发人员 云管理员和其他企业 IT 专业人员可以通过公共互联
  • 每节课都是一个项目 手把手用STM32打造联网气象站-1-安装开发环境

    工欲善其事必先利其器 我们为了打造一个可以联网的智能气象站 先得把集成开发环境IDE整利索 亮点在最后 读完有惊喜 我们这个教程的集成开发环境包括了2部分 第一部分是常见的KEIL 本文会讲解KEIL的安装和使用 第二部分是更加常见的vsc
  • Apollo配置中心热加载mysql_一种Apollo配置中心的搭建方法与流程

    本发明涉及一种信息技术处理领域 特别涉及一种apollo配置中心的搭建方法 背景技术 随着分布式系统中程序功能的日益复杂 程序的配置日益增多 各种功能的开关 参数的配置 服务器的地址等的配置错综复杂 对程序配置的期望值也越来越高 配置修改后
  • Odoo服务器搭建——保姆级教程

    文章目录 一 工具准备 二 更新系统 三 添加系统工具 四 安装Postgresql数据库 1 下载Postgresql 2 启动Postgresql 3 创建数据库用户 4 在新用户中创建数据库 五 上传Odoo源码 1 创建目录 2 上
  • ESP32 LVGL使用外部FLASH字体BIN文件

    ESP32 LVGL使用外部FLASH字体BIN文件 生成字体文件 使用LvglFontTool 这个工具 生成类型勾选XBF字体 外部BIN文件 会生成两个文件 一个myFont c 和一个bin文件 然后把bin文件放到spiffs分区