6.9.5 安装Fontconfig
Linux最初在我国的程序员中流行时,有很多程序员热衷于Linux的美化,其中优化文字的显示是其中主要内容之一,至今在各个Linux论坛仍然可见Linux美化的身影。文本渲染比较烦琐,除了技术原因外,文本处理机制不断的发展变化,从最初的X的核心字体,到X的字体服务器,再到现在广泛采用的客户端渲染,也给这个本身就不是特别容易理解的领域增加了很多复杂性。
凡是涉及字体相关的地方,我们经常看到如Fontconfig、Freetype、Pango,甚至更多,这些库在文本渲染中都担任什么角色?它们之间的关系又是什么?在我们埋头搭建系统时,还是要不时抬头看看路的。下面,我们就结合图6-28来简单地介绍一下文本的渲染。
图 6-28 文本渲染过程示意图
(1)字符编码(character code)
虽然我们在写程序时,直接使用可读的字符,但事实上,在程序内部,是用字符的编码来代表字符的。字符的编码有多种标准,比如ISO-8859系列编码,Unicode编码以及我国的GB18030等。
假设系统使用UTF8编码,当程序准备显示字符串“你好Linux!”时,程序中将以编码"4F60 597D 4C 69…"来记录这个字符串。
(2)字形(glyph)
字形是字的形体的简称,GB/T 16964《信息技术字型信息交换》中关于字形的的定义为:一个可以辨认的抽象的图形符号,它不依赖于任何特定的设计。
这样解释读者可能依然会感到比较生疏,因为平时我们很少使用这个概念,但是提到字体,大家就一定比较熟悉了,因为操作系统中一定要安装字体文件的,否则是不能正确显示字符的。而所谓的这个字体文件,其实就是字形的集合。
以TrueType字体文件为例,其中包含两个关键的数据结构:
❑一个是字形表,也称为glyf。字形表中每一项代表一个字形,使用字形索引访问其中的字形。TrueType的字形表中,每个字形的描述并非如图6-28中的字形表(glyf)中显示的那样直观,字形表中描述的字形信息都是矢量的,字符的每一个笔画都是由多条曲线包围而形成的。一次曲线需要两个点来确定,二次需要三个点,三次就需要四个点。字体内部保存了这些点的坐标。
❑一个是字符编码到字形映射表(Character to Glyph Mapping),简称cmap。读者可能会有个疑问,cmap中的第二列为什么不是字形,而是字形索引呢?原因是字体文件可能使用在不同的编码环境中,所以字体文件可能包含多个cmap表,比如UTF8对应一个cmap表,GB18030对应另外一个cmap表。另外,一个字体文件中也可能不只包含一种字体。
(3)排版(layout)
每每谈到文本渲染时,大家更多的关注在字体上,却往往忽略了文本的布局排版。实际上,文字的排版是重要而且复杂的。排版引擎需要将单个字符按照一定的间距美观的排列起来。
除了处理字形信息外,由于世界上有多种文字体系,因此,文本可能是多种语言混合的。而且,还有像阿拉伯文、希伯来文这种文字体系是从右向左书写,更别提布局规则极其复杂的印度系文字。
可见,排版引擎是一位真正的幕后英雄。而且,文本渲染的过程都是由排版引擎牵头开始的,不同的图形库可能使用不同的排版引擎,GTK使用的排版引擎是Pango。
(4)确定字体
在将字符编码转化为字符前,首先需要确定字体文件,否则巧妇也难为无米之炊。一个系统中可能安装了多个字体文件,因此,在众多的字体文件中要选择一个最合适的,这就是Fontconfig的主要任务之一。
进行文本渲染时,Pango收集来自各方的字体信息,如系统主题中设置如下:
程序自身的设置如下:
可能还有来自如图形库等其他方面的信息,总之,Pango最后加工出一个字体描述,将它传递给Fontconfig,这个描述称为模式(Pattern),Fontconfig根据配置文件对这个模式进行进一步加工,Fontconfig通常会修改或者增加一些属性。
最终,Fontconfig以加工好的模式在众多的字体中匹配一个最合适的字体。
(5)光栅化
一旦字体确定后,Fontconfig使用库Freetype提供的接口,确定字符编码对应的字形索引,依据的就是如TrueType字体文件中的cmap表。最后,Freetype根据字形索引,从字体文件的字形表中获取描述字形的矢量信息,构建具体的字形,这个过程也叫光栅化。经过光栅化的字符编码,就是一普通图形了,接下来无论是显示到具体窗口中,还是进行其他处理,都与处理普通的图形完全相同。
理解了各个库的作用后,下面我们开始安装这些库。
Freetype在前面安装X时已经安装,接下来只需安装Fontconfig和Pango。由于Cairo依赖于Fontconfig,而Pango又基于Cairo进行字体渲染,所以,这里的安装顺序看上去有点奇怪。我们先安装Fontconfig,中间插播Cairo,然后才安装Pango。
安装Fontconfig的命令如下: