Guilite字库工具

目录

前言

使用方法

离线字库解析

 工具链接


前言

最近通过Qt写了一个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/952896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】深入解析pop_back()方法及其应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;什么是 pop_back()&#xff1f;定义与功能使用场景 &#x1f4af;深入解析代码示例基础示例分析示例代码分析 空字符串上的 pop_back() 调用错误示例错误原因分析 &#x1…

Java Web开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

IDEA中创建maven项目

1. IDEA中创建maven项目 在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境。如还未配置安装Maven的&#xff0c;请先下载安装。如何下载安装&#xff0c;可参考我另外篇文章&#xff1a;maven的下载与安装教程本篇教程是以创建基于servlet的JavaWeb项目为例子&…

MACPA:fMRI连接性分析的新工具

摘要 不同脑区的共同激活为它们之间的功能交互或连接提供了一个有价值的衡量指标。元分析连接模型(MACM)是一种经过充分验证的研究某一特定区域共激活模式的方法&#xff0c;该方法对基于任务的功能磁共振成像(task-fMRI)数据进行种子点(seed-based)元分析。虽然MACM是一种强大…

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode

【2024最新版】React18 核心源码分析教程&#xff08;全61集&#xff09; Element对象与Fiber对象 在 React 中&#xff0c;Element 对象 和 Fiber 对象 是核心概念&#xff0c;用于实现 React 的高效渲染和更新机制。以下是它们的详细解读&#xff1a; 1. Element 对象 定…

【C】初阶数据结构1 -- 时间复杂度与空间复杂度

目录 1 数据结构 2 算法 3 复杂度 1&#xff09; 时间复杂度 2&#xff09; 空间复杂度 4 提升算法能力的两点建议 1&#xff09; 画图 2&#xff09; 多实践&#xff0c;多上手写代码 重点一 数据结构的定义 1 数据结构 数据结构是计算机存储、组织数据的…

TypeScript Jest 单元测试 搭建

NPM TypeScript 项目搭建 创建目录 mkdir mockprojectcd mockproject初始化NPM项目 npm init -y安装TypeScript npm i -D typescript使用VSCode 打开项目 创建TS配置文件tsconfig.json {"compilerOptions": {"target": "es5","module&…

一.项目课题 <基于TCP的文件传输协议实现>

客户端代码 需要cJSON.c文件和cJSON.h文件 在这里插入代码片#include "myheadth.h" #include "myfun.h"#define TIME 10 int sockfd; void heartbeat(int signum) {cJSON* root cJSON_CreateObject();cJSON_AddStringToObject(root,"request"…

C#调用OpenCvSharp实现图像的膨胀和腐蚀

图像膨胀和腐蚀操作属于图像处理中常用的形态学操作&#xff0c;其原理都是采用特定小矩形&#xff08;核矩形&#xff09;&#xff0c;将其中心位置与图像中的每个像素对齐后&#xff0c;对重合位置的像素执行特定处理后&#xff0c;将处理结果保存到中心位置对应的像素处&…

新活动平台建设历程与架构演进

01 前言 历时近两年的重新设计和迭代重构&#xff0c;用户技术中心的新活动平台建设bilibili活动中台终于落地完成&#xff01;并迎来了里程碑时刻 —— 接过新老迭代的历史交接棒&#xff0c;从内到外、从开发到搭建实现全面升级&#xff0c;开启了活动生产工业化新时代&#…

一个好用的C++数据库操作库:OTL

目录 1.简介 2.OTL库的核心类 3.OTL使用 4.使用OTL时注意事项 4.1.多线程初始化 4.2.OTL支持连接池 4.3.大字段的读取方式 4.4.指定数据库类型 4.5.异常处理 5.下载地址 6.总结 1.简介 OTL&#xff08;Oracle, ODBC and DB2-CLI Template Library&#xff09;是一个…

高级生化大纲

一&#xff0c;蛋白质化学&#xff1a; 蛋白质分离是生物化学和分子生物学研究中的一项基本技术&#xff0c;用于根据蛋白质的物理和化学特性将其从混合物中分离出来。 1. 离心分离法 离心分离法利用离心力来分离不同质量或密度的颗粒和分子。 差速离心&#xff1a;通过逐…

linux网络 | http结尾、理解长连接短链接与cookie

前言&#xff1a;本节是http章节的最后一部分&#xff0c;主要解释一些小概念。讲解到了HTTP的方法&#xff0c;表单&#xff0c; 重定向等等。 现在废话不多说&#xff0c; 开始我们的学习吧。 ps&#xff1a;本节内容都是概念&#xff0c; 知道就行&#xff0c; 友友们放心观…

金融项目实战 03|JMeter脚本实现手工接口测试

目录 一、环境说明 1、项目环境搭建 2、Mock说明 二、构造测试数据 1、通过系统页面构造 2、通过接口构造 3、通过数据库构造【推荐】 4、案例&#xff1a;构造借款业务数据 三、JMeter执行接口测试用例 1、获取图片验证码、获取短信验证码 2、注册脚本 3、登录脚本…

点赞系统设计(微服务)

点赞业务是一个常见的社交功能&#xff0c;它允许用户对其他用户的内容&#xff08;如帖子、评论、图片等&#xff09;表示喜欢或支持。在设计点赞业务时&#xff0c;需要考虑以下几个方面&#xff1a; 一、业务需求 点赞业务需要满足以下特性&#xff1a; 通用&#xff1a;…

网络原理一>UDP协议详解

UDP和TCP都是应用层中的重要协议&#xff0c;如果做基础架构开发&#xff0c;会用得多一些。 这一篇我们先简单聊一下的UDP TCP格式呈现&#xff1a; 我们知道UDP是一种无连接&#xff0c;面向数据报&#xff0c;全双工&#xff0c;不可靠传输特性的网络协议。 基本格式如图…

时空笔记:CBEngine(微观交通模拟引擎)

CBEngine 是一个微观交通模拟引擎&#xff0c;可以支持城市规模的道路网络交通模拟。CBEngine 能够快速模拟拥有数千个交叉路口和数十万辆车辆的道路网络交通。 以下内容基本翻译自CBEngine — CBLab 1.0.0 documentation 1 模拟演示 1.0 模拟演示结构 config.cfg 定义了 roa…

金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成

目录 一、⾃动化测试理论 二、自动化脚本 1、添加断言 1️⃣注册、登录 2️⃣认证、充值、开户、投资 2、可重复执行&#xff1a;清除测试数据脚本按指定顺序执行 1️⃣如何可以做到可重复执⾏&#xff1f; 2️⃣清除测试数据&#xff1a;连接数据库setup线程组 ①明确…

20250112面试鸭特训营第20天

更多特训营笔记详见个人主页【面试鸭特训营】专栏 250112 1. TCP 和 UDP 有什么区别&#xff1f; 特性TCPUDP连接方式面向连接&#xff08;需要建立连接&#xff09;无连接&#xff08;无需建立连接&#xff09;可靠性可靠的&#xff0c;提供确认、重传机制不可靠&#xff0c…