Guilite字库工具

news/2025/1/13 12:29:12/

目录

前言

使用方法

离线字库解析

 工具链接


前言

最近通过Qt写了一个Guilite字库工具>Guilite字库工具,相比原始工具,主要有以下几个优点:

(1)支持同时生成多套字库

(2)支持离线字库生成

(3)支持离线字库导入

(4)字库生成速度更快

使用方法

(1)打开工具之后点击“增加字体”

(2)字体选择完成之后输入字库内容

(3)点击生成字库

字库生成完成之后,会生成一个.cpp字库和.bin离线字库

(4)字库导入

有时我们需要在已有字库上进行增删,那么可以选择“字库导入”,选择正确的离线字库之后,工具会自动导入字库。

离线字库解析

(1)头文件

#ifndef FONT_PARSER_H
#define FONT_PARSER_H
#include <string>#include "GuiLite.h"class FontParser{
public:static LATTICE_FONT_INFO* getFontFromBin(std::string fontPath);static int releaseFont(LATTICE_FONT_INFO* pFont);
};
#endif

(2)cpp文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>#include <string>#include "FontParser.h"#define FONT_PRINT(info,...)\
printf("[%s][%d]" info "",__FILE__,__LINE__,##__VA_ARGS__);class AutoCloseFile {
public:AutoCloseFile(FILE* fp):m_pFp(fp){}~AutoCloseFile(void){if (m_pFp){fclose(m_pFp);}}
private:FILE* m_pFp = nullptr;
};inline int32_t getFileRemainLen_(FILE* fp)
{size_t curPos = ftell(fp);fseek(fp,0,SEEK_END);size_t endPos = ftell(fp);fseek(fp,curPos,SEEK_SET);return endPos - curPos;
}LATTICE_FONT_INFO* FontParser::getFontFromBin(std::string path)
{FILE* fp = fopen(path.c_str(),"rb");if(NULL == fp){FONT_PRINT("fopen %s fail!\n",path.c_str());return NULL;}AutoCloseFile closeFile(fp);char startCode[5];char fontInfo[64];char version;uint8_t fixCode[4];uint32_t utf_8;uint16_t fontWidth;uint16_t fontHeight;uint32_t fontCount;uint32_t dataCount;int32_t realCount;memset((void*)startCode,0,5);if(getFileRemainLen_(fp) < 4){FONT_PRINT("%s init fail!\n",path.c_str());return NULL;}fread((void*)startCode,1,4,fp);//读取起始码if(strcmp(startCode,"font") != 0){FONT_PRINT("%s init fail,%s\n",path.c_str(),startCode);return NULL;}//读取版本号if(getFileRemainLen_(fp) < 1){FONT_PRINT("%s init fail!\n",path.c_str());return NULL;}fread((void*)&version,1,1,fp);//读取字库信息if(getFileRemainLen_(fp) < 64){FONT_PRINT("%s init fail!\n",path.c_str());return NULL;}memset((void*)fontInfo,0,64);fread((void*)fontInfo,1,64,fp);//读取固定码if(getFileRemainLen_(fp) < 4){FONT_PRINT("%s init fail!\n",path.c_str());return NULL;}fread((void*)fixCode,1,4,fp);if(0xff != fixCode[0] || 0xff != fixCode[1] || 0xff != fixCode[2]|| 0xff != fixCode[3]){FONT_PRINT("%s init fail!\n",path.c_str());return NULL;}//读取字高度if(getFileRemainLen_(fp) < 2){FONT_PRINT("%s init fail!\n",path.c_str());return NULL;}fread((void*)&fontHeight,1,2,fp);//读取字库总个数if(getFileRemainLen_(fp) < 4){FONT_PRINT("%s init fail!\n",path.c_str());return NULL;}fread((void*)&fontCount,1,4,fp);LATTICE_FONT_INFO* pFont = (LATTICE_FONT_INFO*)malloc(sizeof(LATTICE_FONT_INFO));if(NULL == pFont){FONT_PRINT("%s init fail!\n",path.c_str());return NULL;}pFont->count = fontCount;pFont->height = fontHeight;FONT_PRINT("font count:%d\n",fontCount);pFont->lattice_array = (LATTICE*)calloc(fontCount,sizeof(LATTICE));if(NULL == pFont->lattice_array){free((void*)pFont);FONT_PRINT("%s init fail!\n",path.c_str());return NULL;}realCount = 0;for(int32_t i = 0;i < fontCount;i++){//读取固定码if(getFileRemainLen_(fp) < 4){break;}fread((void*)fixCode,1,4,fp);if(0xff != fixCode[0] || 0xff != fixCode[1] || 0xff != fixCode[2]|| 0xff != fixCode[3]){break;}//读取utf-8码if(getFileRemainLen_(fp) < 4){break;}fread((void*)&utf_8,1,4,fp);//读取宽度if(getFileRemainLen_(fp) < 2){break;}fread((void*)&fontWidth,1,2,fp);//读取点数if(getFileRemainLen_(fp) < 4){break;}fread((void*)&dataCount,1,4,fp);if(getFileRemainLen_(fp) < dataCount){break;}pFont->lattice_array[i].utf8_code = utf_8;pFont->lattice_array[i].width = fontWidth;pFont->lattice_array[i].pixel_buffer = (uint8_t*)calloc(1,dataCount);if(NULL == pFont->lattice_array[i].pixel_buffer){break;}fread((void*)pFont->lattice_array[i].pixel_buffer,1,dataCount,fp);realCount++;}if(realCount != fontCount){for(int32_t i = 0;i < fontCount;i++){if(NULL != pFont->lattice_array[i].pixel_buffer){free((void*)pFont->lattice_array[i].pixel_buffer);}}free((void*)pFont->lattice_array);free((void*)pFont);FONT_PRINT("%s init fail!\n",path.c_str());FONT_PRINT("info count:%d,real count:%d\n",fontCount,realCount);return NULL;}FONT_PRINT("%s init success!\n",path.c_str());FONT_PRINT("font info:%s\n",path.c_str());return pFont;
}int FontParser::releaseFont(LATTICE_FONT_INFO* pFont)
{if(NULL == pFont){return -1;}if(NULL == pFont->lattice_array){free((void*)pFont);return 0;}for(int32_t i = 0;i < pFont->count;i++){if(pFont->lattice_array[i].pixel_buffer){free((void*)pFont->lattice_array[i].pixel_buffer);}}free((void*)pFont->lattice_array);free((void*)pFont);return 0;
}

 工具链接

v2.3版本:

(1)百度网盘链接:链接: https://pan.baidu.com/s/1PAX-1qS0RfOuI3wXd3iBGw 提取码: zkq5 

(2)CSDN下载链接:https://download.csdn.net/download/qq_37363702/90260230


http://www.ppmy.cn/news/1562806.html

相关文章

Hive SQL必刷练习题:连续问题 间断连续

问题描述&#xff1a; 1&#xff09; 连续问题&#xff1a;找出连续三天&#xff08;或者连续几天的啥啥啥&#xff09;。 2&#xff09; 间断连续&#xff1a;统计各用户连续登录最长天数&#xff0c;间断一天也算连续&#xff0c;比如1、3、4、6也算登陆了6天 问题分析&am…

(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)

城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…

使用Cilium/eBPF实现大规模云原生网络和安全

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 目录 抽象 1 Trip.com 云基础设施 1.1 分层架构 1.2 更多细节 2 纤毛在 Trip.com 2.1 推出时间表 2.2 自定义 2.3 优化和调整 2.3.1 解耦安装 2.3.2 避免重试/重启风暴 2.3.3 稳定性优先 2…

CentOS 7.9 通过 yum 安装 Docker

文章目录 前言一、删除已安装的 Docker二、网络设置三、设置 yum 源&#xff0c;并安装依赖四、设置 Docker 仓库五、安装及使用 Docker六、镜像仓库总结 前言 CentOS 7.9 过了维护期&#xff0c;Docker 官方文档没有了相关的安装文档。记录一下&#xff0c;备用&#xff01; …

30天开发操作系统 第 12 天 -- 定时器 v1.0

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单&#xff0c;只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器&#xff0c;CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…

基于物联网技术的电动车防盗系统设计(论文+源码)

1总体设计 本课题为基于物联网技术的电动车防盗系统&#xff0c;在此将整个系统架构设计如图2.1所示&#xff0c;其采用STM32F103单片机为控制器&#xff0c;通过NEO-6M实现GPS定位功能&#xff0c;通过红外传感器检测电瓶是否离开位&#xff0c;通过Air202 NBIOT模块将当前的…

计算机网络(三)——局域网和广域网

一、局域网 特点&#xff1a;覆盖较小的地理范围&#xff1b;具有较低的时延和误码率&#xff1b;使用双绞线、同轴电缆、光纤传输&#xff0c;传输效率高&#xff1b;局域网内各节点之间采用以帧为单位的数据传输&#xff1b;支持单播、广播和多播&#xff08;单播指点对点通信…

探索 Docker Desktop:简化开发与部署的利器

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…