使用freetype加载矢量字库,ttf字体文件,通过字符的unicode,load一个字符的点阵!汉字的unicode使用32bit既可表达,比如‘’我‘’的unicode是0x6211
定义全局变量
static FT_Library g_lib;
static FT_Face g_face;
初始化freetype
<pre name="code" class="cpp">pShowScreen<span style="font-family: Arial, Helvetica, sans-serif;">是frambuffer的映射内存地址。</span>
int Show_Char(int Unicode,int FontSizePixel,MID_FONT_COLOR fontColor,int StartX,int StartY){
int charUnicode = Unicode;
int index,x,y;
FT_Glyph glyph;
unsigned short int *pShowLine;
int error;
index =0;x=0;y =0;
if(pShowScreen == NULL) {printf("<Use OSD_Init not yet!!!> \n");return -1;}
pShowLine = (unsigned short int*) (pShowScreen );
error = FT_Set_Pixel_Sizes(g_face,FontSizePixel,FontSizePixel);
if(error != 0) {
return HI_FAILURE;
}
index = FT_Get_Char_Index(g_face,charUnicode);
error = FT_Load_Glyph(g_face,index, FT_LOAD_DEFAULT);
error = FT_Get_Glyph(g_face->glyph, &glyph);
if(!error){
error = FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph) glyph;
FT_Bitmap *bitmap = &bitmap_glyph -> bitmap;
for (y = StartY; y < bitmap->rows + StartY; ++y) {
for (x = StartX; x < bitmap->width + StartX; ++x) {
if(x < 0 || y < 0) continue;
if(bitmap->buffer[(y-StartY)* bitmap->width + (x-StartX)]){
*(pShowLine + y * var.xres + x) = fontColor;
}else{
}
}
}
FT_Done_Glyph(glyph);
glyph = NULL;
}else return -1;
return 0;
}
MSG_PRINT("init error:%d,errno:%d \n",error,errno);}error = FT_New_Face(g_lib,fontFile, 0, &g_face);if(error != 0) { MSG_PRINT("init FreeType error, please check font file \n "); return -1;}error = FT_Select_Charmap(g_face, ft_encoding_unicode);if(error != 0) {return -1;}
load unicode
释放freetype
int FreeType_Realse(){
FT_Done_Face(g_face);
FT_Done_FreeType(g_lib);
return 0;
}