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