- 显示设备初始化
```c
DisplayInit() / main函数中调用 /
FBInit() / dispmanager中调用底层FB模块的初始化函数 /
RegisterDispOpr(&g_tFBOpr) /* FB模块中调用dispmanager中提供的注册函数 */
/ 注册的结构体 / / 抽象 / typedef struct DispOpr { char name; //属性成员, 初始指定名字 int iXres; //属性成员, 在相应的初始化函数中设置 int iYres; //属性成员 int iBpp; //属性成员 int (DeviceInit)(void); //方法成员 int (ShowPixel)(int iPenX, int iPenY, unsigned int dwColor); //方法成员 int (CleanScreen)(unsigned int dwBackColor); //方法成员 struct DispOpr ptNext; }T_DispOpr, PT_DispOpr; / FB / static T_DispOpr g_tFBOpr = { .name = “fb”, .DeviceInit = FBDeviceInit, / 再这里才是真正的对FB设备进行初始化(打开、映射等) / .ShowPixel = FBShowPixel, / 画点函数 / .CleanScreen = FBCleanScreen, / 清屏函数 / };
- 文字初始化
```c
FontsInit() /* main */
ASCIIInit() /* fontsmanager */
RegisterFontOpr(&g_tASCIIFontOpr) /* ascii模块调用fontsmanager提供的注册函数 */
GBKInit()
RegisterFontOpr(&g_tGBKFontOpr)
FreeTypeInit()
RegisterFontOpr(&g_tFreeTypeFontOpr)
/* 注册的各个结构体 */
/* 抽象出来的结构体 */
typedef struct FontOpr {
char *name;
int (*FontInit)(char *pcFontFile, unsigned int dwFontSize);
int (*GetFontBitmap)(unsigned int dwCode, PT_FontBitMap ptFontBitMap);
struct FontOpr *ptNext;
}T_FontOpr, *PT_FontOpr;
/* ASCII */
static T_FontOpr g_tASCIIFontOpr = {
.name = "ascii",
.FontInit = ASCIIFontInit, /* ASCII字体初始化 */
.GetFontBitmap = ASCIIGetFontBitmap, /* 获取字体位图 */
};
/* GBK */
static T_FontOpr g_tGBKFontOpr = {
.name = "gbk",
.FontInit = GBKFontInit,
.GetFontBitmap = GBKGetFontBitmap,
};
/* FreeType */
static T_FontOpr g_tFreeTypeFontOpr = {
.name = "freetype",
.FontInit = FreeTypeFontInit,
.GetFontBitmap = FreeTypeGetFontBitmap,
};
- 编码初始化
```c
EncodingInit()
AsciiEncodingInit()
Utf16leEncodingInit()AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("freetype")) /* 从ascii编码添加freetype字体 */ AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("ascii")) /* ascii文字 */ AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("gbk")) /* gbk文字 */ RegisterEncodingOpr(&g_tAsciiEncodingOpr) /* 最后注册 */
Utf16beEncodingInit()AddFontOprForEncoding(&g_tUtf16leEncodingOpr, GetFontOpr("freetype")) AddFontOprForEncoding(&g_tUtf16leEncodingOpr, GetFontOpr("ascii")) RegisterEncodingOpr(&g_tUtf16leEncodingOpr)
Utf8EncodingInit()AddFontOprForEncoding(&g_tUtf16beEncodingOpr, GetFontOpr("freetype")) AddFontOprForEncoding(&g_tUtf16beEncodingOpr, GetFontOpr("ascii")) RegisterEncodingOpr(&g_tUtf16beEncodingOpr)
AddFontOprForEncoding(&g_tUtf8EncodingOpr, GetFontOpr("freetype")) AddFontOprForEncoding(&g_tUtf8EncodingOpr, GetFontOpr("ascii")) RegisterEncodingOpr(&g_tUtf8EncodingOpr)
/ 注册的结构体 / / 抽象 / typedef struct EncodingOpr { char name; int iHeadLen; PT_FontOpr ptFontOprSupportedHead; / 对字体的支持 / int (isSupport)(unsigned char pucBufHead); / isSupport判断是否支持 / int (GetCodeFrmBuf)(unsigned char pucBufStart, unsigned char pucBufEnd, unsigned int pdwCode); struct EncodingOpr ptNext; }T_EncodingOpr, PT_EncodingOpr; / ASCII / static T_EncodingOpr g_tAsciiEncodingOpr = { .name = “ascii”, .iHeadLen = 0, .isSupport = isAsciiCoding, .GetCodeFrmBuf = AsciiGetCodeFrmBuf, }; / UTF16LE / static T_EncodingOpr g_tUtf16leEncodingOpr = { .name = “utf-16le”, .iHeadLen = 2, / 文件头的长度(BOM) / .isSupport = isUtf16leCoding, / 是否支持 / .GetCodeFrmBuf = Utf16leGetCodeFrmBuf, / 从buf中获取编码 / }; / UTF16BE / static T_EncodingOpr g_tUtf16beEncodingOpr = { .name = “utf-16be”, .iHeadLen = 2, .isSupport = isUtf16beCoding, .GetCodeFrmBuf = Utf16beGetCodeFrmBuf, }; / UTF8 */ static T_EncodingOpr g_tUtf8EncodingOpr = { .name = “utf-8”, .iHeadLen = 3, .isSupport = isUtf8Coding, .GetCodeFrmBuf = Utf8GetCodeFrmBuf, }; ```