LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1037|回复: 11

fontconfig設定的優先權

[复制链接]
发表于 2011-4-23 10:06:27 | 显示全部楼层 |阅读模式
我發現以下两個wqy-zenhei装的fontconfig conf檔:
  1. eselect fontconfig list
  2. ...
  3.   [26]  43-wqy-zenhei-sharp.conf
  4.   [27]  44-wqy-zenhei.conf
  5. ...
  6.   [30]  50-user.conf *
  7. ...
复制代码

如果采用了好像會蓋過用户自己的~/.fonts.conf。我的~/.fonts.conf基本上有一系列generic family的prefer list:
  1. <alias>  <!-- serif prefer list-->
  2.     <family>serif</family>
  3.     <prefer>
  4.       <family>DejaVu Serif</family>
  5.       <family>Bitstream Vera Serif</family>
  6.       ...      
  7.       <family>Adobe 仿宋 Std</family>
  8.       ...
  9.     </prefer>
  10.   </alias>
复制代码

那两个wqy的conf档也是一系列的<alias><prefer>而已:
  1. <?xml version="1.0"?>
  2. <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
  3. <!-- WenQuanYi Zen Hei Configure File -->
  4. <fontconfig>
  5.         <alias>
  6.                 <family>serif</family>
  7.                 <prefer>
  8.                         <family>Bitstream Vera Serif</family>
  9.                         <family>DejaVu Serif</family>
  10.                         <family>WenQuanYi Zen Hei Sharp</family>
  11.                 </prefer>
  12.         </alias>
  13.         <alias>
  14.                 <family>sans-serif</family>
  15.                 <prefer>
  16.                         <family>DejaVu Sans</family>
  17.                         <family>Bitstream Vera Sans</family>
  18.                         <family>WenQuanYi Zen Hei Sharp</family>
  19.                 </prefer>
  20.         </alias>
  21. </fontconfig>
复制代码


例如上面我用Adobe的宋體来做一般的中文serif字體。但如果采用以上43-wqy和44-wqy 的話原本用宋體網頁會變成黑體。fontconfig排列數序較前的設定比較優先嗎?
发表于 2011-4-23 16:24:16 | 显示全部楼层
按照我的理解,fontconfig处理conf.d(以及其他通过<include>包含的配置文件夹)时是按文件名的数字排列顺序来处理的,因此"43-wqy-zenhei-sharp.conf"和"44-wqy-zenhei.conf"的处理是在"50-user.conf"之前。

fontconfig对字体的处理是通过一个font matching列表来实现的,具体可见:http://www.freedesktop.org/softw ... fig-user.html#AEN25
比如,如果某个程序要求字体"serif",一开始的font matching list就是"serif";
当处理"43-wqy-zenhei-sharp.conf"时,fontconfig会将列表中的"serif"之前加入<prefer>中的字体,这个列表变为"Bitstream Vera Serif, DejaVu Serif, WenQuanYi Zen Hei Sharp, serif";
此时再处理~/.fonts.conf,fontconfig会将列表中的"serif"之前加入此文件中<prefer>的字体,这个列表变为"Bitstream Vera Serif, DejaVu Serif, WenQuanYi Zen Hei Sharp, DejaVu Serif, Bitstream Vera Serif, Adobe 仿宋 Std, serif"。这样"WenQuanYi Zen Hei Sharp"就优先于"Adobe 仿宋 Std"被使用。

我自己为了避免这个问题,eselect fontconfig中只启用了极少的conf文件,大部分配置都在local.conf中做出。
回复 支持 反对

使用道具 举报

发表于 2011-4-23 16:31:21 | 显示全部楼层
只要启用了50-user.conf就会 .fonts.conf或.font.conf.d优先。
可能还需要在.fonts.conf 里设定标头 <?xml, <!DOCTYPE 之类的吧?

如果想用宋体,还可以启用wqy-sharp试试,这样自动用wqy内嵌的点阵宋体。
回复 支持 反对

使用道具 举报

发表于 2011-4-23 16:33:09 | 显示全部楼层
另外,配置文件的序列(数字)跟优先级没有关系,只是分类。UBUNTU的/etc/fonts/conf.d/里有个README文件,里面有写。
回复 支持 反对

使用道具 举报

发表于 2011-4-23 21:51:09 | 显示全部楼层
Post by gentlog;2136171
另外,配置文件的序列(数字)跟优先级没有关系,只是分类。UBUNTU的/etc/fonts/conf.d/里有个README文件,里面有写。

/etc/conf.d/README:
  1. ...
  2. The files are loaded in numeric order, the structure of the configuration
  3. has led to the following conventions in usage:
  4. ...
复制代码
即配置文件夹的文件依照数字顺序被读取,配置文件前缀数字越小,越先读取和处理。也就是说对于对字体属性的修改和字体的替换,配置文件前缀数字越大,可以覆盖之前文件的修改,优先级越高;但对<alias>是个例外,参见我前一回复的分析。

事实上我为了求证这一点还看了下fontconfig的源代码: ./src/fcxml.c
  1. static FcBool
  2. FcConfigParseAndLoadDir (FcConfig        *config,
  3.                          const FcChar8        *name,
  4.                          const FcChar8        *dir,
  5.                          FcBool                complain)
  6. {
  7. // Blah blah blah...
  8.     if (ret)
  9.     {
  10.         int i;
  11.         qsort (files->strs, files->num, sizeof (FcChar8 *),
  12.                (int (*)(const void *, const void *)) FcSortCmpStr);
  13.         for (i = 0; ret && i < files->num; i++)
  14.             ret = FcConfigParseAndLoad (config, files->strs[i], complain);
  15.     }
复制代码
注意qsort()一行,fontconfig读取配置文件时,严格意义上说,是按配置文件文件名的字符编码(ASCII?)顺序读取,文件名字符编码小的配置文件先被读取。
回复 支持 反对

使用道具 举报

发表于 2011-4-23 21:58:22 | 显示全部楼层
ooooops!!!

我没仔细看就胡扯(没读注释),现眼了。感谢指出。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-24 04:51:02 | 显示全部楼层
我懂了。就是fontconfig處理<prefer>的方法是像queue一樣一直往後加。和我想它先處理用户的<prefer>相反。而因為用户檔後處理所以被忽略。
我覺得這樣很怪因為用户檔裡有其他例如關於hinting, anitialiasing, subpixel rendering的設定却會盖過更前處理的10-sub-pixel-rgb.conf等。
回复 支持 反对

使用道具 举报

发表于 2011-6-10 01:05:15 | 显示全部楼层
我将/etc/fonts/conf.d 里的链接都删掉,然后在~/.fonts.conf.d里加链接,怎么不起作用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-10 07:11:08 | 显示全部楼层
Post by i18n;2142148
我将/etc/fonts/conf.d 里的链接都删掉,然后在~/.fonts.conf.d里加链接,怎么不起作用


你把50-user.conf也删掉了吧。
回复 支持 反对

使用道具 举报

发表于 2011-6-10 12:16:39 | 显示全部楼层
大家討論這麼多理論性的東西,
不如給幾個各位配置的localfont.conf來得實在,
更能夠身體力行,:-)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表