這里說一下Freetype的關鍵點,比較基礎的在很多文章已經有說明,這里就不詳細說明了。
FreeType每個字符的加載,可以影響到后面對字符圖像的處理。
在這里說明一下,字符的加載有多種方式,調用函數是:
FT_Load_Char( FT_Face face,
FT_ULong char_code,
FT_Int32 load_flags );
其中的參數load_flags決定了加載后字體圖像的屬性。
這里只對常用的進行解釋:
關閉抗鋸齒:FT_LOAD_MONOCHROME(這個其實是加載1位bmp位圖)
打開抗鋸齒:FT_LOAD_FORCE_AUTOHINT
加載時就已經生成圖像:FT_LOAD_RENDER
加載時不生成圖像:FT_LOAD_NO_BITMAP(注意:這里需要在加載后調用FT_Render_Glyph)
下面是代碼示例:
1 FT_Error error = 0;
2 FT_Int32 nLoadFlag = m_type.m_nFontHint == FONT_MONO ? FT_LOAD_FORCE_AUTOHINT | FT_LOAD_MONOCHROME :
FT_LOAD_FORCE_AUTOHINT | FT_LOAD_RENDER;/*FT_LOAD_NO_BITMAP*/;
3 error = FT_Load_Char(m_ftFace, wCH, nLoadFlag);
4
5 if (error)
6 {
7 error = FT_Load_Char(m_ftFace, wCH, FT_LOAD_DEFAULT);
8 }
9
10 if (error)
11 {
12 return NULL;
13 }
14 //加粗
15 FT_Pos xBold = 32;
16 FT_Pos yBold = 32;
17 if (m_bBold)
18 {
19 if (m_ftFace->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
20 {
21 FT_BBox oldBox;
22 FT_Outline_Get_CBox(&m_ftSlot->outline , &oldBox);
23 error = FT_Outline_Embolden(&m_ftSlot->outline, xBold);
24
25 FT_BBox newBox;
26 FT_Outline_Get_CBox(&m_ftSlot->outline , &newBox);
27 xBold = (newBox.xMax - newBox.xMin) - (oldBox.xMax - oldBox.xMin);
28 yBold = (newBox.yMax - newBox.yMin) - (oldBox.yMax - oldBox.yMin);
29 }
30 else if (m_ftFace->glyph->format == FT_GLYPH_FORMAT_BITMAP)
31 {
32 FT_Library ftLibrary = FTFaceMgr::GetInstance()->GetFTLibrary();
33 error = FT_Bitmap_Embolden( ftLibrary, &m_ftSlot->bitmap, xBold, yBold );
34 }
35 }
36 //斜體
37 if (m_bItailc)
38 {
39 if (m_ftFace->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
40 FT_Outline_Transform(&m_ftSlot->outline, &m_matItailc);
41 }
42
43 //FT_Error error = FT_Render_Glyph(m_ftSlot, FT_RENDER_MODE_MONO);
44 if (m_ftFace->glyph->format != FT_GLYPH_FORMAT_BITMAP)}
45 {
46 error = FT_Render_Glyph(m_ftSlot, FT_RENDER_MODE_NORMAL);
47 }
在這里可以看到:
如果是加載時已經是FT_LOAD_RENDER,那么m_ftFace->glyph->format就是FT_GLYPH_FORMAT_BITMAP;
否則就是FT_GLYPH_FORMAT_OUTLINE。
這時候加粗和斜體都可以在代碼中看到如果實現。