数码相框-font字体模块

字符编码及字体显示
在lcd上显示文件
1.去文件获得“编码”(GBK,ASCII,UTF-8,UTF-16BE,UTF-16LE)
2.根据“编码”得到“字体数据(点阵)”(ASCII,GBK,freetype)
3.把点阵在lcd上显示

点阵的获取方式目前涉及三种:ASCII,GBK,freetype。
font模块的主要功能 :
  根据 “编码值” 获得 “字体点阵”

每种方式主要实现了 GetFontBitmap(编码值,FontBitMap)函数,通过编码值取到的点阵信息保存在FontBitMap结构体中。前两种字体的点阵大小是固定的,freetype的点阵是变化的,所以FontBitMap包含更多变量描述点阵信息。
font模块包含Fonts_manager.c,ascii.c,gbk.c,freetype.c,其中Fonts_manager.c通过链表管理这3种字体点阵的获得方式。每个字体文件向上注册FontOpr结构体,由Fonts_manager.c函数通过链表管理这些结构体。

typedef struct FontOpr {
	char *name;  	/* 字体模块的名字 */
	int (*FontInit)(char *pcFontFile, unsigned int dwFontSize);  /* 字体模块的初始化函数 */
	int (*GetFontBitmap)(unsigned int dwCode, PT_FontBitMap ptFontBitMap); /* 根据编码值获得字符的位图 */
	void (*SetFontSize)(unsigned int dwFontSize); /* 设置字体尺寸(单位:象素) */
	struct FontOpr *ptNext;		 /* 链表 */
}T_FontOpr, *PT_FontOpr;

其中,GetFontBitmap函数根据编码值获得字符的位图,存储在FontBitMap结构体中,该结构体能够描述所有的字体格式。其中,ascii点阵6x12,GBK点阵16x16,freetype的点阵是变化的,所以需要更多的变量来确定位置。

typedef struct FontBitMap {
	int iXLeft;  /* 位图左上角X座标 */
	int iYTop;   /* 位图左上角Y座标 */
	int iXMax;   /* 位图的最大X座标值 */
	int iYMax;   /* 位图的最大Y座标值 */
	int iBpp;    /* 位图中一个象素用多少位来表示 */
	int iPitch;  /* 对于单色位图, 两行象素之间的跨度, 即第N行、第N+1行象素数据之间的偏移值(一行的个数) */
	int iCurOriginX;  /* 位图的原点X座标(一般是左下角), 使用原点来确定相邻字符的位置(输入参数) */
	int iCurOriginY;  /* 位图的原点Y座标 */	
	int iNextOriginX; /* 下一个字符即右边字符的原点X座标(输出参数) */
	int iNextOriginY; /* 下一个字符即右边字符的原点Y座标 */
	unsigned char *pucBuffer;  /* 存有字符的位图数据 */
}T_FontBitMap, *PT_FontBitMap;

支持的字体格式包括:ascii字体,GBK字体freetype字体
Fonts_manager.c的操作函数包括:

int RegisterFontOpr(PT_FontOpr ptFontOpr)	//注册"字体模块", 所谓字体模块就是取出字符位图的方法
PT_FontOpr GetFontOpr(char *pcName)	//根据名字取出指定的"字体模块"
void SetFontSize(unsigned int dwFontSize)	//设置字符的尺寸(单位:色素)
unsigned int GetFontSize(void)	//获得字符的尺寸(单位:色素)
int GetFontBitmap(unsigned int dwCode, PT_FontBitMap ptFontBitMap)	//获得字符的位图
int SetFontsDetail(char *pcFontsName, char *pcFontsFile, unsigned int dwFontSize)	//设置字体模块的信息,比如指定字库文件,指定字符尺寸
int FontsInit(void)	//调用各个字体模块的初始化函数

根据名字取出指定的"字体模块"

PT_FontOpr GetFontOpr(char *pcName){
	PT_FontOpr ptTmp = g_ptFontOprHead;	
	while (ptTmp){
		if (strcmp(ptTmp->name, pcName) == 0)
			return ptTmp;
		ptTmp = ptTmp->ptNext;
	}
	return NULL;
}

设置字体模块的信息,比如指定字库文件,指定字符尺寸

int SetFontsDetail(char *pcFontsName, char *pcFontsFile, unsigned int dwFontSize){
	int iError = 0;
	PT_FontOpr ptFontOpr;

	ptFontOpr = GetFontOpr(pcFontsName);
	if (NULL == ptFontOpr)
		return -1;

	g_dwFontSize = dwFontSize;
	iError = ptFontOpr->FontInit(pcFontsFile, dwFontSize);	
	return iError;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值