LinuxSir.cn,穿越时空的Linuxsir!

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

[转贴]Linux字体设置fonts.dir文件分析

[复制链接]
发表于 2002-8-22 10:49:32 | 显示全部楼层 |阅读模式
作者: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是两种不同的编码体系。
发表于 2002-10-19 01:11:07 | 显示全部楼层

X 下的字体到底是怎么回事?[转帖作者未知]

X 下的字体到底是怎么回事?

X 支持的字库种类有很多,最常见的是点阵字库*.pcf(.gz 经gzip压缩),还有我们不太熟悉的Type 1字体等等。现在很多发行版的X Server 或 X Font Server都能支持TrueType字体。

关于X Font Server:X Server 本身可以直接提供字体,又可以由X Font Server提供。因为是Server/Client的方式X Font Server和X Server可以不在同一机器上。 RedHat6.0开始由X Font Server提供字体,以前的版本则是由X Server提供字体,这会使设置上有所不同。

X Font Server和X Server都有自己的字体目录(集)。在每一字体目录里储存着字体文件和一个字体列表文件fonts.dir,shuyong已作了详细说明。

字体目录的设置:对于X Server,在XF86Config文件(在/etc/X11 or /usr/X11R6/lib/X11)里:
Section "Files"
RgbPath "/usr/X11R6/lib/X11/rgb"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"
......
EndSection
如果是下面这个样子("unix/:xxx")则表示使用了X Font Server
Section "Files"
RgbPath "/usr/X11R6/lib/X11/rgb"
FontPath "unix/:-1"
EndSection

对于RedHat6.x的X Font Server其设置文件放在/usr/X11R6/lib/X11/xfs/。

注:以上关于X Server的设置均为XFree86,其它X Server如Accelerated X则另有其设置文件。关于X Font Server的设置均为RedHat 6.x,其它版本可能有所不同,仅供参考。

字体目录文件由mkfontdir命令生成(当然也可以手工写,有时还只能手工写,如TrueType字体的fonts.dir)。
用法:mkfontdir 目录
如果没指定目录则默认为当前目录。

X11R6 标准的字体目录在/usr/X11R6/lib/X11/fonts。

另外还有一种bdf文件,是一种文本格式的字体描述文件(具体格式请参考XFree86 documents),也可以说是pcf的源文件。利用bdftopcf命令可以把bdf文件编译成pcf文件。如果想自己制作字体,这是很好的途径。

最后推销一下自己的程序:-) XFontGenerator。这是一个运行在Windows下的程序,它可以把任意大小风格的Windows字体输出成bdf文件。输出的小字体文件效果特别好,如12点阵的宋体字。还可以输出斜体、粗体等。 http://c_home.163.net/ (163有时很烂,接不上请过一段时间再试)。
发表于 2002-10-19 08:46:04 | 显示全部楼层
好啊!又有新的东东来研究研究了。谢谢了。
发表于 2002-10-19 08:55:18 | 显示全部楼层
不知那位知道在纯console下(即没有进入Xwindows时的console),下的字体如何设置,我以前用TurboLinux在纯console下的字体又小又漂亮,而redhat在这方面差多了。
发表于 2002-10-20 00:31:47 | 显示全部楼层
改GRUB的启动项,或者LILO的。在最后加上VGA=789(800*600)或VGA=792(1024*768)
发表于 2003-10-24 16:05:03 | 显示全部楼层

nice

右键另存为
发表于 2003-10-24 16:11:22 | 显示全部楼层

好文章,值得学习!

收藏
发表于 2003-10-24 21:34:59 | 显示全部楼层
现在流行fontconfig, the font season--fontconfig!
发表于 2003-10-24 22:04:13 | 显示全部楼层
多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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