X字体
hanlray@gmail.comReversion:0.8 Date: 2006/08/02
X有两种字体系统:core font system和xft。xft以其显示质量高、安装便捷而被越来越多的应用程序使用,gtk+2.2以后就缺省使用xft;但是一些老的应用程序如emacs仍然使用的是core font system,当前两种font system是共存的。
一个字体文件主要包含的是字符的glyph,如果是用位图来表示glyph,该字体就是bitmap font,如果是用数学描述来表示glyph,那就是scalable font。要能任意访问一个glyph,必须对这些glyph进行索引,不同的字体格式采用的索引方式不同,Type1用glyph的名字来索引,TrueType一般是用unicode来索引的。
通常是用某个encoding来访问字体文件里的glyph的,这对于不是用encoding来索引的字体,需要作一个encoding到字体所用索引的转换,而对用encoding索引的字体,可能需要作一个从访问用的encoding到字体所用encoding的转换,比如,针对gbk字符的simsun.ttf如果是用unicode来索引的,没有理由不允许用gbk encoding来访问,这样就需要一个gbk到unicode的编码转换。这种转换是如何进行的?对于xft,我们不用太关心,因为这一切都是自动进行的;而对core fonts,我们还是应该了解一下,这样将有助于理解后面描述的字体安装的步骤。
core fonts的两个scalable backends(Type1和FreeType TrueType backend)使用一个公共的fontenc layer来进行字体重编码。对一个用来访问字体的encoding,为了使之能访问到各种字体文件格式(也即字体采用的索引方式,包括glyph name、unicode、cap map等),fontenc layer为其定义了一些mapping,每个mapping针对一种字体格式;针对一个encoding的数据(包括encoding名、可能的一些别名,以及各个mapping)通常保存在一个后缀为enc文件里,放在X11/fonts/encoding目录下;X.org中的fontenc layer已经内置了一些encoding,还可以增加新的encoding支持,只要为该encoding编写规定格式的enc文件即可。
如何指定访问字体使用的编码呢?core fonts是用XLFD来描述使用字体的,XLFD的最后两个field:CHARSET_REGISTRY-CHARSET_ENCODING实际上指示了这种编码,但由于这两个field表达编码的方式是独立的,不同于fontenc layer使用的名字,因此我们还需要把XLFD定义的编码名映射到fontenc layer使用的encoding,这就是X11/fonts/encoding/encoding.dir文件的内容。
core fonts使用的XLFD必须先要注册然后才能使用,注册过程是通过写一个fonts.dir文件来完成的,该文件列出了准备使用的XLFD,同时为了能通过XFLD找到对应的字体文件,每个XLFD还和字体文件名做了映射,之后通过在X的配置文件里指定该该文件所在的目录,X server就能提供通过这些XLFD进行的字体访问了。
怎么写这个fonts.dir文件?怎么知道一个字体文件支持哪些XLFD?下面就simsun.ttf的安装为例来说明。
1. 核心字体的安装
以在ubuntu 6.06/X.Org X11R7.x下安装simsun.ttf为例,步骤如下:
- 拷贝字体文件到选定的目录。
- 生成fonts.scale和fonts.dir。
- 修改/etc/X11/xorg.conf。
- 重启X,用xlsfonts命令确认字体安装成功。