edora7(Moonshine)发布也有一段时间了,这个版本包含了GNOME2.18和KDE3.5.6,美工有很大的提高;使用Xorg1.3版本,对nVidia显卡支持很好,支持显示器的热插拔和自动识别;yum性能也得到很大的提升,其它各方面的表现都很不错的,唯一的缺点就是中文字体显示不够完美。虽然比FC6有了极大的提高,但还是赶不上Ubuntu7.04。于是就有了自己动手美化中文显示的想法,下面我把美化过程的整理给大家。
试验环境:Fedora7,KDE3.5.6,在GNOME和其它发行版本上差别应该不大。
首先,我们来了解一些关于字体方面的知识。
一、点阵字体(BDF)与矢量字体(TrueType)
大家知道PC的
显示器是点阵显示设备,图像显示的精细程度取决于显示器的分辨率。文字也必须转换为点阵信息方可正常显示。于是人们设计制作了点阵字体,这种字体类似于位
图图像,以点阵详细记录了字体大小、形状;这样字体信息被读取后不需要任何转换就可直接在显示器上显示,由于制作精细,因此显示效果也是最好的。但这种字
体不能缩放,需要为每种字号制作点阵信息才能满足不同大小字体的显示,因此导致字体制作工作量大、耗时、占用空间大等问题。后来人们设计了矢量字体,它是
用矢量图形记录了笔画和字形等信息,解决了字体缩放的问题。
矢量字体在显示时转换为点阵信息后才能显示,在小字体情况下,转换得到的点阵信息质量与点阵字体相差甚远,导致小字体显示效果很差。因此人们取两种字体之长,设计了一种即包括小字体点阵信息,又包括矢量字形的字体。比如著名的宋体(simsun),它包括12、13、14、15、16、18点的点阵字库,还包括矢量字形。
矢量字体涉及到以下两个概念:
AA(anti-alias)抗锯齿技术,它将字型以实际数倍大小绘制,然后缩放成想要的大小,未能占满一格像素的格子就用灰阶填补。对于英文字符,因其笔划简单,所以比较美观,但对于中文小字体,会导致文字看起来发虚,模糊不清的问题。
hinting字体微调技术,它是字体的一种额外信息,嵌入字体内部,告诉字体渲染引擎如何渲染字体,使用字体看起来更美观。但hinting制作复杂,非常耗时,所以带有良好hinting的字体并不多(特别是中文字体)。对于字体的hinting有四种风格hintnone、hintslight、hintmedium、hintfull,分别是指无hinting、轻度hinting、中等hinting、完全hinting。
但hinting如果调整不好,可能导致字体显示并不好看,且由于hinting是有专利的,不能免费无限制地使用,freetype又做出了自己的字体微调技术autohint,经过不断改进,已经改善了部分字体的显示效果。autohint是通过程序来实现的,并且是针对所有字体,当然不可能有专门为每种字体制作的hinting技术效果好。
二、重要的概念:DPI
DPI(DotperInch),这是一个印刷上的单位,是指每英寸上的油墨点数。这里把DPI用来描述显示器上每英寸所包括的像素(Pixel),其值越高越精细,显示效果就越好。由于显示器的分辨率、点距(或珊距)及尺寸的不同,因此不同显示器的DPI也有差别。
那么我们如果计算自己显示器的DPI呢?先测出自己显示器的宽(width)和高(height),单位是cm,知道显示器的分辨率。注意,如果是液晶显示器,则它只有一个分辨率即其最大分辨率。对于CRT显示器,它可以用多种分辨率,你先将其调整为最合适的分辨率(比如17寸CRT显示器调整为1024*768)。由于1(inch)=2.54(cm),于是有下面的公式:
水平DPI=(水平分辨率/width)*2.54
垂直DPI=(垂直分辨率/height)*2.54
有的显示器上水平DPI和垂直DPI有少许出入,这也是正常的。
大家可以看出,同样像素的字体在高DPI的显示器上显示出来会较小。既然不同显示器的DPI不同,那么用像素来描述字的大小显然不合适,于是还有一个字体大小的单位:磅(point)。
磅是重量单位?不,此磅非彼磅,在这里,它才是字体大小的绝对度量(没忘记MSWord里的行距的单位吧)。
1磅=1/72英寸。
不管何种大小的字体,最终都要换算成像素之后,才能在屏幕上显示。那么像素(px)和磅(pt)换算关系为:
px=pt*DPI/72
用这个公式可以算出,一个9磅的字在96DPI的显示器上用12像素来显示,但在75DPI的显示器上却只用9像素来显示。因此如果你的系统里为显示器设置了错误的DPI,那么最终显示出来的字将是不正常的大小。
请注意,Firefox里设置的字体大小是以像素(px)为单位,在系统其它你能看到的绝大多数地方,都是以磅(pt)为字体大小单位。
好了,我们来看看自己Xserver的DPI设置:
$xdpyinfo |grep resolution
resolution: 75x75 dots per inch
通过上面的方法已经得知我的显示器DPI约为96,这里却设为75,明显不正确。打开/etc/X11/xorg.conf,在Section"monitor"段中加入DisplaySize参数:
Section"Monitor"
……
DisplaySize 270 203 # 1024x768 96pi
EndSection
重启X后,再使用上述xdpyinfo命令便可看到效果。不管实际的DPI是多少,都建议你将DPI值设为6甚至12的倍数。因为我们使用磅来计算字体大小,在转换时采用舍入方法来选择邻近的值作为字体最终的大小(像素),如果DPI值不为6或12的倍数,将可能导致相邻的字号转换后得到相同或差别很大的像素的字。
打开/etc/X11/Xresources文件,找到开头为Xft.dpi那一行将其冒号后的值改为96(你的实际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中,但是不建议这么做,因为在升级或其它设置时,可能会被覆盖。如果没有这个文件,则创建一个。这是一个XML格式的文件,下面会有详细介绍。
上面两个修改DPI值的地方,其中GTK程序会读取Xresources文件中的设置,而Qt程序则会应用fonts.conf或local.conf中的设置。
三、Linux系统下字体显示原理
现代Linux的字体处理系统大都采用Xft、Fontconfig和Freetype来处理字体。
Fontconfig提供了一系列字体设定的函数库,应用程序直接向其索取字型;还负责发现和自动配置新字体,使新字体安装变得简单。它由两部分组成,其一是设定模块,把XML配置文件转换成Fontconfig的內部设定;另一是对比模块,将应用程序传来的字体样式需求与现有字体对比入修改,传回最相似的字体。
Xft也是一套library,它使用fontconfig找出来的字型,将其绘制出来。
Freetype可以说是一种完整的字体光栅化引擎,它提供一个简单的、易用的并且统一的接口实现对多种字体文件的访问。目前版本是2.x,与1.x版本相比主要是支持Anti-alias和hinting。freetype的改变会影响到Xft画出来的字。
说了这么一段大家一定头晕了,其实我也晕了。简单地说就是由Fontconfig选出来的字,再由Freetype决定如何去画,最后由Xft来处理画字。这是我个人的理解,可能可能不太准确,请大家不吝指正。
四、安装新字体
讲了这么多枯燥而繁琐的理论,可能有的读者都已经睡着了。好,我们下面开始进行实际的美化操作!
安装MScorefonts,这里http://corefonts.sourceforge.net/有下载地址和详细的安装方法,Redhat或Fedora的用户可能使用下面这个命令来安装,但前提是已经可以上网并设置好yum源。
yuminstall msttcorefonts
Debian/Ubuntu用户:
apt-getinstall msttcorefonts
十一种字体将会被安装到/usr/share/fonts/msttcorefonts/目录中。然后我们到windows中把中文字体细明体和新细明体(mingliu.ttc)、华文细黑(stxihei.ttf)也考到此目录吧,你也可以把其它常用的中文字体(比如楷体、幼圆等)也考过来,不过在下面的配置就不体现它们了。而对于宋体(simsun.ttc),我们去http://wyx.nbtvu.net.cn/jmm/Computing/SIMSUN.rar下载fromnuaa兄制作的这个版本,它带有10-19点十种点阵字体,比Windows带的效果更好。Fedora使用的是文鼎的宋体(uming.ttf)和楷体(ukai.ttf),实在不怎么好看,可以把它删去,当然你也可以保留。之后重启X字体服务"servicexfs restart"让系统自动发现并配置新字体。
五、fontconfig配置
前面介绍过,fontconfig可以把应用程序传来的字体请求信息进行匹配和修改,从而实现个性化定制,其配置文件为/etc/fonts/fonts.conf。这是一个XML文件,可以用任何编辑器编辑。但由于升级原因导致此文件容易被覆盖,所以建议大家把自定义的配置写在/etc/fonts/local.conf中,这个文件与fonts.conf格式一模一样下面是它的框架:
<?xmlversion="1.0"?>
<!DOCTYPEfontconfig SYSTEM "fonts.dtd">
<!--/etc/fonts/local.conf file to configure system font access -->
<fontconfig>
</fontconfig>
所有的配置都应该写在<fontconfig>和</fontconfig>之间,比如加入上面提到的设置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>
我们以后的设置都是在这个文件<fontconfig>和</fontconfig>之间添加语句。fontconfig配置文件的语法非常灵活和复杂,manfonts-conf可以看到非常详细的解释和语法说明,网上据说有繁体中译版本,但我一直没有找到。如有时间,我把它翻译一下发到论坛上。
<matchtarget="font" >
<editname="rgba" mode="assign">
<const>rgb</const><!--不同的显示器取值有所差别-->
</edit>
</match>
这一段是用来启用液晶显示器的次像素排列,是液晶显示器的最佳显示方式。大家知道,液晶显示屏的每一个点都是用三原色RGB来合成各种颜色,但各种液晶显示器的RGB排列方式却可能不同,因此,取值也有多种:rgb、bgr、vrgb、vbgr,对于CRT显示器,应关闭此功能(将值设为none)。如果设置错误,对于开AA的字体可能看起来花花绿绿,不太舒服。
在计算机中我们把字体分为无衬线字体(SanSerif)和(有)衬线字体(Serif)。无衬线字体的笔画没有多余修饰,比如黑体、幼圆,英文字体有Arial、Verdana及著名的Tahoma等;而衬线字体的笔画的起始和结束通常都有一些装饰,使字体看起来更美观,比如宋体、楷体,Georgia和TimesNew Roman等。
而对于英文字体,还有等宽字体(monotype)和不等宽字体,故名思义,即英文字符占用宽度是相等的或不相等的。常见的等宽字体有Andalemono、CourierNew等。绝大多数人都认为不等宽字体具有更好的外观和可识别性,但在计算机有的环境中却不利于排版(比如控制台中)。
下面对各类字体提供别名,靠前的字体优先级高。当应用程序请求系统中没有的字体时,将自动用后面的字体替换。
<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>新細明體</family>
<family>STXihei</family>
<family>华文细黑</family>
</prefer>
</alias>
<alias>
<family>serif</family>
<prefer>
<family>TimesNew Roman</family>
<family>Georgia</family>
<family>SimSun</family>
<family>宋体</family>
<family>PMingLiU</family>
<family>新細明體</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>CourierNew</family>
<family>AndaleMono</family>
<family>NSimSun</family>
<family>新宋体</family>
<family>MingLiU</family>
<family>細明體</family>
</prefer>
</alias>
这里把宋体和新细明体也加入无衬线字体类别中了,因为内嵌点阵字形的宋体和新细明体,比黑体等无衬线字体会有更好的表现。
有的网页使用了如Times,Helvetica等英文字体。原来系统中没有这些字体,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>
前面已经提到了hinting技术,MS对每种字体做了不同的hinting,详细可以到http://www.microsoft.com/typography/web/fonts/fonts02.htm查看,这里只贴出开头一小部分。对于表中没有的字体,MS也提供了工具来查看http://www.microsoft.com/typography/TrueTypeProperty21.mspx
Font name
|
Smoothing and hinting*
|
Also supplied with
|
Smoothed
|
Hinted
|
Both
|
Arial
|
0-6
|
7-13
|
14+
|
.Windows
.Web fonts
|
Arial Bold
|
0-6
|
7-8
|
9+
|
Arial Italic
|
0-6
|
7-13
|
14+
|
Arial Bold Italic
|
0-6
|
7-8
|
9+
|
表里的smoothed就是指打开AA,hinted是指打开hinting,both当然就指两者都开,单位是磅(pt)。大家看到,MS对待字体的hinting可不是一棒子打死,不同的字号是区分开的,正体、粗体、黑体等也是有区别的。我们这里要做的,就是针对不同的字体单独设置。
先来一段总体的设置,对于没有单独设置的字形,就采用它了。autohint和hinting是两种不同的字体微调技术,不建议同时开启。
<matchtarget="font" >
<editname="antialias" mode="assign" >
<bool>true</bool> <!-- 改成false即可关闭AA -->
</edit>
<editname="autohint" mode="assign" >
<bool>false</bool>
</edit>
<editname="hinting" mode="assign" >
<bool>true</bool> <!-- 改成false即可关闭hinting -->
</edit>
<editname="hintstyle" mode="assign" >
<const>hintfull</const> <!-- 前面提到的hinting风格,在这里设置-->
</edit>
</match>
表中看出,MS每种字体在0-6号字都只打开了AA,因此这段设置就是把所有MS字体0-6号开AA,关闭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>
下面我就通过表中数据对Arial字体进行设置,其它字体类似(为节约篇幅,这里代码写得很紧凑)。
<!--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可让某些字体的某些字号开启或关闭指定的特性,用法非常灵活,参照manpage(manfonts-conf)。将MS每种字体都照表上的数据设置一下,不过工作量也太大了点,各位同胞要是有耐心可以照此修改,把它做完。但是,我也没发现这样做了之后字体变得有多么漂亮,也许是我的审美观有问题,或者就是太懒。所以我自己的电脑上,还是把所有字体设置一棒子打死(中文字体除外),hinting全开,hintstyle为hintfull,呵呵!别扁我!
下面的就是针对中文字体的设置了,有的中文字体由于双宽度属性(spacing=dual),对于中文部分几乎没影响,但英文部分间隙太宽,不美观,所以将其调整为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>
前面提到宋体和细明体都内嵌了点阵字体,下面我们就争对有点阵字体的字号单独关闭AA,让其使用字体内嵌的位图字体。
<!--这里使用前面下载的宋体,它带了10-19点位图字体-->
<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>
<!--细明体和新细明体,带有11,12,13,15,16,20点位图字体-->
<matchtarget="font" >
<testqual="any" name="family" compare="eq" >
<string>MingLiU</string>
<string>細明體</string>
<string>PMingLiU</string>
<string>新細明體</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>細明體</string>
<string>PMingLiU</string>
<string>新細明體</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>細明體</string>
<string>PMingLiU</string>
<string>新細明體</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>新細明體</string>
</test>
<editname="family" mode="prepend" binding="strong">
<string>Arial</string> <!-- 将英文不等宽字体替换为Arial-->
</edit>
</match>
<matchtarget="pattern">
<testname="family" qual="any" >
<string>NSimSun</string>
<string>新宋体</string>
<string>MingLiU</string>
<string>細明體</string>
</test>
<editname="family" mode="prepend" binding="strong">
<string>CourierNew</string> <!-- 英文等宽字体替换为CourierNew -->
</edit>
</match>
我将英文不等宽字体替换为Arial,等宽字体替换为CourierNew,如果你更喜欢其它英文字体,在上面注释处直接更改就可以了。
六、关于字体的修改
关于fontconfig配置文件的写法我们就写到这里了,但其配置灵活,能实现的远不只这里说提到的功能,更多的写法还需要大家去发掘。由于Linux系统中GUI应用程序有很多种,如GTK1程序,GTK2及Qt程序,有的支持fontconfig,有的不支持,还有一些特殊程序拥有自己的画字引擎,所以前面提到的配置不可能在所有的程序中生效。比如刚才提到的字体替换技术在Qt程序中好像不起作用,由于宋体内嵌的位图字体没有包括英文部分点阵,导致不开AA的情况下英文部分显示丑陋,但如果开AA,小号中文字体显示又不理想。于是我们就会想是否可以为其加上英文部分的点阵,让宋体在任何地方都有较好的显示效果,这能不能行得通呢?答案是肯定的。下面就为大家介绍如何使用工具来为宋体加上英文部分点阵。
工具准备:
fontforge,可直接对点阵字体或矢量字形进行编辑,这是我们的主要工具。工作平台:linux。下载地址:http://fontforge.sourceforge.net/
sbit32,工作平台:windows。下载地址:http://www.linuxfans.org/nuke/modules/Forums/files/sbit.zip
ttctool,工作平台:windows。下载地址:http://www.linuxfans.org/nuke/modules/Forums/files/TTCTOOL_213.zip
ttc字体是由多个ttf字体合并而来的。fontforge可以直接打开ttc字体,但当我们打开simsun.ttc时,发现其读不到13、15、18点阵位图字体,同样打开fromnuaa兄制作的那款宋体也有同样的问题。这并不是因为宋体中没有包含这三种位图点阵,而是因为这三种点阵的flag=0(正常应为1)的缘故。解决方法是使用sbit32分离出这出这三种点阵信息,将它们从原字体中删除后再加入,就可以使其flag变为1,从而可以用fontforge打开编辑。但sbit32不支持ttc文件,因此我们需要先使用ttctool将ttc字体分解为ttf字体。
1.分割ttc字体为两个ttf字体
解压TTCTOOL_213.zip,打开windows命令行,进入解压目录操作
D:\>cdTTCTOOL_213
D:\TTCTOOL_213>breakttc simsun.ttc
这里我们使用fromnuaa兄制作的这款宋体。这步操作完成之后生成两个ttf字体,font000.ttf和font001.ttf,其中一个是宋体,另一个是新宋体。由于宋体和新宋体除了英文部分是否是等宽的之外,其它一模一样,以后我们就只对宋体进行操作,去掉新宋体。
2.将flag=0的那部分点阵信息保存为单独的文件
解压sbit32,同样我们也打开windows命令行,进入解压目录,将刚才生成的宋体(ttf)考贝到这里来,还是将字体文件名改为simsun.ttf吧。
D:\sbit>sbit32-v -i simsun.ttf
这条命令将看到字体的详细信息,我们主要是看字体包含那些字号的点阵和它的flag。这里看到13、15、18点阵字体的flag=0。
Sbit目录中有一个文件sample.met,用记事本打开它,可以看到其中只有几个字符ppemxx,我们将其改为ppem13,然后保存。
D:sbit>sbit32-x simsun.ttf sample.met 13.bdf
这条命令就将simsun.ttf文件中内嵌的13点位图点阵保存为13.bdf了。我们再修改sample.met文件为ppem15,然后用sbit32-x simsun.ttf sample.met 15.bdf把15点位图字体保存下来了,同理,把18点位图字体保存下来。
3.删除simsun.ttf字体中内嵌的flag=0的点阵字体
把sample.met文件的内容改为ppem13,再用这个命令得到一个不包含13点位图字体的simsun1.ttf
D:\sbit>sbit32-d simsun.ttf sample.met simsun1.ttf
再修改sample.met内容为ppem15,用下面这个命令得到一个不包含13、15点位图字体的simsun2.ttf
D:\sbit>sbit32-d simsun1.ttf sample.met simsun2.ttf
同样的方法,得到一个不包含13、15、18点位图字体的simsun3.ttf
4.将刚才保存的bdf文件全部加入simsun3.ttf中
修改sample.met文件为ppem13,运行下面这条命令得到simsun4.ttf,包含了13点位图字体。
D:\sbit>sbit32-a simsun3.ttf 13.bdf sample.met simsun4.ttf
同样的方法,可由simsun4.ttf得到simsun5.ttf,再得到包含了10-19所有位图字体的simsun6.ttf。我们迂回地做了这么多工作得到的simsun6.ttf,其实就是把13、15、18点位图字体的flag变为了1,其它与simsun.ttf一模一样。有的读者可能会问,直接把第2步生成的bdf文件导入fontforge编辑不就行了吗?愦憾的是fontforge并不能正常地打开这些bdf文件。以下的工作,我们就用fontforge打开simsun6.ttf来添加英文点阵了。
5.使用fontforge编辑字体。
fontforge的安装是非常简单的,对于Fedora,除了在上面给出的地址下载安装外,还可以使用yuminstallfontforge命令自动安装。在终端下输入fontforge开始运行,你可能觉得界面也太丑了,不过还好是中文的。开始运行时就提示你打开一个字体,选择刚才生成的simsun6.ttf,等会儿会提示你载入位图字体,这时你应该可以看到10-19共10种位图字体(如果少了几种,那么刚才的工作就没做好),点[选择全部],再点[是]打开字体。主界面以方格的形式显示每个字的形状。
点[查看]菜单,菜单最下面可看到10-19十项菜单,点选它们主界面就切换到点阵位图字体查看状态,双击其中一个字,就可对这个字进行点阵信息编辑。我们的目标是对添加英文字体位图点阵,你可以手动一个个编辑,也可以将其它英文位图字体导入,这是一项十分繁琐的工作,不过不用担心,我已经帮大家做好了。
firefox浏览网页时,你可能发现文字总是紧贴着下划线,十分不舒服,不过我们可以下移下划线的位置。点[基础]->[字体信息],弹出字体信息对话框,你可以对字体的很多信息进行查看和修改,但是建议不要乱动里面的信息。点左边的[一般],在右边找到[下划线位置],其默认为-22,把它改为-50,点确定,如果还出现提示信息,仍然点确定。
最后,点[文件]->[生成字体],在生成字体对话框中,为新字体取一个名字,下面分别选择TrueType和TTF/OTF,点[确定],出现dpi选项,选[估计]就可以了。需要注意的是如果使用了前面字体替换技术,这里的下划线设置就不起作用!不过由于现在我们已经对字体加入了英文位图点阵,也就不在担心英文显示太丑,所以在我的设置中没有使用字体替换技术。
把这个新字体考到字体目录中,删掉原来的宋体,重启xfs服务,你会看到Linux下的宋体不管是中文还是英文,都已经和windows下的样子没有区别!
(全文完)
关于作者
姓名:苟廷勇
论坛ID:wotooa
MSN:icecard@hotmail.com
论坛ID的由来:其实这也和Linux有关。Ubuntu7.04刚发布时,我就去下载回来体验,它给我的第一感觉就是太漂亮了,因此决定由Fedora转向Ubuntu,并且开始向我的朋友灌输Ubuntu的好,才向朋友灌输的过程中,发现我将ubuntu念成了“我不吐”!但用了之后才发现,我RedHat/Fedora的功底在Ubuntu里都用不上,很多以前用得很熟悉的命令都不能用,常见的配置文件也找不到,以前可以轻松搞定的事在这里做不了,我得重新学过!过了一个多月,实在忍受不了,我终于“吐了”!“我吐啊”(wotooa)这个名字就这么出来了!这个名字实在有点不雅,不过既然与Linux有关,还是暂时留着吧!
我又换回了久违的Fedora,狠下心来做美化,于是就有了这篇文章,呵呵
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
常用链接
留言簿(55)
随笔分类
随笔档案
文章分类
相册
mplayer安装
U-Boot官方DULG
Useful Site
嵌入式Linux移植
搜索
最新评论
阅读排行榜
评论排行榜
|
|