touchGFX综合学习六、touchGFX使用FontCache字体缓存功能实现直接从外部存储介质显示字符串
一、touchGFX工程搭建
二、bin文件字体生成
参考这一篇文件
将生成的文件拷贝到sd卡
三、touchGFX源码修改
1、新建两个文件
FontReader.hpp和FontReader.cpp
FontReader.hpp
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2022-10-17 01417804 the first version*/
#ifndef _FONTREADER_HPP_
#define _FONTREADER_HPP_#include <fonts/FontCache.hpp>
#include <unistd.h>
#include <fcntl.h>
#include "ff.h"
#include "stdio.h"using namespace touchgfx;class FontReader :public FontDataReader
{public:FontReader();~FontReader();virtual void open();virtual void close();virtual void setPosition(uint32_t position);virtual void readData(void* out, uint32_t numberOfBytes);private:FILE* fp;
};#endif /* LIBRARIES_TOUCHGFX_LIB_TOUCHGFX_GUI_INCLUDE_GUI_COMMON_FONTREADER_HPP_ */
FontReader.cpp
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2022-10-17 01417804 the first version*/#include <gui/common/FontReader.hpp>int fd;
extern "C" void open_file()
{fd = open("/sdcard/touchgfx/font.bin", O_RDONLY);if(fd<0)rt_kprintf("open failed!\r\n");else {rt_kprintf("open success!\r\n");}
}
extern "C" void close_file()
{close(fd);
}FontReader::FontReader()
{}
FontReader::~FontReader()
{}void FontReader::open()
{open_file();
}
void FontReader::close()
{close_file();
}
void FontReader::setPosition(uint32_t position)
{rt_kprintf("lseek:%ld!\r\n",lseek(fd, position, SEEK_SET));
}
void FontReader::readData(void* out, uint32_t numberOfBytes)
{read(fd, out,numberOfBytes);rt_kprintf("read:%d!\r\n",numberOfBytes);
}
这两个函数是将open和close封装了一下
extern "C" void open_file()
extern "C" void close_file()
在FontDataReader
类中下面四个函数为纯虚函数,所以子函数必须要实现
virtual void open() = 0;virtual void close() = 0;virtual void setPosition(uint32_t position) = 0;virtual void readData(void* out, uint32_t numberOfBytes) = 0;
2、Screen1View.hpp文件修改
#ifndef SCREEN1VIEW_HPP
#define SCREEN1VIEW_HPP#include <gui_generated/screen1_screen/Screen1ViewBase.hpp>
#include <gui/screen1_screen/Screen1Presenter.hpp>
#include <touchgfx/Font.hpp>
#include <fonts/GeneratedFont.hpp>
#include <touchgfx/Font.hpp>
#include <fonts/ApplicationFontProvider.hpp>
#include <texts/TypedTextDatabase.hpp>
#include <fonts/CachedFont.hpp>
#include <texts/TextKeysAndLanguages.hpp>#include <gui/common/FontReader.hpp>using namespace touchgfx;class Screen1View : public Screen1ViewBase
{public:Screen1View();virtual ~Screen1View() {}virtual void setupScreen();virtual void tearDownScreen();void cache_font();
protected:uint8_t fontData[5120]; //字符缓存区,缓存12个字符FontCache fontCache;CachedFont cacheFont;FontReader fontReader;
};#endif // SCREEN1VIEW_HPP
添加相关头文件和定义相关变量
3、Screen1View.cpp文件修改
#include <gui/screen1_screen/Screen1View.hpp>//0x4e00-0x9fa5,0x0000-0x007fScreen1View::Screen1View()
{}void Screen1View::setupScreen()
{Screen1ViewBase::setupScreen();this->cache_font();//显示字符串Unicode::snprintf(this->textArea1Buffer,this->TEXTAREA1_SIZE,"%s","e");this->textArea1.resizeToCurrentText();this->textArea1.invalidate();}void Screen1View::tearDownScreen()
{Screen1ViewBase::tearDownScreen();
}
void Screen1View::cache_font()
{fontCache.setMemory(this->fontData,sizeof(this->fontData));fontCache.setReader(&this->fontReader);TypedText text = TypedText(T___SINGLEUSE_W0UD);this->fontCache.initializeCachedFont(text, &this->cacheFont);TypedTextDatabase::setFont(Typography::TEST,&this->cacheFont);//缓存字符数据//第一种方法//this->fontCache.cacheString(text, (Unicode::UnicodeChar*)"0123456789");//第二种方法Unicode::UnicodeChar* str = (Unicode::UnicodeChar*)this->textArea2.getTypedText().getText();fontCache.cacheString(text,str);}
cache_font()函数加载字符,将用到的字符加载到fontData
数组中。
关于fontData[8192]
大小的计算8192/20*40 = 10.24大概20个中文字符
//显示字符串Unicode::snprintf(this->textArea1Buffer,this->TEXTAREA1_SIZE,"%s","e");this->textArea1.resizeToCurrentText();this->textArea1.invalidate();
此处显示的字符只能为cache_font()
中加载的字符。
touchGFX综合学习六、touchGFX使用FontCache字体缓存功能实现直接从外部存储介质显示字符串相关推荐
- touchGFX综合学习五、touchGFX加载外部(SDCARD、SPI FLASH等)字体显示,包括中文
一.touchGFX工程搭建 添加一个box和textArea控件 注意:textArea控件需要通配符,至于字体下面有简介 二.bin文件字体生成 1.新建字体 按如上图片新建一个字体,下面填写的0 ...
- Docker学习六:综合实践
前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...
- 【vivado学习六】 Vivado综合
世界上一成不变的东西,只有"任何事物都是在不断变化的"这条真理. -- 斯里兰卡 [vivado学习六] Vivado综合 在 Flow Navigator 中点击设置, 然后选择 ...
- 前端学习六——html5+CSS3
前端学习六--html5+CSS3 HTML5 H5新增语义标签 多媒体标签 audio音频标签 audio音频标签常见属性 音频标签语法 视频标签video 视频标签语法 H5新增input表单.表 ...
- HTML5+CSS3的学习(六)
HTML5+CSS3的学习(六) 2018版李立超html+css基础 103集教程,哔哩哔哩链接:https://www.bilibili.com/video/BV1sW411T78k?spm_id ...
- C语言程序设计入门学习六步曲,六步带你入门C语言
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理 ...
- Apollo代码学习(六)—模型预测控制(MPC)_follow轻尘的博客-CSDN博客_mpc代码
Apollo代码学习(六)-模型预测控制(MPC)_follow轻尘的博客-CSDN博客_mpc代码
- 艾伟:C#多线程学习(六) 互斥对象
本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...
- 学习WPF——使用Font-Awesome图标字体
学习WPF--使用Font-Awesome图标字体 原文:学习WPF--使用Font-Awesome图标字体 图标字体介绍 在介绍图标字体之前,不得不介绍图标格式ICON ICON是一种图标格式,我们 ...
最新文章
- CV00-01-开篇与环境搭建
- ‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序
- php 文档标示规范,php标识
- 爬虫笔记12完结篇实例:股票
- JAVA 文件锁 FileLock
- 牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- ubuntu vim8.0源码安装
- 基于IO流读取的 完成 用户登录,注册,修改,查看所有用户,删除功能
- 一套完整的用户增长系统架构
- 杭州某知名xxxx公司急招大量java以及大数据开发工程师
- 送书 | 数据分析如烹小鲜
- Safari技术预览版141来啦,增加了哪些新功能?
- SQL Server 2005利用分区对海量数据的处理
- mysql pxc搭建_MySQL(PXC)集群搭建
- MySQL中以日期为查询条件的方法
- 第七周-C语言 求方程的共轭复根
- 室内定位常用方法总结
- 1.1 异步复位的串联T触发器 ---- always中慎用 非阻塞
- 正版NOD32升级ID在线申请
- 怎么把html改成迅雷bt种子文件格式,BT种子怎么制作?教你如何制作BT种子
热门文章
- 正确姿势开发vue后台管理系统
- pbe服务器最新更新,英雄联盟PBE服务器安装指南 抢先体验新模式“云顶之弈”不用等...
- 1.angular html+css+js导航条点击样式修改,加跳转页面
- As time goes by
- 读论文《Efficient Estimation of Word Representations in Vector Space》
- 御龙在天手游服务器满怎么注册,御龙在天手游背包满了怎么办
- 9.3 a.m.小结
- PTA R7-6 新世界 (C语言) (5 分)
- 快门shutter网络电话的使用方法和资费——免费打电话
- centos离线安装Chrome浏览器