LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 13298|回复: 19

字体基础和底层知识(多帖合并)

[复制链接]
发表于 2003-12-9 14:00:50 | 显示全部楼层 |阅读模式
XFree86 字体美化 Mini HOWTO
作者: Doug Holland, meldroc@frii.com
译者: Yu-Chia Chang, joezhang@ms10.hinet.net
1. 简介
在我必须处理的一堆讨厌事中,有一项就是没完没了的 X 缺省字体和字体设定 (我专指 XFree86,其它的 X 也许比较好)。有些程序缺省使用固定宽度字体 (fixed width fonts),但其实可变宽度字体 (variable width fonts) 较为适当。而有些程序使用不可思议的小字,而无法辨认。伴随 XFree86 而来的字体根本不适於使用。它的确有还算体面的 courier 字体,但是它附的 Times 和 Helvetica 只是简单的点阵字,当缩放的时候就产生锯齿状。

本 HOWTO 尝试说明如何调整各式各样的字体设定,如何安装新字体,和其它可以大大改善 X window 字体的外观和可读性的方法。这是藉由调整 XF86Config 档中的字体路径 (FontPath),在 startx 或 xdm 加上 X server 命令列选项(command line options),加入新的字体,安装 TrueType 字体服务器 (font server) xfstt,和使用 K Desktop Environment 1.1 的功能来调整许多应用程序的字体设定,包含设定让非 KDE 应用程序的颜色和字体能够与 KDE 一致。

欢迎评论,更正,增补和批评。您可以在 meldroc@frii.com 联络到我。
1.1 更新纪录

* 0.1: Feb. 21, 1999: 第一次公布。
* 0.11: Feb. 27, 1999: 放入 copyright。
* 0.12: Jun. 10, 1999: 放入请求援助。
* 0.20: Sep. 14, 1999: 为 redhat 使用者放入有关于 xfs 的一节。感谢 Hal Burgiss 的贡献。
* 1.0: Nov. 23, 1999: 将文章转为 SGML 格式,传送给 Linux Document Project。将请求援助的部份移除。
2. XF86Config 档

要想解决字体的问题,首先先得看看 XF86Config 档。(通常放在 /usr/X11/lib/X11/XF86Config 或 /etc/X11/XF86Config)。您猜到了吗? 这个档中关于字体最重要的部份就是 FontPath。在我们研究它之前,最好先检查 X 的其它设定。错误的屏幕设定比错误的字体设定更令人头痛。确定您屏幕的更新频率 (refresh rate) 在正常使用范围中已经设到最高 (85Hz 很好,75Hz 普通,60 Hz 很不舒服)。
2.1 设定 FontPath

用您最顺手的文字编辑器来编辑 XF86Config。在文件的开头,您应该会看到类似下面的东西:

FontPath "/usr/X11R6/lib/X11/fonts/misc/"
FontPath "/usr/X11R6/lib/X11/fonts/Type1/"
FontPath "/usr/X11R6/lib/X11/fonts/Speedo/"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/"

FontPath 告诉 X 到那里去找在屏幕上显示用的字体。顺序是很重要的,当一个 X 的应用程序向 X 要求使用一些字体,X server 通常偏好使用正在用的字体。然后它去看看 FontPath,使用最先看到能满足 X client 要求的字体。

缺省的 FontPath 通常将 75dpi 的字体放在 100dpi 的字体前面。若您有一台高解析度的屏幕,这表示非常小的字。第一个你要用的方法就是将 75dpi 和 100dpi 的 FontPath 对调。

FontPath "/usr/X11R6/lib/X11/fonts/misc/"
FontPath "/usr/X11R6/lib/X11/fonts/Type1/"
FontPath "/usr/X11R6/lib/X11/fonts/Speedo/"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"

然后指出您偏好使用不能缩放的点阵字。若您曾经使用 Netscape 或是其它使用较大字体来显示标题的程序,您将会发现这些字体呈现锯齿状的。这样很丑,需要修改。所以在 misc,100dpi 和 75dpi 的最后加上 :unscaled。若您想要的话,您也可以同时使用能缩放和不能缩放的字,只要将不能缩放的字的 FontPath 放在前面,告诉 X 说若可能的话,尽量使用不能缩放的字。

FontPath "/usr/X11R6/lib/X11/fonts/misc:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/Type1"
FontPath "/usr/X11R6/lib/X11/fonts/Speedo"
FontPath "/usr/X11R6/lib/X11/fonts/misc"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi"

再做了这些改变後,重新启动 X。桌面是不是已经比较漂亮呢?

3. X server 命令列选项 (command line options)

下面一件要做的事是调整 X server 的命令列选项。您将会想要用 -dpi 来指定显示的解析度是每英□几点。现在很多的系统使用高解析度的显示器,可能它们将会要用 100dpi。

若您在 console 下启动 X,键入

startx -dpi 100

若您用 xdm 这种图形登录界面,您需要编辑您的 /usr/X11/lib/X11/xdm/Xservers 档。在里面有 Xserver 的命令列。我的文件里有下面这一行

:0 local /usr/X11R6/bin/X -dpi 100 -gamma 1.6

您可在 X 和 Xserver 的 manpage 中找到更多的信息。

4. TrueType 字体 (少数 Windows 做的很好的事情)

因为在 Redmond 的那群家伙非常关心他们软件的外观而不是内容,他们在 Windows 里加上对 TrueType 字体的支持。Window 95 和其它的 Windows 都内含 Arial,Times New Roman,和 Courier New。他们约等於 Helvetica,Times,和 Courier。TrueType 字体是能缩放的,所以它们在放大时很好看,而它们也被好好的调整过,故在缩小的时候依然可读。有许多的 Windows 应用程序附送好几打的 TrueType 字体。先别急著把您的 Windows CD 拿去微波,您得先拿到这些字体。
4.1 xfstt

不幸的是 XFree86 并没有内部支持 TrueType 字体,所以必须自己加入。最简单的方式使用 xfstt,一个没镅的 TrueType 字体服务器。(译注: 这里没镅是 free,严格来说,并不是没镅,而是自由的意思)
Installation

xfstt 安装非常容易。首先从网站上下载 tarball。最新的版本是 http://metalab.unc.edu/pub/Linux/X11/fonts/Xfstt-0.9.10.tgz

有了 tarball後,把它解开

tar -zxvf Xfstt-0.9.10.tgz

然后编译和安装它。INSTALL 档有简单的说明。有个不用大脑的方法 make; make install 就可以了。当做好後,把由各式管道取得的 TrueType 字体拷贝到 /usr/ttfonts 就可以了。键入下面的指令来启动 xfstt

xfstt --sync # 更新 xfstt 的字体数据库
xfstt & # 在背景执行 xfstt

然后键入

xset +fp unix/:7100 # 让 X 使用 xfstt

或是在您的 XF86Config 档中加入下面的指令,让 X 使用这项服务

FontPath "unix/:7100"

调整缺省字体的大小

若您的 TrueType 字体显得相当小,下面的指令可能有帮助

在 X server 命令列加上 -dpi (请参考第 3 章)。

使用 --res 来告诉 xfstt 增加缺省的解析度。用下面的指令

xfstt --res 120

4.2 xfs

xfs 是另一种字体服务器的选择。它已经包含在以 RedHat 为基础的 distribution 中。xfs 是基於 FreeType Font library,提供了类似於 xfstt 的功能。xfs 不只能处理 TrueType 和 Type 1 字体,也可以对付原本的 X 字体。
安装

第一步是将 TrueType 字体加入您的 linux 里。su 为超级使用者,建一个目录来存放这些字体:

mkdir /usr/share/fonts/ttfonts

然后将字体放入这个目录里。您可以从您的 Windows 系统中拷贝过去

cp /mnt/win/path_to_fonts/*ttf /usr/share/fonts/ttfonts/

或是从 Microsoft 直接下载。

这些字体是自解压缩的 zip 档。您仍可在 linux 中安装

unzip <FONT.EXE>

注意字体的文件名必须小写。一个快速又容易的转换方法是将他们拷贝到一个 DOS(FAT16) 文件系统中,然后再拷贝回来。DOS 不处理大写。另一个较像 linuxer 会用的方法是先进入到存放字体的目录下,然后键入:

ls *TTF | while read f
do
[ -f "$f" ] && mv -f "$f" "`echo \"$f\" | tr A-Z a-z`"
done

您在键入每一行得时候会有 ">" 的提示符号,在上述每一行的最后按下 return。 注意标点符号 -- 那些 "backquotes" 很重要。当 TrueType 字体正确安装後,以超级使用者执行:

ttmkfdir -o fonts.scale
mkfontdir

当您字体目录下的内容改变後,重新执行上面的命令。接下来,编辑您的 xfs 字体设定文件 /etc/X11/fs/config 在您字体表中加入您的 TrueType 字体:

catalogue = /usr/X11R6/lib/X11/fonts/misc:unscaled,
/usr/X11R6/lib/X11/fonts/100dpi:unscaled,
/usr/X11R6/lib/X11/fonts/75dpi:unscaled,
/usr/X11R6/lib/X11/fonts/misc,
/usr/X11R6/lib/X11/fonts/Type1,
/usr/X11R6/lib/X11/fonts/Speedo,
/usr/share/fonts/default/Type1,
/usr/share/fonts/ttfonts,
/usr/X11R6/lib/X11/fonts/100dpi,
/usr/X11R6/lib/X11/fonts/75dpi

或是您也可以用 'chkfontpath --add <font>' 命令来加入字体。当使用时,您或许也会想要更改您的字体的缺省点数。

default-point-size = 140

这让我从缺省的 12 点字变为 14 点字。有些 X 的应用程序使用这个,有些则否。接下来,确定您的 XF86Config 档中的 FontPath 是

FontPath "unix/:-1"

注意 "unix/:7100" 也可以做到,但是在刚出来时无法使用。将所有的 FontPath 用 '#' 让它变成注解,反正你也不用它们了。xfs 的 packages 应该和其它 XFree 的 packages 一起安装了。要确定它是缺省的服务,您可以使用 'ntsysv' 或是

chkconfig --add xfs

现在 xfs 在您每一次开机的时候都会启动。 现在重新启动 X 来读入新的 FontPath。用下面的的方式 启动/重新启动 xfs

/etc/rc.d/init.d/xfs restart

现在您应该有个可以使用的字体服务器了。您可以检查那些字体有被使用

xlsfonts | less

或用 xfontsel 甚至更好的 gfontsel 来检查它们。

5. KDE

在这段日子里,KDE 是在 Linux 和 X 发生过最好的事情之一。它提供了一个一致的使用者界面,让一般大众能够接触 Linux。您可以在 http://www.kde.org/. 找到更详细的数据。为什么我会在这大大称赞它呢? 这是因为 KDE 1.1 有个新特色,能够让您程序的字体和颜色与现在的 KDE 风格一致,这也包括非 KDE 的应用程序。
5.1 应用 KDE 的字体和颜色於非 KDE 的应用程序上

这很简单。只要打开 KDE 的控制中心(Control Center)下面的 Desktop 下面的 style。那里有个选项叫做 "Apply fonts and colors to non-KDE apps"(将字体与颜色应用到非 KDE 的应用程序),打开他,选 OK,这样就好了! 下次您开启许多的应用程序,它们就会像其它的 KDE 应用程序般,有相同的颜色与字体。有些人最喜欢这项特色,但若您不喜欢的话,您也可以将它关掉。

6. 在特定的应用程序中调整字体

6.1 Netscape Navigator/Communicator

Netscape Communicator 对于字体的问题相当的敏感。若您使用缺省的 FontPath,您的字体将会非常小非常丑。您第一件要去做的事情就是修改您的 XF86Config 档中的 FontPath (参考第二章)。使用 100dpi 的字体大大的改善了可读性。您也会想要去检查在 Edit/Preferences/Appearance/Fonts 的字体设定。不选 Font 选项中的 "Allow Scaling" 可以让点阵字不会锯齿状。

若您有 xfstt 或 xfs,Netscape 非常适合使用 TrueType 字体。然而,它不能得体的处理 xfstt 的锐角。在 Edit/Preferences 中,您可以将 TrueType 字体设为固定宽度或是可变宽度,然而当您关闭 Netscape 後,它将不记得您选取的字体点数。若您在开启 X 时未用 -dpi 或是在 xfstt 未使用 --res,您的字体将会很小。当我用了上面两个修正,TrueType 字体真的很棒!
6.2 WordPerfect

即将登场。
6.3 StarOffice

即将登场。

7. 致谢

本 HOWTO 是由 Doug Holland 所撰写

Email: meldroc@frii.com

WWW: http://www.frii.com/~meldroc/

外加 Hal Burgies 的贡献。

感谢

* 在 comp.os.linux.x 的人们,他们在我刚开始研究这些的时候对我伸出援手。
* 让这所有一切变为可能的 Linux 社群。
* Microsoft 和 Apple: 他们提供了字体,美化了我的桌面。
 楼主| 发表于 2003-12-9 14:01:59 | 显示全部楼层

XFree86的字体(XFree86文档翻译)

XFree86的字体(XFree86文档翻译)   

--------------------------------------------------------------------------------

======================================
我是菜鸟。看得也比较快。下面如果有译得不对的地方,不必客气,尽请指出。

看这个东西也是因为总是不明白在 X 里面的字体是怎么回事,想搞搞清楚,总是用别人的汉化/美化方法也不是长久之计。而这个汉化/美化的工作,我认为是Linux在中国走向普通用户,承担起日常工作的最后一个沟坎。在网上找了一下,东西还不少,这个文档是XFree86的,位置是在http://www.xfree86.org/current/f ... free86.org/current/ 是Documentation for XFree86[tm] version 4.3.0)。它说得是比较全面而且权威的。希望能对像我一样的Newbie(我折腾了2年了,还是Newbie)们有所帮助。之所以译出来,也是逼自己看仔细点的一个方法。

注意它是最新的XFree86 4.3.0的文档,和4.2以及更早的版本也许会有不同。

文中有几段感觉没什么用的,也不太懂的,就没译。见谅。

第5部分有些东西可以先看。第6部分有参考资料。

希望Linux能越来越好。

有什么意见或建议,请发邮件至:lpqi@hotmail.com 。
====================================
名称:XFree86的字体
作者:Juliusz Chroboczek, jch@xfree86.org
日期:17 January 2003

译者:lpqi@hotmail.com
日期:28 April 2003
====================================
1.介绍
本文档描述了XFree86对字体的支持。“安装字体”面向想在XFree86中安装字体的用户;其他部分比较详细地描述了对字体的支持。
我们假设你已经对数字字体有相当的了解。如果有什么不清楚的,可以查看附录:本文档最后部分的背景信息。

1.1 两种字体系统
XFree86包含两种字体系统:核心X11字体系统,存在于所有X11实现中;xft字体系统,目前并未在除XFree86以外的X11实现中存在,但将来很有可能加入进去。
核心X11字体系统是从1987年出现的X11R1中继承下来的,它只能使用单色bitmap字体。在经过多年发展之后,它总算加入了可变形字体及旋转象形文字的支持。
Xft最初设计的目的就是为了对可变形字体提供更有效更好的支持。它不像核心字体系统,它支持反锯齿和子像素平滑等特性。可能这一点更重要,它为应用程序提供了对象形文字描绘方法的完整的控制,让排版和所见即所得的显示成为可能。最后,还还允许应用程序使用并未安装在系统中的字体,而是使用文件中嵌入的字体来进行显示。
Xft同核心字体系统不兼容:使用Xft要求对开发工具(用户接口库)进行较多的改变。因此,目前XFree86继续使用核心字体系统,而开发工具的作者们也已经准备尽快转向Xft。

2. 安装字体
这一部分解释了如何对Xft和核心字体系统进行配置以便使用刚安装的字体。

2.1. 配置Xft
Xft自己没有配置机制,而是依赖于fontconfig库来进行配置。这个库并不专用于XFree86,也不限于某种特定的字体显示机制。因此,本部分就是描述fontconfig而不是Xft如何工作的。

2.1.1. 在Xft中安装字体
Fontconfig在一系列常见的目录中寻找字体,包括所有的XFree86标准字体目录(缺省是`/usr/X11R6/lib/X11/lib/fonts/*'),和用户主目录下的`.fonts/'。为Xft安装字体只需将字体文件拷贝到这些目录之一下面。

$ cp lucbr.ttf ~/.fonts/

Fontconfig在下一次寻找时就能发现这些字体,并重建自己的字体列表。如果想在命令行上激活这个行为(比如想全面升级全系统的Fontconfig信息),可以使用`fc-cache'命令:

$ fc-cache

2.1.2. 微调Xft
Xft的行为由一组配置文件控制:全系统的配置文件是`/etc/fonts/fonts.conf',用户专用的是主目录下的`.fonts.conf'(如果设定了`FONTCONFIG_FILE'全局变量,这个文件可能不起作用。)

Fontconfig文件均由以下样式开头:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>

并以此行结束:
</fontconfig>

缺省的Fontconfig文件包括对`~/.fonts/'目录的寻找,这里是放置用户专用字体的地方。如果要加入一个新的字体目录,可用如下语法:
<dir>/usr/local/share/fonts/</dir>

另外一个有用的选项是关掉某个字体的防锯齿(平滑)功能,语法如下:

<match target="font">
<test qual="any" name="family">
<string>Lucida Console</string>
</test>
<edit name="antialias" mode="assign">
false
</edit>
</match>

也可用下述命令关闭对所有字体的平滑功能:

<match target="font">
<edit name="antialias" mode="assign">
false
</edit>
</match>

在LCD显示上,Xft支持子像素平滑。一般地,XFree86在使用LCD并用DVI连接到主机的笔记本电脑上会自动打开这一选项。以下命令可用以查证:

$ xdpyinfo -ext RENDER | grep sub-pixel

如果该命令没有印出任何东西,就需要手动配置。语法如下:

<match target="font">
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
</match>

`<const>'...`</const>'之间的rgb用于指定像素元件在屏幕上显示的顺序,这必须和硬件相配:普通的LCD是rgb,backwards LCD使用bgr,顺时针旋转后用vrgb,反向用vbgr。

2.1.3. 配置应用程序
Because most current applications use the core fonts system by default, it is necessary to explicitly configure them to use Xft. How this is done depends on the application.
由于许多应用程序缺省是使用核心字体系统的,所以要使用Xft,就必须进行配置。方法根据程序不同而有所区别。

XTerm使用 `-fa' 的命令行选项就可以使用Xft,也可以通过设定`XTerm*faceName':

XTerm*faceName: Courier

or
$ xterm -fa "Courier"

对GTK+ 2.0(GNOME 2程序)程序来说,把`GDK_USE_XFT'设为 1 即可:

$ export GDK_USE_XFT=1

GTK+ 2.2 缺省即使用 Xft 。

对KDE程序来说,应在KDE的控制中心里打开字体面板,选择``Anti-alias fonts''。这个选项名词写错了,它实际上就是使用 Xft,而不是打开反锯齿选项,如果它已经在Xft的配置文件中关闭了的话。

(What about Mozilla?)

2.1.4. 难题
如果有些基于Xft的程序没胡注意到你做的这些修改,那可能是因为它们还在使用XFree86 4.2的Xft,只需让它们使用当前版本的Xft即可。大多数情况下,只要安装Xft和Fontconfig库就可以了。
如果不能升级共享库,可以查阅XFree86 4.2的Xft(3)手册页,以确定其配置机制。

2.2. 配置核心字体系统
安装核心字体系统的字体分两步。第1步,必须创建一个目录,其中放有字体文件和索引文件。第2步是把这个目录放到字体路径中,以便让X服务器知道它的存在。

2.2.1. 安装bitmap字体
XFree86可以使用bitmap字体,包括跨平台的BDF字体和更有效率的二进制PCF字体。(还支持较老的SNF字体)
bitmap字体通常都用BDF格式发布,但在安装之前,可以把它转为PCF格式,可用命令`bdftopcf':

$ bdftopcf courier12.bdf

然后对它进行压缩:

$ gzip courier12.pcf

转换之后,把这些字体拷贝到任意目录下,如`/usr/local/share/fonts/bitmap/',然后运行 `mkfontdir'命令来生成索引文件`fonts.dir'(可查看mkfontdir(1) manual page)

$ mkdir /usr/local/share/fonts/bitmap/
$ cp *.pcf.gz /usr/local/share/fonts/bitmap/
$ mkfontdir /usr/local/share/fonts/bitmap/

然后的工作就是告诉X服务器有个新的字体目录;可参考下面的字体路径设置部分。

2.2.2. 安装可变形字体
XFree86支持4种格式的可变形字体:Type 1, Speedo, TrueType 和 CIDFont。本部分只讨论前3种。最后一种放在后面讨论。
安装可变形字体同安装bigmap字体一样:创建一个目录,并运行`mkfontdir'来生成索引文件`fonts.dir'。
但也有一处不同:`mkfontdir'不能自动认出这是可变形字体。因此,必须先建立一个名为`fonts.scale'的文件,使用如下命令:

$ mkfontscale /usr/local/share/fonts/Type1/
$ mkfontdir /usr/local/share/fonts/Type1/

在某些情况下,可能要对生成的`fonts.scale'文件进行修改;为此可参考mkfontdir(1) 和 mkfontscale(1) manual page,也可参考本文档后面的核心字体部分及国际化部分。

2.2.3. 安装 CID-keyed 字体
这种字体是Adobe公司为大字符集语言设计的,其中包含了一象形文字,由字符ID(CID)进行索引。
为使这种文字有意义,Adobe提供了一套CMap文件,从CIDFont文件中产生的PS字体名词由CIDFont和CMap共同组成,中间用两个短横线相连,举例来说,由CIDFont`Munhwa-Regular'生成,使用CMap`UniKS-UCS2-H'的字体就叫做:

Munhwa-Regular--UniKS-UCS2-H

在XFree86中使用这种字体要求一个严格的目录结构,主目录必须是CID(缺省在`/usr/X11R6/lib/X11/fonts/CID'),但也可以放在任何地方,下面应该为每一个CID集合建立一个子目录,下面有三个子目录,分别是CIDFont,CMap和AFM(the font metric files)、CFM(初始情况下是空的)。如下所示:

CID/Adobe-Korea1/CIDFont/Munhwa-Regular
CID/Adobe-Korea1/CMap/UniKS-UCS2-H
CID/Adobe-Korea1/AFM/Munhwa-Regular.afm
CID/Adobe-Korea1/CFM/
CID/fonts.dir
CID/fonts.scale

在生成这个目录并拷贝了文件之后,应该再创建一个`tt/fonts.scale/'文件,这个文件的格式同其他可变形字体一样,但第一列含有PS字体名,还带有.cid的后缀。

Adobe-Korea1/Munhwa-Regular--UniKS-UCS2-H.cid \
-adobe-munhwa-medium-r-normal--0-0-0-0-p-0-iso10646-1

(上述文字是一行)。然后运行 `mkfontdir' 生成 `fonts.dir'文件:

$ cd /usr/local/share/fonts/CID
$ mkfontdir

然后在CFM目录中运行 `mkcfm':

$ mkcfm /usr/local/share/fonts/CID

如果没有CFM文件,服务器也能使用CID字体,但查询起来时间会有点长。如果有变化,就得再运行一次这个命令。

2.2.4. 设置服务器字体路径
让服务器知道新的字体目录存在的方法就是把它放到字体路径中。
字体路径是有顺序的。如果客户端请求的字体有多个选择,把就用碰上的第一个。在寻找字体时,服务器会进行两次查询,第1次要求准确配合,第2次则寻找可变形的字体。
所以,最好把可变形字体放到bitmap字体的前面。这样,在有这个字体的情况下,服务器会合作bitmap,但如果有可变形字体可用也会忽略掉bitmap字体。(仍然可以使用`:unscaled',但在4.0及以后版本中已经不必须)
可以通过以下命令显示已经有的字体路径:

$ xset q

2.2.4.1. 临时修改字体路径
`xset'命令也可用于修改当前的字体路径。设置命令为xset fp,加入新路径是 xset +fp,加到最后则是xset fp+,如:

$ xset +fp /usr/local/fonts/Type1
$ xset fp+ /usr/local/fonts/bitmap

反过来,从前面删除一个用`xset -fp',从后面删除一个用`xset fp-',设为缺省值是`xset fp default'。其他信息,可查询 xset(1) manual page。

2.2.4.2. 字体路径的永久改变
缺省的字体路径(刚启动或使用`xset fp default'之后)在文件`XF86Config' 中设置。在Files一节中用FontPath设置,要注意顺序。

FontPath "/usr/local/fonts/Type1"
...
FontPath "/usr/local/fonts/bitmap"

如有疑问,可参考 XF86Config(5) manual page。

2.2.5. 难题
如果发现有哪种安装好的字体不能使用,第1件事就是检查`fonts.dir'文件是否正确,以及它是否能被X server读(通常是root权限,但要注意NFS安装的目录)。如果不是这个问题,那就是这个字体可能不被服务器支持了。
XFree86 支持 BDF, PCF, SNF, Type 1, Speedo, TrueType, OpenType 及 CIDFont 等字体,但并非所有的XFree86都配备了这些后端,并进行了配置。
在大多数平台上,XFree86是模块化的:字体后端也是模块,在运行时可以载入。装入模块在`XF86Config'文件中用“Load”进行设置(注意大小写敏感):

Load "type1"

如果还是有安装问题,可以看一下X server的log文件,看模块是否被正确载入了。模块如下:
"bitmap": bitmap fonts (`*.bdf', `*.pcf' and `*.snf');
"freetype": TrueType fonts (`*.ttf' and `*.ttc'), OpenType fonts (`*.otf' and `*.otc') and Type 1 fonts (`*.pfa' and `*.pfb');
"type1": alternate Type 1 backend (`*.pfa' and `*.pfb') and CIDFont backend;
"xtt": alternate TrueType backend (`*.ttf' and `*.ttc');
"speedo": Bitstream Speedo fonts (`*.spd').

3. XFree86中包含的字体
3.1. 标准 bitmap 字体
X11的标准(样本实现,SI)带有大量的bitmap字体,包括fixed族,Courier、Times、Helvetica及Lucida族的bitmap版,它们都以ISO 8859-1(ISO Latin Western-European)编码。
In XFree86, a number of these fonts are provided in Unicode-encoded font files instead. At build time, these fonts are split into font files encoded according to legacy encodings, a process which allows us to provide the standard fonts in a number of regional encodings with no duplication of work.
在XFree86中,这些字体中不少以Unicode编码,在创建时,这些字体可以被分成其他编码的字体文件,这样就让我们得以使用一些 地区编码的 标准字体,而不用再去做重复性的工作。如字体文件

/usr/X11R6/lib/X11/fonts/misc/6x13.bdf
with XLFD
-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1

是一个Unicode编辑的标准fixed字体,它可以支持 Latin, Greek, Cyrillic, Georgian, Armenian, IPA 以及其他符号。它里面的字形数量超过2800,涵盖了 ISO 8859 parts 1-5, 7-10, 13-15 编码形式,还包含所有的欧洲 IBM、Microsoft 代码页,甚至还有 KOI8,WGL4 以及其他多种字符集的支持。
这个字体在创建时会生成多种字体文件:
6x13-ISO8859-1.bdf
6x13-ISO8859-2.bdf
...
6x13-ISO8859-15.bdf
6x13-KOI8-R.bdf

他们各自都有 XLFDs :
-misc-fixed-medium-r-normal--13-120-75-75-c-60-iso8859-1
...
-misc-fixed-medium-r-normal--13-120-75-75-c-60-iso8859-15
-misc-fixed-medium-r-normal--13-120-75-75-c-60-koi8-r

fixed这个名字是下述名字的简写:
-misc-fixed-medium-r-normal--13-120-75-75-c-60-iso8859-1

3.2. ClearlyU Unicode 字体族
ClearlyU族提供12pt、100dpi的比例字体,包含Unicode所需的众多字形,总数约有7500个。

主 ClearlyU 字体使用如下的 XLFD :

-mutt-clearlyu-medium-r-normal--17-120-100-100-p-101-iso10646-1

它存在于以下字体文件中:
/usr/X11R6/lib/X11/fonts/misc/cu12.pcf.gz

其他的 ClearlyU 字体包括:
-mutt-clearlyu alternate glyphs-medium-r-normal--17-120-100-100-p-91-iso10646-1
-mutt-clearlyu pua-medium-r-normal--17-120-100-100-p-111-iso10646-1
-mutt-clearlyu arabic extra-medium-r-normal--17-120-100-100-p-103-fontspecific-0
-mutt-clearlyu ligature-medium-r-normal--17-120-100-100-p-141-fontspecific-0

Alternate Glyphs字体包含有额外的为某些语言所用的字型。很快就会有第2种这种字体出来,专为那些经常使用这种字型的地区设计(the Urdu heh,乌尔都?)

PUA字体中包含有特殊的字形信息,以用于某些描绘方式。

Arabic Extra字体为那些不含有所有字形的ISO 10646编码字符提供字形,其排序也大体上根据ISO 10646来。

Ligature字体包括有各种手写体,在增强的文本演示时比较有用。

3.3. 标准可变形字体
XFree86 包含了所有在X11R6中的可变形字体。

3.3.1. 标准 Type 1 字体
IBM Courier 字体包含了 ISO 8859-1 和 ISO 8859-2 编码,同时也有 Adobe Standard Encoding,其 XLFD 如下:

-adobe-courier-medium-*-*--0-0-0-0-m-0-*-*

字体文件是:

/usr/X11R6/lib/X11/fonts/Type1/cour*.pfa

Adobe Utopia 字体仅含有 ISO 8859-1 和 Adobe Standard Encoding,其 XLFD 如下:

-adobe-utopia-*-*-normal--0-0-0-0-p-0-iso8859-1

字体文件是:

/usr/X11R6/lib/X11/fonts/Type1/UT*.pfa

最后,XFree86 还包含有 Bitstream Courier 和 Charter 的 Type 1 版本,其字 XLFD 如下:

-bitstream-courier-*-*-normal--0-0-0-0-m-0-iso8859-1
-bitstream-charter-*-*-normal--0-0-0-0-p-0-iso8859-1

字体文件是:

/usr/X11R6/lib/X11/fonts/Type1/c*bt_.pfb


3.3.2. 标准 Speedo 字体
XFree86 包含 Bitstream Courier 和 Charter 字体的Speedo 版本,要想使用这种字体,必须载入`Speedo' 字体后端。

这些字体都是 ISO 8859-1 编码,差不多全部含有 ISO 8859-2,其 XLFD 如下:

-bitstream-courier-*-*-normal--0-0-0-0-m-0-*-*
-bitstream-charter-*-*-normal--0-0-0-0-p-0-*-*

字体文件是:

/usr/X11R6/lib/X11/fonts/Speedo/font*.spd

3.4. Bigelow & Holmes Luxi字体族
XFree86 包含 Luxi 族的可变形字体,TrueType 和 Type 1 格式都有,包含有 Luxi Serif, XLFD 如下:

-b&h-luxi serif-medium-*-normal--*-*-*-*-p-*-*-*

Luxi Sans:
-b&h-luxi sans-medium-*-normal--*-*-*-*-p-*-*-*

以及 Luxi Mono:
-b&h-luxi mono-medium-*-normal--*-*-*-*-m-*-*-*

这些字体都含有罗马、斜体、粗体、粗斜体的变化。TrueType版的字型包含基本ASCII Unicode区,Latin 1区及扩展Latin 1区,还有一些附加的标点符号。通常这些字体都含有ISO 8859的1、2、3、4、9、13和15,还有Adobe Standard encoding和Windows 3.1 字符集。
Type 1版的字形要略少一些,一般只有ISO 8859 1/2/15和Adobe Standard encoding。
以下省略一些关于Luxi字体的说明。

4. 关于核心字体的补充说明
这一部分对XFree86专用的X11核心字体系统增强功能进行说明。

4.1. 核心字体和国际化
可变形字体后端(Type 1, Speedo and TrueType)可自动对字体进行重新编码,只要在`fonts.dir'中对其 XLFD 进行了说明。如Type 1 Courier的说明如下:

cour.pfa -adobe-courier-medium-r-normal--0-0-0-0-m-0-iso8859-1
cour.pfa -adobe-courier-medium-r-normal--0-0-0-0-m-0-iso8859-2

解释时就会自动分出 ISO 8859-1 and ISO 8859-2 两种编码。

4.1.1. fontenc(字体编码) 层
有3种可变形后端(Type 1, Speedo, FreeType)使用一个通用的字体编码层进行字体的重新编码,所以就能共享编码数据,并可对字体的新locale进行简单的配置。
请注意:X-TrueType (X-TT)后端不使用“字体编码”层,而使用它自己定义的一种方法来进行编码工作。如果你只对X-TT有兴趣,你可以跳过Using Symbol Fonts,而让中间的信息不作用于X-TT。
在fontenc层中,编码都定义了一个名字(如iso8859-1),一般是一个数字和映射集号。映射定义了这种编码可被映射到fontenc所知道的某个编码的方法。现在这种映射有Unicode、Adobe字型名和任意的TrueType映射。

有一些编码已经被固定在fontenc中,总是可以使用的,而它们也不能轻易改动:

iso10646-1: Unicode;
iso8859-1: ISO Latin-1 (Western Europe);
iso8859-2: ISO Latin-2 (Eastern Europe);
iso8859-3: ISO Latin-3 (Southern Europe);
iso8859-4: ISO Latin-4 (Northern Europe);
iso8859-5: ISO Cyrillic;
iso8859-6: ISO Arabic;
iso8859-7: ISO Greek;
iso8859-8: ISO Hebrew;
iso8859-9: ISO Latin-5 (Turkish);
iso8859-10: ISO Latin-6 (Nordic);
iso8859-15: ISO Latin-9, or Latin-0 (Revised Western-European);
koi8-r: KOI8 Russian;
koi8-u: KOI8 Ukrainian (see RFC 2319);
koi8-ru: KOI8 Russian/Ukrainian;
koi8-uni: KOI8 ``Unified'' (Russian, Ukrainian, and Byelorussian);
koi8-e: KOI8 ``European,'' ISO-IR-111, or ECMA-Cyrillic;
microsoft-symbol and apple-roman: 只在TrueType字体中有用。

定义编码文件就可以把编码加入进去。如果有哪种字体编码是 fontenc 层不知道的,后端就会检查字体文件所在的目录(不一定非要是fonts.dir所在的目录!),寻找一个 `encodings.dir' 文件。如果找到了,就扫描它寻找编码,找到后读入。`mkfontdir' 命令如果加上`-e'的选项,后面接上包含有编码文件的目录名,就能自动生成`encodings.dir'文件。可参考mkfontdir(1) manual page。

常用的一些编码文件都可在XFree86中找到。也可以自己写编码文件。不详述。

4.1.2. 针对各种后端的 fontenc 注意事项
4.1.2.1. FreeType
对TrueType 和 OpenType 字体,FreeType会依次扫描映射,有PS的映射会被忽略,如果是TrueType或Unicode的就会继续扫描它的cmap,最后使用找到的第1个可用的。

省略关于Type1字体的说明。

如果不能找到一个可用的映射,FreeType会使用ISO 8859-1。

4.1.2.2. Type 1
4.1.2.3. Speedo

4.1.3. 编码目录文件格式
要想使用一种编码不被后端识别的字体,就需要在自己的字体目录下或在系统全局目录下(/usr/X11R6/lib/X11/fonts/encodings/)有一个`encodings.dir'文件。
这个文件同 `fonts.dir'的格式差不多。第1行也是声明共有多少个编码,其后每1行分成两列,名字和编码文件,可用相对目录,也可以用绝对目录。名字和文件中定义的名字要符合。如:

3
mulearabic-0 /usr/X11R6/lib/X11/fonts/encodings/mulearabic-0.enc
mulearabic-1 /usr/X11R6/lib/X11/fonts/encodings/mulearabic-1.enc
mulearabic-2 /usr/X11R6/lib/X11/fonts/encodings/mulearabic-2.enc

编码的名字必须在文件的`STARTENCODING' 或 `ALIAS'行中进行说明。

如果平台支持,编码文件可以压缩(compress or gzip)。

`encoding.dir'可以用`mkfontdir'命令进行维护,可以参考mkfontdir(1)手册页。

4.1.4. 编码文件格式
编码文件本身是自由格式的。多个空格还是一个,关键词大小写不敏感,但在字型的名字上,大小写还是很重要的。
数字可用十进制、16进制或8进制。
'#'开头的行是注释行,它可以出现在一行的任意地方,其后的字符会全部被忽略。
开头是名字或别名:

STARTENCODING mulearabic-0
ALIAS arabic-0

这个名字应适用于XLFD字体名,只能有一个'-'。
这个文件中可以声明编码的数量。

Unicode (ISO 10646):
STARTMAPPING unicode

a given TrueType ``cmap'':
STARTMAPPING cmap 3 1

PostScript glyph names:
STARTMAPPING postscript

文件中每一行都说明了从一种编码到另一种的映射关系。

0x21 0x0660
0x22 0x0661
...
简化的也可以一行说明一个区。

最后是:

ENDMAPPING

映射完后是:

ENDENCODING

如果用了没有定义的关键词,这一行会被忽略。

4.1.5. 符号字体

4.1.6. 关于使用不良编码的字体的提示

4.1.6.3. 定义别名

有些字体像 `adobe-fontspecific', `microsoft-win3.1' 等,其名称不合规范,要想用它们,就必须给他们一个合适的名字。
这可以写在 `fonts.alias' 文件中,这个文件的格式很简单,每一行写一个别名到字体名的映射即可。如:

"-ogonki-alamakota-medium-r-normal--0-0-0-0-p-0-iso8859-2" \
"-ogonki-alamakota-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific"

其准确语法可参考 mkfontdir(1) manual page。

4.2. 可变形核心字体的附加说明
FreeTyep后端(即freetype模块,以前也叫xfsft)可以处理TrueType和Type 1字体,这让它和X-TT和Type 1后端有冲突。
如果同时使用FreeType和Type 1后端,FreeType就会被用于处理Type 1字体。如果FreeType和X-TT同时使用,X-TT会被用于TrueType字体。

4.2.1. 字型描绘延迟
FreeType和X-TT在第一次使用某个字型时都会有一点延迟。因此,他们只能提供一个大致的字体“平均宽度”。
两种后端都支持character-cell字体的优化(几何上相同的字型,或终端字型),其特征是在 XLFD 中有一个 c 。如:

-misc-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1990-0

这种字体在描绘时就不用去计算尺寸,而相信它是一个character-cell字体,如觉得有用时可以使用。但需要注意的是并非所有的等宽字体都是这种字体。

4.2.2. 关于 FreeType 后端
FreeType目前基于FreeType 库的第2版,支持 fontenc 形式的国际化。支持TTF/TTC/OTF/OTC等多种字体。
为了读取TTC文件中的一个字体,必须在 fonts.dir 文件中声明它的号码,如:

:2:mincho.ttc -misc-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1990-0

指的就是这个TTC文件中的第2个字体。

4.2.3. 有关X-TT
`X-TrueType'基于FreeType 库的第 1 版,它不使用fontenc层来管理字体编码,它有自己的方法。
XTT扩展了`fonts.dir'的语法,加入了几个选项,主要是 TTCap :

ption=value:

在文件名前面声明。

最有用的TTCap是声明TTC文件中字体号的,即 fn :

:fn=2:mincho.ttc -misc-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1990-0

其他信息,可参考XTT的网站:http://x-tt.dsl.gr.jp/(好像连不上)

5. 附录:背景及术语
5.1. 字符和字型
击键和显示/打印出来的字型是不同的,有时候一对一,有时候不是,可能会有连字,如阿拉伯字。
从击键到字型有两步,先是从击键到字符,再从字符到字型。字符就是存储在计算机里的文件中的东西,关于它也有许多标准。
在代码和字符之间有一个映射关系,计算机必须知道哪个代码是哪个字符,如 US-ASCII, ISO 8859-1, KOI8-R, and JIS X 0208(1990)等都是编码。
字符集通常是8位编码,更早的有6位的。对象形文字来说,一般得用16位来编码。

5.2. 字体文件,字体和XLFD
传统上,印刷工叫它们字形和铅板。字形就是某种专门设计的字体,如 Times Italic 。而铅板就是一个用融化的铅铸出来的给定尺寸字形块。
数字字体存在字体文件里,其中存储着生成某种字形线条的信息。使用它的程序可以任意顺序读取其中的字形信息。
字体中还可以包含 位图 数据,这就是bitmap字体。它还可以包含数学描述,这就是可变形字体,常见的有Type 1(有时也叫ATM字体或PS字体)、TrueType和Speedo。
字形信息又必须有一种索引方法,Type1里一般是字形的名字,而TrueType里一般是一种特定的索引机制,比如Unicode。
X11核心字体系统使用字体文件中的数据来生成字体实例,它就是一系列特定尺寸字形的集合,并用一种给定的编码进行索引。
X11核心字体实例通常用一种XLFD来指定,即 X逻辑字体描述(X Logical Font Description),它以一个'-'开头,共有14个由'-'分开的区域,如:

-adobe-courier-medium-r-normal--12-120-75-75-m-70-iso8859-1

最后的 `iso8859-1'表明了这个字体的编码。

可变字体的XLFD中用0来代替一些区域(因为它们大小是不定的):

-adobe-courier-medium-r-normal--0-0-0-0-m-0-iso8859-1

这些字体也可以用短的名字来称呼,它就是一个名字,没有结构。有两个名字是一定要有的,如果它们打不开,X server就不能启动,一个叫 fixed ,是一个后备字体,如果指定字体打不开,就用它来代替。另一个叫 cursor ,实际上是鼠标指针的形状。

短名字一般是XLFD的别名,标准的 `fixed' 和 `cursor' 定义在:

/usr/X11R6/lib/X11/font/misc/fonts.alias

文件中。

5.3. Unicode
Unicode (http://www.unicode.org)是一个巨大的字符集,它定义现有及历史上的所有字符。它是开放的,也就是说任何时候都可以加入新的编码点(加入后不得改变)。因此,Unicode现在显得比较零散,通常只有一个个的子集。
Unicode同ISO 10646是并行的,其分配也经常是等同的,可以同时或交互使用这两个名字。
在X11核心字体中,Unicode编码的字体应该在XLFD的最后加上 `iso10646-1' 。

6. 参考
fontconfig(3) man page
mkfontdir(1) man page
及X(7), Xserver(1), xset(1), Xft(3), xlsfonts(1) and showfont(1) man page

XFree86当前文档:http://www.xfree86.org/current
comp.fonts FAQ:http://www.netmeg.net/faq/computers/fonts/
fontconfig: http://www.fontconfig.org/
xfsft: http://www.dcs.ed.ac.uk/home/jec/programs/xfsft/ , http://www.joerg-pommnitz.de/TrueType/xfsft.html
作者:http://www.pps.jussieu.fr/~jch/software/
X-TT:http://x-tt.dsl.gr.jp/
CIDfonts:ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
Unicode:http://www.unicode.org/
UTF-8 FAQ:http://www.cl.cam.ac.uk/~mgk25/unicode.html

IANA RFC 373
 楼主| 发表于 2003-12-9 14:05:03 | 显示全部楼层

Fontconfig用户手册

Fontconfig用户手册
  贴出者为 connermo  

原文:http://www.fontconfig.org/fontconfig-user.html
作者:Keith Packard , HP Cambridge Research Lab
翻译:Conner Mo   (connermo@hotmail.com)  中国Linux公社 (www.linuxfans.org )

Fonts-conf

名称

fonts.conf - 字体配置文件


文件纲要

/etc/fonts/fonts.conf
/etc/fonts/fonts.dtd
~/.fonts.conf


描述

fontconfig 是提供系统范围内字体设置,定制和允许应用程序访问的函数库。

功能概述

fontconfig 包含两个基本的模块,即读取XML文件并建立内部配置的配置模块和接受请求的字体样板并返回最接近所需字体的匹配模块。

字体设置
fontconfig的配置模块由FcConfig 数据类型,libexpat和FcConfigParse 组成。它扫描一个XML树并将其中的数据处理成一个配置文件。从外部来看,函数库的配置就是生成一个有效的XML树并将其填充到FcConfigParse里。应用程序改变运行中的函数库配置的唯一途径就是添加字体和目录到用户的字体文件列表中。

这样做的目的就是让字体的配置变得相对静态,并且可以尽可能多地让其他应用程序共享。这种做法预计可以在应用程序相互传递字体名称的时候获得相对稳定的字体选择。XML被选为配置文件的标准格式是因为它是一个既便于外部程序编辑又可以保留正确结构和语法的格式。

字体的配置和字体的是分开的。需要采取自身特定匹配方式的应用程序可以从库中访问已有的字体并执行独立的匹配操作。这样做是为了让应用程序可以从字体库中挑选并选定合适的库功能,而不是强迫他们选择这个库或者私有的设置机制。这种做法预计可以让所有应用程序的字体配置可以集中在一处。集中的字体配置可以标准化和简化字体安装和定制。

字体属性

虽然字体样板可能包含任意基本属性,但还是有一些众所周知的属性及其附带的类型。Fontconfig利用这些属性来匹配和完成字体配置。其他属性则被用来为应用程序的渲染机制提供方便。

属性
类型
描述

family
String
字体家族名称 (宋体,仿宋体等)

style
String
字体风格,包括粗度(weight)和倾斜度(slant)。

slant
Int
倾斜度,分为Italic(斜体), oblique(倾斜罗马体)或者roman(罗马体)

weight
Int
Light (微粗),medium(稍粗),demibold(略粗),bold(粗)或者black(黑体)

size
Double
尺寸大小

aspect
Double
在微调(hinting)前水平拉伸字体

pixelsize
Double
像素大小

spacing
Int
间距,Proportial (可变),monospace (等宽) 或者charcell (字符单元)

foundry
String
字体厂商名称

antialias
Bool
字体渲染是否采用抗锯齿功能

hinting
Bool
渲染引擎是否采用微调

verticallayout
Bool
采用竖直排版

autohint
Bool
采用自动微调代替普通微调

globaladvance
Bool
使用字体全局间距数据

file
String
存储字体的文件名称

index
Int
字体文件内的字体索引

ftface
FT_Face
使用指定的Freetype格式对象

rasterizer
String
正在使用的渲染引擎

outline
Bool
字型是否中空

scalable
Bool
字型是否可以放缩

scale
Double
尺寸->像素的放缩比例

dpi
Double
目标点数/英寸

rgba
Int
unkonw, rgb, brg, vrgb, vbgr, none -子像素的几何排列

minspace
Bool
是否采用最小行间距

charset
CharSet
字体的编码

lang
String
字体支持的RFC-3066-style 语言列表。



字体匹配

Fontconfig用计算输入的字体样板和现有系统中字体的距离来实现字体匹配。最接近的字体将被选择。这样可以保证任何时候都能够返回一个字体,但不能保证它和所需要的样板类似。

字体的匹配是从应用程序所创建的样板开始的。请求字体的所有属性会被搜集到一个样板里。每个属性可以包含一个或多个值。它们按照优先等级排列。匹配列表前的被认为是比符和列表后的更加接近所需属性。

最初的字体样板会按照配置文件中的编辑指令按顺序修改。每个修改的过程包括匹配和其它一系列的编辑操作,并且每个匹配的过程都会执行相应的编辑操作。

当字体样板编辑修改完后,将会执行一系列默认的替换操作,从而标准化已有的一套属性。这样可以避免较低层程序在渲染的时候为不同的字体属性提供一成不变的默认值。

标准化后的字体样板最后将和系统所有拥有的字体进行匹配。样板和字体的距离是用它的每个属性,厂商,编码,家族,语言,间距,像素大小,风格,斜度,粗度,防锯齿,渲染引擎和中空测量出来的。这个列表是按照优先级排序的,排在前面的元素比后面的元素占的比重大。

这个规则中有一个特殊的例子:家族的名称分成两个部分,strong(强)和weak (弱)。强家族名称在匹配中比语言元素优先级要高,而弱家族名称在匹配中比语言元素的优先级别要低。这样允许在文档指定字体都不存在的时候,文档的语言属性可以指导字体的选择。

代表所属字体的样板会包含所有在那个样板找到的属性,而不只是在字体中找到的。这允许应用程序通过匹配系统传送渲染指令和其它数据。最后,在配置文件中找到字体的编辑指令列表将被应用到样板。修改过的样板会返回给应用程序。

返回的值包括充足的字体定位和渲染信息,包括文件名,像素大小和其他渲染数据。因为没有任何包含的信息属于Freetype库,引用程序可以自由选择渲染引擎,甚至直接获取和访问字体文件。

在编辑文件中,匹配和编辑的序列是按照两步执行的,因为需要有两个不同操作。第一步是修改如何选取字体,为字体家族取别名和添加合适的默认值。第二步是修改如何渲染已选择的字体。这些步骤必须应用在已选择的字体上,而不是原有的字体样板,因为经常会发生错误的匹配。

字体名称

Fontconfig 为样板提供一个可以让函数库接受和产生的文本表达。表达有三个部分,第一个是字体家族名称列表,第二个是尺寸大小列表,最后是附加属性列表:

<families>-<point sizes>:<name1>=<values1>:<name2>=<values2>...
<家族名称>-<尺寸大小>:<名称1>=<赋值1>:<名称2>=<赋值2>...

在列表中的赋值用逗号分开。名称不需要包含家族或者尺寸大小,它们可以省略。另外,还有一些字符常量可以同时说明名称和赋值。这里有一些例子:

名称
含义

Times-12
尺寸12的Times Roman

Times-12:bold
尺寸12的Times粗体

Courier:italic
Courier默认尺寸的斜体

Monospace:matrix=1 .1 0 1
用户首选的采用人工斜体的等宽字体



语言标记

每种在数据库中的字体包括一个它所支持的语言列表。这是用比较字体的unicode范围和语言的正词法(orthography)计算出来的。语言使用一个兼容RFC-3066的命名标准并且具有两个部分——ISO693语言标记跟一个连字符,然后是ISO3166国家代码。连字符和国家代码可以省略。

Fontconfig在函数库中有几种语言的正词法。除了重新编译函数库外,还没有其他途径添加新的正词法。Fontconfig现在支持ISO639-1中命名的139种语言的122种,ISO 639-2的141种有双字符编码的语言和另外30种三字符编码的语言。

配置文件的格式

Fontconfig的配置文件的存储格式为XML格式。这种格式可以让延伸的配置工具更加方便的编写并且可以保证他们可以生成语法结构正确的文件。由于XML文件是纯文本文件,专家用户可以用文本编辑器处理它们。

Fontconfig 文件类型定义在延伸的实体“fonts.dtd”中,通常存储在默认的字体设置目录(/etc/fonts)。每个配置文件必须包括下列的结构:

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
    ...
    </fontconfig>

<fontconfig>

这是字体配置顶层的单元,可以按照任意顺序包括dir, cache, include, match和alias单元。

dir
这个单元包含一个会被扫描目录名称,扫描到字体文件将被包括到可用的字体列表中里。

cache
这个单元包含一个为每个用户设置的缓存字体信息的文件名称。如果它以“~”开始的话,代表一个在用户主目录的文件。这个文件是用来保留在为每个目录设置的缓存文件中没有的字体信息的。Fontconfig将会自动处理缓存文件。默认的缓存文件是“~/.fonts.cache-version”,这里version是字体配置文件的版本号。(目前是1)。

include ignore_missing="no"

这个单元包含一个附加的配置文件名称。当XML数据类型被FcConfigParse扫描处理后,这个文件的内容也将会通过传送文件名称到FcConfigLoadAndParse,从而被包括在配置中。如果“ignore_missing”设成“yes”而不是默认的“no”的话,一个丢失的文件将不会引起函数库的警告信息。

config

这个单元提供一个整合附加的配置信息的地方。config可以按照任意顺序包含blank和rescan单元。

blank

字体通常包含“破碎”的字型,它们在编码中存在但在屏幕上却被绘制成空白。我们在blank单元中放置每个预计是空白的unicode字符到int单元中。这些绘制为空白的字符将从字体支持的字符集中忽略。

rescan

rescan单元存放一个表示自动扫描字体配置文件变化间隔时间的int单元。每次间隔过后,Fontconfig都将验证所有的配置文件和目录并且自动重建内部的数据结构。

match target="pattern"

这个单元先存放(可能是空的)test元素列表,然后是一个edit元素列表(也可能是空的)。匹配检测(test元素)条件的样板将受到edit元素列表的影响。如果“target”设定为“font”而不是默认的“pattern”的话,那么这个单元就将应用到一个匹配后的字体名称,而不是一个需要匹配的字体样板。

test qual="any" name="property" compare="eq"

这个单元包含一个单独的值,用来和样本的属性“property”比较(可以替换property为任意一个上面列出的属性)。“compare”可以是“eq”(等于),“not_eq”(不等于),“less”(小于),“less_eq”(小于等于),“more”(大于),“more_eq”(大于等于)。“qual”可以为默认的“any”,在这种情况下,只要任意一个之字体属性符合比较的值,匹配就成功。如果“qual”为“all”的话,只有当所有的字体属性都符合比较的值的时候,匹配才成功。

edit name="property" mode="assign" binding="weak"

这个单元包括一个表达式单元的列表(任何赋值和操作单元)。表达式单元将在运行的时候被执行并且将修改属性“property”。是否修改依赖于“property”的值是否匹配相应的test单元。如果匹配的话,这个修改将会影响第一个匹配的值。任何插入到属性的值都可以给出绑定(binding)说明。“mode”可以是以下列表其中的一个:

Mode
有匹配条件
没有匹配条件

"assign"
替换匹配的值
替换所有值

"assign_replace"
替换所有值
替换所有值

"prepend"
在匹配前插入
在列表头部插入

"prepend_first"
在列表头部插入
在列表头部插入

"append"
在匹配后添加
在列表底部添加

"append_last"
在列表底部添加 在列表底部添加


int, double, string, bool

这些单元保存单独一个声明的类型。bool 单元保存true或者false。在赋浮点数的时候有一个重要的限制——fontconfig要求尾数必须以一个数字开始,而不是一个小数点,所以应该碰到纯小数的时候应该插入一个起始的"0"。(例如用0.5而不是.5,-0.5而不是-.5。)

matrix

这个单元保存一个防射变换的四个double元素。

name

保存一个属性名称。从字体属性的第一个值判断出来的,而不是样板的第一个值。

const

保存一个常量的名称。以下这些数值总是整数并且作为一般字体值的字符表达。

常量
属性


light
weight
0

medium
weight 100

demibold
weight
180

bold
weight
200

black
weight
210

roman
slant
0

oblique
slant
110

proportional
spacing 0

mono
spacing
100

charcell
spacing
110

unknow
rgba
0

rgb rgba
1

bgr
rgba
2

vrgb
rgba
3

vbgr
rgba
4

none
rgba
5



or(与), and(或), plus(加), minus(减), times(乘), divide(除)

这些元素在一个表达试列表上执行特定的操作。or和and是布尔操作,不是位操作。

eq(等于), not_eq(不等于), less(小于), less_eq(小于等于), more(大于), more_eq(大于等于)

这些元素比较两个值,产生一个布尔值。

not

对一个表达式的布尔值进行“非”操作。

if

这个单元包含三个表达单元。如果第一个单元为真,则产生第二个单元的值,否则产生第三个单元的值。

alias

Alias (别名)单元为需要替代一个字体家族名称到另一个的一套通用匹配操作提供简化符号。它们包含一个family单元,紧跟着是可选的prefer,accept和default单元。匹配family单元的字体将被编辑,使得prefer家族在匹配family的前面,accept家族在匹配的family后面并且default家族在家族列表的最后。

family

保存一个单独的字体家族名称

prefer, accpet, default  

这些单元保存一个让alias单元使用的字体列表。

配置文件举例


系统配置文件
这是一个系统范围的配置文件例子

<?xml version="1.0"?><!DOCTYPE fontconfig SYSTEM "fonts.dtd"><!-- /etc/fonts/fonts.conf 配置系统自体的文件 --><fontconfig><!--         在以下目录寻找字体--><dir>/usr/X11R6/lib/X11/fonts/truetype</dir><dir>/usr/X11R6/lib/X11/fonts/Type1</dir><!--        接受不受欢迎的'mono'别名,用'monospace'替代它。--><match target="pattern">        <test qual="any" name="family"><string>mono</string></test>        <edit name="family" mode="assign"><string>monospace</string></edit></match><!--        没有使用众所周知别名的名称将用'sans'赋值。--><match target="pattern">        <test qual="all" name="family" mode="not_eq">sans</test>        <test qual="all" name="family" mode="not_eq">serif</test>        <test qual="all" name="family" mode="not_eq">monospace</test>        <edit name="family" mode="append_last"><string>sans</string></edit></match><!--        读入用户配置文件,如果不存在的话不发出警告信息。--><include ignore_missing="yes">~/.fonts.conf</include><!--        创建众所周知的字体名称别名到可用的Truetype字体。        将Type1字体类别替代为Truetype字体类别可以提高屏幕显示质量。--><alias>        <family>Times</family>        <prefer><family>Times New Roman</family></prefer>        <default><family>serif</family></default></alias><alias>        <family>Helvetica</family>        <prefer><family>Verdana</family></prefer>        <default><family>sans</family></default></alias><alias>        <family>Courier</family>        <prefer><family>Courier New</family></prefer>        <default><family>monospace</family></default></alias><!--        为标准名称提供所需的别名。        在用户文件后面进行可以让所有的别名都可以使用所推荐的别名。--><alias>        <family>serif</family>        <prefer><family>Times New Roman</family></prefer></alias><alias>        <family>sans</family>        <prefer><family>Verdana</family></prefer></alias><alias>        <family>monospace</family>        <prefer><family>Andale Mono</family></prefer></alias></fontconfig>   
用户配置文件
这是一个以用户为单位的字体配置文件例子,文件名为 ~/.fonts.conf

<?xml version="1.0"?><!DOCTYPE fontconfig SYSTEM "fonts.dtd"><!-- ~/.fonts.conf 用户的字体配置文件 --><fontconfig><!--        用户字体文件目录--><dir>~/misc/fonts</dir><!--        使用rgb子像素显示顺序来提高字型在液晶显示器上的显示效果。效果会影响渲染,        但不会影响匹配。记得应该总是使用target="font"。--><match target="font">        <edit name="rgba" mode="assign"><const>rgb</const></edit></match></fontconfig>   


文件

fonts.conf        包含了fontconfig函数库的配置信息,其中有用来寻找字体及相关信息的目录名称,还有在尝试匹配现有字体前执行的字体样板编辑指令。它使用的是xml格式。


fonts.dtd         是一个描述配置文件格式的DTD文件。


~/.fonts.conf   是当前用户字体配置的默认位置,实际的位置可以在fonts.conf文件里指定。


~/.fonts.cache-* 是在没有发现字体目录中的缓存文件时,在当前用户目录存储字体信息的文件。这个文件是fontconfig自动维护的。



版本号
Fontconfig version2.2.0
 楼主| 发表于 2003-12-9 14:06:58 | 显示全部楼层

跟我一步一步学汉化(一)

跟我一步一步学汉化(一)
  贴出者为 connermo  

如何使Linux桌面正确显示和输入中文, 一直是令Linux初学者头痛的事情. 目前有很多汉化的文章, 但大多只讲步骤而不谈道理, 让初学者云里来雾里去. 这篇文章将从X的字体原理入手,帮助大家理解X的字体机制,在汉化中学习.

首先, 我们要理解X的字体引擎. X中支持Truetype字体(一种可放缩字体) 的主要有四种引擎. freetype, xtt, xfs和Xft.

其中freetype 和 xtt 是 X 的内部模块. 使用的都是freetype1渲染引擎.

Xfs 和xft 是外部服务程序. xfs 是系统级的字体服务程序, 也可以作为X的内部模块, 使用的是X 内部的freetype2. Xft 和其他类库一样, 只有被调用的时候才被加载. 其中只有xft才有antialias 支持.

这里有必要讲讲freetype. Freetype 是开源字体渲染引擎, 并不只为X设计. 它的功能就是读取Truetype字体信息, 如大小, 分辨率, 编码等, 然后渲染成所需的位图数据输出. Freetype 现在的版本是 2.x, 与1.0 相比, 最大的差别就是加入了抗锯齿功能.

有这么多引擎,到底要用哪个好? 其实我们目前为止, 支持中文最好的还是xtt. 因为小字体的时候, 用函数描述法算出来的中文字体效果不能让人满意, 所以很多中文字体公司就在Truetype字体里嵌入了位图字体. 这些位图字体需要用特殊的方式读出来, 所有的引擎中就只有xtt能做到这一点.

我们下一步就是将字体添加到X中, 使xtt可以正确读取, 这样就可以了.

首先, 由于要配置Linux系统文件, 我们需要用root帐号进入, 相当于windows下的administrator.

X的配置文件是/etc/XF86Config-4 (比较新的显卡) 或者是 XF86Config (比较老的显卡). 用你喜欢的文本编辑器打开, 如 kedit或gedit.

打开后我们发现配置文件分成很多个Section, 我们首先要配置的就是 Section "Files" , 这个部分描述了X所要调用的文件信息.

要加入一个字体目录, 只需在里面插入一行 FontPath "目录名" 就可以了, 如:

Section "Files"
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Mandrake 6.0 and later now use a font server independent of
# the X server to render fonts.
FontPath "unix/:-1"
FontPath "/truetype" # 插入一个字体目录
EndSection

然后, 我们让X加载xtt字体引擎:

找到Section "Module", 像这样修改:

Section "Module"
# Load "dbe" # Double-Buffering Extension
# Load "v4l" # Video for Linux
Load "extmod"
Load "glx
# Load "type1" # type1 模组是渲染type1字体的, 和xtt冲突, 必需屏蔽
# Load "freetype" # freetype 模组是渲染Truetype字体的, 和xtt冲突, 必需屏蔽
Load "xtt" # 加入xtt模组引擎
EndSection

好了, 现在xtt会自动去 /truetype 里找字体.

现在开始拷贝字体到 /truetype里去, 先要在根目录建一个truetype目录, 打

mkdir /truetype

就可以了.

从windows分区拷贝要先mount, 就是作一个联接, 将Linux目录连到windows分区. 在根目录下建一个"c"目录.

mkdir /c

然后

mount /dev/hda1 /c

这样就将windows下的C盘 联接到我们Linux下的/c目录了, 进入/c, 应该可以看到你C盘的文件.

然后, 进入/c 中的字体文件目录, 一般在window下面的Fonts里, 注意目录名大小写在Linux下面是有区别的.

拷贝字体文件到 /truetype里, 打

cp simsun.ttc /truetype/simsun.ttf
cp tahoma* /truetype/

这样就将我们所需要的字体文件拷贝到truetype 里了.

下一步我们要设置字体文件, Linux中X的字体设置很烦锁, 不像windows一拷贝就完事, 初级阶段嘛, 大家还是忍忍吧, 呵呵.

1. 建立字体信息文件fonts.dir

如下

24
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-c-0-gb2312.1980-0
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-c-0-gb2312.1980-0
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-c-0-gb2312.1980-0
tahoma.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-1
ai=0.3:tahoma.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-iso8859-1
tahomabd.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-iso8859-1
ai=0.3:tahomabd.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-iso8859-1
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-gbk-0
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-gbk-0
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-gbk-0
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-gbk-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-fcd8859-15
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-fcd8859-15
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-fcd8859-15
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-fcd8859-15
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-15
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-iso8859-15
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-iso8859-15
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-iso8859-15
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-iso10646-1
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-c-0-iso10646-1
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-c-0-iso10646-1
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-c-0-iso10646-1


第一行的24表示下面一共有24行设置 (好像有点傻) , 其他的格式都差不多:

ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-gbk-0

说明:

simsun.ttf: 字体文件名

ds=[yn]: ds是xtt的功能, 设成"y" 表示粗体, "n" 表示正常.

ai=Real_number: 表示倾斜度. 不设表示自动.

misc : 表示字体的类别

SimSun : 是字体的名称

bold : bold 表示粗体, 其他如medium表示正常,

i : 表示斜体, r 是正常

p: 可变长度, c 是正方形, m是固定宽度

gbk: 字体编码

这里大家发现我们还使用了tahoma英文字体, 这样替换, 系统读取Simsun英文字体的时候, 就会用pp的tahoma替代.

好了, 现在存盘. 然后拷贝一个到fonts.scale

cp fonts.dir fonts.scale

然后拷贝编码文件 encodings.dir 到目录里来.

cp /usr/X11R6/lib/X11/fonts/encodings/encodings.dir /truetype

好, 重起, 把KDE, mozilla, galeon 等等所有默认字体都改成simsun, 哈哈, 是不是比从前漂亮了很多?

大家还是把这几个配置文件备份起来, 以后安装的时候就不用再设置了.

这里顺带说一下其他几个字体引擎的配置:

xfs : 配置文件是 /etc/X11/fs/config
xft : 配置文件是 /etc/X11/Xftconfig

xft 的配置相对来说比较容易, 只要将字体拷到配置文件中dir 指定的任何一个目录就可以了. 如果要小字体不显示AA, 可以在末尾加入:

match
any size > 8
any size < 17
edit
antialias = false;
match
any pixelsize > 8
any pixelsize < 17
edit
antialias = false;

这样 8~17号的字体就不会用抗锯齿功能了.
 楼主| 发表于 2003-12-9 14:11:23 | 显示全部楼层

XFree86的字体(翻译)

XFree86的字体(翻译)
  贴出者为 cathayan  
cathayan写著 '

我是菜鸟。看得也比较快。下面如果有译得不对的地方,不必客气,尽请指出。

看这个东西也是因为总是不明白在 X 里面的字体是怎么回事,想搞搞清楚,总是用别人的汉化/美化方法也不是长久之计。而这个汉化/美化的工作,我认为是Linux在中国走向普通用户,承担起日常工作的最后一个沟坎。在网上找了一下,东西还不少,这个文档是XFree86的,位置是在http://www.xfree86.org/current/f ... free86.org/current/ 是Documentation for XFree86[tm] version 4.3.0)。它说得是比较全面而且权威的。希望能对像我一样的Newbie(我折腾了2年了,还是Newbie)们有所帮助。之所以译出来,也是逼自己看仔细点的一个方法。

注意它是最新的XFree86 4.3.0的文档,和4.2以及更早的版本也许会有不同。

文中有几段感觉没什么用的,也不太懂的,就没译。见谅。

第5部分有些东西可以先看。第6部分有参考资料。

希望Linux能越来越好。

有什么意见或建议,请发邮件至:lpqi@hotmail.com 。
====================================
名称:XFree86的字体
作者:Juliusz Chroboczek, jch@xfree86.org
日期:17 January 2003

译者:lpqi@hotmail.com
日期:28 April 2003
====================================
1.介绍
本文档描述了XFree86对字体的支持。“安装字体”面向想在XFree86中安装字体的用户;其他部分比较详细地描述了对字体的支持。
我们假设你已经对数字字体有相当的了解。如果有什么不清楚的,可以查看附录:本文档最后部分的背景信息。

1.1 两种字体系统
XFree86包含两种字体系统:核心X11字体系统,存在于所有X11实现中;xft字体系统,目前并未在除XFree86以外的X11实现中存在,但将来很有可能加入进去。
核心X11字体系统是从1987年出现的X11R1中继承下来的,它只能使用单色bitmap字体。在经过多年发展之后,它总算加入了可变形字体及旋转象形文字的支持。
Xft最初设计的目的就是为了对可变形字体提供更有效更好的支持。它不像核心字体系统,它支持反锯齿和子像素平滑等特性。可能这一点更重要,它为应用程序提供了对象形文字描绘方法的完整的控制,让排版和所见即所得的显示成为可能。最后,还还允许应用程序使用并未安装在系统中的字体,而是使用文件中嵌入的字体来进行显示。
Xft同核心字体系统不兼容:使用Xft要求对开发工具(用户接口库)进行较多的改变。因此,目前XFree86继续使用核心字体系统,而开发工具的作者们也已经准备尽快转向Xft。

2. 安装字体
这一部分解释了如何对Xft和核心字体系统进行配置以便使用刚安装的字体。

2.1. 配置Xft
Xft自己没有配置机制,而是依赖于fontconfig库来进行配置。这个库并不专用于XFree86,也不限于某种特定的字体显示机制。因此,本部分就是描述fontconfig而不是Xft如何工作的。

2.1.1. 在Xft中安装字体
Fontconfig在一系列常见的目录中寻找字体,包括所有的XFree86标准字体目录(缺省是`/usr/X11R6/lib/X11/lib/fonts/*'),和用户主目录下的`.fonts/'。为Xft安装字体只需将字体文件拷贝到这些目录之一下面。

$ cp lucbr.ttf ~/.fonts/

Fontconfig在下一次寻找时就能发现这些字体,并重建自己的字体列表。如果想在命令行上激活这个行为(比如想全面升级全系统的Fontconfig信息),可以使用`fc-cache'命令:

$ fc-cache

2.1.2. 微调Xft
Xft的行为由一组配置文件控制:全系统的配置文件是`/etc/fonts/fonts.conf',用户专用的是主目录下的`.fonts.conf'(如果设定了`FONTCONFIG_FILE'全局变量,这个文件可能不起作用。)

Fontconfig文件均由以下样式开头:




并以此行结束:


缺省的Fontconfig文件包括对`~/.fonts/'目录的寻找,这里是放置用户专用字体的地方。如果要加入一个新的字体目录,可用如下语法:

/usr/local/share/fonts/


另外一个有用的选项是关掉某个字体的防锯齿(平滑)功能,语法如下:



Lucida Console


false



也可用下述命令关闭对所有字体的平滑功能:



false



在LCD显示上,Xft支持子像素平滑。一般地,XFree86在使用LCD并用DVI连接到主机的笔记本电脑上会自动打开这一选项。以下命令可用以查证:

$ xdpyinfo -ext RENDER | grep sub-pixel

如果该命令没有印出任何东西,就需要手动配置。语法如下:



rgb



`'...`'之间的rgb用于指定像素元件在屏幕上显示的顺序,这必须和硬件相配:普通的LCD是rgb,backwards LCD使用bgr,顺时针旋转后用vrgb,反向用vbgr。

2.1.3. 配置应用程序
Because most current applications use the core fonts system by default, it is necessary to explicitly configure them to use Xft. How this is done depends on the application.
由于许多应用程序缺省是使用核心字体系统的,所以要使用Xft,就必须进行配置。方法根据程序不同而有所区别。

XTerm使用 `-fa' 的命令行选项就可以使用Xft,也可以通过设定`XTerm*faceName':

XTerm*faceName: Courier

or
$ xterm -fa "Courier"

对GTK+ 2.0(GNOME 2程序)程序来说,把`GDK_USE_XFT'设为 1 即可:

$ export GDK_USE_XFT=1

GTK+ 2.2 缺省即使用 Xft 。

对KDE程序来说,应在KDE的控制中心里打开字体面板,选择``Anti-alias fonts''。这个选项名词写错了,它实际上就是使用 Xft,而不是打开反锯齿选项,如果它已经在Xft的配置文件中关闭了的话。

(What about Mozilla?)

2.1.4. 难题
如果有些基于Xft的程序没胡注意到你做的这些修改,那可能是因为它们还在使用XFree86 4.2的Xft,只需让它们使用当前版本的Xft即可。大多数情况下,只要安装Xft和Fontconfig库就可以了。
如果不能升级共享库,可以查阅XFree86 4.2的Xft(3)手册页,以确定其配置机制。

2.2. 配置核心字体系统
安装核心字体系统的字体分两步。第1步,必须创建一个目录,其中放有字体文件和索引文件。第2步是把这个目录放到字体路径中,以便让X服务器知道它的存在。

2.2.1. 安装bitmap字体
XFree86可以使用bitmap字体,包括跨平台的BDF字体和更有效率的二进制PCF字体。(还支持较老的SNF字体)
bitmap字体通常都用BDF格式发布,但在安装之前,可以把它转为PCF格式,可用命令`bdftopcf':

$ bdftopcf courier12.bdf

然后对它进行压缩:

$ gzip courier12.pcf

转换之后,把这些字体拷贝到任意目录下,如`/usr/local/share/fonts/bitmap/',然后运行 `mkfontdir'命令来生成索引文件`fonts.dir'(可查看mkfontdir(1) manual page)

$ mkdir /usr/local/share/fonts/bitmap/
$ cp *.pcf.gz /usr/local/share/fonts/bitmap/
$ mkfontdir /usr/local/share/fonts/bitmap/

然后的工作就是告诉X服务器有个新的字体目录;可参考下面的字体路径设置部分。

2.2.2. 安装可变形字体
XFree86支持4种格式的可变形字体:Type 1, Speedo, TrueType 和 CIDFont。本部分只讨论前3种。最后一种放在后面讨论。
安装可变形字体同安装bigmap字体一样:创建一个目录,并运行`mkfontdir'来生成索引文件`fonts.dir'。
但也有一处不同:`mkfontdir'不能自动认出这是可变形字体。因此,必须先建立一个名为`fonts.scale'的文件,使用如下命令:

$ mkfontscale /usr/local/share/fonts/Type1/
$ mkfontdir /usr/local/share/fonts/Type1/

在某些情况下,可能要对生成的`fonts.scale'文件进行修改;为此可参考mkfontdir(1) 和 mkfontscale(1) manual page,也可参考本文档后面的核心字体部分及国际化部分。

2.2.3. 安装 CID-keyed 字体
这种字体是Adobe公司为大字符集语言设计的,其中包含了一象形文字,由字符ID(CID)进行索引。
为使这种文字有意义,Adobe提供了一套CMap文件,从CIDFont文件中产生的PS字体名词由CIDFont和CMap共同组成,中间用两个短横线相连,举例来说,由CIDFont`Munhwa-Regular'生成,使用CMap`UniKS-UCS2-H'的字体就叫做:

Munhwa-Regular--UniKS-UCS2-H

在XFree86中使用这种字体要求一个严格的目录结构,主目录必须是CID(缺省在`/usr/X11R6/lib/X11/fonts/CID'),但也可以放在任何地方,下面应该为每一个CID集合建立一个子目录,下面有三个子目录,分别是CIDFont,CMap和AFM(the font metric files)、CFM(初始情况下是空的)。如下所示:

CID/Adobe-Korea1/CIDFont/Munhwa-Regular
CID/Adobe-Korea1/CMap/UniKS-UCS2-H
CID/Adobe-Korea1/AFM/Munhwa-Regular.afm
CID/Adobe-Korea1/CFM/
CID/fonts.dir
CID/fonts.scale

在生成这个目录并拷贝了文件之后,应该再创建一个`tt/fonts.scale/'文件,这个文件的格式同其他可变形字体一样,但第一列含有PS字体名,还带有.cid的后缀。

Adobe-Korea1/Munhwa-Regular--UniKS-UCS2-H.cid
-adobe-munhwa-medium-r-normal--0-0-0-0-p-0-iso10646-1

(上述文字是一行)。然后运行 `mkfontdir' 生成 `fonts.dir'文件:

$ cd /usr/local/share/fonts/CID
$ mkfontdir

然后在CFM目录中运行 `mkcfm':

$ mkcfm /usr/local/share/fonts/CID

如果没有CFM文件,服务器也能使用CID字体,但查询起来时间会有点长。如果有变化,就得再运行一次这个命令。

2.2.4. 设置服务器字体路径
让服务器知道新的字体目录存在的方法就是把它放到字体路径中。
字体路径是有顺序的。如果客户端请求的字体有多个选择,把就用碰上的第一个。在寻找字体时,服务器会进行两次查询,第1次要求准确配合,第2次则寻找可变形的字体。
所以,最好把可变形字体放到bitmap字体的前面。这样,在有这个字体的情况下,服务器会合作bitmap,但如果有可变形字体可用也会忽略掉bitmap字体。(仍然可以使用`:unscaled',但在4.0及以后版本中已经不必须)
可以通过以下命令显示已经有的字体路径:

$ xset q

2.2.4.1. 临时修改字体路径
`xset'命令也可用于修改当前的字体路径。设置命令为xset fp,加入新路径是 xset +fp,加到最后则是xset fp+,如:

$ xset +fp /usr/local/fonts/Type1
$ xset fp+ /usr/local/fonts/bitmap

反过来,从前面删除一个用`xset -fp',从后面删除一个用`xset fp-',设为缺省值是`xset fp default'。其他信息,可查询 xset(1) manual page。

2.2.4.2. 字体路径的永久改变
缺省的字体路径(刚启动或使用`xset fp default'之后)在文件`XF86Config' 中设置。在Files一节中用FontPath设置,要注意顺序。

FontPath "/usr/local/fonts/Type1"
...
FontPath "/usr/local/fonts/bitmap"

如有疑问,可参考 XF86Config(5) manual page。

2.2.5. 难题
如果发现有哪种安装好的字体不能使用,第1件事就是检查`fonts.dir'文件是否正确,以及它是否能被X server读(通常是root权限,但要注意NFS安装的目录)。如果不是这个问题,那就是这个字体可能不被服务器支持了。
XFree86 支持 BDF, PCF, SNF, Type 1, Speedo, TrueType, OpenType 及 CIDFont 等字体,但并非所有的XFree86都配备了这些后端,并进行了配置。
在大多数平台上,XFree86是模块化的:字体后端也是模块,在运行时可以载入。装入模块在`XF86Config'文件中用“Load”进行设置(注意大小写敏感):

Load "type1"

如果还是有安装问题,可以看一下X server的log文件,看模块是否被正确载入了。模块如下:
"bitmap": bitmap fonts (`*.bdf', `*.pcf' and `*.snf');
"freetype": TrueType fonts (`*.ttf' and `*.ttc'), OpenType fonts (`*.otf' and `*.otc') and Type 1 fonts (`*.pfa' and `*.pfb');
"type1": alternate Type 1 backend (`*.pfa' and `*.pfb') and CIDFont backend;
"xtt": alternate TrueType backend (`*.ttf' and `*.ttc');
"speedo": Bitstream Speedo fonts (`*.spd').

3. XFree86中包含的字体
3.1. 标准 bitmap 字体
X11的标准(样本实现,SI)带有大量的bitmap字体,包括fixed族,Courier、Times、Helvetica及Lucida族的bitmap版,它们都以ISO 8859-1(ISO Latin Western-European)编码。
In XFree86, a number of these fonts are provided in Unicode-encoded font files instead. At build time, these fonts are split into font files encoded according to legacy encodings, a process which allows us to provide the standard fonts in a number of regional encodings with no duplication of work.
在XFree86中,这些字体中不少以Unicode编码,在创建时,这些字体可以被分成其他编码的字体文件,这样就让我们得以使用一些 地区编码的 标准字体,而不用再去做重复性的工作。如字体文件

/usr/X11R6/lib/X11/fonts/misc/6x13.bdf
with XLFD
-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1

是一个Unicode编辑的标准fixed字体,它可以支持 Latin, Greek, Cyrillic, Georgian, Armenian, IPA 以及其他符号。它里面的字形数量超过2800,涵盖了 ISO 8859 parts 1-5, 7-10, 13-15 编码形式,还包含所有的欧洲 IBM、Microsoft 代码页,甚至还有 KOI8,WGL4 以及其他多种字符集的支持。
这个字体在创建时会生成多种字体文件:
6x13-ISO8859-1.bdf
6x13-ISO8859-2.bdf
...
6x13-ISO8859-15.bdf
6x13-KOI8-R.bdf

他们各自都有 XLFDs :
-misc-fixed-medium-r-normal--13-120-75-75-c-60-iso8859-1
...
-misc-fixed-medium-r-normal--13-120-75-75-c-60-iso8859-15
-misc-fixed-medium-r-normal--13-120-75-75-c-60-koi8-r

fixed这个名字是下述名字的简写:
-misc-fixed-medium-r-normal--13-120-75-75-c-60-iso8859-1

3.2. ClearlyU Unicode 字体族
ClearlyU族提供12pt、100dpi的比例字体,包含Unicode所需的众多字形,总数约有7500个。

主 ClearlyU 字体使用如下的 XLFD :

-mutt-clearlyu-medium-r-normal--17-120-100-100-p-101-iso10646-1

它存在于以下字体文件中:
/usr/X11R6/lib/X11/fonts/misc/cu12.pcf.gz

其他的 ClearlyU 字体包括:
-mutt-clearlyu alternate glyphs-medium-r-normal--17-120-100-100-p-91-iso10646-1
-mutt-clearlyu pua-medium-r-normal--17-120-100-100-p-111-iso10646-1
-mutt-clearlyu arabic extra-medium-r-normal--17-120-100-100-p-103-fontspecific-0
-mutt-clearlyu ligature-medium-r-normal--17-120-100-100-p-141-fontspecific-0

Alternate Glyphs字体包含有额外的为某些语言所用的字型。很快就会有第2种这种字体出来,专为那些经常使用这种字型的地区设计(the Urdu heh,乌尔都?)

PUA字体中包含有特殊的字形信息,以用于某些描绘方式。

Arabic Extra字体为那些不含有所有字形的ISO 10646编码字符提供字形,其排序也大体上根据ISO 10646来。

Ligature字体包括有各种手写体,在增强的文本演示时比较有用。

3.3. 标准可变形字体
XFree86 包含了所有在X11R6中的可变形字体。

3.3.1. 标准 Type 1 字体
IBM Courier 字体包含了 ISO 8859-1 和 ISO 8859-2 编码,同时也有 Adobe Standard Encoding,其 XLFD 如下:

-adobe-courier-medium-*-*--0-0-0-0-m-0-*-*

字体文件是:

/usr/X11R6/lib/X11/fonts/Type1/cour*.pfa

Adobe Utopia 字体仅含有 ISO 8859-1 和 Adobe Standard Encoding,其 XLFD 如下:

-adobe-utopia-*-*-normal--0-0-0-0-p-0-iso8859-1

字体文件是:

/usr/X11R6/lib/X11/fonts/Type1/UT*.pfa

最后,XFree86 还包含有 Bitstream Courier 和 Charter 的 Type 1 版本,其字 XLFD 如下:

-bitstream-courier-*-*-normal--0-0-0-0-m-0-iso8859-1
-bitstream-charter-*-*-normal--0-0-0-0-p-0-iso8859-1

字体文件是:

/usr/X11R6/lib/X11/fonts/Type1/c*bt_.pfb


3.3.2. 标准 Speedo 字体
XFree86 包含 Bitstream Courier 和 Charter 字体的Speedo 版本,要想使用这种字体,必须载入`Speedo' 字体后端。

这些字体都是 ISO 8859-1 编码,差不多全部含有 ISO 8859-2,其 XLFD 如下:

-bitstream-courier-*-*-normal--0-0-0-0-m-0-*-*
-bitstream-charter-*-*-normal--0-0-0-0-p-0-*-*

字体文件是:

/usr/X11R6/lib/X11/fonts/Speedo/font*.spd

3.4. Bigelow & Holmes Luxi字体族
XFree86 包含 Luxi 族的可变形字体,TrueType 和 Type 1 格式都有,包含有 Luxi Serif, XLFD 如下:

-b&h-luxi serif-medium-*-normal--*-*-*-*-p-*-*-*

Luxi Sans:
-b&h-luxi sans-medium-*-normal--*-*-*-*-p-*-*-*

以及 Luxi Mono:
-b&h-luxi mono-medium-*-normal--*-*-*-*-m-*-*-*

这些字体都含有罗马、斜体、粗体、粗斜体的变化。TrueType版的字型包含基本ASCII Unicode区,Latin 1区及扩展Latin 1区,还有一些附加的标点符号。通常这些字体都含有ISO 8859的1、2、3、4、9、13和15,还有Adobe Standard encoding和Windows 3.1 字符集。
Type 1版的字形要略少一些,一般只有ISO 8859 1/2/15和Adobe Standard encoding。
以下省略一些关于Luxi字体的说明。

4. 关于核心字体的补充说明
这一部分对XFree86专用的X11核心字体系统增强功能进行说明。

4.1. 核心字体和国际化
可变形字体后端(Type 1, Speedo and TrueType)可自动对字体进行重新编码,只要在`fonts.dir'中对其 XLFD 进行了说明。如Type 1 Courier的说明如下:

cour.pfa -adobe-courier-medium-r-normal--0-0-0-0-m-0-iso8859-1
cour.pfa -adobe-courier-medium-r-normal--0-0-0-0-m-0-iso8859-2

解释时就会自动分出 ISO 8859-1 and ISO 8859-2 两种编码。

4.1.1. fontenc(字体编码) 层
有3种可变形后端(Type 1, Speedo, FreeType)使用一个通用的字体编码层进行字体的重新编码,所以就能共享编码数据,并可对字体的新locale进行简单的配置。
请注意:X-TrueType (X-TT)后端不使用“字体编码”层,而使用它自己定义的一种方法来进行编码工作。如果你只对X-TT有兴趣,你可以跳过Using Symbol Fonts,而让中间的信息不作用于X-TT。
在fontenc层中,编码都定义了一个名字(如iso8859-1),一般是一个数字和映射集号。映射定义了这种编码可被映射到fontenc所知道的某个编码的方法。现在这种映射有Unicode、Adobe字型名和任意的TrueType映射。

有一些编码已经被固定在fontenc中,总是可以使用的,而它们也不能轻易改动:

iso10646-1: Unicode;
iso8859-1: ISO Latin-1 (Western Europe);
iso8859-2: ISO Latin-2 (Eastern Europe);
iso8859-3: ISO Latin-3 (Southern Europe);
iso8859-4: ISO Latin-4 (Northern Europe);
iso8859-5: ISO Cyrillic;
iso8859-6: ISO Arabic;
iso8859-7: ISO Greek;
iso8859-8: ISO Hebrew;
iso8859-9: ISO Latin-5 (Turkish);
iso8859-10: ISO Latin-6 (Nordic);
iso8859-15: ISO Latin-9, or Latin-0 (Revised Western-European);
koi8-r: KOI8 Russian;
koi8-u: KOI8 Ukrainian (see RFC 2319);
koi8-ru: KOI8 Russian/Ukrainian;
koi8-uni: KOI8 ``Unified'' (Russian, Ukrainian, and Byelorussian);
koi8-e: KOI8 ``European,'' ISO-IR-111, or ECMA-Cyrillic;
microsoft-symbol and apple-roman: 只在TrueType字体中有用。

定义编码文件就可以把编码加入进去。如果有哪种字体编码是 fontenc 层不知道的,后端就会检查字体文件所在的目录(不一定非要是fonts.dir所在的目录!),寻找一个 `encodings.dir' 文件。如果找到了,就扫描它寻找编码,找到后读入。`mkfontdir' 命令如果加上`-e'的选项,后面接上包含有编码文件的目录名,就能自动生成`encodings.dir'文件。可参考mkfontdir(1) manual page。

常用的一些编码文件都可在XFree86中找到。也可以自己写编码文件。不详述。

4.1.2. 针对各种后端的 fontenc 注意事项
4.1.2.1. FreeType
对TrueType 和 OpenType 字体,FreeType会依次扫描映射,有PS的映射会被忽略,如果是TrueType或Unicode的就会继续扫描它的cmap,最后使用找到的第1个可用的。

省略关于Type1字体的说明。

如果不能找到一个可用的映射,FreeType会使用ISO 8859-1。

4.1.2.2. Type 1
4.1.2.3. Speedo

4.1.3. 编码目录文件格式
要想使用一种编码不被后端识别的字体,就需要在自己的字体目录下或在系统全局目录下(/usr/X11R6/lib/X11/fonts/encodings/)有一个`encodings.dir'文件。
这个文件同 `fonts.dir'的格式差不多。第1行也是声明共有多少个编码,其后每1行分成两列,名字和编码文件,可用相对目录,也可以用绝对目录。名字和文件中定义的名字要符合。如:

3
mulearabic-0 /usr/X11R6/lib/X11/fonts/encodings/mulearabic-0.enc
mulearabic-1 /usr/X11R6/lib/X11/fonts/encodings/mulearabic-1.enc
mulearabic-2 /usr/X11R6/lib/X11/fonts/encodings/mulearabic-2.enc

编码的名字必须在文件的`STARTENCODING' 或 `ALIAS'行中进行说明。

如果平台支持,编码文件可以压缩(compress or gzip)。

`encoding.dir'可以用`mkfontdir'命令进行维护,可以参考mkfontdir(1)手册页。

4.1.4. 编码文件格式
编码文件本身是自由格式的。多个空格还是一个,关键词大小写不敏感,但在字型的名字上,大小写还是很重要的。
数字可用十进制、16进制或8进制。
'#'开头的行是注释行,它可以出现在一行的任意地方,其后的字符会全部被忽略。
开头是名字或别名:

STARTENCODING mulearabic-0
ALIAS arabic-0

这个名字应适用于XLFD字体名,只能有一个'-'。
这个文件中可以声明编码的数量。

Unicode (ISO 10646):
STARTMAPPING unicode

a given TrueType ``cmap'':
STARTMAPPING cmap 3 1

PostScript glyph names:
STARTMAPPING postscript

文件中每一行都说明了从一种编码到另一种的映射关系。

0x21 0x0660
0x22 0x0661
...
简化的也可以一行说明一个区。

最后是:

ENDMAPPING

映射完后是:

ENDENCODING

如果用了没有定义的关键词,这一行会被忽略。

4.1.5. 符号字体

4.1.6. 关于使用不良编码的字体的提示

4.1.6.3. 定义别名

有些字体像 `adobe-fontspecific', `microsoft-win3.1' 等,其名称不合规范,要想用它们,就必须给他们一个合适的名字。
这可以写在 `fonts.alias' 文件中,这个文件的格式很简单,每一行写一个别名到字体名的映射即可。如:

"-ogonki-alamakota-medium-r-normal--0-0-0-0-p-0-iso8859-2"
"-ogonki-alamakota-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific"

其准确语法可参考 mkfontdir(1) manual page。

4.2. 可变形核心字体的附加说明
FreeTyep后端(即freetype模块,以前也叫xfsft)可以处理TrueType和Type 1字体,这让它和X-TT和Type 1后端有冲突。
如果同时使用FreeType和Type 1后端,FreeType就会被用于处理Type 1字体。如果FreeType和X-TT同时使用,X-TT会被用于TrueType字体。

4.2.1. 字型描绘延迟
FreeType和X-TT在第一次使用某个字型时都会有一点延迟。因此,他们只能提供一个大致的字体“平均宽度”。
两种后端都支持character-cell字体的优化(几何上相同的字型,或终端字型),其特征是在 XLFD 中有一个 c 。如:

-misc-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1990-0

这种字体在描绘时就不用去计算尺寸,而相信它是一个character-cell字体,如觉得有用时可以使用。但需要注意的是并非所有的等宽字体都是这种字体。

4.2.2. 关于 FreeType 后端
FreeType目前基于FreeType 库的第2版,支持 fontenc 形式的国际化。支持TTF/TTC/OTF/OTC等多种字体。
为了读取TTC文件中的一个字体,必须在 fonts.dir 文件中声明它的号码,如:

:2:mincho.ttc -misc-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1990-0

指的就是这个TTC文件中的第2个字体。

4.2.3. 有关X-TT
`X-TrueType'基于FreeType 库的第 1 版,它不使用fontenc层来管理字体编码,它有自己的方法。
XTT扩展了`fonts.dir'的语法,加入了几个选项,主要是 TTCap :

ption=value:

在文件名前面声明。

最有用的TTCap是声明TTC文件中字体号的,即 fn :

:fn=2:mincho.ttc -misc-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1990-0

其他信息,可参考XTT的网站:http://x-tt.dsl.gr.jp/(好像连不上)

5. 附录:背景及术语
5.1. 字符和字型
击键和显示/打印出来的字型是不同的,有时候一对一,有时候不是,可能会有连字,如阿拉伯字。
从击键到字型有两步,先是从击键到字符,再从字符到字型。字符就是存储在计算机里的文件中的东西,关于它也有许多标准。
在代码和字符之间有一个映射关系,计算机必须知道哪个代码是哪个字符,如 US-ASCII, ISO 8859-1, KOI8-R, and JIS X 0208(1990)等都是编码。
字符集通常是8位编码,更早的有6位的。对象形文字来说,一般得用16位来编码。

5.2. 字体文件,字体和XLFD
传统上,印刷工叫它们字形和铅板。字形就是某种专门设计的字体,如 Times Italic 。而铅板就是一个用融化的铅铸出来的给定尺寸字形块。
数字字体存在字体文件里,其中存储着生成某种字形线条的信息。使用它的程序可以任意顺序读取其中的字形信息。
字体中还可以包含 位图 数据,这就是bitmap字体。它还可以包含数学描述,这就是可变形字体,常见的有Type 1(有时也叫ATM字体或PS字体)、TrueType和Speedo。
字形信息又必须有一种索引方法,Type1里一般是字形的名字,而TrueType里一般是一种特定的索引机制,比如Unicode。
X11核心字体系统使用字体文件中的数据来生成字体实例,它就是一系列特定尺寸字形的集合,并用一种给定的编码进行索引。
X11核心字体实例通常用一种XLFD来指定,即 X逻辑字体描述(X Logical Font Description),它以一个'-'开头,共有14个由'-'分开的区域,如:

-adobe-courier-medium-r-normal--12-120-75-75-m-70-iso8859-1

最后的 `iso8859-1'表明了这个字体的编码。

可变字体的XLFD中用0来代替一些区域(因为它们大小是不定的):

-adobe-courier-medium-r-normal--0-0-0-0-m-0-iso8859-1

这些字体也可以用短的名字来称呼,它就是一个名字,没有结构。有两个名字是一定要有的,如果它们打不开,X server就不能启动,一个叫 fixed ,是一个后备字体,如果指定字体打不开,就用它来代替。另一个叫 cursor ,实际上是鼠标指针的形状。

短名字一般是XLFD的别名,标准的 `fixed' 和 `cursor' 定义在:

/usr/X11R6/lib/X11/font/misc/fonts.alias

文件中。

5.3. Unicode
Unicode (http://www.unicode.org)是一个巨大的字符集,它定义现有及历史上的所有字符。它是开放的,也就是说任何时候都可以加入新的编码点(加入后不得改变)。因此,Unicode现在显得比较零散,通常只有一个个的子集。
Unicode同ISO 10646是并行的,其分配也经常是等同的,可以同时或交互使用这两个名字。
在X11核心字体中,Unicode编码的字体应该在XLFD的最后加上 `iso10646-1' 。

6. 参考
fontconfig(3) man page
mkfontdir(1) man page
及X(7), Xserver(1), xset(1), Xft(3), xlsfonts(1) and showfont(1) man page

XFree86当前文档:http://www.xfree86.org/current
comp.fonts FAQ:http://www.netmeg.net/faq/computers/fonts/
fontconfig: http://www.fontconfig.org/
xfsft: http://www.dcs.ed.ac.uk/home/jec/programs/xfsft/ , http://www.joerg-pommnitz.de/TrueType/xfsft.html
作者:http://www.pps.jussieu.fr/~jch/software/
X-TT:http://x-tt.dsl.gr.jp/
CIDfonts:ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
Unicode:http://www.unicode.org/
UTF-8 FAQ:http://www.cl.cam.ac.uk/~mgk25/unicode.html

IANA RFC 373'
 楼主| 发表于 2003-12-9 14:13:31 | 显示全部楼层

Xft字体库:体系结构及用户指南

Xft字体库:体系结构及用户指南
  贴出者为 conner  
conner写著 '
摘自linux伊甸园
Keith Packard

XFree86 Core Team, SuSE Inc.

本文由本站会员麦氏赛扬翻译,manux代为发表,原文排版非常漂亮,但是由于html代码问题,发到这里后只能勉强看懂原意,后面评论里面将会添加一个下载连接,感兴趣的朋友可以下载回去浏览。


摘要

X渲染扩展(X Render Extension)提供了一个新的基于客户方字形(glyph)和字体管理的字形渲染体系结构。这个扩展设计在解决了许多相关技术难题的同时,也把光栅化字体、配置字体以及定制字体使用的责任交给了每一个X客户程序。

编写Xft库是为了给X应用程序提供一个能访问FreeType字体光栅化引擎和X渲染扩展的、便于使用的接口,鉴于FreeType没有提供配置和定制字体的功能,Xft也担负了这一任务。Xft提供了新的字体命名约定、复杂而精密的字体匹配和选择机制,并对相关功能进行充分的抽象,从而使得一般应用程序既能够从使用X渲染扩展的文本输出获得益处,又能在不支持这一扩展的X服务器上正常工作。



1 引言

X渲染扩展[Pac01]把访问字体文件和生成字形图像的功能从X服务器移到了X客户一方。采用客户方字形管理的X应用程序在以下几个方面有优势:可以访问字体文件的所有细节,应用程序可以指定特有字体,渐增的光栅化处理(incremental rasterization),并且有可能与其他部件共享字体,例如打印机。此外,鉴于底层的渲染机制基于图像而非字形,字形的光栅化技术、乃至字体文件格式本身都不再依赖于X服务器的能力,所以现在新字体技术的集成速度可以跟得上独立应用程序的开发,而不必遥遥无期地等待新的X服务器增强技术。

当X服务器不再负责管理字体文件的访问和字形生成,就需要一个新的函数库在客户方完成相应的任务。由于X渲染扩展在设计上支持消锯齿(anti-aliased)图形,这个新的函数库需要支持高质量的消锯齿字形光栅化。

FreeType项目[TT00]开发了一个完整的字体光栅化引擎,不仅支持大多数轮廓字体格式,还支持标准的X PCF位图字体,X渲染扩展接收字形图像并使之在屏幕上显现。为了让应用程序能在屏幕上显现高质量的文本,所需要做的就是在FreeType和X渲染扩展之间放置一层薄薄的“粘合”代码。

对于不支持渲染扩展的X服务器,这个函数库还需要提供访问“核心”字体(使用原始X核心协议访问的字体)的能力,这就使得应用程序能在转向新函数库时仍然支持老式X服务器。

FreeType库没有指定如何定位字体文件,而是需要应用程序提供字体文件名,这就把配置和定制可用字体集合的负担放在了FreeType库以外,因此,这个新的“粘合”层也需要提供一些配置功能以便在桌面环境中应用。



2 X渲染扩展字形管理

X渲染扩展提出了几个简单抽象供应用程序管理字形。每个Glyph结构包括一个覆盖字形外形的alpha掩码(一个描述不透明值的矩形映象)、从alpha掩码原点到名义字符原点的偏移量、到下一字形的位移(包括垂直和水平的偏移量),GlyphSet结构则包含了一个字形结构的集合,应用程序使用一个32位的索引对字形集进行编号。

应用程序绘制文本时,把一个GlyphSet标识符以及一系列针对该GlyphSet的索引发送到X服务器,X服务器通过对指定位置使用字形结构中的偏移量调整确定绘制位置,并渲染alpha掩码来完成对每个字形的处理,后续字形的绘制位置则是通过在当前原点加上位移向量实现。正如X核心协议中的PolyText请求,在同一个请求中可以对字形序列作出调整位置、改变GlyphSet等变动,从而使得一个复杂的字符串在一次操作中完成渲染。

为了覆盖世界上更多的民族,操作系统支持的语言和区域集合不断扩展,伴随这种扩展,大多数字体中包含的字形数也大大增加,当今流行的轮廓字体中会包含几千个字形。十多年前,渐增式渲染字形被看作一种合理的优化,现在已成为各种字体机制中的基本组成部分,以尽可能减少每种字体占用的内存,并缩短访问一种新字体时所需的时间。X渲染扩展通过允许在需要时把一个Glyph加入已存在的GlyphSet,提供了这种渐增式渲染支持。由于在添加Glyph的过程中没有任何从X服务器到X客户的信息流,这一过程可以完全异步进行。这种异步性保证了即使面对一个高网络延迟的环境,仍有可接受的性能表现。

当应用程序传送它们需要显示的字形图像时,X服务器通过在任何可能情况下共享相同字形来节省内存。



3 FreeType库

FreeType项目的初衷是要构建一个自由的TrueType字体光栅化器。FreeType的第一版提供了与现有系统相当的高质量TrueType光栅化器,FreeType的第二版对内部结构进行了一般化以支持更多字体格式,除了支持Type-1、OpenType和CID等众多轮廓字体格式,FreeType现在还支持X的标准PCF格式(可移植编译格式)的位图字体。

FreeType不仅提供光栅化以及度量字形的接口,还提供存取字体文件内各种形式的字距调整和字形替换等表格的机制。这就在基础字体含有相应表格的前提下,使应用程序能够获得在各种区域中定位字形所必需的数据。

既然FreeType项目明确地要构建一个通用的字体函数库,在XFree86开发一个新函数库的负担就可以大大减轻,因为可以直接采用现有系统,并提供“粘合代码”改变FreeType数据结构使之使用X渲染扩展的要求。这固然使得应用程序需要面对FreeType函数库可能的变化,但考虑到FreeType是一个成熟的项目,相对于完全由XFree86开发一个新函数库的情形,这种变化的严重性大概会轻很多。

字体命名和配置不属于FreeType函数库,这些“杂务”交给了应用程序。考虑到FreeType应用于各种环境,有些甚至没有文件系统,为保证FreeType得到最大程度应用并独立于系统策略,这种设计思想是适当的。提供这些支持成为Xft实现中最困难的部分,并且其中一部分可能很快就被替换。



4 XLFD命名

X核心协议规定了用非结构化字符串命名字体的方法,X逻辑字体描述(XLFD)[SG92]用于在字符串名格式中加入结构信息。在开发X时,用于桌面计算的轮廓字体还是一个相对新奇的事务,所以X核心协议和XLFD都是基于位图字体设计的,当围绕缩放字体命名的语法和语义加入XLFD时,基于XLFD的开发已经进行了相当长的时期。

XLFD中字体命名语法的意图在于仅通过名字就可以向应用程序提供足够的字体信息,这样就可以在不访问字体数据情况下,进行字体选择和字体列表表示。

XLFD还提供了使用包含“?”和“*”的名字打开字体的标准策略,使用这类名字时,选中的字体将是第一个匹配的字体,即使用相同模式请求列出字体时返回的第一个。不幸的是,X服务器保存字体名时为了高效搜索,会在各字体目录中进行内部排序,所以不能保证“*”的默认值是合理的。例如,当在字体名的weight字段使用“*”时,X服务器会把bold字体列在normal字体之前。

这个策略真正失败之处在从point(点值)尺寸到pixel(像素)尺寸的映射。XLFD在字体名中分别提供了两个轴向上的pixel尺寸、point尺寸和resolution(解析度),标准的X字体按照解析度分别存放,“75dpi”和“100dpi”下各自存放着与该解析度匹配的各种点值尺寸的字体,其他字体目录下一般是为了在75dpi屏幕光栅化。

协议指导X服务器按照在字体路径(译注:font path,应指配置文件中相应节)中出现的顺序去搜索字体目录,这就使字体路径决定了对解析度的倾向性。如果100dpi的目录列在前面,当应用程序在字体名的resolution字段用“*”时,只要在100dpi目录下存在匹配字体就会使用该字体,否则才去尝试75dpi的字体。

应用程序如果在字体名中仅指定point尺寸,而在resolution字段使用“*”,那么最终将会得到一组随即尺寸的字体:那些在100dpi目录下发现的字体按照100dpi屏幕光栅化,其他字体则按照75dpi屏幕光栅化从而会显得小一些。

最终的结果是XLFD的字体匹配充满了危险,应用程序经常列出所有可用字体(作出选择)然后提交完整XLFD字体名(译注:不含“?”和“*”)给X服务器。

XLFD的另一个问题是在字体名中包含了字形的平均宽度字段。对于需要在不同总体宽度的字体中进行选择的应用程序而言,这是个非常有用的信息,而且对位图字体也很容易计算。但是对轮廓字体,除非在指定尺寸下对每个字形进行光栅化计算,该字段值不能算出。仅仅列出一个特定尺寸下所有的可用字体就会导致光栅化每一个字体的每一个字形。

XLFD提供了关于可用字体的有用信息,出列平均宽度,这些信息都是容易计算并交付应用程序的。使用XLFD的应用程序应该在本地管理XLFD字体名,而不要依赖服务器方字体匹配,也就是通过列出可用字体收集信息,再利用这些信息构造完整字体名。

鉴于XLFD没有提供一种按照语义匹配的合理方案,需要有新方案允许在应用程序给定一组约束情况下,基础的字体系统能够定位一个适当的字体。这样的系统需要有足够的灵活性以便能够包含现在不能预料的新字体特性,也不需要应用程序完全指定字体的方方面面。



5 设计一个新函数库

Xft在三个方面与环境交互:通过编程接口与应用程序交互,通过配置文件与系统交互,通过让用户指定字体名与用户交互。虽然这三方面在函数库中紧密相关,但从设计角度来说,它们是分离的。

5.1 应用程序接口设计

Xft的首要目标是把FreeType的输出和X渲染扩展结合起来,但是,为了Xft能作为现有的Xlib文本输出例程的替代物而被人接受,其次要目标包括支持核心X字体,尽管这样做可能以损失应用程序功能为代价。

由于FreeType不提供字体选择功能,所以Xft的一部分要进行字体匹配。采用现有的XLFD机制会极大地限制字体匹配地能力,所以Xft提出了一种新格式。这种选择机制被设计为总能匹配某种字体,允许应用程序假设适当地字体存在,避免在每个级别上都要考虑失败回落。

另一个要求是函数库要提供合理地匹配,例如需要italic(斜体)字体时用oblique(倾斜)字体代替,在不指定weight要求时使用中等weight的字体。这允许应用程序在指定字体时不必指定所有的特征,而且可以期望得到合理的结果。当应用程序的请求存在相互矛盾时,决定哪些特征更重要的政策能提供解决方案。

为了在函数库级别上简化可选的文本编码,所有的文本输出例程只接受Unicode编码的数据。其他的编码需要由应用程序负责转换,无论是在操作系统边界还是应用程序与Xft之间。由于大部分现存的字体一般都有Unicode编码(译注:指其内部检索采用的编码方式,可能有多种,置于不同表格结构,这取决于具体的字体文件格式),或是某种易于转换到Unicode的编码,这个策略显著地简化了函数库地内部结构,同时以一致的视图呈现于应用程序之前。

另一个重要目标是尽可能避免把内部数据结构暴露给应用程序。X渲染扩展允许渐增式下载新字形,设计Xft时允许按需光栅化新字形,这就要求(字形的)度量信息通过一个函数获取,而不是象Xlib中那样直接访问相应数据结构。

最后,Xft被设计为一个完整的字体访问函数库,所以底层的FreeType数据类型未被隐藏,以便应用程序可以直接使用FreeType自身。这降低了Xft的复杂度,同时允许应用程序完全存取可用的字体信息。

5.2 字体命名设计

Xft字体命名设计方案最初源于这样的观念,即字体名应该反映字体属性,不管是应用程序想要的属性还是字体自身的属性。由于应用程序的需求并不固定,而字体的特性也不断得到增强,下述想法逐渐形成:字体名应该用一个可变的指定属性列表表示,每个属性有一组相关值。允许属性有多个值,提供了为字体的家族(family)名或风格(style)等属性指定可接受的替代值的能力。

这一设计统一了应用程序的字体请求和可用字体的表示。一个XftPattern是一组指定属性,每个属性有一个或多个值。每个可用字体用一个给出了该字体特性的XftPattern来描述。应用程序构造一个描述了其请求的XftPattern,该XftPattern其后将与所有描述可用字体的XftPattern进行匹配,与应用程序请求最匹配的可用字体将被选中。这种“最近匹配”机制保证每个应用程序字体请求都能匹配一个字体,虽然该字体的精确特性可能与应用程序的请求有一定差别。

一种XftPattern的文本表示方法最终被设计出来,这就允许应用程序在很大程度上象当前一样使用字符串去选择字体。

XftPattern提供了一种简单但可扩展的机制,供应用程序与所使用的字体之间传达请求和能力,具体的用法在第6节描述。

5.3 字体列表设计

X核心协议提供了支持查询可用字体集合的原语,简单的、shell风格的模式(Pattern)传送到X服务器,匹配该模式的字体名集合被返回。只有获得几乎包括系统中所有字体的列表,才能发现可用的字体家族集合。应用程序要负责从这些大量数据中提取有用信息。

真正需要的是能向系统请求特定的相关信息,并由系统丢弃多余数据。应用程序可以专注于检验和操作信息,而不是花费很大气力去解析XLFD字符串。

Xft把用于返回可用字体数据的信息分为两部分,第一部分是从可用字体中做选择所需的模式,第二部分是决定应用程序有兴趣接收信息的一组属性名。匹配字体的列表将被修剪,以消除在所选属性中重复的项。

最后需要说明的是,“最好匹配”的观念在列出字体时没有用,应用程序用字体列表为用户产生对话框,或者用来发现字体家族的能力。这时,需要对模式中的每个元素做精确匹配,而不是测量可用字体与请求模式的差距(以寻找最好匹配——译注)。

5.4 配置设计

为避免可能在字体配置和定制机制出现互不兼容的分支,需要一个标准。鉴于没有可用的现有标准,在Xft中加入字体配置至少能保证X应用程序使用相同方式共享和命名字体。

一个基本的定制需求是允许一种字体作为另一种字体的替代,这种“别名”机制能在某种字体不可用时,选择拥有近似特性的字体来维护文本的外观统一。另一个有用的任务是支持一般的“mono”、“sans”和“serif”字体,应用程序可以在大多数情况下按照用户偏好选用。

另一个目标是要使添加字体尽可能容易。核心X字体配置机制使用X服务器字体路径列出所有查找字体的目录集合,在每个目录下,需要生成两个单独的配置文件来进行字体名到文件名的映射。如果这些文件丢失或损坏,就不能正确地进行字体选择。不再使用这些配置文件,会使系统总体上更加健壮。

最后,用户和管理员需要定制特定字体的光栅化。一些用户希望避免对某些字体、或是某些尺寸范围内的字体使用消锯齿功能,另一些需要对某些字体调整尺寸和间距。

实际上,Xft并非放置所有这些配置功能的正确场所,因为X应用程序并不是唯一对访问字体和字体信息感兴趣的程序。把这些配置机制移出Xft,放在一个能被非X应用程序使用的函数库,将是近期开发的焦点(译注:该功能已经移到FontConfig函数库。)



6 Xft字体名

Xft的字体名用一个指定属性的列表表示,其中每个属性带有一个有类型值的列表,这个属性集合存放在XftPattern数据结构中。有一些例程用于创建、编辑XftPattern以及进行与可用字体列表进行匹配的操作。Xft有一些内部支持的属性,如表1中所示;但是并不限制应用程序仅使用这些属性,Xft会忽略所有不理解的属性。

为了让XftPattern能够传输和存储,一个模式的结构能用一个字符串表示。这些字符串的格式如图1所示。每一个支持的(属性)名字有一个隐含类型,以便解析相关值,这样就避免使用引号或其它词法机制来区分不同类型。一些指定常量可以取代一些值或者完整的“name=value”对,因为常量唯一确定了相关属性名字,没有必要再显式给出名字。表2给出了可用的常量列表。这些常量中的每一个在内部都用一个值表示,这就允许在应用程序请求的值和可用字体的值之间进行相似匹配。例如,一个应用程序请求“demibold”时,会选中“bold”而不是“medium”。这有助于达成应用程序的意图,即使在开发和测试过程中没有与之匹配的可用字体。

名字 类型 C语言名
family String XFT_FAMILY
style String XFT_STYLE
slant Int XFT_SLANT
weight Int XFT_WEIGHT
size Double XFT_SIZE
pixelsize Double XFT_PIXEL SIZE
encoding String XFT_ENCODING
spacing Int XFT_SPACING
foundry String XFT_FOUNDRY
core Bool XFT_CORE
antialias Bool XFT_ANTIALIAS
xlfd String XFT_XLFD
file String XFT_FILE
index Int XFT_INDEX
rasterizer String XFT_RASTERIZER
outline Bool XFT_OUTLINE
scalable Bool XFT_SCALABLE
rgba Int XFT_RGBA
scale Double XFT_SCALE
render Bool XFT_RENDER
minspace Bool XFT_MINSPACE
dpi Double XFT_DPI
charwidth Int XFT_CHAR WIDTH
charheight Int XFT_CHAR HEIGHT
matrix Matrix XFT_MATRIX

表1 Xft字体名属性



name : families sizes properties

families : family-names

|

family-names : family-names ,string

| string

sizes : -size-list

|

size-list : size-list ,number

| number

properties : properties :property

|

property : string =value

| named-constant

value : string

| number

| boolean

| named-constant

| matrix

matrix : number number number number



Examples:

times,serif-12:italic

courier,mono-14:matrix=1 .1 0 1

图1: Xft字体名语法.



另外,虽然XLFD字体名不理想,但是它在现有的X应用程序中很常见,而且也表达了一组期望的字体特性。Xft能够把XLFD字体名转换成XftPattern,以便能使用Xft匹配规则选择字体,而不用第4节中所述的XLFD匹配规则。

名字 常量 值
weight light 0
medium 100
demibold 180
bold 200
black 210

slant roman 0
italic 100
oblique 110

spacing proportional 0
mono 100
charcell 110

rgba rgb 1
bgr 2
vrgb 3
vbgr 4

表2 Xft字体名常量



Xft字体名被设计为可扩展,以便即使Xft/FreeType2界面继续成长并为新系统提供模式元素情况下,现有应用程序依然能够正确运转。



7 Xft配置文件

使用核心协议,应用程序保证可以存取所有可用字体,因为由X服务器负责定位字体;现在字体管理移到了客户方,定位字体成为应用程序的责任。没有了可以共享的集中配置机制,每个应用程序可用的字体集合都可能有很大不同,安装和选择字体就可能有问题或者出错。

Xft配置文件的主要作用是指定可用字体文件的位置,其次是调整字体选择以及定制光栅化参数。

默认情况下,Xft的配置文件“XftConfig”在/usr/X11R6/lib/X11目录下,但可以通过在XFT_CONFIG环境变量中指定一个不同的文件名来改变。

文件中任何地方都可以放置注释,“#”字符将使其后直到行尾的部分成为注释。其他的语法将在下面几节说明。

7.1 字体目录

在配置字体所在位置时,Xft使用了一种极为简单的方法。指定一个目录的列表,Xft在这些目录中查找字体文件,所有找到的字体文件将被加入用于匹配的可以字体列表。(字体)在目录中的位置是无关紧要的,因为Xft总是在所有字体中进行最佳匹配。在配置文件中,用如下格式的行来指定目录:

dir "/usr/X11R6/lib/X11/fonts/Type1"

在目录下不再需要其他配置,Xft自动扫描目录来发现字体。

7.2 嵌套配置文件

为了把配置文件划分为便于管理的部分,也为了允许基于用户的函数库定制,Xft配置文件中允许出现如下格式的行:

include "/usr/local/lib/XftAliases"

includeif "~/.xftconfig"

两种格式的唯一区别在于:使用第一种格式,当被引用的文件找不到时,会发出警告消息。“~”字符指的是用户的主目录。因为Xft配置文件由用户的应用程序自己进行解析,这就能在不管X的显示(display)情况下,实现基于用户的定制。

7.3 字体模式编辑

为了能在字体匹配过程中实现字体替换以及其他的调整,也为了能配置光栅化过程,Xft配置文件中可以包含一些操作,这些操作能在匹配过程结束前修改Xft模式。这些操作被称为“编辑命令”(editing commands),与模式匹配时执行以修改模式,每个命令按照它们在配置文件中出现的顺序执行。这些命令的语法示于图2。



command : match tests edit edits

tests : test tests

|

test : any | all name compare value

compare : == | != | | >=

edits : edit edits

|

edit : name eqop expr ;

eqop : = | += | =+

expr : value

| name

| expr binop expr

| !expr

| expr ?expr :expr

binop : || | && | == | != | | >= | + | - | * | /



Examples:

# Use LuciduxSerif as default serif’ed font

match any family == "serif"

edit family += "LuciduxSerif";

# Avoid using anti-aliasing at some sizes for LuciduxSerif face

match any family == "LuciduxSerif" any size 8

edit antialias = false;



图2 Xft模式编辑语法



match子句用来选择待编辑的模式,其值为“真”时才会进行编辑。如果表达式使用“any”前缀,那么当与指定字段相关的任何值符合条件时,子句取“真”值;如果表达式使用“all”前缀,那么只有当所有值符合条件时,子句才取“真”值。

edit子句在模式的字段上操作,可以替换或者修正相关值。如果在match子句中引用模式中同一元素,则匹配值将被标记。

在edit子句中,“+=”操作符把值插入标记值之前,“=+”操作符把值插入标记值之后,“=”操作符则替换标记值。如果没有值被标记,“+=”和“=+”操作符分别把值加入整个值列表的头和尾,“=”操作符将会替换所有的值。

表达式中的操作符的含义都很明显,一种可能有些意外的情况,是“+”操作符可以用于连接字符串。表达式中可能引用字体中的某些字段,这种情况下,使用该字段的第一个值。

使用此机制几个月后,发现这种机制很复杂,并且完成不了一些预期的任务。缺陷之一是编辑只影响进入的模式,而不对匹配的字体进行任何操作。这使得禁止LuciduxSerif字体消锯齿效果的例子(译注:图2中的第二个例子)产生非预期的结果,例如,当以如下名字指定字体时,
Times,LuciduxSerif,serif-10
match子句将会成功匹配该模式,从而导致Times字体在显示时失去了消锯齿效果。

另一个问题是字体别名含义不清,目前还没有提供精确语义。关于字体别名,有两种可能的语义:一种是在任何情况下都用一种字体替换其它,另一种是只有当某些字体不存在时,才用特定字体替换。关于这一点的明确声明既能澄清文件格式,也有助于改进匹配的语义。(译注:本段中的“字体”对应原文的face)



8 字体匹配

Xft中字体匹配的目标是从应用程序接收一组字体特性的描述,然后从所有可用字体中返回最好的。应用程序调用XftFontMatch函数,并提供XftPattern形式的字体规格说明。模式按照7.3节中所描述的方式进行编辑,表3所示的X资源可以用来修改模式。如果应用程序没有指定像素尺寸,将根据指定的点值尺寸(如果也没有指定,使用12.0)乘以缩放因子,再利用指定的dpi值将点值转换为像素。其他的X资源用作相关模式元素的默认值。

X资源 类型 效果 默认值

Xft.render Bool 指导Xft使用客户方字体 HasRender
Xft.core Bool 指导Xft使用服务器方字体 !HasRender
Xft.antialias Bool 选择字形是否需要消锯齿 True
Xft.rgba Number 指定LCD屏幕上的子像素顺序 0
Xft.minspace Bool 消除行间的额外间距 False
Xft.scale Number 所有字体点值尺寸的缩放因子 1.0
Xft.dpi Number 用于从点值尺寸转换为像素尺寸 屏幕的垂直dpi

表3 用X资源调整Xft值



完整的模式随后将用于与所有可用字体进行比较,只有表4中所示的字段在比较中有用。表中字段的顺序是有意义的,表中靠前的元素不匹配将使后面元素的匹配变得无效。如果模式或字体缺少某一元素,将默认为匹配。数字值按照其差值的大小进行度量,这就是为什么指定“oblique”将选择“italic”,而不是“roman”。(译注:参见表2的常量定义。)

Order Name Type
1 foundry String
2 encoding String
3 antialias Bool
4 family String
5 spacing Number
6 pixelsize Number
7 style String
8 slant Number
9 weight Number
10 rasterizer String
11 outline Bool

表4 Xft字段比较的匹配顺序



有多个值的字段倾向于匹配列表中靠前项的字体,按照这种方式,下面名字将相对于“LuciduxSerif”优先匹配“Times”。
Times,LuciduxSerif,serif-10

一但选中了某一字体,将会构造一个能精确描述该字体的XftPattern,以便应用程序知道究竟选用了什么字体。这个模式包括底层字体文件的信息,从而允许应用程序直接通过FreeType访问未获得的信息。在模式中有、而字体中没有的字段也被加上,这就允许应用程序之间交换字体模式的信息,这种通信既可以在应用程序与光栅化器之间,也可以在应用程序自身发生。



9 X核心字体处理

虽然Xft的主要目标是在FreeType和X渲染扩展基础上,提供客户方字体支持,但是为了在X渲染扩展不可用时提供应用程序兼容性,同时X核心字体支持也是合理的。这必然限制函数库的能力,但即使这样,很多应用程序无论使用X核心字体或基于渲染扩展字体机制时,不加修改地使用Xft函数,另一些则只需作一些小小的改动以便注意到何时不能使用FreeType函数。

核心字体处理有两个部分:字体选择和渲染。字体选择是通过列出可用的X字体,将其转换为XftPattern结构,然后从应用程序接收模式进行匹配。由于按照接近程度进行匹配,而不是采用简单的shell模式匹配,一般情况下,这种匹配得到的结果要比用XLFD指定更有用。这有助于简化应用程序的设计,因为在此之前它们需要包含可观的、用于X核心字体匹配的机制。

一但选定某种核心字体,渲染就成为简单的事情:可以让Xft例程调用标准Xlib中文本绘制例程。唯一的困难是把应用程序提供的Unicode字形映射到字体所支持的编码。

这种合并的效果之一是Xft渲染例程只提供那些渲染扩展和核心字体都支持的能力。应用程序可以为绘制指定半透明的颜色值,但是如果使用的是核心字体,该指定将被忽略。类似地,Xft不提供选择光栅化操作或者组合操作(译注:X渲染扩展在服务器方的基本设计思想是基于图像组合操作),因为它们都只被底层的一种渲染机制支持。最终的结果是一种新的使用核心字体的方式,相对于Xlib中的对应物,在许多方面更容易使用,并且功能更强大。



10 Xft接口总览

Xft编程接口很容易划分到三个单独区域:处理XftPattern以及匹配字体、在屏幕上绘制字形、用于提供底层FreeType函数库接口的一小部分。

10.1 Xft数据结构

XftValue

typedef enum _XftType {

XftTypeVoid,

XftTypeInteger,

XftTypeDouble,

XftTypeString,

XftTypeBool,

XftTypeMatrix

} XftType;

typedef struct _XftValue {

XftType type;

union {

char *s;

int i;

Bool b;

double d;

XftMatrix *m;

} u;

} XftValue;

一个XftValue存放一个XftPattern元素的一个值,应该作为一个加了标签的联合来对待:使用联合前应该先设置或检查“type”字段。字符串或者矩阵元素单独存放,Xft从应用程序接收XftValue结构后,总是根据这些指针复制数据,这就使得应用程序自由地决定使用静态或是堆栈中的存储。

XftPattern

typedef struct _XftPattern

XftPattern;

XftPattern是一个不透明地数据结构,用于存放一个指定元素的列表,而每个元素又有一个XftValue的列表。Xft为构建和查询这些模式提供了接口。

XftFont

typedef struct _XftFont {

int ascent;

int descent;

int height;

int max_advance_width;

Bool core;

XftPattern *pattern;

union {

struct {

XFontStruct *font;

} core;

struct {

XftFontStruct *font;

} ft;

} u;

} XftFont;

当打开字体时,返回XftFont数据结构,并用于绘制字形。其可见成员提供了关于字体的少量信息。如果core的值为真,底层使用X核心字体,这时u.core.font 指向一个 XfontStruct结构;否则底层使用FreeType字体而u.ft.font字段引用XftFontStruct结构。

XftFontStruct

typedef struct _XftFontStruct

XftFontStruct;

struct _XftFontStruct {

FT_Face face;

GlyphSet glyphset;

int min_char;

int max_char;

FT_F26Dot6 size;

int ascent;

int descent;

int height;

int max_advance_width;

int spacing;

int rgba;

Bool antialias;

int charmap;

XRenderPictFormat *format;

XGlyphInfo **realized;

int nrealized;

Bool transform;

FT_Matrix matrix;

};

也许这个结构将来会隐藏起来,用一些适当的函数访问某些内部字段。最有用的字段当属“face”,用于引用底层的FreeType对象,但是在内存中保存这类对象开销太大,所以这些应该被缓冲并且按需调入。应用程序在使用该字段时,明智的方法是通过宏包装,以备将来该字段不再可见。关于该结构其他字段的可见性还需进一步核查。

XftDraw

typedef struct _XftDraw

XftDraw;

XftDraw封装了在X可画物上渲染字形所需的状态。对于使用渲染扩展的情况,需要Picture,对于使用X核心协议情况,需要GC和相关像素值。(译注:可画物,drawable,是Xlib编程基本概念,包括window和pixmap)
XftColor

typedef struct _XftColor {

unsigned long pixel;

XRenderColor color;

} XftColor;

渲染扩展需要RGBA,而X核心需要像素值;XftColor保存了二者,并有相应例程来初始化以及释放相关资源。对于真彩色可视类型,分配例程为了避免往返传递的开销,在本地计算像素值,这样来消除性能下降。如果已知将使用渲染扩展,“color”成员可以手动初始化而不去设置“pixel”的值。(译注:可视类型,visual type,是Xlib编程基本概念,可以是StaticGray, StaticColor,TrueColor, GrayScale, PseudoColor, 或DirectColor之一)

XftObjectSet

typedef struct _XftObjectSet

XftObjectSet;

Xft的字体列示机制使用XftObjectSet来限制返回给应用程序的数据总量,XftObjectSet用于存放一个字段名的列表。

XftFontSet

typedef struct

_XftFontSet {

int nfont;

int sfont;

XftPattern **fonts;

} XftFontSet;

XftFontSets指向一组模式集合,用作字体列示函数的返回值。

XftResult

typedef enum _XftResult {

XftResultMatch,

XftResultNoMatch,

XftResultTypeMismatch,

XftResultNoId

} XftResult;

需要返回搜索结果的函数使用这个数据类型来表示它们的发现,XftResultMatch表示发现了对象XftResultNoMatch说明没有发现匹配对象,XftResultTypeMismatch说明发现了某个对象,但是类型不对,XftResultNoId说明发现了对象,但是比请求的值少。

10.2 字体模式操作

许多Xft操作涉及XftPattern对象,鉴于应用程序不应该直接访问这些对象,有一组例程用于操作它们。

XftPatternCreate

XftPattern *

XftPatternCreate (

void)

创建一个空的模式。

XftPatternDuplicate

XftPattern *

XftPatternDuplicate (

XftPattern *p)

创建一个新模式,其所有值源自“p”所指对象。如果值引用其他存储(字符串和矩阵),相关存储将被复制到新分配存储区中。

XftPatternDestroy

void

XftPatternDestroy (

XftPattern *p)

释放所有相关的存储,包括模式中引用的字符串和矩阵。

XftPatternAdd

Bool

XftPatternAdd (

XftPattern *p,

const char *object,

XftValue value,

Bool append)

把“value”加入“object”字段的值列表中。如果“append”为True,值将被加到列表尾部,否则插入到头部。如果“value”引用字符串或者矩阵,XftPatternAdd将分配新存储区并复制,只有在分配空间失败时,XftPatternAdd才返回False。此函数是其他XftPatternAdd函数的基础。

Bool

XftPatternAddInteger (

XftPattern *p,

const char *object,

int i)

Bool

XftPatternAddDouble (

XftPattern *p,

const char *object,

double d)

Bool

XftPatternAddString (

XftPattern *p,

const char *object,

const char *s)

Bool

XftPatternAddMatrix (

XftPattern *p,

const char *object,

const XftMatrix *s)

Bool

XftPatternAddBool (

XftPattern *p,

const char *object,

Bool b)

这些函数中的每一个都会创建适当类型的临时XftValue,并作为参数传递给XftPatternAdd,调用时“append”设为True。

XftPatternGet

XftResult

XftPatternGet (

XftPattern *p,

const char *object,

int id,

XftValue *v)

XftPatternGet搜索指定的模式,找到名字与“object”匹配的元素,然后在值列表中找到第“id”个(从0开始计数)个元素,把结果值存入“v”。此函数不为字符串和矩阵分配存储区,所以应用程序必须确保不在XftPattern自身的生存期之外引用该值。此函数是其他XftPatternGet函数的基础。

XftResult

XftPatternGetInteger (

XftPattern *p,

const char *object,

int n,

int *i)

XftResult

XftPatternGetDouble (

XftPattern *p,

const char *object,

int n,

double *d)

XftResult

XftPatternGetString (

XftPattern *p,

const char *object,

int n,

char **s)

XftResult

XftPatternGetMatrix (

XftPattern *p,

const char *object,

int n,

XftMatrix **s)

XftResult

XftPatternGetBool (

XftPattern *p,

const char *object,

int n,

Bool *b)

这些函数中的每一个都调用XftPatternGet。如果结果的数据类型与函数不匹配,函数将返回XftResultTypeMismatch,否则与XftPatternGet的返回值相同。

XftPatternBuild

XftPattern *

XftPatternBuild (

XftPattern *orig,

...)

“orig”之后的参数构成了一个用于加入到指定模式的名字、类型和值的列表,如果“orig”为空,将分配一个新模式。模式参数的格式如下:

char *object,

XftType type,

union {

char *s;

int i;

Bool b;

double d;

XftMatrix *m;

} u

列表用一个空对象结束,例如:

p = XftPatternBuild (

0,

XFT_FAMILY,

XftTypeString,

"mono",

XFT_SIZE,

XftTypeDouble,

12.0,

0);

这个函数是一个便捷函数,它把若干XftPatternAdd调用封装到一个语句,其语义与作一组相当的XftPatternAdd调用是一样的。

XftPattern *

XftPatternVaBuild (

XftPattern *orig,

va_list va)

这个函数使用变参列表,其参数格式与XftPatternBuild 一致,产生结果也一样。

10.3 字体选择

Xft的字体选择函数分若干级别,所用到的模式既可以由简单的字体名字符串隐含生成,也可以由应用程序显式管理,在交付下层匹配接口前进行操作。作为最基本的级别,Xft提供:

XftFontMatch

XftPattern *

XftFontMatch (

Display *dpy,

int screen,

XftPattern *pattern,

XftResult *result)

此函数用应用程序生成的XftPattern进行配置文件编辑和X资源替换(译注:见第7、8节),然后把得到的模式在可用字体集合中匹配,最接近的字体名以另一个XftPattern的形式返回,该模式包含足够的信息以使用XftFontOpenPattern函数打开字体。如果失败,返回值为0,并且在“result”中放置错误指示。

XftFontOpenPattern

XftFont *

XftFontOpenPattern (

Display *dpy,

XftPattern *pattern)

XftFontOpenPattern接受匹配的字体模式,为字体创建XftFont结构。返回的XftFont包含一个对传入模式的引用,该模式将在以该XftFont为参数调用XftFontClose时被销毁。

XftFontOpen

XftFont *

XftFontOpen (

Display *dpy,

int screen,

...)

“screen”之后的参数构成了一个暗含的XftPattern,如同10.2节对XftPatternBuild参数的描述。下面是一个例子:

f = XftFontOpen (

dpy,

DefaultScreen(dpy),

XFT_FAMILY,

XftTypeString,

"mono",

XFT_SIZE,

XftTypeDouble,

12.0,

0);

根据这些参数可以创建一个模式,将其作为参数调用XftFontMatch,返回结果有传递给XftFontOpenPattern,最终产生本函数的返回值。

XftFontOpenName

XftFont *

XftFontOpenName (

Display *dpy,

int screen,

const char *name)

与XftFontOpen类似,“name”参数构成暗含的XftPattern,XftFontMatcn和XftFontOpenPattern以同样方式被调用以最终得到匹配的XftFont。

XftFontOpenXlfd

XftFont *

XftFontOpenXlfd (

Display *dpy,

int screen,

const char *xlfd)

除了通过解析“xlfd”指向的XLFD字体名得到XftPattern以外,此函数与XftFontOpenName完全相同。

XftFontClose

void

XftFontClose (

Display *dpy,

XftFont *font)

下层的核心或者FreeType字体对象被关闭,字体引用的模式被销毁。

10.4 XftDraw操作

Xft提供了可以屏蔽X核心和渲染扩展这两种不同渲染机制之间差异的一种抽象,XftDraw对象提供了两种模式的操作对象,并包装了两种渲染模型所需的适当信息。

XftDrawCreate

XftDraw *

XftDrawCreate (

Display *dpy,

Drawable drawable,

Visual *visual,

Colormap colormap)

此例程创建一个XftDraw对象,引用所涉及的可画物以及相关的可视类型及颜色图。即便使用指定了最终像素的像素图(pixmap)进行渲染,也需要指定visual参数。

XftDrawCreateBitmap

XftDraw *

XftDrawCreateBitmap (

Display *dpy,

Pixmap bitmap)

如果渲染目标是1位的位图,应使用此函数,而非XftDrawCreate。

XftDrawChange

void

XftDrawChange (

XftDraw *draw,

Drawable drawable)

此函数切换下层的渲染目标,但不会影响XftDraw对象的其他属性。应用程序应负责保证新的可画物与原来的可画物有相同的可视类型。

XftDrawDisplay,XftDrawDrawable,

XftDrawColormap,XftDrawVisual

Display *

XftDrawDisplay (

XftDraw *draw)

Drawable

XftDrawDrawable (

XftDraw *draw)

Colormap

XftDrawColormap (

XftDraw *draw)

Visual *

XftDrawVisual (

XftDraw *draw)

这些函数简单地从不透明地XftDraw结构中返回相关值。

XftDrawDestroy

void

XftDrawDestroy (

XftDraw *draw)

此函数将销毁XftDraw对象及其分配的任何私有数据,但引用的X可画物并不销毁。

10.5 字形渲染

有了XftFont和XftDraw,下一步就是使用它们在屏幕上显示文本。这相对简单,因为只用Unicode编码,唯一需要改变的是如何保存字形。在这一节中还给出了一些便利函数,让应用程序能使用与其他操作类似的数据结构。

XftTextExtents

void

XftTextExtents (

Display *dpy,

XftFont *font,

XftChar *string,

int len,

XGlyphInfo *extents)

这些函数测量指定字符串的显示宽度,并在“extents”结构中返回。

XftDrawString

void

XftDrawString (

XftDraw *d,

XftColor *color,

XftFont *font,

int x,

int y,

XftChar *string,

int len)

这些函数中的每一个显示一个字符串。若用渲染扩展,使用Over操作绘制字符串;若用核心机制,使用GXcopy绘制并且作用于所有平面。(译注:原文最后一句为it is painted with GXcopy and a full planemask,plane指特定可视类型下的颜色平面,planemask是GC的成员,按位标记平面,说明绘制操作影响哪些平面;with a full planemask意味着影响所有平面)

XftDrawRect

void

XftDrawRect (

XftDraw *d,

XftColor *color,

int x,

int y,

unsigned int width,

unsigned int height)

这个简单的函数用指定的颜色画一个矩形。

XftDrawSetClip

Bool

XftDrawSetClip (

XftDraw *d,

Region r)

通过指定区域来设置XftDraw的裁减区(clip)列表,以后可能会增加使用矩形列表来指定区域的等同函数。

10.6 字体列示

Xft提供一套相对复杂的机制来列示可用字体,此机制不仅可以列出可用的字体face,还可以在不返回无关数据的前提下列出某种特定face的可用风格。为达到这个目标,应用程序在提供用于字体匹配的模式外,还要说明字体模式中哪些字段是重要的;对每种匹配的字体,都会根据应用程序提供的XftObjectList选中的字段生成返回列表中的一项,由这些项构成的无重复集合将返回给应用程序。

列出字体是一个独立于打开字体的基本过程,此过程中模式如何匹配字体的语义与10.3节中有所不同。在这种上下文中,匹配要求模式中每个元素必有值与相关字体元素精确匹配。

XftObjectSetCreate

XftObjectSet *

XftObjectSetCreate (

void)

创建一个空的XftObjectSet。

XftObjectSetAdd

Bool

XftObjectSetAdd (

XftObjectSet *os,

const char *object)

在XftObjectSet中添加一个字段名。会分配新的存储区,并从参数中复制字段名,这样就允许应用程序能释放或重用其存储空间。

XftObjectSetDestroy

void

XftObjectSetDestroy (

XftObjectSet *os)

The XftObjectSet is destroyed along with any other

referenced storage.

XftObjectSetBuild, XftObjectSetVaBuild

XftObjectSet *

XftObjectSetBuild (

const char *first,

...)

XftObjectSet *

XftObjectSetVaBuild (

const char *first,

va_list va)

XftObjectSetBuild通过NULL结束的对象名列表创建XftObjectSet,使用此函数能快速构建一个名字的常量集合而避免一长串函数调用,其语义效果等同于一系列调用。XftObjectSetVaBuild使用一个可变参数列表完成同样的工作。

XftListFontsPatternObjects

XftFontSet *

XftListFontsPatternObjects (

Display *dpy,

int screen,

XftPattern *pattern,

XftObjectSet *os)

对匹配“pattern”的每种字体生成一个新的模式,其中仅包括“os”所指定的元素;此函数把得到的新模式合并后返回,以保证其中没有重复的模式。

XftListFonts

XftFontSet *

XftListFonts (

Display *dpy,

int screen,

...)

可变参数包括一个NULL结束的模式元素列表,与10.2节中关于XftPatternBuild的描述一致,其后还有一个NULL结束的字段名列表,与本节中关于XftObjectSetBuild的描述一致。根据参数生成模式和对象集合后,此函数调用XftListFontPatternObjects并直接返回调用结果。

10.7 访问FreeType

在需要与底层的FreeType函数库或渲染扩展需要更复杂交互的地方,Xft提供一些函数以便直接访问。

XftFreeTypeGet

XftFontStruct *

XftFreeTypeGet (

XftFont *font)

此函数返回给定字体的底层XftFontStruct对象,当底层字体不是FreeType时返回NULL。

XftRenderString

void

XftRenderString (

Display *dpy,

Picture src,

XftFontStruct *font,

Picture dst,

int srcx, int srcy,

int x, int y,

XftChar *string,

int len)

这四个相关函数都提供相对于使用渲染扩展画文本更强的控制,它们提供一个任意源图片(picture),用于填充文本。应用程序使用这些例程,还能更有效地缓冲源图片。(译注:Picture可能是FreeType引入的数据结构)



11 字体信息缓冲

如同7.1节所述,函数库通过扫描配置文件中列出的目录生成可用字体集合。要发现字体的特性需要使用FreeType打开字体文件,一大批文件需要处理,这可能会花费相当长的时间,尤其是字体很多的情况。

为提高此操作的性能,Xft在两个地方缓存搜索结果。每个目录下可能有一个名为XftCache的文件,其中每一行列出了字体文件名、字体在文件的索引以及用XftPattern字符串格式表示的字体信息。如果一种字体没有在任何XftCache文件中发现其信息,Xft会在用户主目录下生成一个.xftcache文件,其中包含字体文件名、字体索引、文件修改时间和XftPattern。

XftCache文件由xftcache程序创建,该程序是Xfree86发布的一个标准部件。鼓励用户在要加入Xft配置文件的其他目录下运行此程序,并且每当目录内容改变时重新运行。Xft会自动管理每用户的.xftcache文件内容,仅存放那些不在任何XftCache文件中的未知字体。

Xft仍然会在开始时扫描每个目录,但是会在使用FreeType打开文件前先检查每目录和每用户缓冲中是否有相应文件名,这能在保持查询字体目录方法得到的精确性前提下,极大地减少应用程序的启动时间。



12 未来的研究方向

Xft始于把X渲染扩展和FreeType光栅化器结合在一起的简单努力,为了支持更多的应用程序,加入了一些新的能力。这些新功能都是必须的,但其中的一些已经超出了以X为中心的函数库。特别是字体配置机制,应该从Xft中提出来放入一个单独的函数库,以便打印驱动程序和其他非X的字体使用者能共享该机制。这样能确保所有应用程序,而不仅是那些在屏幕上显示信息的程序,都能受惠于字体更易安装、管理。

Xft还需要支持国际化的额外能力。目前,XftFont对象引用单一FreeType字体,如果该字体没有包括渲染特定文档所需的全部字形,缺少的字形不会正确显示。需要增加某种发现替换字形的机制,XftFont结构也应扩展以便使用多个底层FreeType字体face进行自动字形替换。

对于那些不希望自动替换的应用程序,可能应该基于所需的Unicode字形子集匹配字体。字体文件中有字形覆盖范围的信息,应用程序应该能指定所需的字形范围,而Xft应该基于该指定进行字体匹配。



13 结论

Xft的开发模型与大多数X开发不同,函数库早期在其他项目中发布和集成,其他X项目等到基本稳定了才提交给社区中进行详细评判。

随着对此函数库的使用逐步增长,在没有太多影响其他项目的情况下,一些主要的提高被加入。未来的增强可能需要改变现有应用程序,这应被视作发展过程的正常部分。此函数库在很大程度上为Xfree86社区开辟了新天地,只有通过大范围的使用和评判,才能开发出适当的体系结构。

Xft的设计与实现进展很快,虽然仅在一年前启动,Xft已经成为许多现在的X项目的基本组成部分。(译注:原文发表于2001年11月在Oakland, California, USA举行的Proceedings of the XFree86 Technical Conference)



参考文献

[Pac01] Keith Packard. Design and Implementation of the X Rendering Extension. In FREENIX Track, 2001 Usenix Annual Technical Conference, Boston, MA, June 2001. USENIX.

[SG92] Robert W. Scheifler and James Gettys. X Window System. Digital Press, third edition, 1992.

[TT00] David Turner and The FreeType Development Team. The design of FreeType 2, 2000. http://www.freetype.org/freetype2/docs/design/.
 楼主| 发表于 2003-12-9 14:14:32 | 显示全部楼层

Fontconfig 及 Xft 2.0 版发布记

Fontconfig 及 Xft 2.0 版发布记
  贴出者为 conner  
conner写著 '
Fontconfig.org

作者:Keith Packard (www.xfree86.org) 翻译:Connermo (www.linuxfans.org)

Fontconfig是用来设定和配置访问字体的函数库。

关于 Fontconfig

Fontconfig 有以下几个功能:

当拷贝字体的时候,能自动发现新的字体,解决普遍存在的设置问题。


拥有字体替换功能,当所需字体不存的时候,可以换成恰当的替换字体。


可以识别覆盖特定语言所需的一套字体。


因为使用XML为基础的配置文件,所以它内含图形界面配置工具。(虽然我们直觉告诉我们它不是很重要)。


在你安装的所有字体中,可以有效而快速地查找所需的字体,哪怕你装了上千种,同时,内存的使用也是最小化的。


同X的渲染延伸模组和Freetype一起,在屏幕上实现具有高质量,反锯齿和子像素的文字。

Fontconfig 不负责的工作:

不渲染字体(这些交给Freetype和其他渲染系统)


不依赖于X windows 系统,使得只使用打印机的程序和fontconfig没有依赖关系。


关于Xft

xft 目前的版本(2.0) 为X程序提供了一个客户端的应用程序接口(API) 。它使用fontconfig选择字体,然后用X 协议渲染。可能的话,Xft会使用X的硬件渲染延伸模组来加速字体绘制。当渲染延伸模组不可用的时候,Xft使用X核心协议来渲染客户端的字形。这为所有的X服务器提供了完全兼容的客户端支持。


使用核心协议绘制反锯齿文字需要获得目标端的像素(服务器端),合成字形,然后再将它们送回去(服务器端)。当客户端和服务器端有延迟的时候,就会造成一个性能问题。用核心协议绘制非反锯齿文字的时候,就可以将字形直接从客户端送到服务器。这就可以消除任何的延迟反应并且是渲染速度只和带宽有关。精心选择的协议可以让带宽随着字形像素的大小线性变化。所以就算有相对较大的字形的时候,性能也是可以接受的。

当在网络上使用过时的X服务器(没有硬件渲染支持)时,禁用反锯齿功能会提高字体的渲染速度,使得应用程序就算在完全依赖客户端字体的时候也可以运行的比较畅顺。


多变的Xft

有三个差别很大的函数库叫Xft。和XFree86 4.02发表的原来的1.0 xft函数库包含了一个独立的配置方式,使用XftConfig文件。Xft当渲染延伸模组不存在的时候,使用X的核心字体代替客户端字体。这是为了让编写的程序使用一个共同的API并且可以运行在所有的X服务器上。

早期应用Xft1.0的时候,它不同与其他X风格的字体配置方式被充分证明是一个不好的想法。

KDE和pango最后都拿了部分的xft来设置字体。KDE拿了Xft分解代码的建立了一个图形界面的Xft配置工具。Pango则拿了几乎所有的Xft代码,用来让XftConfig文件可以在Xft和FreeType2后端之间共享。Fontconfig最终被设计出来解决这两个问题。

Xft 1.0的另外一个问题就是当服务器没有渲染延伸模组的时候就会使用X核心字体。这意味着当使用高级Xft API时,应用程序不能够依靠客户端字体。显然这个设计是有缺陷的,因为这时客户端需要提供的信息比反锯齿字形还要多很多。

Xft 1.0 API详细充分的抽象化设置使一个二进制兼容版本,并且用调用Fontconfig函数库的方法取代了XftConfig设置文件的Xft 1.1得以开发。不幸的是,Xft 1.0 API没有有效的封装渲染细节,也就不可能在服务器端没有渲染延伸模组的时候提供客户端字体。这意味着Xft1.1 共享字体设置,但在没有渲染器的服务器上并不十分可用。

Xft 2.0封装了几乎所有的底层系统细节,使得开发者可以在任何X环境下放心的使用它的API来访问客户端字体。

2.0 发布

Fontconfig现在发布的是2.0。没错,这是第一次发布这个函数库,命名为1.0应该没有什么问题,但原来有一个早一点的XFree86使用的版本叫"Xft", 有一个1.0的版本,而且因为fontconfig现在和第二个版本的Xft一起发布,所以感觉上不如将这一堆都标为2.0

取得2.0正式版,点击这里。

相关的资料

这里有一些关于fontconfig的东西

GTK+

目前的GTK+和Pango CVS使用Fontconfig 和xft2. 请从gnome.org获取。

Mozilla

这个目录存放了最新的支持Fontconfig和Xft2的Mozilla编译版本。从某种角度,这个会被官方的Mozilla版取代。

Qt 3

这个目录存放了一个让Qt3使用Fontconfig和Xft2而不是Xft1的补丁。Trolltech正忙着将这个支持包括进下一个Qt的发布版本。

Web字体
这里有微软的web字体。

相关站点

XFree86

Fontconfig 被包括在XFree86的发行版里, 并且共享XFree86的CVS库。

Freetype

Freetype是一个免费的,高质量可移植的字体引擎,被Xft用来生成字体。尽管Fontconfig在应用程序上并不表现出任何Freetype的相关性,但它确实在内部使用Freetype从字体文件获得信息。


附注:

Fontconifg 目前共享XFree86的CVS库,如果要使用CVS,请查看xfree86.org的网页。

关于Fontconfig的问题和意见可以发表到fonts@xfree86.org邮件列表。

这个包包括一个Xfontconfig和Xft源代码tarball,和最新版Xft1和Xrender一起。Fontconfig 和 Xft可以用通常的"./configure && make && make install" 的步骤编译,Xrender和Xft1则用"xmkmf -a && make && make install"。xmkmf对fontconfig和Xft应该也能可以使用。

当用./configure时,你大概需要设置路径到通常的值,在大多数的系统上,最好用"./configure --sysconfig=etc --prefix=/usr/X11R6"

请在pub目录里查找不同版本fcpackage的tar文件,每个版本列出了编译时的年-月-日-小时.分。

注: 没什么好说的,精彩的技术文章!'
发表于 2003-12-9 15:26:10 | 显示全部楼层
我的qt已经不受控制了。
发表于 2003-12-9 15:26:54 | 显示全部楼层
新的qt配合mdk自带中文字体
显示不错
而没有更新QT的时候,自带中文字体显示很难看
发表于 2003-12-9 15:52:39 | 显示全部楼层
qt-3.2.3确实进步了不少,中文支持更好了,速度方面有所提高,加上没用xfs,X比以前快不少,嘿嘿!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表