分类:
2008-05-23 13:29:51
/usr/local/etc/fonts/fonts.conf |
Fontconfig是全系統以及個人化字型設定的函式庫,應用程式可向其索取字型。
Fontconfig由兩個主要的模組構成,其一是設定模組,把XML設定檔轉換成Fontconfig的內部設定; 另一為比對模組,將應用程式傳來的字型樣式需求與現有字型比對,傳回最相似的字型。
FcConfig datatype,libexpat,FcConfigParse三者所構成的設定模組在解析XML樹狀結構之後,對Fontconfig重新設定。 從外部觀之,設定Fontconfig函試庫的方法,即為編輯出一個正確的XML檔案,然後交給FcConfigParse處理。 除此之外,更動字型設定的唯一方法就是把字型和目錄加入應用程式提供的字型檔清單中。
其目的就是儘量不更動字型設定,並且讓各種應用程式共用一個設定。 這樣一來當程式之間需要交換字型名稱時,所取得的字型較為一致。 我們用XML作為設定檔的格式,因為XML容易被外部程式編輯,而不會意外地損壞設定檔該有的結構和語法。
字型設定和字型比對不同;有些程式需要自己比對字型,所以會向Fontconfig詢問電腦上所有可用的字型,再自行比對。 這讓程式可以只針對Fontconfig中合適的功能善加利用,不必採納Fontconfig的所有設定,所以不會陷入程式本身和Fontconfig設 定兩者的抉擇。 然而願景是讓所有程式的字型設定都能集中管理。 若字型設定能集中管理,字型的安裝和個人化就會簡易而有秩序。
雖然字型需求樣式可以指定各種性質,但是有些性質才較為常用。 Fontconfig利用下列的性質來做字型比對和字型補全。 (譯註:當程式傳來的字型格式需求沒有一一指定各種需要的性質時,透過字型補全由Fontconfig為其挑選一個適用的字型。) 其它的性質將交給字體繪製程式,以便應用程式另外指定繪製方法。
性質 型態 說明 |
當接收到字型的樣式需求,Fontconfig會將之與電腦現有的字型逐一比對,比對其間之差距。 然後從結果中選出最接近的字型。 雖然一定會傳回一個字型,但不保證傳回的字型和需求的樣式有多相符。
首先應用程式必須提出一個字型的樣式需求。 應用程式所想要的屬性會集中起來,成為一個樣式。 樣式裡的每一種性質可能不只一個值; 若有多個值,係依優先順序排列; 所以如果現有的字型中和較前面的值相符,就算是「較為接近需求」。
在字型比對之前,Fontconfig會依照一系列修訂指令來修改樣式需求,不同的樣式可以有不同的修訂指令; 每一個修訂指令分成兩個部份:比對和修改。(譯註:這裡的比對,指樣式需求和設定比對,不是和現有的字型比對。) 修訂指令依照於設定檔中的出現順序執行。 若比對正確,即依指令修改樣式。
需求樣式經過修改後,接下來就進行預設的替換,把不典型的性質換為典型的性質; 這麼一來下層的畫字程式就不必一直提供預設值給不同的字型性質。
經過修訂和替換的步驟後,典型的需求樣式終於要和電腦中的字型逐一比對了。 樣式和字型的差距是藉由比對下列性質再換算而得的: foundry, charset, family, lang, spacing, pixelsize, style,slant, weight, antialias, rasterizer 和 outline。 上面是依優先順序列出,比較前面的權重較大。
有一個特別規則:字族名稱 (family) 分為兩種約束:強和弱(strong and weak)。(譯註:binding怎麼翻?) 強字族名稱比字型所支援的語言 (lang) 更為優先,弱字族名稱反之。 在文件指定的字型都不在電腦裡的時候,這可以讓語言引導字型的選擇。
如果需求樣式的性質中有字型本身所沒有的性質,這些額外的性質會被保留住; 這允許應用程式通知畫字程式另外的指示或資料,不因修改及比對而被干擾。 最後,樣式再次依照設定檔中的修訂指令修改。 再次修改後的樣式才會傳回給應用程式。
傳回值提供字型的位置和畫字的方法,包含檔名、pixel大小和其它畫字資料等。 由於傳回的資訊並非專屬於FreeType,所以應用程式可以自行選則畫字引擎,甚或利用傳回的檔名直接存取字型檔。
比對和修改 (也就是修訂指令) 一共進行兩次,因為根本上就有兩件事要做-- 第一要調整字型選擇的方法:主要是為字族名稱起別名和加上適合的預設值。 第二件事是選好字型後,針對選上的字型修正其畫字方式。 只可以在選上的字型上做第二次的修改,不可以在需求樣式上做第二次的修改,因為第二次的比對方式時常有錯誤的比對成功。
Fontconfig可以收發的字型樣式是用文字表示的。 (譯註:字型樣式的文字表示,稱作字型名稱。別和字族名稱搞混了。) 這種表示法分為三個部份,第一部份是條列字族名稱,然後是條列point sizes,最後才是其它的性質:
<字族名稱列表>-<大小列表(point sizes)>:<性質1>=<數值列表1>:<性質2>=<數值列表2>... |
數值列表用逗點分開。 字型名稱可以不包含字族名稱或是大小(point sizes)。 此外有符號常數可以同時指定性質和其數值。 下面是一些例子:
字型名稱 意義 |
資料庫裡的每一個字型都有其所支援的語言的清單。 藉由比較字型涵蓋Unicode的範圍和每個語言所用到的文字,Fontconfig可以算出字型支援的語言。 語言標幟和RFC-3066相容,分成兩個部份--依前後是ISO 639語言標幟和ISO 3166國碼,用連字號相連。 連字號和國碼可以省略。
Fontconfig內建有多種語言所用到的文字。 除非重新編譯Fontconfig,不然沒有辦法新增。 目前支援了ISO 639-1裡139種語言的122種,和ISO 639-2裡用兩個字母表示的語言141種及三個字母表示的30種。 用兩個字母或三個字母都可以表示的語言,就用兩個字母為代表。
針對一些在不同地區使用完全不同的字集的語言,Fontconfig對不同地區語文所記錄的「語言所使用的文字」也不一樣。 這包括亞塞拜然文、庫德文、普什圖文、提格利尼亞文和中文。(Azerbaijani, Kurdish, Pashto, Tigrinya and Chinese)
Fontconfig的設定檔是XML格式; 這種格式的好處是易於外部設定程式編輯,確保能編輯出語法正確的設定檔。 因為XML檔是純文字,所以有經驗的使用者也可以用一般的文字編輯器修改之。
Fontconfig文件格式定義(document type definition)是外部實體「fonts.dtd」; 這個檔案一般存放在預設的字型設定目錄內 (/etc/fonts)。 每一個設定檔都應該包含如下的結構:
|
這是字型設定檔的頂層元素,可以容納多個 dir, cache, include, match, alias, config, 和selectfont等元素,次序不限。
這個元素容納一個目錄名稱,存放在此的字型檔會被當作是可以使用的字型。
這個元素容納一個檔名,用來存放每一個使用者的字型資訊快取。 如果檔名以「~」為起頭,代表指到使用者的家目錄下的檔案。 這個檔案裡,存放了一些不在其它目錄的快取的字型的資訊。 這由Fontconfig自動維持。 預設是``~/.fonts.cache-version'',version是字型設定檔的版本編號(目前是1)。
這個元素容納一個設定檔的檔名或是一個目錄名。 如果容納的是目錄名,該目錄下的每一個以數字為檔名開頭的檔案,都會被當字型設定檔來依序處理。 當FcConfigParse處理字型設定檔時,設定檔裡該元素容納的檔案 (或該元素容納的目錄下的檔案) 會交給FcConfigLoadAndParse使之與目前的設定結合。 如果「ignore_missing」設為"yes"而不是預設的"no",而且元素裡的檔名並不存在,Fontconfig不會為之產生警示訊息。
這個元素用來存放其它的設定資訊。 config可容納多個blank和rescan元素,順序不限。
雖然字型的編碼可能有編到,但是字型經常闕漏字體,闕漏的部份畫起來是空白的。 在blank元素裡,把本來就應該是空白的字體其編碼用int元素容納,內容是每一個空白字元的Unicode編碼。 不包含在這裡的字元如果畫起來還是空白的,就會被當作不被此字型支援的字元。
rescan元素容納一個int元素,用來設定多少秒自動檢查一次字型設定。 Fontconfig在指定的時間過後會檢查所有的設定檔和目錄,然後重建內部的資料結構。
這個元素用來設定黑名單或白名單,指示哪些字型該列出給應用程式,以及哪些字型可供比對。
在acceptfont元素裡比對到的字型會被列入「白名單」內; 這種字型會被列出給應用程式,而且可供比對; 在白名單內的字型不會被rejectfont元素列入黑名單。 acceptfont元素包含多個glob和pattern元素,用來比對字型。
rejectfont元素裡比對到的字型會被列入黑名單內; 這類的字型既不會列出給應用程式,也不會被拿來比對,就好像該字列不存在於系統中一樣。 rejectfont元素包含多個glob和pattern元素,用來比對字型。
glob元素容納多個shell下完整路徑的檔名比對方式(可以包含?和*)。 這可以用來排除一整套目錄(/usr/share/fonts/uglyfont*),或特定的字型檔格式(*.pcf.gz),然而使用附檔名的方法,依賴的是不可靠的檔案命名系統。
pattern元素把進來的字型和樣式需求一一比較;也就是說,它容納了一系列的元素及其值。 如果每個元素裡都有一個值佮好與進來的字型相符,代表進來的字型和這整個樣式相符。 依屬性(可縮放、粗體等)比對字型時,就會用到這個功能,這種方法比依賴附檔名可靠多了。 pattern元素包含多個patelt元素。
patelt name="property"元素容納多個constant元素,constant再轉而容納一個下列元素:int|double|string|matrix|bool|charset|const。 patelt name="property"元素必須要指定屬性name,表示對應於何種字型性質。
這個元素容納一系列的test元素(也可以不含test),接著是一系列的edit元素(也可以不含)。 符合所有test的字型樣式,會按照edit裡的指令逐一修改。 如果設定「match target="font"」,表示一系列的修改只針對選出的字型的樣式名稱。預設的「match target="pattern"」表示更改的是字型樣式需求。(譯註:還記得字型樣式共修訂兩次嗎?一次在和選出字型之前,一次在選出字型之後。)
這個元素容納一個值,跟target(可以是"pattern", "font", "default")的某一性質比較,性質property可以是上面「字型的性質」裡提到的任何一種。compare可以設為下列之一:"eq"、"not_eq"、"less"、"less_eq"、"more"、或"more_eq"。 qual可以是預設的"any",代表當樣式裡任一個性質符合測試值的時候就算符合; 也可以是"all",代表當樣式裡每一個性質都符合測試值的時候才算符合。 如果這個
Mode With Match Without Match |
這個元素容納一系列的元素表示式(以值和算子構成)。 程式執行時才計算這些表示式,並以計算結果修改性質"property"。 隨著樣式是否符合某一個test條件,修改方式也不同, 如果有一個值符合,就修改符合的第一個。 每一個插入值都有一個約束("strong", "weak", 或"same"),其中的"same"代表使用符合的樣式元素的約束。 mode意義如下:
Mode 符合其一 全不符合 |
這些元素容納同型態的單一數值。 bool容納的是true或false。[註: true, on, 1, yes, t*, y*, 1*, on* 等等都是真值; false, off, 0, no, f*, n*, 0*, of* 等等都是偽值。] 浮點數有重要的限制:fontconfig只能接受以數字開頭的尾數,不可以是小數點,所以遇到純小數時請在開頭插入零。 (也就是說接受0.5而非.5,以及接受-0.5而非-.5)。
這個元素容納四個double元素,作為仿射轉換的四個係數。
這個元素容納一個性質名稱。 執行時會算作是字型裡性質的第一個值。 (不適用於樣式需求的性質。)
Constant Property Value |
這個元素容納一個常數的名字; 這些名字都是整數型態的性質及其值,是常用的字型數值:
Constant Property Value |
這些元素對一列的表示式元素執行運算。 or以及and是普通的布爾運算,不是逐位元的布爾運算。
這些元素比較兩個值,產生一個布爾代數結果。
這個元素容納三個表示式元素; 如果第一個表示式為真,則產出的結果為第二個表示式的值,不然的話產生的是第三個的值。
代換字族名稱時,原本需要一連串match元素,我們可以運用alias元素來縮短記法。 alias容納一個family元素,接著prefer、accept和default元素(可以不接)。 若樣式的字族名稱符合family,那麼就會在符合的字族名稱前面插入prefer容納的部份,在符合的名稱後面插入accept容納的部份,而在字族名列表的最後插入default容納的部份。
這個元素容納一個字族名稱。
這些元素容納一系列的family元素,供alias元素使用。
以下是系統全域設定檔的範例。
|
底下是使用者字型設定檔的例子,內容存放於~/.fonts.conf
|
fonts.conf 含有針對fontconfig函式庫的設定資訊,包括了含有字型資訊的目錄,以及比對字型之前修訂字型需求樣式的指令。 此檔案採用XML格式。
conf.d :依慣例,conf.d是額外設定檔所存放的目錄,這些額外的設定檔通常由外部程式或電腦管理員管理。 檔名以數字開頭的檔案按照字典方法排序後,依額外設定檔處理。 這些檔案都採用XML格式。 主要設定檔fonts.conf利用
fonts.dtd 是定義設定檔格式的DTD。
~/.fonts.conf :慣例上~/.fonts.conf是每個使用者各自的字型設定檔。這是由全域的fonts.conf所指定的。
~/.fonts.cache-* 慣例上是所有字型資訊的快取檔,若各別目錄有快取檔則不存放該目錄的資訊。此檔案由fontconfig自動維護。
fc-cache(1), fc-match(1), fc-list(1)