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

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;
	}
}


发布了71 篇原创文章 · 获赞 4 · 访问量 7232

猜你喜欢

转载自blog.csdn.net/floatinglong/article/details/86635044