找回密码
 注册
查看: 1614|回复: 4

linux字体技术原理zt

[复制链接]
发表于 2004-1-2 22:48:14 | 显示全部楼层 |阅读模式
我们要理解X的字体引擎. X中支持Truetype字体(一种可放缩字体) 的主要有四种引擎. freetype, xtt, xfs和Xft.


首先, 我们要理解X的字体引擎. X中支持Truetype字体(一种可放缩字体) 的主要有四种引擎. freetype, xtt, xfs和Xft.

其中freetype 和 xtt 是 X 的内部模块. 使用的都是freetype1渲染引擎.

Xfs 和xft 是外部服务程序. xfs 是系统级的字体服务程序, 也可以作为X的内部模块, 使用的是X 内部的freetype2. Xft 和其他类库一样, 只有被调用的时候才被加载. 其中只有xft才有antialias 支持.

这里有必要讲讲freetype. Freetype 是开源字体渲染引擎, 并不只为X设计. 它的功能就是读取Truetype字体信息, 如大小, 分辨率, 编码等, 然后渲染成所需的位图数据输出. Freetype 现在的版本是 2.x, 与1.0 相比, 最大的差别就是加入了抗锯齿功能.

有这么多引擎,到底要用哪个好? 其实我们目前为止, 支持中文最好的还是xtt. 因为小字体的时候, 用函数描述法算出来的中文字体效果不能让人满意, 所以很多中文字体公司就在Truetype字体里嵌入了位图字体. 这些位图字体需要用特殊的方式读出来, 所有的引擎中就只有xtt能做到这
一点.

我们下一步就是将字体添加到X中, 使xtt可以正确读取, 这样就可以了.

首先, 由于要配置Linux系统文件, 我们需要用root帐号进入, 相当于windows下的administrator.

X的配置文件是/etc/XF86Config-4 (比较新的显卡) 或者是 XF86Config (比较老的显卡). 用你喜欢的文本编辑器打开, 如 kedit或gedit.

打开后我们发现配置文件分成很多个Section, 我们首先要配置的就是 Section "Files" , 这个部分描述了X所要调用的文件信息.

要加入一个字体目录, 只需在里面插入一行 FontPath "目录名" 就可以了, 如:

Section "Files"
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Mandrake 6.0 and later now use a font server independent of
# the X server to render fonts.
FontPath "unix/:-1"
FontPath "/truetype" # 插入一个字体目录
EndSection

然后, 我们让X加载xtt字体引擎:

找到Section "Module", 像这样修改:

Section "Module"
# Load "dbe" # Double-Buffering Extension
# Load "v4l" # Video for Linux
Load "extmod"
Load "glx
# Load "type1" # type1 模组是渲染type1字体的, 和xtt冲突, 必需屏蔽
# Load "freetype" # freetype 模组是渲染Truetype字体的, 和xtt冲突, 必需屏蔽
Load "xtt" # 加入xtt模组引擎
EndSection

好了, 现在xtt会自动去 /truetype 里找字体.

现在开始拷贝字体到 /truetype里去, 先要在根目录建一个truetype目录, 打

mkdir /truetype

就可以了.

从windows分区拷贝要先mount, 就是作一个联接, 将Linux目录连到windows分区. 在根目录下建一个"c"目录.

mkdir /c

然后

mount /dev/hda1 /c

这样就将windows下的C盘 联接到我们Linux下的/c目录了, 进入/c, 应该可以看到你C盘的文件.

然后, 进入/c 中的字体文件目录, 一般在window下面的Fonts里, 注意目录名大小写在Linux下面是有区别的.

拷贝字体文件到 /truetype里, 打

cp simsun.ttc /truetype/simsun.ttf
cp tahoma* /truetype/

这样就将我们所需要的字体文件拷贝到truetype 里了.

下一步我们要设置字体文件, Linux中X的字体设置很烦锁, 不像windows一拷贝就完事, 初级阶段嘛, 大家还是忍忍吧, 呵呵.

1. 建立字体信息文件fonts.dir

如下

24
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-c-0-gb2312.1980-0
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-c-0-gb2312.1980-0
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-c-0-gb2312.1980-0
tahoma.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-1
ai=0.3:tahoma.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-iso8859-1
tahomabd.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-iso8859-1
ai=0.3:tahomabd.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-iso8859-1
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-gbk-0
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-gbk-0
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-gbk-0
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-gbk-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-fcd8859-15
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-fcd8859-15
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-fcd8859-15
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-fcd8859-15
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-15
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-iso8859-15
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-iso8859-15
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-iso8859-15
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-iso10646-1
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-c-0-iso10646-1
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-c-0-iso10646-1
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-c-0-iso10646-1


第一行的24表示下面一共有24行设置 (好像有点傻) , 其他的格式都差不多:

ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-gbk-0

说明:

simsun.ttf: 字体文件名

ds=[yn]: ds是xtt的功能, 设成"y" 表示粗体, "n" 表示正常.

ai=Real_number: 表示倾斜度. 不设表示自动.

misc : 表示字体的类别

SimSun : 是字体的名称

bold : bold 表示粗体, 其他如medium表示正常,

i : 表示斜体, r 是正常

p: 可变长度, c 是正方形, m是固定宽度

gbk: 字体编码

这里大家发现我们还使用了tahoma英文字体, 这样替换, 系统读取Simsun英文字体的时候, 就会用pp的tahoma替代.

好了, 现在存盘. 然后拷贝一个到fonts.scale

cp fonts.dir fonts.scale

然后拷贝编码文件 encodings.dir 到目录里来.

cp /usr/X11R6/lib/X11/fonts/encodings/encodings.dir /truetype

好, 重起, 把KDE, mozilla, galeon 等等所有默认字体都改成simsun, 哈哈, 是不是比从前漂亮了很多?

大家还是把这几个配置文件备份起来, 以后安装的时候就不用再设置了.

这里顺带说一下其他几个字体引擎的配置:

xfs : 配置文件是 /etc/X11/fs/config
xft : 配置文件是 /etc/X11/Xftconfig

xft 的配置相对来说比较容易, 只要将字体拷到配置文件中dir 指定的任何一个目录就可以了. 如果要小字体不显示AA, 可以在末尾加入:

match
any size > 8
any size < 17
edit
antialias = false;
match
any pixelsize > 8
any pixelsize < 17
edit
antialias = false;

这样 8~17号的字体就不会用抗锯齿功能了.
发表于 2004-1-3 06:24:04 | 显示全部楼层
呵呵,已经过时了。
回复

使用道具 举报

 楼主| 发表于 2004-1-5 22:55:23 | 显示全部楼层
LINUX的中文化,一直以来备受人们关注,尤其是国人的关注。
那么到底什么是中文环境,他的内在机理又是那些呢?
本文试着阐述一二:
    目前最常用的基本中文字符集是GB 2312-80。此字符集包括7445个字符,其中6763
个是汉字。而汉字又分为两级,第一级汉字按音序排列,第二级汉字先按部首后按剩余笔
画排列。
    另外,还有一个字符集GB/T 12345-90在字符集的数量和安排上几乎等同于GB
2312-80,但所有的简体字都用对应的繁体字替代了。还有一个字符集就是GB 1988-89,
他对应于ASCII字符或ISO 646,但现金符号(0X24)用中国的人民币符号取代了ASCII字
符集中的美元符号($)。
    中文字符集的编码一般是双字节码,对于每个字符集标准都可能有几种编码体系。
对于GB 2312-80字符集,常用的编码有EUC和HZ。EUC表示“Extended UNIX Code”,是
在ISO 2022-1993中定义的一种编码体系,用来处理大的字符集。EUC包括四个代码集(C
ODE SET),编号为0到3。这样,我们就常把GB 2312-80字符集的EUC编码称为国标码或G
B码。
    我们看到,GB码的第一个字节是0XA1~0XFE,其中0XA1~0XF7对应GB 2312-80字符集
的87个区,0XF8~0XFE没有定义;第二个字节是0XA1~0XFE,对应每个区最多94个字符。G
B码的两个字节都是8位码(>0x7F),不合同ASCII码(<=0x7E)相混淆,这一点对中文处理
很有利。但是,有时候我们可能需要用明显的界限把ASCII字符串和中文字符串分开,这
时就要用到HZ码。在HZ码中,GB码的两个字节的最高位都被置为0,中文字符编码的第一
个字节被限制在0x21~0x77,第二个字节的范围是0x21~0x7E;在中文字符串与ASCII字符
串之间用转换序列隔开。
    目前在台湾等地常用的中文字符串有大五(BIG FIVE)字符集和CNS 11643-1992。
其中,大五字符集由94个区组成,每个区有157个字符,分为两组,分别有63个和94个字
符。
    由于在中文世界同时使用着多种字符集和多种编码体系,我们经常会需要对文本进
行编码转换。于是也就产生了很多转换软件件。
回复

使用道具 举报

 楼主| 发表于 2004-1-5 22:55:42 | 显示全部楼层
X Window系统下的中文软件使用的中文字库大致有以下几类:
——BDF:Bitmap Distribution Format,X Window系统字库的位图格式。
——HBF:Hanzi Bitmap Font,汉字位图字库,每个汉字的位图占同样大的空间。
——PCF:Portable Compiled Format,X Window系统显示字库的标准格式,可跨平台使
用。
——TTF:True Type Font,多在WINDOWS下使用的轮廓线字库。
这四种字库文件的扩展名通常是.bdf, .hbf, .pcf, .ttf。但要注意,.hbf文件只是字
库描述文件,汉字位图则存放在另外的文件里。
======================================

    中文打印是LINUX中文化的一项重要内容。很多软件的最终目的是形成硬拷贝,即提
供符号各种要求的,良好的打印输出。
    目前LINUX上的打印通常是用NENSCRIPT(或MPAGE)把非POSTSCRIPT文件转换成POST
SCRIPT文件,然后通过软件转换后再输出到打印机上。但由于没有中文POSTSCRIPT字库
体系,这就造成了一定的困难。
回复

使用道具 举报

 楼主| 发表于 2004-1-5 22:56:09 | 显示全部楼层
有很多老东西的~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-10 23:51 , Processed in 0.023071 second(s), 16 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

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