edora7(Moonshine)發(fā)布也有一段時(shí)間了,這個(gè)版本包含了GNOME2.18和KDE3.5.6,美工有很大的提高;使用Xorg1.3版本,對nVidia顯卡支持很好,支持顯示器的熱插拔和自動(dòng)識(shí)別;yum性能也得到很大的提升,其它各方面的表現(xiàn)都很不錯(cuò)的,唯一的缺點(diǎn)就是中文字體顯示不夠完美。雖然比FC6有了極大的提高,但還是趕不上Ubuntu7.04。于是就有了自己動(dòng)手美化中文顯示的想法,下面我把美化過程的整理給大家。 試驗(yàn)環(huán)境:Fedora7,KDE3.5.6,在GNOME和其它發(fā)行版本上差別應(yīng)該不大。 首先,我們來了解一些關(guān)于字體方面的知識(shí)。 一、點(diǎn)陣字體(BDF)與矢量字體(TrueType) 大家知道PC的 顯示器是點(diǎn)陣顯示設(shè)備,圖像顯示的精細(xì)程度取決于顯示器的分辨率。文字也必須轉(zhuǎn)換為點(diǎn)陣信息方可正常顯示。于是人們設(shè)計(jì)制作了點(diǎn)陣字體,這種字體類似于位 圖圖像,以點(diǎn)陣詳細(xì)記錄了字體大小、形狀;這樣字體信息被讀取后不需要任何轉(zhuǎn)換就可直接在顯示器上顯示,由于制作精細(xì),因此顯示效果也是最好的。但這種字 體不能縮放,需要為每種字號(hào)制作點(diǎn)陣信息才能滿足不同大小字體的顯示,因此導(dǎo)致字體制作工作量大、耗時(shí)、占用空間大等問題。后來人們設(shè)計(jì)了矢量字體,它是 用矢量圖形記錄了筆畫和字形等信息,解決了字體縮放的問題。 矢量字體在顯示時(shí)轉(zhuǎn)換為點(diǎn)陣信息后才能顯示,在小字體情況下,轉(zhuǎn)換得到的點(diǎn)陣信息質(zhì)量與點(diǎn)陣字體相差甚遠(yuǎn),導(dǎo)致小字體顯示效果很差。因此人們?nèi)煞N字體之長,設(shè)計(jì)了一種即包括小字體點(diǎn)陣信息,又包括矢量字形的字體。比如著名的宋體(simsun),它包括12、13、14、15、16、18點(diǎn)的點(diǎn)陣字庫,還包括矢量字形。 矢量字體涉及到以下兩個(gè)概念: AA(anti-alias)抗鋸齒技術(shù),它將字型以實(shí)際數(shù)倍大小繪制,然后縮放成想要的大小,未能占滿一格像素的格子就用灰階填補(bǔ)。對于英文字符,因其筆劃簡單,所以比較美觀,但對于中文小字體,會(huì)導(dǎo)致文字看起來發(fā)虛,模糊不清的問題。 hinting字體微調(diào)技術(shù),它是字體的一種額外信息,嵌入字體內(nèi)部,告訴字體渲染引擎如何渲染字體,使用字體看起來更美觀。但hinting制作復(fù)雜,非常耗時(shí),所以帶有良好hinting的字體并不多(特別是中文字體)。對于字體的hinting有四種風(fēng)格hintnone、hintslight、hintmedium、hintfull,分別是指無hinting、輕度hinting、中等hinting、完全hinting。 但hinting如果調(diào)整不好,可能導(dǎo)致字體顯示并不好看,且由于hinting是有專利的,不能免費(fèi)無限制地使用,freetype又做出了自己的字體微調(diào)技術(shù)autohint,經(jīng)過不斷改進(jìn),已經(jīng)改善了部分字體的顯示效果。autohint是通過程序來實(shí)現(xiàn)的,并且是針對所有字體,當(dāng)然不可能有專門為每種字體制作的hinting技術(shù)效果好。 二、重要的概念:DPI DPI(DotperInch),這是一個(gè)印刷上的單位,是指每英寸上的油墨點(diǎn)數(shù)。這里把DPI用來描述顯示器上每英寸所包括的像素(Pixel),其值越高越精細(xì),顯示效果就越好。由于顯示器的分辨率、點(diǎn)距(或珊距)及尺寸的不同,因此不同顯示器的DPI也有差別。 那么我們?nèi)绻?jì)算自己顯示器的DPI呢?先測出自己顯示器的寬(width)和高(height),單位是cm,知道顯示器的分辨率。注意,如果是液晶顯示器,則它只有一個(gè)分辨率即其最大分辨率。對于CRT顯示器,它可以用多種分辨率,你先將其調(diào)整為最合適的分辨率(比如17寸CRT顯示器調(diào)整為1024*768)。由于1(inch)=2.54(cm),于是有下面的公式: 水平DPI=(水平分辨率/width)*2.54 垂直DPI=(垂直分辨率/height)*2.54 有的顯示器上水平DPI和垂直DPI有少許出入,這也是正常的。 大家可以看出,同樣像素的字體在高DPI的顯示器上顯示出來會(huì)較小。既然不同顯示器的DPI不同,那么用像素來描述字的大小顯然不合適,于是還有一個(gè)字體大小的單位:磅(point)。 磅是重量單位?不,此磅非彼磅,在這里,它才是字體大小的絕對度量(沒忘記MSWord里的行距的單位吧)。 1磅=1/72英寸。 不管何種大小的字體,最終都要換算成像素之后,才能在屏幕上顯示。那么像素(px)和磅(pt)換算關(guān)系為: px=pt*DPI/72 用這個(gè)公式可以算出,一個(gè)9磅的字在96DPI的顯示器上用12像素來顯示,但在75DPI的顯示器上卻只用9像素來顯示。因此如果你的系統(tǒng)里為顯示器設(shè)置了錯(cuò)誤的DPI,那么最終顯示出來的字將是不正常的大小。 請注意,Firefox里設(shè)置的字體大小是以像素(px)為單位,在系統(tǒng)其它你能看到的絕大多數(shù)地方,都是以磅(pt)為字體大小單位。 好了,我們來看看自己Xserver的DPI設(shè)置: $xdpyinfo |grep resolution resolution: 75x75 dots per inch 通過上面的方法已經(jīng)得知我的顯示器DPI約為96,這里卻設(shè)為75,明顯不正確。打開/etc/X11/xorg.conf,在Section"monitor"段中加入DisplaySize參數(shù): Section"Monitor" …… DisplaySize 270 203 # 1024x768 96pi EndSection 重啟X后,再使用上述xdpyinfo命令便可看到效果。不管實(shí)際的DPI是多少,都建議你將DPI值設(shè)為6甚至12的倍數(shù)。因?yàn)槲覀兪褂冒鮼碛?jì)算字體大小,在轉(zhuǎn)換時(shí)采用舍入方法來選擇鄰近的值作為字體最終的大小(像素),如果DPI值不為6或12的倍數(shù),將可能導(dǎo)致相鄰的字號(hào)轉(zhuǎn)換后得到相同或差別很大的像素的字。 打開/etc/X11/Xresources文件,找到開頭為Xft.dpi那一行將其冒號(hào)后的值改為96(你的實(shí)際DPI)。 再打開/etc/fonts/local.conf,在<fontconfig>和</fontconfig>之間加入下面幾行: <matchtarget="pattern"> <editname="dpi" mode="assign" > <double>96</double> </edit> </match> 這5行代碼,也可以寫在/etc/fonts/fonts.conf或~/.fonts.conf中,但是不建議這么做,因?yàn)樵谏?jí)或其它設(shè)置時(shí),可能會(huì)被覆蓋。如果沒有這個(gè)文件,則創(chuàng)建一個(gè)。這是一個(gè)XML格式的文件,下面會(huì)有詳細(xì)介紹。 上面兩個(gè)修改DPI值的地方,其中GTK程序會(huì)讀取Xresources文件中的設(shè)置,而Qt程序則會(huì)應(yīng)用fonts.conf或local.conf中的設(shè)置。 三、Linux系統(tǒng)下字體顯示原理 現(xiàn)代Linux的字體處理系統(tǒng)大都采用Xft、Fontconfig和Freetype來處理字體。 Fontconfig提供了一系列字體設(shè)定的函數(shù)庫,應(yīng)用程序直接向其索取字型;還負(fù)責(zé)發(fā)現(xiàn)和自動(dòng)配置新字體,使新字體安裝變得簡單。它由兩部分組成,其一是設(shè)定模塊,把XML配置文件轉(zhuǎn)換成Fontconfig的內(nèi)部設(shè)定;另一是對比模塊,將應(yīng)用程序傳來的字體樣式需求與現(xiàn)有字體對比入修改,傳回最相似的字體。 Xft也是一套library,它使用fontconfig找出來的字型,將其繪制出來。 Freetype可以說是一種完整的字體光柵化引擎,它提供一個(gè)簡單的、易用的并且統(tǒng)一的接口實(shí)現(xiàn)對多種字體文件的訪問。目前版本是2.x,與1.x版本相比主要是支持Anti-alias和hinting。freetype的改變會(huì)影響到Xft畫出來的字。 說了這么一段大家一定頭暈了,其實(shí)我也暈了。簡單地說就是由Fontconfig選出來的字,再由Freetype決定如何去畫,最后由Xft來處理畫字。這是我個(gè)人的理解,可能可能不太準(zhǔn)確,請大家不吝指正。 四、安裝新字體 講了這么多枯燥而繁瑣的理論,可能有的讀者都已經(jīng)睡著了。好,我們下面開始進(jìn)行實(shí)際的美化操作! 安裝MScorefonts,這里http://corefonts./有下載地址和詳細(xì)的安裝方法,Redhat或Fedora的用戶可能使用下面這個(gè)命令來安裝,但前提是已經(jīng)可以上網(wǎng)并設(shè)置好yum源。 yuminstall msttcorefonts Debian/Ubuntu用戶: apt-getinstall msttcorefonts 十一種字體將會(huì)被安裝到/usr/share/fonts/msttcorefonts/目錄中。然后我們到windows中把中文字體細(xì)明體和新細(xì)明體(mingliu.ttc)、華文細(xì)黑(stxihei.ttf)也考到此目錄吧,你也可以把其它常用的中文字體(比如楷體、幼圓等)也考過來,不過在下面的配置就不體現(xiàn)它們了。而對于宋體(simsun.ttc),我們?nèi)?/font>http://wyx./jmm/Computing/SIMSUN.rar下載fromnuaa兄制作的這個(gè)版本,它帶有10-19點(diǎn)十種點(diǎn)陣字體,比Windows帶的效果更好。Fedora使用的是文鼎的宋體(uming.ttf)和楷體(ukai.ttf),實(shí)在不怎么好看,可以把它刪去,當(dāng)然你也可以保留。之后重啟X字體服務(wù)"servicexfs restart"讓系統(tǒng)自動(dòng)發(fā)現(xiàn)并配置新字體。 五、fontconfig配置 前面介紹過,fontconfig可以把應(yīng)用程序傳來的字體請求信息進(jìn)行匹配和修改,從而實(shí)現(xiàn)個(gè)性化定制,其配置文件為/etc/fonts/fonts.conf。這是一個(gè)XML文件,可以用任何編輯器編輯。但由于升級(jí)原因?qū)е麓宋募菀妆桓采w,所以建議大家把自定義的配置寫在/etc/fonts/local.conf中,這個(gè)文件與fonts.conf格式一模一樣下面是它的框架: <?xmlversion="1.0"?> <!DOCTYPEfontconfig SYSTEM "fonts.dtd"> <!--/etc/fonts/local.conf file to configure system font access --> <fontconfig> </fontconfig> 所有的配置都應(yīng)該寫在<fontconfig>和</fontconfig>之間,比如加入上面提到的設(shè)置DPI的語句,將變成下面的樣子: <?xmlversion="1.0"?> <!DOCTYPEfontconfig SYSTEM "fonts.dtd"> <!--/etc/fonts/local.conf file to configure system font access --> <fontconfig> <matchtarget="pattern"> <editname="dpi" mode="assign" > <double>96</double> </edit> </match> </fontconfig> 我們以后的設(shè)置都是在這個(gè)文件<fontconfig>和</fontconfig>之間添加語句。fontconfig配置文件的語法非常靈活和復(fù)雜,manfonts-conf可以看到非常詳細(xì)的解釋和語法說明,網(wǎng)上據(jù)說有繁體中譯版本,但我一直沒有找到。如有時(shí)間,我把它翻譯一下發(fā)到論壇上。 <matchtarget="font" > <editname="rgba" mode="assign"> <const>rgb</const><!--不同的顯示器取值有所差別--> </edit> </match> 這一段是用來啟用液晶顯示器的次像素排列,是液晶顯示器的最佳顯示方式。大家知道,液晶顯示屏的每一個(gè)點(diǎn)都是用三原色RGB來合成各種顏色,但各種液晶顯示器的RGB排列方式卻可能不同,因此,取值也有多種:rgb、bgr、vrgb、vbgr,對于CRT顯示器,應(yīng)關(guān)閉此功能(將值設(shè)為none)。如果設(shè)置錯(cuò)誤,對于開AA的字體可能看起來花花綠綠,不太舒服。 在計(jì)算機(jī)中我們把字體分為無襯線字體(SanSerif)和(有)襯線字體(Serif)。無襯線字體的筆畫沒有多余修飾,比如黑體、幼圓,英文字體有Arial、Verdana及著名的Tahoma等;而襯線字體的筆畫的起始和結(jié)束通常都有一些裝飾,使字體看起來更美觀,比如宋體、楷體,Georgia和TimesNew Roman等。 而對于英文字體,還有等寬字體(monotype)和不等寬字體,故名思義,即英文字符占用寬度是相等的或不相等的。常見的等寬字體有Andalemono、CourierNew等。絕大多數(shù)人都認(rèn)為不等寬字體具有更好的外觀和可識(shí)別性,但在計(jì)算機(jī)有的環(huán)境中卻不利于排版(比如控制臺(tái)中)。 下面對各類字體提供別名,靠前的字體優(yōu)先級(jí)高。當(dāng)應(yīng)用程序請求系統(tǒng)中沒有的字體時(shí),將自動(dòng)用后面的字體替換。 <alias> <family>sans-serif</family> <prefer> <family>Arial</family> <family>Verdana</family> <family>Tahoma</family> <family>TrebuchetMS</family> <family>SimSun</family> <family>宋體</family> <family>PMingLiU</family> <family>新細(xì)明體</family> <family>STXihei</family> <family>華文細(xì)黑</family> </prefer> </alias> <alias> <family>serif</family> <prefer> <family>TimesNew Roman</family> <family>Georgia</family> <family>SimSun</family> <family>宋體</family> <family>PMingLiU</family> <family>新細(xì)明體</family> </prefer> </alias> <alias> <family>monospace</family> <prefer> <family>CourierNew</family> <family>AndaleMono</family> <family>NSimSun</family> <family>新宋體</family> <family>MingLiU</family> <family>細(xì)明體</family> </prefer> </alias> 這里把宋體和新細(xì)明體也加入無襯線字體類別中了,因?yàn)閮?nèi)嵌點(diǎn)陣字形的宋體和新細(xì)明體,比黑體等無襯線字體會(huì)有更好的表現(xiàn)。 有的網(wǎng)頁使用了如Times,Helvetica等英文字體。原來系統(tǒng)中沒有這些字體,fontconfig將其映射到其它字體,看起來不夠美觀。我們加上下面這段: <alias> <family>Times</family> <prefer> <family>TimesNew Roman</family> </prefer> <default> <family>serif</family> </default> </alias> <alias> <family>Helvetica</family> <prefer> <family>Arial</family> </prefer> <default> <family>sans-serif</family> </default> </alias> <alias> <family>Courier</family> <prefer> <family>CourierNew</family> </prefer> <default> <family>monospace</family> </default> </alias> 前面已經(jīng)提到了hinting技術(shù),MS對每種字體做了不同的hinting,詳細(xì)可以到http://www.microsoft.com/typography/web/fonts/fonts02.htm查看,這里只貼出開頭一小部分。對于表中沒有的字體,MS也提供了工具來查看http://www.microsoft.com/typography/TrueTypeProperty21.mspx
表里的smoothed就是指打開AA,hinted是指打開hinting,both當(dāng)然就指兩者都開,單位是磅(pt)。大家看到,MS對待字體的hinting可不是一棒子打死,不同的字號(hào)是區(qū)分開的,正體、粗體、黑體等也是有區(qū)別的。我們這里要做的,就是針對不同的字體單獨(dú)設(shè)置。 先來一段總體的設(shè)置,對于沒有單獨(dú)設(shè)置的字形,就采用它了。autohint和hinting是兩種不同的字體微調(diào)技術(shù),不建議同時(shí)開啟。 <matchtarget="font" > <editname="antialias" mode="assign" > <bool>true</bool> <!-- 改成false即可關(guān)閉AA --> </edit> <editname="autohint" mode="assign" > <bool>false</bool> </edit> <editname="hinting" mode="assign" > <bool>true</bool> <!-- 改成false即可關(guān)閉hinting --> </edit> <editname="hintstyle" mode="assign" > <const>hintfull</const> <!-- 前面提到的hinting風(fēng)格,在這里設(shè)置--> </edit> </match> 表中看出,MS每種字體在0-6號(hào)字都只打開了AA,因此這段設(shè)置就是把所有MS字體0-6號(hào)開AA,關(guān)閉autohint和hinting <matchtarget="font" > <testname="foundry" qual="any" > <string>microsoft</string> <!-- 只針對MS的字體--> </test> <testname="size" compare="less_eq" > <int>6</int> </test> <editname="antialias" mode="assign" > <bool>true</bool> </edit> <editname="autohint" mode="assign" > <bool>false</bool> </edit> <editname="hinting" mode="assign" > <bool>false</bool> </edit> </match> 下面我就通過表中數(shù)據(jù)對Arial字體進(jìn)行設(shè)置,其它字體類似(為節(jié)約篇幅,這里代碼寫得很緊湊)。 <!--Arial正體 --> <matchtarget="font" > <testname="family" ><string>Arial</string></test> <testname="weight" compare="eq"><const>regular</const></test> <testname="slant" compare="eq"><const>roman</const></test> <testname="size" compare="more_eq"><int>7</int></test> <testname="size" compare="less_eq"><int>13</int></test> <editname="antialias" mode="assign"><bool>false</bool></edit> <editname="autohint" mode="assign"><bool>false</bool></edit> <editname="hinting" mode="assign"><bool>true</bool></edit> <editname="hintstyle" mode="assign"><const>hintfull</const></edit> </match> <!-- Arial 粗體 --> <matchtarget="font" > <testname="family" ><string>Arial</string></test> <testname="weight" compare="eq"><const>bold</const></test> <testname="slant" compare="eq"><const>roman</const></test> <testname="size" compare="more_eq"><int>7</int></test> <testname="size" compare="less_eq"><int>8</int></test> <editname="antialias" mode="assign"><bool>false</bool></edit> <editname="autohint" mode="assign"><bool>false</bool></edit> <editname="hinting" mode="assign"><bool>true</bool></edit> <editname="hintstyle" mode="assign"><const>hintfull</const></edit> </match> <!-- Arial 斜體 --> <matchtarget="font" > <testname="family" ><string>Arial</string></test> <testname="weight" compare="eq"><const>regular</const></test> <testname="slant" compare="eq"><const>italic</const></test> <testname="size" compare="more_eq"><int>7</int></test> <testname="size" compare="less_eq"><int>13</int></test> <editname="antialias" mode="assign"><bool>false</bool></edit> <editname="autohint" mode="assign"><bool>false</bool></edit> <editname="hinting" mode="assign"><bool>true</bool></edit> <editname="hintstyle" mode="assign"><const>hintfull</const></edit> </match> <!-- Arial 粗斜體 --> <matchtarget="font" > <testname="family" ><string>Arial</string></test> <testname="weight" compare="eq"><const>bold</const></test> <testname="slant" compare="eq"><const>italic</const></test> <testname="size" compare="more_eq"><int>7</int></test> <testname="size" compare="less_eq"><int>8</int></test> <editname="antialias" mode="assign"><bool>false</bool></edit> <editname="autohint" mode="assign"><bool>false</bool></edit> <editname="hinting" mode="assign"><bool>true</bool></edit> <editname="hintstyle" mode="assign"><const>hintfull</const></edit> </match> 大家也看到,fontconfig可讓某些字體的某些字號(hào)開啟或關(guān)閉指定的特性,用法非常靈活,參照manpage(manfonts-conf)。將MS每種字體都照表上的數(shù)據(jù)設(shè)置一下,不過工作量也太大了點(diǎn),各位同胞要是有耐心可以照此修改,把它做完。但是,我也沒發(fā)現(xiàn)這樣做了之后字體變得有多么漂亮,也許是我的審美觀有問題,或者就是太懶。所以我自己的電腦上,還是把所有字體設(shè)置一棒子打死(中文字體除外),hinting全開,hintstyle為hintfull,呵呵!別扁我! 下面的就是針對中文字體的設(shè)置了,有的中文字體由于雙寬度屬性(spacing=dual),對于中文部分幾乎沒影響,但英文部分間隙太寬,不美觀,所以將其調(diào)整為Proportional。 <matchtarget="font" > <testtarget="pattern" name="lang" compare="contains"> <string>zh</string> <string>ja</string> <string>ko</string> </test> <testname="spacing" compare="eq"> <const>dual</const> </test> <editname="spacing" mode="assign" > <const>proportional</const> </edit> <editname="globaladvance" mode="assign" > <bool>false</bool> </edit> </match> 前面提到宋體和細(xì)明體都內(nèi)嵌了點(diǎn)陣字體,下面我們就爭對有點(diǎn)陣字體的字號(hào)單獨(dú)關(guān)閉AA,讓其使用字體內(nèi)嵌的位圖字體。 <!--這里使用前面下載的宋體,它帶了10-19點(diǎn)位圖字體--> <matchtarget="font" > <testqual="any" name="family" compare="eq" > <string>SimSun</string> <string>宋體</string> <string>NSimSun</string> <string>新宋體</string> </test> <testname="pixelsize" compare="more_eq" > <int>10</int> </test> <testname="pixelsize" compare="less_eq" > <int>19</int> </test> <editname="antialias" mode="assign" > <bool>false</bool> </edit> </match> <!--細(xì)明體和新細(xì)明體,帶有11,12,13,15,16,20點(diǎn)位圖字體--> <matchtarget="font" > <testqual="any" name="family" compare="eq" > <string>MingLiU</string> <string>細(xì)明體</string> <string>PMingLiU</string> <string>新細(xì)明體</string> </test> <testname="pixelsize" compare="more_eq" > <int>11</int> </test> <testname="pixelsize" compare="less_eq" > <int>13</int> </test> <editname="antialias" mode="assign" > <bool>false</bool> </edit> </match> <matchtarget="font" > <testqual="any" name="family" compare="eq" > <string>MingLiU</string> <string>細(xì)明體</string> <string>PMingLiU</string> <string>新細(xì)明體</string> </test> <testname="pixelsize" compare="more_eq" > <int>15</int> </test> <testname="pixelsize" compare="less_eq" > <int>16</int> </test> <editname="antialias" mode="assign" > <bool>false</bool> </edit> </match> <matchtarget="font" > <testqual="any" name="family" compare="eq" > <string>MingLiU</string> <string>細(xì)明體</string> <string>PMingLiU</string> <string>新細(xì)明體</string> </test> <testname="pixelsize" compare="eq" > <int>20</int> </test> <editname="antialias" mode="assign" > <bool>false</bool> </edit> </match> 如果你覺得宋體的英文部分不美觀,可以使用其它英文字體替換掉,也就是中英文字體混用的問題,在Firefox中可以生效。 <matchtarget="pattern"> <testname="family" qual="any" > <string>SimSun</string> <string>宋體</string> <string>PMingLiU</string> <string>新細(xì)明體</string> </test> <editname="family" mode="prepend" binding="strong"> <string> |