在X下的字體管理原理與概念

雖然在X下面活了這麼久,但是其實都不知道它的原理,今天找到了一篇文章對於整個概念寫的非常好,在此轉載一下。

* Fontconfig在桌面系統中的作用

KDE是類Unix系統中建立在X基礎上的一個主流桌面環境,對用戶來說,它提供了良好的圖形界面和語言切換機制,用以滿足來自不同國家、使用不同語言的用戶的使用需求,這種機制簡稱「國際化」。主要包括界面文字的翻譯,多種語言字體的管理、顯示的支持以及輸入法等等。這其中系統層面字體的管理和顯示的支持直接關係到文字的顯示效果,因此顯得尤為重要。在KDE系統中,字體管理、顯示的支持採用的是如下框架。

※架構: Fontconfig(字體配置)-->Freetype(字庫操作)-->xft(字體顯示)

Fontconfig:管理系統安裝的字體,根據應用程序的字體配置,match(匹配)一種字體,填充match字體的各種屬性。
Freetype:以Fontconfig匹配到的字體為參數,根據應用程序需要讀取相應的字庫。
xft:對需要顯示的語言文字進行顯示。

* X系統中字體的管理

作為KDE底層支持的X,它使用字體服務器(xfs)對安裝的字體進行管理,也稱之為「核心字庫管理系統」,基本配置原理是xfs使用可維護的字體安裝目錄和fonts.dir文件對字體進行操作。

X為之提供了一些工具來完成管理操作。例如:
mkfontdir,mkfontscale 用來生成安裝字體的 fonts.dir和fonts.scale。
xlsfonts 用來顯示安裝的字體。
xfd 用來顯示指定字庫的信息。
xset 用來管理字體服務器。

對於FreeBSD,在安裝了xorg 7.2並且X server運行的情況下,字體安裝目錄可用 xset q來查詢
shell>xset q
Font Path:
/usr/local/lib/X11/fonts/misc/,/usr/local/lib/X11/fonts/TTF/
/usr/local/lib/X11/fonts/OTF,/usr/local/lib/X11/fonts/Type1/
/usr/local/lib/X11/fonts/100dpi/,/usr/local/lib/X11/fonts/75dpi/
/home/dbhrscom/.fonts

上面顯示的是X系統安裝時定義的字體目錄。在這些目錄中,都有利用mkfontdir生成的fonts.dir(對於true type 字體需要使用mkfontscale 生成 fonts.scale,然後拷貝到fonts.dir中)。fonts.dir是個文本文件,裡面保存的是所在目錄的字體信息。關於這些信息的具體含義,可以參見X的man手冊,這裡不再贅述。

如果準備把一個字體安裝到X系統中,並且使用Xfs進行管理,大致需要以下過程:
1、建立一個目錄,並且把字庫文件拷貝到這個目錄下
2、運行mkfontdir或者mkfontscale,生成安裝字庫的fonts.dir文件
3、運行「mkfontdir -e 系統編碼目錄」生成encodings.dir文件
4、運行「xset +fp 字體目錄」或者「xset fp+ 字體目錄」,把字體目錄添加到xfs的字體目錄列表中。需要注意的是當字體目錄沒有fonts.dir這個文件時,這種添加字體目錄操作會失敗
5、運行「xset rehash」進行更新,確保新添加的字體可用

※注意:作為一種X系統的約定,安裝字體最方便的做法是把字體文件拷貝到「$HOME/.fonts/」目錄下,這樣省去了添加字體目錄的操作,而且xset +fp 是針對當前會話有效,如果準備系統啟動時有效,還要修改相關的配置文件。

* Fontconfig的字體管理

簡單的說Fontconfig是使用字體緩存的機制來進行字體管理的。這個Xfs有所不同。fontconfig提供fc-cache來建立這個緩存。

shell >fc-cache -v

/usr/local/lib/X11/fonts: skipping, 0 fonts, 12 dirs
/usr/local/lib/X11/fonts/100dpi: skipping, 398 fonts, 0 dirs
/usr/local/lib/X11/fonts/75dpi: skipping, 398 fonts, 0 dirs
/usr/local/lib/X11/fonts/Fonts: skipping, 4 fonts, 0 dirs
/usr/local/lib/X11/fonts/OTF: skipping, 23 fonts, 0 dirs
/usr/local/lib/X11/fonts/TTF: skipping, 13 fonts, 0 dirs
/usr/local/lib/X11/fonts/Type1: skipping, 29 fonts, 0 dirs
/usr/local/lib/X11/fonts/bitstream-vera: skipping, 10 fonts, 0 dirs
/usr/local/lib/X11/fonts/cyrillic: skipping, 0 fonts, 0 dirs
/usr/local/lib/X11/fonts/encodings: skipping, 0 fonts, 1 dirs
/usr/local/lib/X11/fonts/encodings/large: skipping, 0 fonts, 0 dirs
/usr/local/lib/X11/fonts/local: skipping, 0 fonts, 0 dirs
/usr/local/lib/X11/fonts/misc: skipping, 55 fonts, 0 dirs
/usr/local/lib/X11/fonts/util: skipping, 0 fonts, 0 dirs
/home/dbhrscom/.fonts: skipping, 0 fonts, 0 dirs
/var/db/fontconfig: not cleaning unwritable cache directory
/home/dbhrscom/.fontconfig: cleaning cache directory
fc-cache: succeeded

fc- cache的運行原理是掃瞄fontconfig的配置文件中定義的字體目錄,然後利用掃瞄的結果生成系統字體緩存。在這個fc-cache -v的運行結果中可以看到,它所掃瞄的路徑已經涵蓋了xfs所管理的系統字體路徑。但這並不表示fontconfig和xfs的繼承關係,fontconfig掃瞄這些目錄,完全是因為在配置文件fonts.conf中有這樣的定義!

<!-- Font directory list -->

<dir>/usr/local/lib/X11/fonts</dir>
<dir>~/.fonts</dir>

<!-- Font cache directory list -->

<cachedir>/var/db/fontconfig</cachedir>
<cachedir>~/.fontconfig</cachedir>

fc-cache所作的掃瞄都是基於以上的<dir></dir>定義。
這個配置文件在fontconfig最新版本中,默認放在下面的目錄中
/usr/local/etc/fonts/
而生成的字體緩存按照系統和當前用戶,分別存放到
/var/db/fontconfig
~/.fontconfig

這兩個目錄中,諸如下面所看到的

0c3f6abf7a2705d2e8570f7f70e9302d-x86.cache-2
1e99991e6eeb0b3e05d4185c886f4b19-x86.cache-2
2550ddc31d0b62d94bc27b0fea358aba-x86.cache-2
55cbb48b13195d29d336fd465f155e7b-x86.cache-2
75ff5e8ddb5aa19e5f229f72d89c73db-x86.cache-2

.cache-2 就是fc-cache的運行記號,fontconfig通過這個緩存來管理系統安裝的字體,也因為這種機制在系統中安裝字體變得非常簡單,只要把字體文件放到fonts.conf定義的目錄中,然後運行一下fc-cache。

由此看出,fontconfig和xfs相比,fontconfig提供了更加靈活的字體管理機制,目前系統中保持xfs和fontconfig並行工作的理由,只能是為必須使用xfs機制的程序提供一種支援。而作為KDE,它使用的就是fontconfig進行字體管理。舉例來說,KDE的控制中心有個「字體安裝」模塊,通過分析可知它進行字體安裝的原理就是自定義一個安裝路徑,放到fontconfig的配置文件中,然後把字體拷貝到自定義的目錄。

更完整的介紹請直參考 http://www.bsdlover.cn/html/16/n-116.html

0 意見: