|
作者:iceblood
日期:2002-07-20
现在很多人都喜欢打造自己的linux,并且她比以前更漂亮,其中设置字体是非常重要的一步,很多人在设置fonts.dir文件的时候,一般都直接从别人那里copy,而它的结构到底如何,或有的想自己打造一个自己更加喜欢的字体出来,就不知道如何下手了,近几天我对这个文件分析了一下,把目前我所理解到的一些心得写出来给大家,让大家做个参考,希望能提供大家一个方便,由于这方面的具体资料我找了很久都没找到,所以以下都是我的个人见解,如果有不对的地方欢迎高人指出.
fonts.dir的第一行一般是告诉Xwindows一共有多少行字体信息,从第二行开始起就是正式的字体设置信息了,一般分两部分,第一部分为参数部分,是配合第二部分来定义的,现在我来分析下面一行字体信息给大家一个参考:
ab=y:ai=-0.2:sw=1:bw=0.5:simsun.ttf-misc-simsun-bold-ro-normal--0-0-0-0-p-0-gb18030.2000-0
ab=y 启用粗体字,默认ab=n 既当没有设置的时候是不启用粗体的,配合bold同时使用.
ai=-0.4 左倾斜一个字的0.4的宽度,如果ai=0.4就是右倾斜一个字的0.4宽度,默认ai=0.请配合o或者i同时使用,由于这里是负的所以这里还需要配合r使用,所以后面是ro.
sw=1 字体宽度为1,默认为0.这个一般配合后面的p使用,使用p的时候,由于占用的是字符宽度,所以可能显示出来的字叠在一起,加上这个后就会把字和字的距离拉开.
bw=0.5 字体间距离为0.5个字的宽度,默认为0,假设你要使用斜体,由于斜体占的宽度比较宽,比如上面的bw=-0.4也就是说字体的上边部分左移0.4个字的宽度,那么我们为了看字的方便,需要吧字体宽度为之为bw=0.5这样有0.1之间的距离,不会导致字和字之间看起来重叠.
simsun.ttf 字体文件名,这个不用解释了.
misc 字体制造商
simsun 字体明称,这个我们可以随便修改,比如改成song,那么当我们在Xwindows里设置字体的时候找song字体就行了.
bold 粗体,这个还有一个选项medium(普通)假如使用了bold请同时把ab=y加上才起作用.
ro 反斜,其中r(Roman罗马体),i(Italic斜体),o(Oblique倾斜)当r和其他两个一起使用的时候为反斜.当使用i,o,ro,ri等的时候,请使用ai=n,其中n=0.2,-0.2,0.4,-0.4等.如果不设置ai=n,那么这些也都失去效果.
normal 字符集宽度为标准, 此外还有 condensed(压缩), narrow(窄), double(两倍宽)
0 像素大小,这个字体服务器会自动修改,所以一般为0.
0 点大小,同上.
0 X轴解析度,同上.
0 Y轴解析度,同上.
c 字间距为c,即一个字的距离,另外还有p,即字符距离
0 平均宽度,这个字体服务器会自动修改,所以一般为0.
asccii-0 字符集为asccii-0,其它还可以有很多,比如:gb2312.1980-0,gb18030.2000-1,gb18030.2000-0,gbk-0等,具体可以参看
分析完一行后,现在我来写一个gb2312.1980-0的font.dir给大家使用.
22 //以下22行为字体设置
simsun.ttf -misc-simsun-medium-r-normal--0-0-0-0-p-0-gb2312.1980-0 //SIMSUN的字符设置,使用的p.
ai=0.4:sw=1:bw=0.5:simsun.ttf -misc-simsun-medium-i-normal--0-0-0-0-p-0-gb2312.1980-0
ai=0.2:sw=1:bw=0.5:simsun.ttf -misc-simsun-medium-o-normal--0-0-0-0-p-0-gb2312.1980-0
ai=-0.4:sw=1:bw=0.5:simsun.ttf -misc-simsun-medium-ri-normal--0-0-0-0-p-0-gb2312.1980-0
ai=-0.2:sw=1:bw=0.5:simsun.ttf -misc-simsun-medium-ro-normal--0-0-0-0-p-0-gb2312.1980-0
ab=y:simsun.ttf -misc-simsun-bold-r-normal--0-0-0-0-p-0-gb2312.1980-0
ab=y:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-r-normal--0-0-0-0-p-0-gb2312.1980-0
ab=y:ai=0.4:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-i-normal--0-0-0-0-p-0-gb2312.1980-0
ab=y:ai=0.2:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-o-normal--0-0-0-0-p-0-gb2312.1980-0
ab=y:ai=-0.4:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-ri-normal--0-0-0-0-p-0-gb2312.1980-0
ab=y:ai=-0.2:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-ro-normal--0-0-0-0-p-0-gb2312.1980-0
simsun.ttf -misc-simsun-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0 //simsun的字设置,使用的p.
ai=0.4:sw=1:bw=0.5:simsun.ttf -misc-simsun-medium-i-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.2:sw=1:bw=0.5:simsun.ttf -misc-simsun-medium-o-normal--0-0-0-0-c-0-gb2312.1980-0
ai=-0.2:sw=1:bw=0.5:simsun.ttf -misc-simsun-medium-ro-normal--0-0-0-0-c-0-gb2312.1980-0
ai=-0.4:sw=1:bw=0.5:simsun.ttf -misc-simsun-medium-ri-normal--0-0-0-0-c-0-gb2312.1980-0
ab=y:simsun.ttf -misc-simsun-bold-r-normal--0-0-0-0-c-0-gb2312.1980-0
ab=y:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-r-normal--0-0-0-0-c-0-gb2312.1980-0
ab=y:ai=0.4:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-i-normal--0-0-0-0-c-0-gb2312.1980-0
ab=y:ai=0.2:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-o-normal--0-0-0-0-c-0-gb2312.1980-0
ab=y:ai=-0.2:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-ro-normal--0-0-0-0-c-0-gb2312.1980-0
ab=y:ai=-0.4:sw=1:bw=0.5:simsun.ttf -misc-simsun-bold-ri-normal--0-0-0-0-c-0-gb2312.1980-0
有兴趣的朋友看了以上内容后可以自己添加新的字体,让大家的linux越来越中国化.也祝中国的Linux越来越繁荣
X下的字体简介
字体属于最直观的东西,直接影响最终的显示和打印结果,所以倍受关注。
一,X 逻辑字体描述(X Logical Font Description)
在X Window下字体的命名方式是以X 逻辑字体描述(X Logical Font Description)
习惯命名的:
// font fields
// -fndry-fmly-wght-slant-sWdth-adstyl-pxlsz-ptSz-resx-resy-spc-avgWdth-rgstry-encdng
// fndry -> foundy
// fmly -> family, font style
// wght -> weight
// slant
// sWdth -> ? width
// adstyl -> addtion style
// pxlsz -> pixel size
// ptSz -> point size
// resx -> resolution x
// resy -> resolution y
// spc -> space
// avgWdth -> average width
// rgstry -> register
// encdng -> encoding
example:
-cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb2312.1980-0
其中:
cclib : 制造商
song : 字体族, 宋体
medium: 线权重(中等), 还有bold(粗体)选项
r : 倾斜, r(Roman), i(Italic), o(Oblique)
normal: 字符集宽度, 此外还有 condensed, narrow, double
jiantizi: 附加说明(简体字)
16: 以像素衡量的宽度.
160: 点数*10
75(1): 水平分辨率(dpi)
75(2): 垂直分辨率(dpi)
c: 间距, (?), m: fixed width, p: variable width
160: 平均宽度(10*pixels)
gb2312.1980: 注册字符集,标准名
0: 第0套,基本集
二,字体描述文件
在字体同一目录下,有两个文件指导X window如何安装使用字体:fonts.dir/fonts.alias。
虽然fonts.dir可由实用程序mkfontdir生成,但生成的文件中字体的次序不一定合适,所
以有时需要人工调整。因为不了解TTF字体的使用规则,所以这里只给出pcf字体的描述文
件格式。
fonts.dir 格式:
第一行:字体文件的数目
后面:字体文件 X 逻辑字体描述(字体真名)
.......
fonts.dir example:
21
ccs16.pcf.gz -cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb2312.1980-0
ccs24.pcf.gz -cclib-song-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-0
ccs16_1.pcf.gz -cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb2312.1980-1
ccs24_1.pcf.gz -cclib-song-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-1
ccs16f.pcf.gz -cclibf-song-medium-r-normal-fantizi-16-160-75-75-c-160-gb12345.1990-0
ccs24f.pcf.gz -cclibf-song-medium-r-normal-fantizi-24-240-75-75-c-240-gb12345.1990-0
ccs16f_1.pcf.gz -cclibf-song-medium-r-normal-fantizi-16-160-75-75-c-160-gb12345.1990-1
ccs24f_1.pcf.gz -cclibf-song-medium-r-normal-fantizi-24-240-75-75-c-240-gb12345.1990-1
hts14.pcf.gz -tlc-song-medium-r-normal--14-140-75-75-c-140-gb2312.1980-0
hts14_1.pcf.gz -tlc-song-medium-r-normal--14-140-75-75-c-140-gb2312.1980-1
cck24.pcf.gz -cclib-kai-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-0
cck24_1.pcf.gz -cclib-kai-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-1
cch24.pcf.gz -cclib-hei-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-0
cch24_1.pcf.gz -cclib-hei-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-1
ccfs24.pcf.gz -cclib-fangsong-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-0
ccfs24_1.pcf.gz -cclib-fangsong-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-1
taipei16.pcf.gz -eten-fixed-medium-r-normal--16-150-75-75-c-160-big5.et-0
taipei24.pcf.gz -eten-fixed-medium-r-normal--24-230-75-75-c-240-big5.et-0
cns1hku16.pcf.gz -hku-fixed-medium-r-normal--16-160-72-72-c-160-cns11643.1992.1-0
cns2hku16.pcf.gz -hku-fixed-medium-r-normal--16-160-72-72-c-160-cns11643.1992.2-0
unifont.pcf.gz -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1
fonts.alias 格式:
字体别名 X 逻辑字体描述(字体真名)
.......
fonts.alias example:
ccs16 -cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb2312.1980-0
cclib16 -cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb2312.1980-0
ccs24 -cclib-song-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-0
ccs16_1 -cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb2312.1980-1
cclib16_1 -cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb2312.1980-1
ccs24_1 -cclib-song-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-1
ccfs24 -cclib-fangsong-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-0
ccfs24_1 -cclib-fangsong-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-1
cck24 -cclib-kai-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-0
cch24 -cclib-hei-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-0
cck24_1 -cclib-kai-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-1
cch24_1 -cclib-hei-medium-r-normal-jiantizi-24-240-75-75-c-240-gb2312.1980-1
ccs16f -cclibf-song-medium-r-normal-fantizi-16-160-75-75-c-160-gb12345.1990-0
ccs24f -cclibf-song-medium-r-normal-fantizi-24-240-75-75-c-240-gb12345.1990-0
ccs16f_1 -cclibf-song-medium-r-normal-fantizi-16-160-75-75-c-160-gb12345.1990-1
ccs24f_1 -cclibf-song-medium-r-normal-fantizi-24-240-75-75-c-240-gb12345.1990-1
hts14 -tlc-song-medium-r-normal--14-140-75-75-c-140-gb2312.1980-0
hts14_1 -tlc-song-medium-r-normal--14-140-75-75-c-140-gb2312.1980-1
taipei16 -eten-fixed-medium-r-normal--16-150-75-75-c-160-big5.et-0
taipei24 -eten-fixed-medium-r-normal--24-230-75-75-c-240-big5.et-0
这样在使用过程中,程序既可以使用字体真名,也可以使用字体别名装载X字体。
三,X字体的使用
应用程序调用XLoad(Query)Font函数装载字体。X window会尽量解释和装载字体,
其中包括参数里使用"*","?"通配符,还有缩放字体。其中X 逻辑字体描述字段对字体
缩放有直接影响的是pixel size/point size, average width字段。其中pixel size的
优先级大于point size。也就是,如果传给XLoadFont的字体不存在,X window会根据
现有的一个名字匹配,大小(pixel size/point size, average width)不同的字体,在
内存里生成一个新字体。因为X window下的中文字体很少,一般只提供16和24点阵两种
大小。所以字体缩放机制就显得很重要。这种机制的好处是只须提供少量的字体,就可
以应付大多数情况。缺点也是有的,就是生成字体的速度很慢,延迟是以秒记的。如果
是GB2312字体还好,不到7000个字。而Unicode或GBK字体,汉字就有20902多个,一个个
进行缩放,延迟可想而知。但要注意的是,X window只是在装载生成字体时有延迟,字
体生成后,XDraw*函数显示速度并没有延迟。
下面举例说明。如果有字体:
ccs16.pcf.gz -cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb2312.1980-0
想用字体:
"-*-song-medium-r-normal-jiantizi-12-120-75-75-c-100-gb2312.1980-0"
程序里只须直接调用即可:
.......
char *font_name = "-*-song-medium-r-normal-jiantizi-12-120-75-75-c-100-gb2312.1980-0";
XFontStruct *zh_font;
.......
zh_font = XLoadFont(display, font_name);
if (zh_font == NULL) {
printf("not find this font: %s\n", font_name);
exit(1);
}
.......
要注意的是,如果这么写
在fonts.dir中有
ccs16_1.pcf.gz ccs16_1
在fonts.alias中有
-cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb2312.1980-1 ccs16_1
X window也认可,但是就不能缩放字体。
这里要讨论字体缩放机制,是为了解决X外挂式中文平台的字符串定位问题。如果光
标要定在两个字符之间,就要知道这点的位置。X应用程序一般是调用函数XTextWidth(16),
XTextExtents(16),XQueryTextExtents(16)以确定字符串的宽度。所以X外挂式中文平台
要截取这些函数以便对中英文混排的字符串进行准确定位。但有些程序为了速度,是调用XGetFontProperty
函数或直接在XFontStruct结构里取得单个字符的宽度,乘上字符个数得到字符串的宽度。
如果ASCII字体有标准高宽比,也是没有问题。所谓标准高宽比就是ASCII字体的宽:高为1/2,
相应的中文字体就是1:1。如果不是这样,光标定位就有问题。再有就是字符高度,一般
是中文字体略高于ASCII字体就美观了。但具体数值要控制好,否则太矮不好看,太高又
会被削去头部。所以字间距和行间距目前是很烦恼的问题。解决的方法可能有一些:
1,截获更多的函数,或修改ASCII字体的高度和宽度。这要求对X window有很深的
了解。这也是一个吃力不讨好的方案,因为总有疏漏,X window的函数也会发展和变化,
那么就会有遗憾。cleex for Linux 1.0在速度和定位上较好地解决了这个问题,可能是
使用了这个方案。
2,使用字体缩放机制,使汉字大小和ASCII字体相匹配。这个方案的问题是装载字体
的速度和耗费的资源。我实验了这个方案,使用NetScape浏览网页,发现很多时间花在了
装载字体上。而且,如何管理这些字体也是一个问题。使用TTF字体可能可以完美地解决
这个问题。我使用TLC4.0的ZhWinPro2.0,发现以前定位不准的软件都没有问题了。看来
使用TTF字体是今后的方向。
使用TTF字体始终是诱人的话题。但现在了解不多,只能简单谈谈从TTF字体生成bdf/pcf
字体的问题。因为现在中文pcf字体很少,只有宋体,仿宋,黑体,楷体四种。要想有更
多的字体,有个取巧的方法就是使用freetype库。用ttftobdf程序生成bdf字体,再用bdftopcf
程序生成pcf字体。但这种方法生成的字体缩放后比较难看,而且不宜控制。这可能是
ttf->bdf的转换过程丢失了信息,高宽比也和标准的不一样。机器生成的东西就是机械,
是不能和手绘的字体相比的。同时,因为TTF技术已成熟,所以也没有必要继续开发更
多的pcf字体。X window将接受和大量使用TTF字体。而pcf字体今后主要用在标准字型(
如宋体),小点阵,网上快速下载传输方面。
这里顺便纠正一个概念上的小错误。在TLC4.0的fonts.alias中有
-tlc-song-medium-r-normal--14-140-75-75-c-140-gb2312.1980-1 hts14_1
-tlc-song-medium-r-normal--14-140-75-75-c-140-gb13000.1993-1 hts14_1
hts14_1是GBK标准的字体。第二行把GBK字体叫做GB13000字体,这是不对的。陈向阳编写
的程序gbpcf也有类似的情况,GBK和GB13000是两种不同的编码体系。 |
|