字符编码及字体显示
在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;
}