免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 768 | 回复: 0
打印 上一主题 下一主题

HowtoCustomFontswithFontconfig [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-11 11:29 |只看该作者 |倒序浏览
Fontconfig是个强大的函式库,可以让使用者自行设定所需字型的使用法则。
如果您对本篇内容有任何疑问或建议,请与zerng07联络
Fontconfig


Fontconfig是一个函式库,提供一套字型比对的机制,使得运用Fontconfig的应用程式能得到所需的字体样式。应用程式本身可以利用Fontconfig所得到的字型来画字,也可以架构在自己原先的字型选择架构上,以达到对旧型设定的一定相容性。
功能概述


Fontconfig由两个主要的模组构成,其一是设定模组,把XML设定档转换成Fontconfig的内部设定;另一为比对模组,将应用程式传来的字型样式需求与现有字型比对,传回最相似的字型。


Fontconfig设定档的目的,即是尽量不更动字型设定,并且让各种应用程式共用一个设定。这样一来当程式之间需要交换字型名称时,所取得的字型较为一致。若字型设定能集中管理,字型的安装和个人化就会较简易而且有秩序。
设定档


如果你已经装了fontconfig,那么它应该已经附上了预设的设定档,位于/etc/fonts/ (一些Linux distributions)或/usr/X11R6/etc/fonts/ (一些BSD flavors)的fonts.conf 。



于/etc/fonts/fonts.conf是X
window的预设设定,系统更新时,可能会将您所设定过的档案覆盖掉,强烈建议不直接更改。系统全域设定建议写于/etc/fonts/conf.d
,个人设定则写在~/.fonts资料夹内,并自订名称,像是10-myfonts.conf(可以参考原本已位于此资料夹的档案),前面是个二位数
(00-99),表示设定配置档时的优先顺序,越小优先度越高。


设定档可以参考示范设定。


fontconfig的设定档储存格式为xml,这种格式可以使玩家们自由编辑。其内容包含两个重要的元素(element),test与edit,存放在match元素中。 (请见教学)
走马看花:
match target="pattern"
test qual ="any" name="属性" compare="eq"
edit name ="属性" mode="assign" binding="weak"
重要的字型性质与其型态
性质型态
family string
style string (值包括slant, weight)
slant int (值包括italic, oblique, roman)
weight int (值包括light, medium, demibold, bold, black)
size double
pixelsize double
antialias bool
autohint bool
charset charset
lang string
如需进一步说明或是想查字型性质与其型态,请见fonts-conf http://edt1023.sayya.org/fontconfig/fontconfig-user.html
重要名词介绍
Hinting



向量字型在缩放时,如果其中一笔画的线,刚好位在两个萤幕像素中间,那么应该要放在左边的格子呢?还是右边的格子?如果这时选错了,常会使字体变得歪七扭
八或变形,所以这时如果有人能告诉它,比较正确的位置在哪里,那么一来,此向量字型就会变得好看许多,而这些资讯,我们称之为—Hinting,但是有良
好Hinting的字型却不多。


Freetype有autohint的功能,可以自动为没有hinting的字型做出hinting,但是对于笔划复杂的文字(如中文),却常会有反效果。
Anti-alias


防锯齿,即是将字型先以数倍的大小来绘制,然后再缩成想要的大小,其中不满一格的格子点用灰阶补上。但是因为中文字笔划多,小字时若补上灰阶,常会使整个字看起来糊糊的(因为大部分的地方都成了灰阶),这就是为什么我们要关闭小字的防锯齿了。


虽然把有防锯齿的小英文字,放在无防锯齿的中文字间,会看起来刺眼,但是英文字不开防锯齿看起来很不舒服,所以预设打开。
Subpixel Rendering


液晶萤幕的画面,是由许多长方形小像素构成的,它的排列通常是红、绿、蓝,也就是说,如果液晶萤幕的水平解析度是1024个像素的话,就有1024 x 3 = 3072个点,而这些点是由rgbrgbrgb...依序排列的。



白底黑字为例,如果需要满格的像素,rgb三格就需是全关(0,0,0);如果只是右边三分之二部份,就关掉g和b,留下最左边的r开着。理论上,这样就
有原来三倍的水平像素能够使用,可以大幅增加液晶萤幕的解析度。但由于只开着红色或黄色或其他颜色,会有很明显的光晕,所以一般都采用filtering
的方式,把一个次像素的值往左右两格分散(因为无论对哪一格次像素来说,它的左右两格的颜色和本身都是不同的,所以往左右两格分散可以均匀影响亮度),成
为1/3, 1/3, 1/3分布;但这样的坏处是会显得太模糊了一点,于是再多一层,把原先三格分成5格,但权重改为1/9 2/9 3/9 2/9
1/9。3/9那一格就是原本的次像素,而邻近的格子就用这样的方法分散后和原来该次像素格子的光度值相加,达到像素往中央集中,却又不太模糊的效果。


Fontconfig的rgba选项,即是设定液晶萤幕次像素的排列方式,一般都是rgb,而v开头的表示三种颜色是纵向排列。
以上撷取自http://www.higherorder.org/wiki/Fontconfig -EricCheng
字型比对


当fontconfig接收到字型的样式需求时,Fontconfig会将它与电脑现有的字型逐一比对,比对其间的差距。然后从结果中选出最接近的字型。虽然一定会传回一个字型,但不保证传回的字型和需求的样式有多么相符。
教学
xml基础


首先,你的文件开头,一定要有
  
  


来表明你的档案身份。



来,你得用与这对元素把其他元素夹在里面,这种一层夹一层的树枝状结构是
xml档一大特色之一。另一特色即是每个元素皆以小于及大于符号括住,而且后面的那个需要加上倒斜线/,来表示结束。写作时,最好进行缩排,较能轻松解
读,也较不会漏掉任何一对由小于及大于符号括住的元素。


(等待扩充内容......)
内容写作指导
加入字体所在路径


避免fontconfig进行比对时找不到你所指定的字体,这里列的是一般人会放字体的地方。
/usr/share/fonts
/usr/share/fonts/local
/usr/local/share/fonts
~/.fonts
  
/usr/X11R6/lib/X11/fonts
与用法


我现在来简单地解释范例中的写法(下面可以看得到缩排用法)
  
  
      
         true
      
     

      
         false
      
      
         false
      
  


第一行,是注解,由惊叹号与两个减号开头,再加上两个减号表示结束。注意!不同于其他元素,它不是一对的。 fontconfig会将这里面包含的东西忽略。



开始的即是告诉fontconfig说,我现在要比对的目标,是字体。
元素下一行接的是元素,用来更改比对到的字体的值;其中的mode值是assign
,意思是:取代原本的值。


简单的说,这一段主要是告诉fontconfig,我要比对所有的字体,不特别挑任何一个(要挑选的
话,得加上元素,后面可以看到用法),把所有字体的antialias (防锯齿)值改成true
,hinting值改成false, autohint值改成false。所以可以看的出来,这是对所有字体设定预设的样式。




接下来,我们要看看元素的用法。
用法


同样的,我拿下面范例设定来讲解。
  
  
      
         Song
         Sun
         Kai
         Ming
      
      
         180
      
      
         true
      
  



然,首先我们还是得说:「我现在要比对的目标是字体。」。接下来,我们要把对字体作任何修改的想法写在元素中。其中的name,就是性质名称,像weight,
family等。
compare则是拿来比较用的,可以比较任何可以比的东西(这不是废话嘛?),像是数值大小,或是像这里的范例一样,比较是否有相同的字串等。



解了这些以后,我们就可以用很凶的口气(因为这是fontconfig的工作)对fontconfig说:「fontconfig!给我找出字型名称中,
含有Song(宋), Sun(宋), Kai(楷), Ming(明)这些字串的字体来。 Song
Sun Kai
Ming
」一般来说,中文字体名称都含有这些字串,像文鼎新宋、文鼎上海宋、文鼎正楷、标楷体、细明体等。



出这些字后,我们得再找出符合粗体的条件,很明显的,我们还是得要求fontconfig比较粗体的值(要不然你要怎么找出谁是粗体?)。这里有件很重要
的事情要做,就是─要记好应该包住这个值的元素,元素(这里所说的元素也就是重要的字型性质与其型态里的型态)。接下来,我们就
说:「再来,fontconfig,我要比较字体样版(pattern)中的粗细(weight),找出粗细值大于等于180的字型。
180 」


最终的一步,也就是把我们所比对到的字
体的值改掉。那么要用什么元素呢?就是啦!当然,我们要修改的值,只有允许粗体的true或取消粗体的false,这里选用的
mode还是assign。接下来,你应该想到一件很重要的事了。那就是,上面说过要注意包住这个值的元素啊,你还记得吗?而这个元素是,不清楚请查表。再写下对应的后就大功告成了,但是别忘了喔(开头结尾必须是一
对的,还记得吧!)所以就像这样:
true   
有些时候修改的效果没有显现,可能是设置了相冲突的条件,例如:一开始限定了某字体大小于等于16,又说某字体等于17时打开防锯齿,那么,你将永远看不到防锯齿效果的出现。
用法


alias元素主要功能是,为某个字体提供一个替代字体列表,越上面越优先使用,请看范例是怎么使用的。
  
  
     serif
      
         DejaVu Serif
         Bitstream Vera Serif
         Times New Roman
         Thorndale AMT
         Luxi Serif
         Nimbus Roman No9 L
         Times
         Frank Ruehl
         MgOpen Canonica
         Norasi
         Kinnari
         AR PL New Sung
         AR PL ShanHeiSun Uni
         SimSun
         MingLiu
         Kochi Mincho
         UnBatang
         Baekmuk Batang
      
  


在alias
元素内的是family以及prefer这两个元素。当然,family就是你想要替代掉的字型名称,这里是serif
,一个经常使用的字型代称,代指无衬线字型,像arial、楷体、圆体,这些都属于serif(许多网页会指定某些字型,如Times New
Roman,而serif, sans-serif,
monospace这三者都是网页最后的指定字型,也就是说,当您的系统没有它指定的字型时,才会使用它)。衬线指的是每一笔画起始处,以及结尾处所加的
小短线;衬线字多用于印刷,因为这种字体较容易阅读。为了得到较好的视觉效果,我在sans-serif列表中仍用宋体、明体,当然,如果您想用楷体也
行。 sans-serif是无衬线字,系统多预设此字型;monospace是等宽字,多用于展示程式码。
在kde环境下,更改完设定后,可以开启gtk2-based程式(ex.firefox)来看看效果。
如何应用



许有一天,你雄雄发现文鼎上海宋在显示大字时,因为没有内嵌点阵字,所以会有点糊糊的。又突然发现,
cwTeXHeiBold在显示大字时,看起来还蛮不错的,有粗体的感觉,还很像Macintosh的字体呢!
(需要者请至此下载http://cle.linux.org.tw/fonts/cwttf/ )


所以我们可能会这样想,当字体大于18时,就把AR PL ShanHeiSun Uni换成cwTeXHeiBold ,这样看起来应该美观多了吧!


我们可以这样写:




  
  
      
         AR PL New Sung
         AR PL ShanHeiSun Uni
      
      
         18
      
      
         cwTeXHeiBold
      
  


而的确,我们可以利用Fontconfig微调字体设定,达成我们的想法。下面就是范例的例图,让你看看Fontconfig的魔力! Image:FontEx.png
示范设定


如果你没有看上面的教学,也不想深入了解其中的奥秘,却想要较好看的字体设定的话(ubuntu 6.06已有内建设定档/usr/share/language-selector/fontconfig/zh_TW),直接照下面的指示做吧!
Ubuntu用户:
sudo gedit /etc/fonts/conf.d/10-myfonts.conf
Kubuntu用户:
kdesu kwrite /etc/fonts/conf.d/10-myfonts.conf


PS.以kate或kwrite修改后,系统会自动产生10-myfonts.conf~做为备份,但是位于此资料夹下的合格档案(有开头的宣告)都会被fontconfig承认,所以必得将他砍掉,以免效果无法显现,或者改用其他程式修改,例:nano。


内容如下:
  
  


  
  


/usr/share/fonts
/usr/share/fonts/local
/usr/local/share/fonts
~/.fonts
  
/usr/X11R6/lib/X11/fonts


  
  
         
                 true
         
         
                 false
         
         
                 false
         
  


  
  
         
                 宋
                 明
                 楷
                 Song
                 Sun
                 Ming
                 Kai
         
         
                 180
         
         
                 true
         
  


  
  
         
                 12
         
         
                 false
         
  


  
  
         
                 宋
                 明
                 Song
                 Sun
                 Ming
         
         
                 20
         
         
                 false
         
  


  
  
         
                 zh-tw
                 zh-cn
                 ja
                 ko
         
         
                 proportional
         
         
                 false
         
  


  
  
         
                 宋
                 明
                 楷
                 Song
                 Sun
                 Ming
                 Kai
         
         
                 8
         
         
                 12
         
         
                 12
         
  


  
  
         serif
         
                 DejaVu Serif
                 Bitstream Vera Serif
                 Times New Roman
                 Times
                 AR PL New Sung
                 AR PL ShanHeiSun Uni
                 Kochi Mincho
                 UnBatang
                 Baekmuk Batang
         
  


  
         sans-serif
         
                 DejaVu Sans
                 Bitstream Vera Sans
                 Lucida Grande
                 Helvetica
                 Arial
                 Verdana
                 AR PL New Sung
                 AR PL ShanHeiSun Uni
                 AR PL New Kai
                 AR PL ZenKai Uni
                 Kochi Gothic
                 UnDotum
                 Baekmuk Dotum
         
  


  
         monospace
         
                 DejaVu Sans Mono
                 Bitstream Vera Sans Mono
                 Andale Mono
                 Courier New
                 Courier
                 AR PL New Sung Mono
                 AR PL New Sung
                 AR PL ShanHeiSun Uni
                 Kochi Gothic
                 Baekmuk Dotum
         
  


  
         新细明体
         
                 AR PL New Sung
                 AR PL ShanHeiSun Uni
         
  


  
         标楷体
         
                 AR PL New Kai
                 AR PL KaitiM Big5
                 AR PL KaitiM GB
                 AR PL ZenKai Uni
         
  




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/56195/showart_461468.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP