Truetype&Harfbuzz&FreeType联合应用完全解析(一)

本篇博客主要介绍当前最流行的计算机数字字体技术。

本章主要介绍truetype相关的技术 你将学习到的主要知识点有:

  1. 计算机字体信息技术的发展史
  2. TrueType字体技术
  3. TrueType字体文件的加载过程

后面还会有两篇博客介绍freetype结合truetype渲染出字符的实例代码和演示效果,以及freetype、truetype和harfbuzz整形引擎结合使用的实例代码和演示效果

1. 计算机字体信息技术的发展

在上世纪80 年代,Adobe的Font技术是最先进的。当时Adobe寻找Apple和Micrisoft合作,试图让他们在各自最新的操作系统中加入对Abode提出的Font格式的支持。尽管Abode的技术不管是屏幕显示,还是打印机输出都能得到当时最好的效果,当时Apple和Microsoft不想让自己在Font技术上受制于人,以及考虑到为此付出的一大笔版权费用,他们拒绝了Abode的提案。
为了打破Adobe的技术垄断,所以Apple和Microsoft合作,试图开发出一种能够取代PostScript的格式的字体。当时的分工是,Microsoft负载图像引擎,模块命名TrueImage,Apple负载字体引擎,叫TrueType。到现在的结果是,只有TrueType变成了MacOS和Windows的标准字体技术,而TrueImage这个定位不明确的东西后来迅速走人了垃圾堆。
1987年到1989年,Apple的总工程师Sampo Kaasila带领一个团队完成了TrueType的几乎所有工作。1911年3月,Apple正式发布TrueType技术,分别是Times Roman,Helvetic,Courier。1992年Microsoft发布了Windows3.1,Windows平台也开始支持TrueType,同时推出的三种TrueType字体,分别是Time New Roman,ARial,Courier。时至今日,Windows里面依然还有这三种字体。以上是所介绍的只是计算机字体信息技术发展过程的一小部分,如需了解更多,请读者自行查阅更多的资料。

2. TrueType字体技术

TrueType是由Apple公司和Microsoft公司联合提出的一种数学字形描述技术。TrueType是一种Font的技术。下面的几个概念将有助于理解TrueType到底是什么:

2.1 Font

什么是Font?Font简单来说就是计算机的二进制数据到屏幕上显示的文字的一种映射关系。比如,你打开记事本,输入几个字符并保存,然后使用二进制编辑软件打开这个文本文件,看到是其实是一些二进制或者十六进制的数据,而这些数据可以对应于屏幕上不同的文字显示。我们平时说的TrueType一般指TrueType Font技术。

2.2 Bitmap Font & Scalable Font

最早的Font技术就是Bitmap的点阵式,也就是点阵字体,这种字体的优点就是简单,一般是用代码或者工具生成点阵数据,然后在屏幕上直接刷点阵数据就行了,但是你要进行放缩,旋转或者其他的一些难度高一点的要求,就显得非常捉襟见肘了。为了满足更多更灵活的文字处理需求,就出现了Scalable Font,也称种字体为可缩放字体或者矢量字体。它的核心思想就是使用一系列的点来描述字符的轮廓,这些点的坐标可以做任何放缩,旋转,扭曲等处理。但是最后经过特定的算法渲染,得到的还是点阵数据。但它显然满足更多的需求。TureType字体就是一种Scalable Font。

2.3 字符&字体&字形

字符:百度百科:字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。简单来说字符就是一种有特定意义和功能的符号,也是构成其他字符的基本单位。字符侧重表示功能和意义方面的内容。一个文字一定是一个字符,一个字符不一定是一个文字。
字形:文字的形状,侧重表示一个字符的外观。一般一个文字有一个字形,字形通常和个体联系起来。
字体:也表示文字的外在形式特征,是一系列字形的集合,表示一种字形的大类。如楷体、宋体。

2.4 contour

Contour表示一系列有序的点首尾相连形成的封闭图形,我们可以把contour翻译成笔画,它是有方向的。一个简单的文字可以包含一个contour,如字母C:
包含1个contour的字母C

一个复杂的文字就要包含几个contour,如字母B,包含了3个contour:
包含3个contour的字母B
Contour由直线和曲线组成。组成contour的曲线是通过一组定义二阶贝塞尔样条(Bezier-spline)的点描述。关于什么是贝塞尔曲线,请读者自行阅读相关资料。Bezier-spline在TrueType字体中由两类点描述,一类是轮廓上的点,一类是不在轮廓上的点。定义曲线时任何在与不在轮廓上的点的组合都是合法的。直线则是有两个连续的在轮廓上的点定义。如下图所示,一个用点描述的contour(同时它也是一个glyph),空心的点表示不在轮廓上,实心的点表示是轮廓的点。
字母S的contour
对于同一个字符的glyph,描述组成它的直线和曲线的点的编号必须是连续且有序的。至于是升序还是降序,将决定轮廓的方向:亦即在填充轮廓时,填充区域是在轮廓的左边还是轮廓的右边。

2.5 glyph

TrueType Font中最小的描画单位称为Glyph。Glyph并不等于字,尽管一个字一定是一个Glyph。一个glyph由一系列的contour(笔画)组成。contour,glyph和字的关系可以简单表示为:一个或几个contour组成一个glyph,一个或几个glyph组成字。
glyph可分为简单的glyph和复合的glyph。

TrueType是一种可缩放的矢量字体技术,包含了字形的描述、字体文件的数据结构和存储格式、字形调整指令等。

2.6 轮廓的坐标空间

TrueType使用笛卡尔二维平面坐标空间。在创建字形轮廓时,一个字形设计者使用一个假想的正方形,叫做EM正方形,这个正方形的网格单位长度很重要,因为它将作为字形轮廓放缩到指定文本尺寸的参考,它和显示设备的像素相关。
EM
如上图,字形轮廓可以被限定在EM框内,它也可以超出EM框。
在字形的轮廓空间中,坐标的原点一般在glyph的基线上,x轴或者y轴与基线重合,由glyph是水平布局还是垂直布局决定。如下图:
水平布局的坐标空间
垂直布局的坐标空间
轮廓坐标空间的各种度量变量,如bearingX、bearingY、advance,为我们正确地把字符的点阵数据刷到屏幕上提供了非常重要的帮助。
关于truetype技术的相关概念就简单介绍到这里,以上所述只是为了后面写代码提供方便。还有其他许多未涉及到的地方,读者自行阅读相关资料

3. TrueType字体文件的加载过程

truetype文件是truetype技术的一种具体的实现载体。TrueType的字体文件一般以.ttf作为文件的后缀。在windows系统下文件路径C:\Windows\Fonts里可以看到很多系统的truetype字体文件。一个字符在显示器上显示出来,大概要经历以下过程。

  1. 读取truetype文件中的字体数据,然后根据字符的码点(codepoint),这个码点一般就是Unicode编码的码点,找到该字符的glyph描述数据;
  2. 把glyph放缩到需要的尺寸;
  3. 通过根据对应的glyph微调指令进行微调,微调是为了能得到更好的渲染效果;
  4. 最后将glyph进行光栅化处理,即Raster,就是将轮廓填充后生成bitmap点阵的位图数据。

以上过程是需要truetype字体文件和truetype字体图像引擎配合工作,才能真正得到位图数据。freetype就是一个可以渲染truetype文件的字体图像引擎。
参考

  • TrueType官网:https://developer.apple.com/fonts/TrueType-Reference-Manual/RM01/Chap1.html
  • 知网论文:《TrueType字体引擎的研究与实现》
  • 相关资料网站:http://www.doc88.com/p-5806372261597.html

学习一种新的知识或者技术,首先应该从官方渠道获取资料,再查看比较正规一点的论文。官方的资料一般是英文的,理论性强,概念较多;论文有的大多数只是翻译了一下官方的资料,说得不够直白;最后就是阅读别人的博客,博客能让人理解得直白一些。三种资料都研究完了,也就对原理掌握得差不多了。

小结
TrueType Font技术包括了字形的数学建模、计算机语言表示、字形轮廓的描述和调整指令、字体文件的数据结构、truetype解释器等。对于工程师来说,我们只关心怎么去使用它,也就是如何解析truetype字体文件,并且最终得到字符的点阵数据。而为了得到点阵数据,可以使用开源的freetype工具,这将在下一篇博客详细介绍…


路漫漫其修远兮,吾将上下而求索。 @Andy 2020-04-26

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值