linux应用程序_1_文本浏览器_3_fonts_1_fonts_manager

本文详细介绍了一个在Linux环境下设计的字体管理系统的实现细节。系统通过抽象的字库和位图结构体,提供了字库的注册、初始化及位图获取等功能。文章深入探讨了位图结构体的构成,包括坐标原点、尺寸、像素深度等关键属性,以及字库结构体如何通过链表维护字库间的联系。此外,还介绍了系统如何通过注册机制构建字库链表,并提供了根据名字检索特定字库的方法。

linux应用程序_1_文本浏览器_3_fonts_1_fonts_manager

 

一、抽象字库结构体、位图信息结构体

二、向下提供接口

1、注册字库结构体

三、向上提供接口

所有字库初始化

获取字库结构体

 

字库结构体:

1、应具有区分同类其他结构体的名字

2、提供初始化函数

3、能获取位图

4、应具有链表,与同类其他结构体建立联系

 

位图结构体:

参照freetype

1、位图假想坐标原点

2、字体实际坐标原点

3、下一个字体坐标原点

4、位图最大长宽

5、跨度

6、像素深度

7、位图缓存地址

 

 

位图结构体

typedef struct{
	int iXLeft;
	int iYTop;
	
	int iCurOriginX;
	int iCurOriginY;
	int iNextOriginX;
	int iNextOriginY;
	
	int iXMax;
	int iYMax;
	
	int iBpp;
	int iPitch;
	
	unsigned char *pucBuf;
}T_BitMap, *PT_BitMap;

 

字库结构体

typedef struct FontOpr{
	char *pcName;
	int (*FontInit)(char *pucFontFile, int iFontSize);
	int (*GetBitMap)(int iCode, PT_BitMap ptBitMap);
	struct FontOpr *ptNext;	
}T_FontOpr, *PT_FontOpr;

 

注册:

将字库结构体添加到字库链表中

int RegisterFont(PT_FontOpr ptFontOpr)
{
	PT_FontOpr ptFontOprTmp;
	
	if(!g_ptFontOpr)
	{
		g_ptFontOpr = ptFontOpr;
		g_ptFontOpr->ptNext = NULL;
	}
	else
	{
		ptFontOprTmp = g_ptFontOpr;
		while (ptFontOprTmp->ptNext)
		{
			ptFontOprTmp = ptFontOprTmp->ptNext;
		}
		ptFontOprTmp->ptNext = ptFontOpr;
		ptFontOpr->ptNext 	 = NULL;
	}
	
	return 0;
}

获得字库结构体(根据名字):

用于为选定的编码添加支持字库

PT_FontOpr GetFontOpr(char *pcName)
{
	PT_FontOpr 	ptFontOprTmp = g_ptFontOpr;
	
	while(ptFontOprTmp)
	{
		if(!strcmp(ptFontOprTmp->pcName,pcName))
			return ptFontOprTmp;
		ptFontOprTmp = ptFontOprTmp->ptNext;
	}
	DBG_PRINT("Error at %s,%d ; GetFontOpr(%s)\r\n", __FILE__, __LINE__, pcName);

	return NULL;
}

 

字库初始化(构造字库链表):

int FontsInit(void)
{
	int iError;


	iError  = AsciiInit();
	if(iError)
		DBG_PRINT("Error at %s,%d\r\n", __FILE__, __LINE__);
	
	iError = GbkInit();
	if(iError)
		DBG_PRINT("Error at %s,%d\r\n", __FILE__, __LINE__);

	iError = FreetypeInit();
	if(iError)
		DBG_PRINT("Error at %s,%d\r\n", __FILE__, __LINE__);

	DBG_PRINT("\r\nFontsInited\r\n");

	return 0;
}

 

 

完整代码:

fonts_manager.h

#ifndef __FONTS_MANAGER_H
#define __FONTS_MANAGER_H


typedef struct{
	int iXLeft;
	int iYTop;
	
	int iCurOriginX;
	int iCurOriginY;
	int iNextOriginX;
	int iNextOriginY;
	
	int iXMax;
	int iYMax;
	
	int iBpp;
	int iPitch;
	
	unsigned char *pucBuf;
}T_BitMap, *PT_BitMap;

typedef struct FontOpr{
	char *pcName;
	int (*FontInit)(char *pucFontFile, int iFontSize);
	int (*GetBitMap)(int iCode, PT_BitMap ptBitMap);
	struct FontOpr *ptNext;	
}T_FontOpr, *PT_FontOpr;

int AsciiInit(void);
int GbkInit(void);
int FreetypeInit(void);

int RegisterFont(PT_FontOpr ptFontOpr);
PT_FontOpr GetFontOpr(char *pcName);
int FontsInit(void);
void ShowSupportFont(void);


#endif

 

fonts_manager.c

#include <config.h>
#include <fonts_manager.h>
#include <string.h>
#include <stdio.h>

PT_FontOpr g_ptFontOpr;


int RegisterFont(PT_FontOpr ptFontOpr)
{
	PT_FontOpr ptFontOprTmp;
	
	if(!g_ptFontOpr)
	{
		g_ptFontOpr = ptFontOpr;
		g_ptFontOpr->ptNext = NULL;
	}
	else
	{
		ptFontOprTmp = g_ptFontOpr;
		while (ptFontOprTmp->ptNext)
		{
			ptFontOprTmp = ptFontOprTmp->ptNext;
		}
		ptFontOprTmp->ptNext = ptFontOpr;
		ptFontOpr->ptNext 	 = NULL;
	}
	
	return 0;
}

PT_FontOpr GetFontOpr(char *pcName)
{
	PT_FontOpr 	ptFontOprTmp = g_ptFontOpr;
	
	while(ptFontOprTmp)
	{
		if(!strcmp(ptFontOprTmp->pcName,pcName))
			return ptFontOprTmp;
		ptFontOprTmp = ptFontOprTmp->ptNext;
	}
	DBG_PRINT("Error at %s,%d ; GetFontOpr(%s)\r\n", __FILE__, __LINE__, pcName);

	return NULL;
}

int FontsInit(void)
{
	int iError;


	iError  = AsciiInit();
	if(iError)
		DBG_PRINT("Error at %s,%d\r\n", __FILE__, __LINE__);
	
	iError = GbkInit();
	if(iError)
		DBG_PRINT("Error at %s,%d\r\n", __FILE__, __LINE__);

	iError = FreetypeInit();
	if(iError)
		DBG_PRINT("Error at %s,%d\r\n", __FILE__, __LINE__);

	DBG_PRINT("\r\nFontsInited\r\n");

	return 0;
}

void ShowSupportFont(void)
{
	int iCnt = 0;
	PT_FontOpr ptFontOprTmp = g_ptFontOpr;

	printf("\r\n");
	printf("supported font:\r\n");
	while(ptFontOprTmp)
	{
		printf("%02d : %s\r\n",++iCnt,ptFontOprTmp->pcName);
		ptFontOprTmp = ptFontOprTmp->ptNext;
	}
}


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值