- 論壇徽章:
- 0
|
[color="#05006c"]FreeBSD桌面系統(tǒng)中利用Fontconfig
進(jìn)行字體配置的運(yùn)作原理
http://www.chinaunix.net 作者:
杜比環(huán)繞聲
發(fā)表于:2007-05-30 18:44:36
【
發(fā)表評(píng)論
】
【
查看原文
】
【
BSD討論區(qū)
】【
關(guān)閉
】
試析FreeBSD桌面系統(tǒng)中利用Fontconfig進(jìn)行字體配置的運(yùn)作原理(一)
杜比環(huán)繞聲
概要:本文以KDE桌面環(huán)境為例,試析Fontconfig的運(yùn)作機(jī)制
一、Fontconfig在桌面系統(tǒng)中的作用
KDE是類Unix系統(tǒng)中建立在X基礎(chǔ)上的一個(gè)主流桌面環(huán)境,對(duì)用戶來說,它提供了良好的圖形界面和語言切換機(jī)制,用以滿足來自不同國家、使用不
同語言的用戶的使用需求,這種機(jī)制簡稱“國際化”。主要包括界面文字的翻譯,多種語言字體的管理、顯示的支持以及輸入法等等。這其中系統(tǒng)層面字體的管理和
顯示的支持直接關(guān)系到文字的顯示效果,因此顯得尤為重要。在KDE系統(tǒng)中,字體管理、顯示的支持采用的是如下框架。
Fontconfig(字體配置)-------->Freetype(字庫操作)-------------->xft(字體渲染)
Fontconfig : 管理系統(tǒng)安裝的字體,根據(jù)應(yīng)用程序的字體配置,match(匹配)一種字體,填充match字體的各種屬性。
Freetype : 以Fontconfig匹配到的字體為參數(shù),根據(jù)應(yīng)用程序需要讀取相應(yīng)的字庫。
xft: 對(duì)需要顯示的語言文字進(jìn)行渲染
二、X系統(tǒng)中字體的管理
作為KDE底層支持的X,它使用字體服務(wù)器(xfs)對(duì)安裝的字體進(jìn)行管理,也稱之為“核心字庫管理系統(tǒng)”,基本配置原理是xfs使用可維護(hù)的字體安裝目錄和fonts.dir文件對(duì)字體進(jìn)行操作。
X為之提供了一些工具來完成管理操作。諸如 :
mkfontdir,mkfontscale 用來生成安裝字體的 fonts.dir和fonts.scale。
xlsfonts 用來顯示安裝的字體。
xfd 用來顯示指定字庫的信息。
xset 用來管理字體服務(wù)器。
對(duì)于FreeBSD,在安裝了xorg 7.2并且X server運(yùn)行的情況下,字體安裝目錄可用 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系統(tǒng)安裝時(shí)定義的字體目錄。在這些目錄中,都有利用mkfontdir生成的fonts.dir(對(duì)于true type 字體需
要使用mkfontscale 生成 fonts.scale,然后拷貝到fonts.dir中)。fonts.dir是個(gè)文本文件,里面保存的是所在目
錄的字體信息。關(guān)于這些信息的具體含義,可以參見X的man手冊(cè),這里不再贅述。
如果準(zhǔn)備把一個(gè)字體安裝到X系統(tǒng)中,并且使用Xfs進(jìn)行管理,大致需要以下過程:
1、建立一個(gè)目錄,并且把字庫文件拷貝到這個(gè)目錄下
2、運(yùn)行mkfontdir或者mkfontscale,生成安裝字庫的fonts.dir文件。
3、運(yùn)行“mkfontdir -e 系統(tǒng)編碼目錄” 生成encodings.dir 文件(可選)
4、運(yùn)行 “xset +fp 字體目錄” 或者 “xset fp+ 字體目錄”,把字體目錄添加到xfs的字體目錄列表中。需要注意的是當(dāng)字體目錄沒有fonts.dir這個(gè)文件時(shí),這種添加字體目錄操作會(huì)失敗。
5、運(yùn)行“xset rehash”進(jìn)行更新,確保新添加的字體可用。
注意:作為一種X系統(tǒng)的約定,安裝字體最方便的做法是把字體文件拷貝到“$HOME/.fonts/“目錄下,這樣省去了添加字體目錄的操作,而且xset +fp 是針對(duì)當(dāng)前會(huì)話有效,如果準(zhǔn)備系統(tǒng)啟動(dòng)時(shí)有效,還要修改相關(guān)的配置文件。
三、Fontconfig的字體管理
簡單的說Fontconfig是使用字體緩存的機(jī)制來進(jìn)行字體管理的。這個(gè)Xfs有所不同。fontconfig提供fc-cache來建立這個(gè)緩存。
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的運(yùn)行原理是掃描fontconfig的配置文件中定義的字體目錄,然后利用掃描的結(jié)果生成系統(tǒng)字體緩存。在這個(gè)fc-
cache -v的運(yùn)行結(jié)果中可以看到,它所掃描的路徑已經(jīng)涵蓋了xfs所管理的系統(tǒng)字體路徑。但這并不表示fontconfig和xfs的繼承關(guān)系,
fontconfig掃描這些目錄,完全是因?yàn)樵谂渲梦募onts.conf中有這樣的定義!
/usr/local/lib/X11/fonts
~/.fonts
/var/db/fontconfig
~/.fontconfig
fc-cache所作的掃描都是基于以上的定義。
這個(gè)配置文件在fontconfig最新版本中,默認(rèn)放在下面的目錄中
/usr/local/etc/fonts/
而生成的字體緩存按照系統(tǒng)和當(dāng)前用戶,分別存放到
/var/db/fontconfig
~/.fontconfig
這兩個(gè)目錄中,諸如下面所看到的
0c3f6abf7a2705d2e8570f7f70e9302d-x86.cache-2
1e99991e6eeb0b3e05d4185c886f4b19-x86.cache-2
2550ddc31d0b62d94bc27b0fea358aba-x86.cache-2
55cbb48b13195d29d336fd465f155e7b-x86.cache-2
75ff5e8ddb5aa19e5f229f72d89c73db-x86.cache-2
.cache-2 就是fc-cache的運(yùn)行記號(hào),fontconfig通過這個(gè)緩存來管理系統(tǒng)安裝的字體,也因?yàn)檫@種機(jī)制在系統(tǒng)中安裝字體變得非常簡單,只要把字體文件放到fonts.conf定義的目錄中,然后運(yùn)行一下fc-cache。
甚至fc-cache一下也不需要,因?yàn)樵趂onts.conf中定義了刷新時(shí)間:
30
由此看出,fontconfig和xfs相比,fontconfig提供了更加靈活的字體管理機(jī)制,目前系統(tǒng)中保持xfs和fontconfig
并行工作的理由,只能是為必須使用xfs機(jī)制的程序提供一種支援。而作為KDE,它使用的就是fontconfig進(jìn)行字體管理。舉例來說,KDE的控制
中心有個(gè)“字體安裝”模塊,通過分析可知它進(jìn)行字體安裝的原理就是自定義一個(gè)安裝路徑,放到fontconfig的配置文件中,然后把字體拷貝到自定義的
目錄。
四、Fontconfig配置文件的結(jié)構(gòu)
在2.4.2以后的版本中,F(xiàn)onfconfig的配置文件采用了模塊化的結(jié)構(gòu)。配置文件由以下文件組成
/usr/local/etc/fonts/fonts.conf
/usr/local/etc/fonts/conf.avail/*.conf
/usr/local/etc/fonts/conf.d/*.conf
/usr/local/etc/fonts/conf.d/ 目錄下的文件大多數(shù)是 conf.avail/ 目錄下的連接,大致是如下這些:
20-fix-globaladvance.conf
20-lohit-gujarati.conf
20-unhint-small-vera.conf
30-amt-aliases.conf
30-urw-aliases.conf
40-generic.conf
49-sansserif.conf
50-user.conf
51-local.conf
60-latin.conf
65-fonts-persian.conf
65-nonlatin.conf
69-unifont.conf
80-delicious.conf
90-synthetic.conf
前面的數(shù)字用來控制執(zhí)行的先后順序,從名稱上就可以看出,每個(gè).conf文件都有針對(duì)性的字體特性進(jìn)行處理。
而實(shí)現(xiàn)這種模塊化,所借助的就是 /usr/local/etc/fonts/fonts.conf 文件。
conf.d
分析/usr/local/etc/fonts/conf.d 目錄下的文件,并通過打開Fontconfig的調(diào)試功能,可知這些配置文件的執(zhí)行順序:
Loading config file /usr/local/etc/fonts/fonts.conf
Scanning config dir /usr/local/etc/fonts/conf.d
Loading config file /usr/local/etc/fonts/conf.d/20-fix-globaladvance.conf
Loading config file /usr/local/etc/fonts/conf.d/20-lohit-gujarati.conf
Loading config file /usr/local/etc/fonts/conf.d/20-unhint-small-vera.conf
Loading config file /usr/local/etc/fonts/conf.d/30-amt-aliases.conf
Loading config file /usr/local/etc/fonts/conf.d/30-urw-aliases.conf
Loading config file /usr/local/etc/fonts/conf.d/40-generic.conf
Loading config file /usr/local/etc/fonts/conf.d/49-sansserif.conf
Loading config file /usr/local/etc/fonts/conf.d/50-user.conf
Loading config file /home/dbhrscom/.fonts.conf
Loading config file /usr/local/etc/fonts/conf.d/51-local.conf
Loading config file /usr/local/etc/fonts/conf.d/60-latin.conf
Loading config file /usr/local/etc/fonts/conf.d/65-fonts-persian.conf
Loading config file /usr/local/etc/fonts/conf.d/65-nonlatin.conf
Loading config file /usr/local/etc/fonts/conf.d/69-unifont.conf
Loading config file /usr/local/etc/fonts/conf.d/80-delicious.conf
Loading config file /usr/local/etc/fonts/conf.d/90-synthetic.conf
五、Fontconfig所提供的調(diào)試功能
Fontconfig提供了調(diào)制功能,用來診斷字體配置運(yùn)行時(shí)的信息,使用調(diào)制功能非常簡單,在KDE環(huán)境下用模擬終端定義 FC_DEBUG 這個(gè)環(huán)境變量的值即可:
例如:csh環(huán)境下
setenv FC_DEBUG 1
在模擬終端中啟動(dòng)相應(yīng)的程序,就可以查看設(shè)定的調(diào)試信息?梢园凑障旅鍲ontconfig用戶手冊(cè)介紹的說明設(shè)定具體顯示的調(diào)試信息。
MATCH 1 Brief information about font matching 字體匹配信息
MATCHV 2 Extensive font matching information
EDIT 4 Monitor match/test/edit execution 顯示match/test/edit信息
FONTSET 8 Track loading of font information at startup
CACHE 16 Watch cache files being written
CACHEV 32 Extensive cache file writing information
PARSE 64 (no longer in use)
SCAN 128 Watch font files being scanned to build caches
SCANV 256 Verbose font file scanning information
MEMORY 512 Monitor fontconfig memory usage
CONFIG 1024 Monitor which config files are loaded 顯示配置文件裝載信息
LANGSET 2048 Dump char sets used to construct lang values
OBJTYPES 4096 Display message when value typechecks fail
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/26320/showart_318198.html |
|