freetype字体概念
分配、设置、注册FontOpr结构体,由Font_manager.c通过链表管理。
static T_FontOpr g_tFreeTypeFontOpr = {
.name = "freetype",
.FontInit = FreeTypeFontInit, //FreeType字体模块的初始化函数
.GetFontBitmap = FreeTypeGetFontBitmap, //根据编码值获得字符的位图
.SetFontSize = FreeTypeSetFontSize, //设置字符的尺寸(单位:色素)
};
FreeType字体模块的初始化函数,参数:文件,字体大小。
static int FreeTypeFontInit(char *pcFontFile, unsigned int dwFontSize){
FT_Init_FreeType(&g_tLibrary ); //初始化库
FT_New_Face(g_tLibrary, pcFontFile, 0, &g_tFace); //创建face对象
g_tSlot = g_tFace->glyph; //定义 槽
FT_Set_Pixel_Sizes(g_tFace, dwFontSize, 0); //设置字体大小
return 0;
}
获得UNICODE字符的FreeType位图,参数:Unicode码,字体点阵信息
static int FreeTypeGetFontBitmap(unsigned int dwCode, PT_FontBitMap ptFontBitMap){
int iPenX = ptFontBitMap->iCurOriginX;
int iPenY = ptFontBitMap->iCurOriginY;
/* load glyph image into the slot (erase previous one) */
FT_Load_Char(g_tFace, dwCode, FT_LOAD_RENDER | FT_LOAD_MONOCHROME); //render和单色位图
//设置FontBitMap结构体
ptFontBitMap->iXLeft = iPenX + g_tSlot->bitmap_left;
ptFontBitMap->iYTop = iPenY - g_tSlot->bitmap_top;
ptFontBitMap->iXMax = ptFontBitMap->iXLeft + g_tSlot->bitmap.width;
ptFontBitMap->iYMax = ptFontBitMap->iYTop + g_tSlot->bitmap.rows;
ptFontBitMap->iBpp = 1;
ptFontBitMap->iPitch = g_tSlot->bitmap.pitch;
ptFontBitMap->pucBuffer = g_tSlot->bitmap.buffer;
ptFontBitMap->iNextOriginX = iPenX + g_tSlot->advance.x / 64;
ptFontBitMap->iNextOriginY = iPenY;
return 0;
}
设置字符的尺寸(单位:色素)
static void FreeTypeSetFontSize(unsigned int dwFontSize){
FT_Set_Pixel_Sizes(g_tFace, dwFontSize, 0);
}