FreeTpye库学习笔记:将矢量字体解析为位图

一、前言

近期工作需要研究 FreeType 库,因此本篇文章记录一下该库的基本用法。

FreeType 是一个免费、开源、可移植且高质量的字体引擎,它有以下优点:

  1. 支持多种字体格式文件,并提供了统一的访问接口;
  2. 支持单色位图、反走样位图渲染,这使字体显示质量达到 Mac 的水平;
  3. 采用面向对象思想设计,用户可以灵活的根据需要裁剪。

但 FreeType 也有缺点,它太大了,即使是裁剪后的阉割版,其代码量也有将近 12 万行,在Flash非常小的开发板可能放不下,此时可以考虑用代码量较小的 stb_truetype 库,具体用法可以参考我之前发的博客:stb_truetype解析ttf字体并将其保存到图片中

注意:本文采用的 FreeType 库为 AWTK 中的裁剪版,只有一个巨大的头文件,下载链接:https://github.com/zlgopen/awtk/tree/master/3rd/freetype_single_header

AWTK是 ZLG 开发的开源 GUI 引擎,官网地址:https://www.zlg.cn/index/pub/awtk.html

二、FreeType解析矢量(.ttf)字体

使用 FreeType 库将矢量(.ttf)字体解析为位图的步骤详见下文。

2.1 包含头文件

此处采用裁剪版的 FreeType 库,需要包含的头文件如下:

#include "freetype.h"

如果采用完整版的 FreeType 库,需要包含的头文件如下:

#include <ft2build.h>
#include <freetype/freetype.h>
#include <freetype/ftglyph.h>
#include <freetype/ftpfr.h>
#include <freetype/ftadvanc.h>

2.2 初始化 FreeType 库

使用 FT_Init_FreeType() 函数初始化一个 FT_Library 句柄,例如:

FT_LIBRARY library;                         //FreeType库的句柄
FT_Error error = FT_Init_FreeType( &library );   
if ( error )
{
     /* 初始化失败 */  }

2.3 加载 FT_Face

FT_Face 是矢量字体的外观对象,用于保存字体外观数、当前外观索引、当前外观所包含字形文件数等相关数据,其中外观可简单理解为常规、斜体、加粗等字体风格,加载 FT_Face 有两种方式,一是通过字体文件名加载,二是从内存中加载,具体如下:

1、通过字体文件名加载FT_Face:

FT_Face face;                        //FT_Face对象的句柄
FT_New_Face( library, "/usr/share/fonts/truetype/arial.ttf", 0, &face); 

2、从内存中加载 FT_Face:

FT_Face face;                        //FT_Face对象的句柄
FT_New_Memory_Face(font_info.library, font_buf, size, 0, &face);

2.4 设置字体编码方式

此处设置字体编码方式为Unicode,如果不设置,FreeType默认为 utf-16编码类型:

FT_Select_Charmap(face, FT_ENCODING_UNICODE);

2.5 设置字体大小

方法一:通过物理距离设置字体大小

FT_Set_Char_Size( FT_Face     face,
                  FT_F26Dot6  char_width,        //字符宽度,单位为1/64点
                  FT_F26Dot6  char_height,       //字符高度,单位为1/64点
                  FT_UInt     horz_resolution,   //水平分辨率
                  FT_UInt     vert_resolution ); //垂直分辨率

字符宽度和高度以1/64点为单位表示。点是物理上的距离,一个点代表1/72英寸(2.54cm)
分辨率以dpi(dots per inch)为单位表示,表示一个英寸有多少个像素
例如:

FT_Set_Char_Size( face, 36 * 64, 0, 96 , 0);    //0表示与另一个尺寸值相等。

字符的物理大小:36 * 64 * (1/64) * (1/72) 英寸
字符的像素宽高: 36 * 64 * (1/64) * (1/72) * 96

方法二:通过像素宽高设置字体大小

FT_Set_Pixel_Sizes( FT_Face  face,
                    FT_UInt  pixel_width,     //像素宽度
                    FT_UInt  pixel_height );  //像素高低

例如:

FT_Set_Pixel_Sizes(face, 0 ,16);      //把字符像素设置为16*16像素, 0表示与另一个尺寸值相等。

2.6 加载字形图像

2.6.1 获取字符编码的字形索引

通过 FT_Get_Char_Index() 函数将字符编码转换为一个字形(glyph)索引,例如:

wchar_t char_co
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值