FreeType使用的总结

xiaoxiao2021-02-28  117

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。 这时候加粗和斜体都可以在代码中看到如果实现。
转载请注明原文地址: https://www.6miu.com/read-84948.html

最新回复(0)