FreeType2使用总结(转)
一、FreeType2简介
1. 是一个免费、开源、可移植且高质量的字体引擎;
2. 支持多种字体格式文件,并提供了统一的访问接口;
3. 支持单色位图、反走样位图渲染,这使字体显示质量达到Mac的水平;
4. 采用面向对象思想设计,用户可以灵活的根据需要裁剪。
二、FreeType2字形约定
2.1 基本概念
字形:
字符映像叫做字形,单个字符能够有多个不同的映像,即多个字形。多个字符也可以有一个字形。
(可以理解为一个字形就是一种书写风格)
字符图:
字体文件包含一个或多个表,叫做字符图。用来将某种字符码转换成字形索引。一种字符编码方式(如ASCII、Unicode、Big5)对应一张表。
2.2字形轮廓
点:
字形文本的大小通常用点(point)表示。点是一种简单的物理单位,数字印刷中,一点等于1/72英寸。
设备的分辨率通常使用dpi(每英寸点数)表示的两个数。
点数大小和像素数的转换公式:
像素大数 = 点数*分辨率/72
轮廓线:
字形轮廓的源格式是一组封闭的路径,称为轮廓线。每个轮廓线划定字形的外部或内部区域,它们可以是线段或者Bezier曲线。
EM正方形:
字体在创建字形轮廓时,字体创建者所使用的假象的正方形。他可以将此想象成一个画字符的平面。它是用来将轮廓线缩放到指定文本尺寸的参考;它的尺寸越大,可以达到更大的字形分辨率。
注意:字形可以自由的超出EM正方形。
位图渲染:
指从字形轮廓转换成一个位图的过程。
2.3 字形度量
基线、笔和布局:
基线是一个假象的线,用来在渲染文本时知道字形,它可以是水平或垂直的。而且,为了渲染文本,在基线上有一个虚拟的点,叫做笔位置或原点,它用来定位字形。每种布局使用不同的规约来放置字形:
对水平布局,字形简单地搁在基线上;
对于垂直布局,字形在基线上句中放置。
图1. 水平布局及其度量
图2.垂直布局及其度量
重要的字体度量参数:
三、FreeType2基本数据结构及API
3.1 基本数据结构
FreeType库句柄对象
(不用关心其成员)
成员:
num_faces: 字体文件所含外观数
face_index: 当前外观索引值
num_glyphs: 当前外观所含字形文件数
num_charmaps: 字符表数
charmaps: 字符表数组
charmap: 当前字符表
glyph: 字形槽对象
size: 字形尺寸
成员:
face: 指向父对象(FT_Face对象)
metrics: 字形尺寸对象
FT_Size_Metrics(EM度量对象):
成员:
x_ppem: EM正方形水平像素数
y_ppem: EM正方形垂直像素数
ascender: EM正方形上行距离
descender: EM正方形下行距离
height: EM正方形高度
max_advance: 最大步进宽度
成员:
face: 指向父对象(FT_Face对象)
metrics: 字形尺寸对象
advance: 步进对象
format: 字形槽格式
bitmap: 字形位图
bitmap_top: 位图上行距离
bitmap_left: 位图左行距离
outline: 字形轮廓线
成员:
x: 水平步进值
y: 垂直步进值
成员:
row: 位图行数(高度)
width: 位图宽度
buffer: 位图数据(默认8位灰度值)
成员:
width: 字符映像宽度
height: 字符映像高度
horiBearingX: 左跨距(水平布局)
horiBearingY: 右跨距(水平布局)
horiAdvance: 水平步进
vertBearingX: 左跨距(垂直布局)
vertBearingY: 右跨距(垂直布局)
vertAdvance: 垂直步进
3. 2 基本API
函数功能:
实例化一个FreeType库对象,并返回给alibrary;
返回值:
若实例化成功则返回0。
函数功能:
销毁FreeType库对象library,包括其所有子对象;
filepathname, FT_Longface_index,FT_Face*aface ):
函数功能:
打开filepathname所指定的字体文件,加载第index个字体外观,并返回给aface指定的地址。
FT_F26Dot6 char_width, FT_F26Dot6 char_height,
FT_UInthorz_resolution,FT_UIntvert_resolution ):
函数功能:
设置字体大小;
输入参数:
char_width: 以1/64点为单位的字符宽度;
char_height: 以1/64点为单位的字符高度;
horz_resolution: 设备水平分辨率;
vert_resolution: 设备垂直分辨率。
注意:
字符宽度或高度可设置为0,这意味着宽度或高度与另一个参数(高度或宽度)相同;
水平或垂直分辨率设置为0时表示使用默认的72dpi。
FT_ULong charcode):
函数功能:
在选定的字符表中,查找与给出的字符码对应的字形索引。
返回值:
如果没有字符表被选中,这个函数简单返回字符码;
如果该字符表总没有该字符码对应的字形图像,返回0。
注意:
0对应特殊的字符图像,通常会显示一个框或空格;
新建一个face时,默认是Unicode编码的字符表。
glyph_index, FT_Int32load_flags):
函数功能:
从face中装载第index个字形图像到字形槽中(face->glyph)。
输入参数:
load_flags:装载标志,默认FT_LOAD_DEFAULT。此时优先装载嵌入位图,若无,则装载该字形的缩放后的轮廓线。
face->glyph->format描述了字形图像的格式。若它的值是FT_GLYPH_FORMAT_OUTLINE,则可调用FT_Outline_Embolden加粗轮廓线;若它的值不是FT_GLYPH_FORMAT_BITMAP,则可通过FT_Render_Glyph把它转换成位图。
函数功能:
将轮廓线加粗strength(26.6像素格式)。
函数功能:
将字形槽对象(slot)中的字形图像转换成字形位图。
输入参数:
render_mode:渲染模式位标志集合,默认使用
FT_RENDER_MODE_NORMAL渲染模式,表示渲染为一个高质量的抗锯齿(256级灰度)位图。
- int main()
- {
- FT_Library library;
- FT_Face face;
- FT_Error error;
- FT_UInt charIdx;
- wchar_t wch = 'a';
- char* buffer; // 用户申请的显示区域空间
- int startX, startY; // 字符图像开始装入的位置
- // 1. 初始化freetype2库
- error = FT_Init_FreeType(&library);
- // 2. 创建一个face
- error = FT_New_Face(library, "C:\\windows\\font\\SURSONG.TTF", 0, &face);
- // 3. 设置字体尺寸
- error = FT_Set_Char_Size(face, 16*64, 16*64, 96, 96);
- // 4. 获取字符图像索引
- charIdx = FT_Get_Char_Index(face, wch);
- // 5. 加载字符图像
- FT_Load_Glyph(face, charIdx, FT_LOAD_DEFAULT);
- if (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
- {
- FT_Outline_Embolden(&(face->glyph->outline), 16); // 加粗轮廓线
- }
- // 6. 获取字符位图
- if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP)
- {
- FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
- }
- // 7. 拷贝字符位图到用户的buffer中(用户私人函数)
- // 注意左边的计算方法
- ft2CopyBitmapToBuf(buffer, startX+face->glyph->bitmap_left,
- startY+face->size->metrics.ascender/64-face->glyph->bitmap_top,
- face->glyph->bitmap);
- startX += face->glyph->advance.x/64;
- }
FreeType2使用总结(转)的更多相关文章
- freeType移植总结①——使用keil编译freeType2库
在各个技术博客搜索相关资料后,终于将freeType的源码用keil工程编译通过,这里记录一下步骤和遇到的问题. 因为网上的资料都是旧版本freeType的工程,这里博主使用的是freeType2.9 ...
- MFC编译Freetype2.3.7
从http://www.freetype.org下载源代码. FreeType2库源码包中包含多种环境与编译器下的make文件,其中还包含vc的项目文件. 我用的是VC,所以首先找到VC环境的项目文件 ...
- ffmpeg编译时freetype2 not found错误
自己安装的libfreetype2在/usr/local/lib目录下export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
- opencv在图像显示中文
在图像定位和模式识别时,经常需要把结果标注到图片上,标注内容可以是数字字母.矩形框等(opencv支持的)或者是中文汉字(借助freetype). 1.显示数字/矩形框 #include <op ...
- Web应用之LAMP源码环境部署
一.LAMP环境的介绍 1.LAMP环境的重要性 思索许久,最终还是决定写一篇详细的LAMP的源码编译安装的实验文档,一来是为了给自己一个交代,把技术进行系统的归纳,将技术以极致的形式呈现出来,做为一 ...
- Ubuntu Server(Ubuntu 14.04 LTS 64位)安装libgdiplus2.10.9出错问题记录
首先下载libgdiplus2.10.9安装包 wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.9.t ...
- ubuntu-14.04-server配置Jexus --安装步骤记录
作者:郝喜路 个人主页:http://www.cnicode.com 博客地址:http://haoxilu.cnblogs.com 说明:我是Linux菜鸟,自己尝试配置Jexus服务 ...
- Asp.Net跨平台:Ubuntu14.0+Mono+Jexus+Asp.Net
Asp.Net跨平台的文章园子里有很多,这里给自己搭建的情况做一下总结,方便以后查看. 参考网站: http://www.linuxdot.net/(Linux DotNET大本营 ) http ...
- 1-web应用之LAMP源码环境搭建
目录 一.LAMP环境的介绍 1.LAMP环境的重要性 2.LAMP组件介绍 二.Apache源码安装 1.下载Apache以及相关依赖包 2.安装Apache以及相关 ...
随机推荐
- 15 自定义分页pagination全局组件
1.Pagination.vue <template> <el-pagination @size-change="handleSizeChange" @curre ...
- 17_Python的常用模块
1.随机数模块 random 1.随机小数 import random # (0,1)随机取浮点数 random.random() # 0.17988578778011 # (1, 3)取指定范围的浮 ...
- 三年前买的T440p目前淘宝二手价2300左右
当时可是近六千买的,唉... 有消息说六千多电脑和四千多的区别是多了OEM Windows的价钱,如果一重装,等于把差价抹了... 看来买电脑,买车,买手机都该秉承一个够用就好的原则,不然当时的顶配不 ...
- Zookeeper源码解读
1.1. 客户端源码 1.1.1. 总体流程 启动客户端 zkCli.sh文件里面的配置 实际运行 public static void main(String args[]) throws Keep ...
- MySQL查询更新所有满足条件的数据
-- 将订单表所有的状态改成1update oc_repair_preorder a inner join (select id,`status` from oc_repair_preorder) b ...
- Mybatis-多对一和一对多
多对一和一对多 目录 多对一和一对多 1. 复杂表的构建 2. 测试环境搭建 1. 导入Lombok 2. 新建实体类 3. 建立Mapper接口 4. 建立Mapper.xml文件 5. 在核心配置 ...
- Robotframework自动化1-Windows环境搭建
前言: robotframework环境搭建-环境准备 1.python2,pip2 2.WxPython 3.Robot Framework 4.Robotframework-ride 5.RIDE ...
- CTF-BugKu-杂项-1-20
2020.09.14 今天又是奥力给的一天,我的鼻炎啥时候能好啊--真是难受的一,影响学习和生活今天复习一遍杂项,应该挺快,毕竟这东西难就难在脑洞,做过一遍就全知道了,ok,let's go 做题 第 ...
- [LeetCode]364. 加权嵌套序列和 II (DFS)
题目 给一个嵌套整数序列,请你返回每个数字在序列中的加权和,它们的权重由它们的深度决定. 序列中的每一个元素要么是一个整数,要么是一个序列(这个序列中的每个元素也同样是整数或序列). 与 前一个问题 ...
- charles常用功能 request和response(简单的操作)
先介绍一个修改request请求参数值的方法吧 第一步: 拷贝完成后还需要配置一下: 先添加一个: 然后下一步: 最后点击OK,就可以开始操作request和response数据了 先修改reques ...