这是一个系统范围的配置文件例子
<?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
- 作者: zhouxxxx 2005年02月15日, 星期二 15:46 回复(0) | 引用(0) 加入博采
萬一本文有更新的版本, 也許可以在 ~eric/fontconfig 找到,任何使用本文中提及的方法所造成之社會成本損失將不會被負責。
在保留此版權聲明及原作者的情況下, 本文可以被任意轉錄。有關於更詳細的條件 請見: licenses/by-nc-sa/1.0/ -- EricCheng
See also:
「為什麼我把 xxx 升了之後字就變難看了?」
「X 的字真是又醜又難設」
「Fontconfig Xft Freetype 到底是什麼關係啊!?!?」
螢幕上的字是用電腦的人整天會看到的,而用螢幕上有限的像素來有效顯示文字,又要提高文字的可讀性一直不容易。除了點陣字外,早在 80 年代就有的 anti-alias 也使得情況變得很複雜,即使已經過了 20 年,由於
所以能夠隨著自己的喜好而設定的字型是挺重要的。在各家 X desktop, toolkit 與瀏覽器的戰國時代,前後出現了許多解決方案,而 Fontconfig 是到目前為止,算是廣為被支援的一種新的不錯的方式,姑且一試,也許它還不能完全令你滿意,不過比起從前是來得有彈性多了。
晚近的 XFree86 除了有了 freetype 的內建,加強了對於 TrueType 等向量字型的支援外,最近 Keith Packard 的 Xft 與 Fontconfig 也是一個對於字型整合所做的嘗試,在最新的 XFree86 4.3.x 與 freetype/Xft2/Fontconfig 的支援下,X 下的程式對於一個統一的字型選擇與繪製介面又進了一步。
雖然 XFree86 本身包含 Fontconfig, Fontconfig 事實上是一個可以獨立出來的 介面,它是一個 library 不是一套 user app, 它所做的就是提供一套 font matching 的機制,讓使用 Fontconfig 的程式可以不必自己實作一套字型的選取 方法。如此只要使用 Fontconfig 的程式愈多,單一的一套設定檔就可以被用在愈 多的應用程式,應用程式本身可以利用 Fontconfig 所得到的字型名稱去畫字,也 可以架構在自己原先的字型選擇架構之上 (如 Qt), 以達成對舊的設定的一定的向 後相容性。
Fontconfig 有許多好處,例如:
Xft 也是一套 library, 它使用 Fontconfig match 到了所要的字型之後, 來決定 該如何畫這些字。Xft 會看情況而決定要不要使用 core protocol 或 XRender 來 畫字。XRender 是 XFree86 4.x 新增的 extension, 我認為這是為了保留 X 的向 後相容性所新增的一個 hack, 不過因為它可以用來畫 anti-aliased 的字,目前 的使用愈來愈廣泛。不過 anti-aliased text 只有在使用向量字型的時候有用, 繪製點陣字的時候就要使用 core lib. Core library(以 x-truetype 或 freetype 作為 backend)自然也是可以畫向量字,只不過畫出來的就不能有 anti-aliased 的效果了。
有時當 XRender 不能使用時(如你是透過網路用一個舊的 X server 來執行 X apps), Xft 也可以使用 core lib 來畫字。應用程式不必為這些問題操心,達到 資訊隱藏、各謀其政的目的。
Freetype (em>) 是一個很棒的畫字函式庫,XFree86 4.3 內含了 2.1.2. Freetype 提供 Xft 如何畫字的資訊,包括處理 anti-aliasing 或 hinting. 因此 freetype 的改變會影響到 Xft 畫出來的字,而 Fontconfig 的改變會影響到 Xft 如何去選字來畫。
這裡所講的就是最新的 Fontconfig 與 Xft2 的設定。對於舊的 Xft1.0 的 ~/.xftconfig 就不提了。
如果你裝了 fontconfig, 那麼它應該已經附上了一套預設的設定檔。可以到 /etc/fonts/ (一些 Linux distributions) 或 /usr/X11R6/etc/fonts (一些 BSD flavors) 底下找找看 fonts.conf 這個檔案。
fonts.conf 是簡單的 xml 格式,在 etc/ 裡面的 fonts.conf 是 system-wide 的設定,一般不建議直接更改它,可以更改 local.conf 或是自己家目錄下面的 ~/.fonts.conf . 關於 fonts.conf 的各種語法,由於 manpage 裡頭已經寫得很 詳盡,所以這裡只是提及比較重要的一些部份,有興趣者可以 man fonts-conf. 所有的設定都放在 <fontconfig> 與 </fontconfig> 之間,而其中可以包含許多 tags, 詳細的 tags 可以參照 fonts.dtd 或者是 manpage.
<dir> 裡面是一個路徑,fontconfig 會自己遞迴地去找這個路徑裡頭的所有字型,如: <dir>/foo/bar/myfonts</dir>
<include> 可以把其他的設定檔引進來,它們的格式是一樣的。
其中最重要的 element 應該是 <match> 了。match 主要有兩種用法, 一種是 pattern match, 另一種是 font match. 前者會把所有的字型 match 出來,所以 針對它的更改會套用到所有的字型的選擇方式上。為什麼要更改字型的屬性? 因為 這樣可以針對個別的字型告訴 Fontconfig 該如何去處理這些字型,或是告訴 renderer 該如何去畫這些字型。這裡是一些常用到屬性的列表,關於所有的屬性 請洽 manpage:
Hinting 用來最佳化字型顯示的方法。由於螢幕的像素有限,向量字型的縮放需要 有更多的考量, 例如當一條線位在兩個像素格子中間時, 該取左邊的格子還是右邊 的格子? 如果這方面的控制沒有做好,就常常會出現字型的襯線沒有對齊,或是小 字歪七扭八的情況。 Hinting 是額外的資訊, 它告訴 renderer 該如何處理這些 細節的部份,使得向量字在小字的時候能夠好看。也因此 Hinting 是非常費時費 人力的工作,TrueType 字型很多,但是有良好 Hinting 的字型不多。拙劣的 Hinting 就會讓字變得很難看。
為了稍微改善這個問題,freetype 有 autohint 的功能,可以自動為沒有 hint 的字型做 hinting 的工作。另外由於 TrueType 的 hinting 是有專利的,不能完 全自由地使用, autohint 就不受這個限制。autohint 自然無法做得像人力的 hint 一樣好,不過至少比沒有 hint 要好些。話雖如此,對於許多筆劃複雜的文 字 (如中文) 目前 freetype 的 autohint 還做得不甚完美,而因為建立完整的 hinting 的難度,即使是英文字,原本就很高,內建有 hinting 的中文字型就少 之又少了。所以常常有人抱怨中文字在螢幕上很難看,就是沒有理想 hinting, 或 者是使用了 autohinter 所造成的一些反效果。
Anti-alias 是將字型在幕後先以數倍的大小來繪製,然後再縮成想要的大小,未 滿一格的格子用灰階補點。由於原本 X 所支援的 logic 運算不敷使用,所以才用 XRender 的 extension 來達成目的。除了一般的 Anti-alias 之外,Xft 還支援 了為 LCD 所設計的 subpixel rendering.