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 

     if (error)

     {

         return NULL;

     }

     //加粗

     FT_Pos xBold = 32; 

     FT_Pos yBold = 32;

     if (m_bBold)

     {

         if (m_ftFace->glyph->format == FT_GLYPH_FORMAT_OUTLINE)

         {

             FT_BBox oldBox;

             FT_Outline_Get_CBox(&m_ftSlot->outline , &oldBox);

             error = FT_Outline_Embolden(&m_ftSlot->outline, xBold);

 

             FT_BBox newBox;

             FT_Outline_Get_CBox(&m_ftSlot->outline , &newBox);

             xBold = (newBox.xMax - newBox.xMin) - (oldBox.xMax - oldBox.xMin);

             yBold = (newBox.yMax - newBox.yMin) - (oldBox.yMax - oldBox.yMin);

         }

         else if (m_ftFace->glyph->format == FT_GLYPH_FORMAT_BITMAP)

         {

             FT_Library ftLibrary = FTFaceMgr::GetInstance()->GetFTLibrary();

             error = FT_Bitmap_Embolden( ftLibrary, &m_ftSlot->bitmap, xBold, yBold );

         }

     }

     //斜体

     if (m_bItailc)

     {

         if (m_ftFace->glyph->format == FT_GLYPH_FORMAT_OUTLINE)

             FT_Outline_Transform(&m_ftSlot->outline, &m_matItailc);

     }

 

     //FT_Error error = FT_Render_Glyph(m_ftSlot, FT_RENDER_MODE_MONO);

     if (m_ftFace->glyph->format != FT_GLYPH_FORMAT_BITMAP)}

     {

         error = FT_Render_Glyph(m_ftSlot, FT_RENDER_MODE_NORMAL);

     }



在这里可以看到:

如果是加载时已经是FT_LOAD_RENDER,那么m_ftFace->glyph->format就是FT_GLYPH_FORMAT_BITMAP;

否则就是FT_GLYPH_FORMAT_OUTLINE。

这时候加粗和斜体都可以在代码中看到如果实现。

FreeType使用的总结的更多相关文章

  1. C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图

    C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图 +BIT祝威+悄悄在此留下版了个权的信息说: 最近需要用OpenGL绘制文字,这是个很费时费力的事.一般的思路就是 ...

  2. C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字

    C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字 上一篇实现了把文字绘制到OpenGL窗口,但实质上只是把含有文字的贴图贴到矩形模型上.本篇我们介绍用Poi ...

  3. C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字

    C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字 +BIT祝威+悄悄在此留下版了个权的信息说: 上一篇得到了字形贴图及其位置字典(可导出为XML).本篇就利用此贴 ...

  4. NeHe OpenGL教程 第四十三课:FreeType库

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. mac升级yosemite后安装gd的freetype扩展

    Mac升级系统到 Yosemite 10.10,对于各位Coder来说,还是需要一些时间来折腾的! @星空之下 同学反映 PHPCMS 的验证码图片不能正常显示,反馈该验证码需要GD库支持FreeTy ...

  6. Bug: freetype/fterrors.h: No such file or directory

    Bug描述: 安装PIL过程中出现题目中的错误信息,具体如下:

  7. 使用FreeType实现矢量字体的粗体、斜体、描边、阴影效果

    前言: Freetype是一个跨平台.开源的字体渲染器,网上很多文章介绍,本人就不啰嗦了.本文重点在于实现文章标题所属的各种效果,不是Freetype的基本使用方法介绍文档,所以对于Freetype不 ...

  8. 基于Qt的FreeType字体轮廓解析

    一.本文目的 以前的文档中.详细的介绍了FreeType开源字体引擎库的基础知识.基本用法.但并未详细的阐明在TurboCG中.是如何解析出一个文字的轮廓的,本文集中阐述.怎么样使用FreeType开 ...

  9. Configure: error: freetype.h not found. 的解决办法

    出现 Configure: error: freetype.h not found. 的解决办法 CentOS yum install freetype-devel Debian apt-get in ...

  10. FreeType in OpenCASCADE

    FreeType in OpenCASCADE eryar@163.com Abstract. FreeType is required for text display in the 3D view ...

随机推荐

  1. HDU 3565 Bi-peak Number(数位DP)题解

    题意:我们定义每一位先严格递增(第一位不为0)后严格递减的数为峰(比如1231),一个数由两个峰组成称为双峰,一个双峰的价值为每一位位数和,问L~R双峰最大价值 思路:数位DP.显然这个问题和pos有 ...

  2. [译]RabbitMQ教程C#版 - 发布订阅

    先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...

  3. vue-cli3.0 笔记

      vue-cli 3.0   npm install -g @vue/cli # OR yarn global add @vue/cli ui 界面创建项目 vue ui 命令行创建项目 步骤 vu ...

  4. j2ee课程设计—基于activiti的请休假系统

    前言 课设基于SSM框架,数据库采用mysql,主要业务交给activiti,版本控制利用github. 参考资料: Intellij 部署SSM框架 Activiti就是这么简单 方大师的教材 下文 ...

  5. JAVA-变量

    静态变量只能在类主体中定义,不能在方法中定义

  6. Confluence 6 超过当前许可证期限进行升级

    这个页面将会对你在进行 Confluence 升级的时候超过了当前许可证的期限进行升级的情况. 许可证警告 在升级的过程中,你将会在 Confluence 的应用程序日志(log file)中看到类似 ...

  7. docker 中安装 redis

    使用以下命令在Docker Hub搜索Redis镜像docker search redis 使用以下命令拉取镜像,Redis的镜像docker pull redis:latest 使用以下命令查看,本 ...

  8. SWUST OJ(1101)

    顺序表中的数据的循环移动 #include <iostream> #include <cstdlib> using namespace std; int main() { in ...

  9. BootStrap 学习笔记一

    1.bootstrap列偏移 列偏移是指在网格系统中,可以使用偏移列来达到让某列右移的效果,只需要在class的“col-*-*”后追加“col-*-offset-*” <div class=& ...

  10. 浏览器中打开PDF链接

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...