|
发表于 2004-8-1 21:56:15
|
显示全部楼层
最初由 e_liming 发表
禁用了subpixel后英文的AA效果就差很多了,都变得发虚了。之前我是说错了,其实有色边比较明显的是Arial,总得来说是ms的字体,verdana, lucida等苹果字体则没有色边。如果把所有英文字体禁了AA,就没有问题,可是我觉得英文一定要AA才好看.... 
我想问问那个<rgba>tag里的<const></const>的值除了none之外还有什么参数么?
关于粗体,其实我只用fzyuanti里的粗体,刚刚试了黑体,觉得还是不大好,不过都是个人爱好了。
哦,是了,关于我指的伪粗体就是指的 artificial bold,firefly的那段fonts.conf我已经加了,可是就是不知道为什么没有效果,之前patch了fontconfig和freetype都没有用..... :-(
总得来说,只要解决了ms字体色边与artificial bold的问题,这个美化算是完美了。
再次感谢Freebird指点!
很抱歉还是没能解决你的问题,也许是我水平太低,希望下面的文章可以帮你拨开乌云见到青天,回来告诉我好信息, 不要感谢我,看看我的签名吧;)
--------------------------------------------------------------------
rgba - Bool - 決定是否要用 subpixel 的方式?懋嬜, 可以是 none (只用灰階), rgb, bgr, vrgb, vbgr
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 是將字型在幕後先以數倍的大小?砝L製,然後再縮成想要的大小,未?M一格的格子用灰階補點。由於原本 X 所支援的 logic 運算不敷使用,所以才用 XRender 的 extension ?磉_成目的。除了一般的 Anti-alias 之外,Xft 還支援了為 LCD 所設計的 subpixel rendering.
什麼是 subpixel rendering? 如果你用放大鏡去看 LCD, 會發現一個正方形的像素是由三個長方形小像素構成的。這排列通常是紅綠?#123;,也就代表如果液晶螢幕的水平解析度是 1024 個像素,它其?有 1024x3 = 3072 個點,只不過這些點是 rgbrgbrgb... 依序排列的。以白底黑字為例,如果需要?M格的像素,rgb 三格就需是全關 (0,0,0), 如果只是右邊三分之二部份, 就關掉 g 和 b, 留下最左邊的 r 開著。這樣子理論上就會有原?砣兜乃较袼乜梢允褂茫蠓黾恿艘壕災坏慕馕龆取5伸吨婚_著紅色或黃色或其他?色,會有很明顯的光暈,所以一般會採用 filtering 的方式,把一個次像素的值往左右兩格分散(因為無論對哪一格次像素?碚f,它的左右兩格的?色和本身都是不同的,所以往左右兩格分散可以均勻影響亮度),蔀?1/3, 1/3, 1/3 分?眩坏@樣的壞處是會顯得太模糊了一點,於是再多一層,把原先三格分成 5 格,但權重改為 1/9 2/9 3/9 2/9 1/9。3/9 那一格就是原本的次像素,而?近的格子就用這樣的方法分散後和原?碓摯蜗袼馗褡拥墓舛戎迪嗉樱_到像素往中央集中,卻又不太模糊的效果。Windows XP 有個 ClearType 選項可以打開對液晶螢幕顯示最佳化,其基本原理就是 subpixel rendering. Xft 也有這樣的功能,不過 Xft 做得更多,除了 subpixel 外,還加上了 anti-aliasing。Fontconfig 的 rgba 選項就是設定液晶螢幕次像素的排列方式,一般都是 rgb, v 開頭的表示三種?色是縱向排列。如果好奇的話可以拿放大鏡仔細瞧瞧,或用數位相機近拍下?矸糯笥^察。
很多問題是出在 hinting, 因為許多時候, distribution 會把 freetype 的 bytecode hinting 打開,代表使用字型內部的 bytecode ?碜 hinting 修正,如果像 freetype 預設沒有打開或是使用 freetype 裡頭的 autohinter, 有時效果不錯,有時卻不盡人意。另外 hinting 費時費力,大部分的字型設計師在做 hinting 的時候都只有針對點陣字的顯示做 hinting 的工作,這表示如果我們在顯示小字又用 anti-aliasing 的話,通常是不在字型設計師最佳化的範圍內的; 當 hinting 不當的時候,小字 anti-aliasing 就會顯得非常難看(如歪七扭八或擠成一團)。關於這方面 freetype 做了很多的努力, autohinter 也就是讓程式自己做 hinting 的演算法。由於 hinting ?在是個很棘手的問題,Mac OS X 對於 anti-aliasing 字型就都不使用 hinting. 好在 fontconfig 可以讓我們?#123;整這些細部的設定,讓我們針對個別的字型做不同的處理。
話題回到 pattern match: 要使用 pattern match, 只需要加入如下的 pattern, 它就會對所有的字型作用:
<match target="pattern">
...
</match>
中間放的可以是一連串的 test, 然後是一連串的 edit. test 的用法是:
<test qual="any|all|first|not_first"
name="屬性"
compare="eq|not_eq|less|less_eq|more|more_eq|contains|not_contains">
值
</test>
any 指的是說, 只要字型的該屬性 list 之中有一項有符合要 test 的值, test 就會成立。all 的話要 list 之中所有的都符合,first 要第一個符合, not_first 要除了第一個以外有符合的。通常只會用到 any, 預設也是 any. name 裡面填的就是前面所提的屬性, 如 name="family". compare 是比較的條件, eq 是相等, less 是小於, 以此?推。 <test> 所包住的那個值就是要用?肀容^的值,包括: int, double, string, matrix, bool 等等。一旦 test 的條件都成立, 就會進行到 edit 的階段,代表編輯符合條件上述 test 條件的屬性:
<edit name="屬性"
mode="assign|assign_replace|prepend|append|prepend_first|append_last">
值
</edit>
注意在 fontconfig 中, 屬性 (property) 可以是一個 list, 亦即一個屬性可有許多的值。 assign 是說把 match 到的值取代掉, assign_replace 是說把該 list 的所有值取代成指定的值, prepend 則是插在 list 中被 match 到的那個值的前頭, 以此?推。
fonts.conf 裡面有一個範例:
<match target="pattern">
<test name="prefer_outline">
<bool>true</bool>
</test>
<test name="family">
<string>Times</string>
</test>
<edit name="family" mode="prepend" binding="same">
<string>Times New Roman</string>
</edit>
</match>
這個 pattern match 是說, 當 prefer_outline 的值是 true 的時候, 而且字型的 family 又叫做 Times, 那麼就把它的 family list 前面加入 Times New Roman。這樣做的原因是, Times 本身是點陣字, 如果希望在許多應用程式指定用 Times 顯示時, 不要用點陣字顯示, 而要用 Times New Roman 這個 TrueType 字型顯示, 這樣可以把 Times New Roman 的優先權提在 Times 的前面。 Family matching 是另一種 match 方法,它的用法和 pattern matching 差不多,只是它是針對個別字型的屬性作修改,用法是:
<match target="font">
...
</match>
舉個例子,如果我想讓所有字型預設能夠打開 anti-aliasing, hinting ?K且使用 subpixel rendering, 我就寫:
<match target="font">
<edit name="antialias"><bool>true</bool></edit>
<edit name="rgba" mode="assign"><const>rgb</const></edit>
<edit name="hinting"><bool>true</bool></edit>
</match>
但是我可能覺得 Luxi Mono 這個字型在某些時候, subpixel 不太好看, 我就寫:
<match target="font">
<test name="family"><string>Luxi Mono</string></test>
<edit name="rgba"><const>none</const></edit>
</match> |
|