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. SPOJ COT Count on a tree(树上主席树 + LCA 求点第k小)题解

    题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点 ...

  2. go 笔记

    Go 语言的变量声明格式为: var 变量名 变量类型 返回类型. 匿名变量不占用命名空间,不会分配内存.匿名变量与匿名变量之间也不会因为多次声明而无法使用. func GetData() (int, ...

  3. Java 连接 MySQL 数据库

    最近想学习一下 Java 连接 MySQL 数据库,于是有了这样的一些问题&解决办法. 首先是解决 JDBC(Java Data Base Connectivity)驱动问题,因为默认安装的J ...

  4. 10_bash_变量_条件判断及运算_sed_循环

    shell编程: 编译器.解释器编程语言:机器语言.汇编语言.高级语言 静态语言:编译型语言 强类型(变量):变量在使用前,必须事先声明,甚至还需要初始化 事先转换成可执行格式 C/C++.C#.Ja ...

  5. transform:rotate3d/tranlate3d

    transform:rotate3d(x,y,z,angle); rotate3d 代表 在3D空间,元素沿着 经过原点(0,0,0) 和 三维坐标(x,y,z) 2点的直线进行旋转.其中: x:是一 ...

  6. 关于Struts2自动装配和访问Servlet API

    自动装配 1.根据属性的getter和setter获取值  index.jsp <s:form action="hello" method="POST"& ...

  7. mac 安装2019Adobe全家桶

    链接:https://pan.baidu.com/s/1UrAnB5fmHKmYPESvqkU3Rg  密码:803f 下载大师版, 进入解压后的文件夹,双击安装程序 打开了安装界面,进入下图中的安装 ...

  8. window上安装kafka(单机)

    1.第一步骤,先安装JDK,请参考:https://www.cnblogs.com/xubao/p/10692861.html 2.第二步骤,安装zookeeper,请参考:https://www.c ...

  9. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建列组合

    jQuery EasyUI 数据网格 - 创建列组合 easyui 的数据网格(DataGrid)可以创建列组合,如下所示: 在本实例中,我们使用平面数据来填充数据网格(DataGrid)的数据,并把 ...

  10. NetSec2019 20165327 Exp1 PC平台逆向破解

    NetSec2019 20165327 Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1(实验中用的 是5327pwnx)的linux可执行文件. 该程序正常执行流程是:ma ...