X 的字体和渲染
对于 GNU/Linux 的中文用户来说,X 的字体设置是一个恒久的话题。似乎永远都谈不厌,说不完。为了备忘,在这里再做个简单的综述。
* X modules
X 为了渲染各种字体以 module 的形式提供了多个后端(backend),其中 freetype 和 xtt 能够处理 TrueType 字体:
- freetype - 支持 TrueType (ttf, ttc), Type1 (pfa, pfb), CID (cid), CFF, OpenType, bitmap (bdf, pcf, snf), Windows (FNT), PFR, and Type42 fonts
- xtt - 支持 True Type (ttf, ttc) fonts (conflicts with freetype)
但是 X 的字体技术没有就此停滞不前,X 核心协议中字体配置的缺乏灵活性,加上难看的 XLFD,催生了 Xft。
* Xft
Xft 最早出现在 XFree86 4.0,它的作者是 Keith Packard同学,其目的是更好的管理和渲染字体。从 XFree 4.02 开始,XFree86/Xft 开始提供对字型反锯齿显示的支持。新的版本是 Xft2,下面的说明都是基于 Xft2 的。Xft2 和它的前辈 Xft 最大的区别就是后者的设置由 Xftconfig 所控制,前者的设置则由 fontconfig 库全权负责。fontconfig 使用的 XML 格式的配置和 Xftconfig 相比大大简化了设置的难度。为了从核心的字体渲染平滑过渡到 X Render extension (后文会提到) 渲染,Xft 可以既可以核心字体,也可以用 FreeType 和 Render extension 的黄金组合。
通过 Xft,客户端的 X 程序能够使用新的 X render extension 和 freetype2 来渲染字体,字体的定位、命名和替换规则由 Fontconfig 负责。用户可以根据自己的喜好和口味自行设置 fontconfig。这里需要提醒一下,是使用 X 核心渲染还是 Xft 的渲染方式,是由 X 程序决定的。
既然你配置好了 Xrender 和 freetype,那么试试吧,这里我打开了 Xft 的调试信息:
$ export XFT_DEBUG=2 $ xterm -fa charter -fs 14
* XRender
说到 Xft 就不得不说一下 X Render。RENDER 是 X 的一个 extension,这个 extension 又是 Keith 同学(我为什么要说“又”?)的作品。X Render 能通过硬件实现的 compositing 操作,提供反锯齿和 alpha 混合(半透明)的绘图功能。你可以用 xpdyinfo 看看你的 X server 是否使用了它,或者也可以检查一下 /var/log/Xorg.0.log。除了画三角形和椭圆之外,X clients 也可以使用 X Render 提供的绘图功能绘制反锯齿的字型。最近的 Qt 提供支持,让 Xft 能使用 FreeType2 和 XRender 绘制反锯齿字型。可以说,FreeType2 负责告诉 X client,字型的形状(glyphs),而 XRender 把这些形状绘制在 X server 上,当然,是有反锯齿和半透明效果的。如果没有 X Render 可用,Xft 就只好使用老式的核心的字体绘制方式了。
* Cairo
Cairo 是一个相当有野心的项目。它企图把二维的图像输出到各种对象,从 X11、win32、或者内存中的图像缓冲区。写入PostScript、PDF和图像文件(PNG)的工作也有了初步的成果。Cairo 也不会放过硬件加速的机会,它能使用 glitz 和 X Render 进行渲染。
** Pango
既然 Cairo 和 Xft 提供了画字的手段,那字和段落的编排、布局呢?Pango 来也!Pango 能够使用多种后端,主要有三种搭配:
- FreeType2+fontconfig +(Cairo|Xft)
- Windows 的字体+(Cairo|Win32 API)
- MacOS X 字体 + Cairo。
** QT
一图胜千文,直接看图
* Xfs
在早期 Red Hat 发行版缺省的 X 配置文件中常常可以看到关于 xfs 的设置。xfs (X Font Server)是一个运行在后台的字体服务器。如果您设置的 X 服务器不想(或者是没有能力)操心字体配置和处理的烦心事,就可以单设置一个 FontPath(事实上是一个端口),让 xfs 代劳。在更早的时候 XFree86 3.x 的时代[8],字体服务器甚至是让 X 使用 TrueType 字体的唯一途径,那时的 XFree86 3.x 还没有内建的 TrueType 支持。最常见的配置就像这样:
FontPath “unix/:7100″
在 这里,unix 是指的 unix domain,即让 X server 通过本地的 7100 端口连接 xfs 服务器。xfs 服务器会对 X server 请求的字体信息作出相应。如果让 X server 用 inet domain 连 Xfs 的话,就是 tcp/fs.x.org:7100, tcp/
除了文中提到的链接之外,这里也说得相当不错,还有力气的话,建议你看看。

