Linux字体美化第3篇其实应该放到最前边的,因为这篇讲得是字体美化原理。 关于字体美化原理,下文会逐点进行讲述。 1)两套字体系统 inux下主要有两套字体系统,X11核心字体系统和xft字体系统。其中,应用越来越广泛的是xft字体系统。gtk2、qt等都采用xft方式进行字体渲染。xft本身并没有配置的功能,需要借助另外一个库fontconfig来对xft进行配置。 2)fontconfig的工作机理 当应用程序需要显示文字时,会向fontconfig发送字体样板(pattern),其中包含部分需要显示的字体信息,例如字体名称,风格,字号等等。 fontconfig收到pattern后,按照配置文件中的内容对pattern进行修改,以实现一些控制功能。接着,fontconfig按照某种算 法从系统目前安装的字体中挑选出最接近pattern的一个,并根据这个字体的相关信息将pattern中的信息完善,返回给应用程序。应用程序根据收到 的详细字体信息选择具体的渲染程序(例如freetype)进行显示和渲染,我们才能看到具体的字体效果。 Fontconfig提供了一系列字体设定的函数库,应用程序直接向其索取字型;还负责发现和自动配置新字体,使新字体安装变得简单。它由两部分组成,其一是设定模块,把XML配置文件转换成Fontconfig的內部设定;另一是对比模块,将应用程序传来的字体样式需求与现有字体对比入修改,传回最相似的字体。 Xft也是一套library,它使用fontconfig找出来的字型,将其绘制出来。 Freetype可以说是一种完整的字体光栅化引擎,它提供一个简单的、易用的并且统一的接口实现对多种字体文件的访问。目前版本是2.x,与1.x版本相比主要是支持Anti-alias和hinting。freetype的改变会影响到Xft画出来的字。 3)点阵字体与矢量字体(TrueType) 大家知道PC的 显示器是点阵显示设备,图像显示的精细程度取决于显示器的分辨率。文字也必须转换为点阵信息方可正常显示。于是人们设计制作了点阵字体,这种字体类似于位 图图像,以点阵详细记录了字体大小、形状;这样字体信息被读取后不需要任何转换就可直接在显示器上显示,由于制作精细,因此显示效果也是{zh0}的。但这种字 体不能缩放,需要为每种字号制作点阵信息才能满足不同大小字体的显示,因此导致字体制作工作量大、耗时、占用空间大等问题。后来人们设计了矢量字体,它是 用矢量图形记录了笔画和字形等信息,解决了字体缩放的问题。 矢量字体在显示时转换为点阵信息后才能显示,在小字体情况下,转换得到的点阵信息质量与点阵字体相差甚远,导致小字体显示效果很差。因此人们取两种字体之长,设计了一种即包括小字体点阵信息,又包括矢量字形的字体。比如xx的宋体(simsun),它包括12、13、14、15、16、18点的点阵字库,还包括矢量字形。 矢量字体涉及到以下两个概念: AA(anti-alias)抗锯齿技术,它将字型以实际数倍大小绘制,然后缩放成想要的大小,未能占满一格像素的格子就用灰阶填补。对于英文字符,因其笔划简单,所以比较美观,但对于中文小字体,会导致文字看起来发虚,模糊不清的问题。 hinting字体微调技术,它是字体的一种额外信息,嵌入字体内部,告诉字体渲染引擎如何渲染字体,使用字体看起来更美观。但hinting制作复杂,非常耗时,所以带有良好hinting的字体并不多(特别是中文字体)。对于字体的hinting有四种风格hintnone、hintslight、hintmedium、hintfull,分别是指无hinting、轻度hinting、中等hinting、xxhinting。 但hinting如果调整不好,可能导致字体显示并不好看,且由于hinting是有专利的,不能免费无限制地使用,freetype又做出了自己的字体微调技术autohint,经过不断改进,已经改善了部分字体的显示效果。autohint是通过程序来实现的,并且是针对所有字体,当然不可能有专门为每种字体制作的hinting技术效果好。 4)DPI DPI(DotperInch),这是一个印刷上的单位,是指每英寸上的油墨点数。这里把DPI用来描述显示器上每英寸所包括的像素(Pixel),其值越高越精细,显示效果就越好。由于显示器的分辨率、点距(或珊距)及尺寸的不同,因此不同显示器的DPI也有差别。 那么我们如果计算自己显示器的DPI呢?先测出自己显示器的宽(width)和高(height),单位是cm,知道显示器的分辨率。注意,如果是液晶显示器,则它只有一个分辨率即其{zd0}分辨率。对于CRT显示器,它可以用多种分辨率,你先将其调整为最合适的分辨率(比如17寸CRT显示器调整为1024*768)。由于1(inch)=2.54(cm),于是有下面的公式: 水平DPI=(水平分辨率/width)*2.54 垂直DPI=(垂直分辨率/height)*2.54 有的显示器上水平DPI和垂直DPI有少许出入,这也是正常的。 大家可以看出,同样像素的字体在高DPI的显示器上显示出来会较小。既然不同显示器的DPI不同,那么用像素来描述字的大小显然不合适,于是还有一个字体大小的单位:磅(point)。 1磅=1/72英寸。 不管何种大小的字体,最终都要换算成像素之后,才能在屏幕上显示。那么像素(px)和磅(pt)换算关系为: px=pt*DPI/72 用这个公式可以算出,一个9磅的字在96DPI的显示器上用12像素来显示,但在75DPI的显示器上却只用9像素来显示。因此如果你的系统里为显示器设置了错误的DPI,那么最终显示出来的字将是不正常的大小。 请注意,Firefox里设置的字体大小是以像素(px)为单位,在系统其它你能看到的绝大多数地方,都是以磅(pt)为字体大小单位。 参考文档: 1)http://www.x.org/archive/X11R6.8.2/doc/fonts.html 2)http://hi.baidu.com/%D4%C2%D4%C2%D7%D0/blog/item/880076f3cd90c6ce0a46e00b.html 3)http://www.cnitblog.com/zouzheng/articles/39238.html |