Vulkan

FreeType使用的总结

http://www.cppblog.com/liangairan/archive/2016/09/11/214270.html

这里说一下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。
这时候加粗和斜体都可以在代码中看到如果实现。

posted on 2017-09-01 15:50  Vulkan  阅读(1752)  评论(0编辑  收藏  举报

导航