LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: redlock

字体基础和底层知识(多帖合并)

[复制链接]
发表于 2003-12-9 18:16:35 | 显示全部楼层

字体基础和底层知识(多帖合并)

均由 rodlock 兄从不同网站转帖,帖子版权由原发帖人在原网站持有。
发表于 2003-12-10 00:33:58 | 显示全部楼层
good!!!
现在就是想学这些基础的东西,不然只能盲目地copy.
thanks!
发表于 2003-12-10 09:08:51 | 显示全部楼层

有关fontconfig,freetype,xtt,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号的字体就不会用抗锯齿功能了.
发表于 2003-12-10 09:11:32 | 显示全部楼层
强烈建议将此文提交文档管理系统,这是每个发行版都能用的啊!
发表于 2003-12-10 09:21:19 | 显示全部楼层
Okay!I have done!
 楼主| 发表于 2003-12-10 11:21:43 | 显示全部楼层
让gs用~/.fonts中的字体
作者 : 廖中煕
Email : lzx21cn@21cn.com

自从有了xft2我们装TrueType显示字体可就方便多了,只要将字体拷贝进~/.fonts就可以了。
要是让这些字体也可以给gs用,让gs利用这些字体模拟粗体斜体,该多好.
有了这样一个~/.fonts,要将字体移到哪去用都十分方便了(在用户名不变的条件下).

让我们 边举例 边说明 吧!
实验平台RedHat9.0
举例:
我们安装一种文鼎宋体,这是系统自带的仅有几个简体中文字体之一,不用装也有的,在这只是作为举例用的.
这当然要感谢文鼎公司提供字体给自由社区。

零、
在举例中 ~=/home/kevin 在以下文件中有很多都出现多次,
这是不足之处,因为移到另一个用户下就不得不修改这些文件了

一、将字体拷贝到~/.fonts

#cp /usr/share/fonts/zh_CN/TrueType/gbsn00lp.ttf ~/.fonts/

二、,在~/.bash_profile中加入2行
export GS_LIB=~/.fontsGS_LIB

说明:有了这一句gs就会到这来找字体信息了
参考:http://www.cs.wisc.edu/~ghost/doc/gnu/7.05/Use.htm#Font_lookup

三、接着建立~/.fonts/CIDFnmap,告诉gs你装了些什么字体且昰什么编码的

A.在~/.fonts/CIDFnmap输入

/BousungEG-Light-GB (/home/kevin/.fonts/gbsn00lp.ttf) 1 /Adobe-GB1-Unicode ;
/Arphic-SongGB /BousungEG-Light-GB ;

说明:
第一句的意思是:/字体名 (来自的文件绝对位置) 索引 /编码 ;
第二名的意思是:Arphic-SongGB 是字体 BousungEG-Light-GB 的别名 ;
参考: http://www.cs.wisc.edu/~ghost/doc/gnu/7.05/CJK.htm
注意: 分号";"前的空格可不能省。

B.建立测试文件~/Arphic-SongGB_all.ps

/Arphic-SongGB-GB-EUC-H findfont 48 scalefont setfont
50 650 moveto
(宋体常规) show

C.测试~/Arphic-SongGB_all.ps
#gs ~/Arphic-SongGB_all.ps
能看见中文“宋体常规”, 算成功
当然您还可以用ggv等查看.ps文件的工具查看

参考: http://freebsd.sinica.edu.tw/zh-tut/print.html
注意: 存储测试文件的字符编码一定要是gb2312才行,如果是UTF-8是不行的。

四、利用gs-cjk显示粗体、斜体、粗斜体
如果第三步成功,我们就已经有正体字了
*在这里每个字体文件都被分成两个文件,
名称               : 说明
-------------------:-------------------------------------------------------
字体名-样式名      : 作为资源文件来用,它们差异很大
字体名-样式名-编码 :用这个资源文件时,用的是什么样的编码,形式十分接近
-------------------:-------------------------------------------------------
说明:在本例中 字体名=Arphic-SongGB,编码=GB-EUC-H,样式有三种,分别为Bold、Italic、BoldItalic 组合一下为6个文件,下面一一列明。

A、粗体。据我看,他的思想方法是取得原字的矢量路径,然后一粗笔描边取得新矢量路径
A.1、建立文件~/.fonts/Arphic-SongGB-Bold

%!PS-Adobe-3.0 Resource-CIDFont
%%BeginResource: CIDFont (Arphic-SongGB-Bold)
/Arphic-SongGB-Bold
/Arphic-SongGB /CIDFont findresource
16 dict begin
  /basecidfont exch def
  /basefont-H /.basefont-H /Identity-H [ basecidfont ] composefont def
  /basefont-V /.basefont-V /Identity-V [ basecidfont ] composefont def
  /CIDFontName dup basecidfont exch get def
  /CIDFontType 1 def
  /CIDSystemInfo dup basecidfont exch get def
  /FontInfo dup basecidfont exch get def
  /FontMatrix [ 1 0 0 1 0 0 ] def
  /FontBBox [
    basecidfont /FontBBox get cvx exec
    4 2 roll basecidfont /FontMatrix get transform
    4 2 roll basecidfont /FontMatrix get transform
  ] def
  /cid 2 string def
  /BuildGlyph {
    gsave
    exch begin
      dup 256 idiv cid exch 0 exch put
      256 mod cid exch 1 exch put
      rootfont /WMode known { rootfont /WMode get 1 eq } { false } ifelse
      { basefont-V } { basefont-H } ifelse setfont
      .03 setlinewidth 1 setlinejoin
      newpath
      0 0 moveto cid false charpath stroke
      0 0 moveto cid show
      currentpoint setcharwidth
    end
    grestore
  } bind def
  currentdict
end
/CIDFont defineresource pop
%%EndResource
%%EOF

A.2、建立文件~/.fonts/Arphic-SongGB-Bold-GB-EUC-H

%!PS-Adobe-3.0 Resource-CIDFont
/Arphic-SongGB-Bold-GB-EUC-H
/Arphic-SongGB-Bold (/home/kevin/.fonts/Arphic-SongGB-Bold)
/GB-EUC-H (CMap/GB-EUC-H)

1 index /CMap resourcestatus
{pop pop pop}
{runlibfile} ifelse
/CMap findresource

3 1 roll
1 index /CIDFont resourcestatus
{pop pop pop}
{runlibfile} ifelse
/CIDFont findresource

[ exch ] composefont pop

A.3、测试,重建~/Arphic-SongGB_all.ps或向其增加这几行

/Arphic-SongGB-Bold-GB-EUC-H findfont 48 scalefont setfont
50 600 moveto
(宋体加粗) show

见到被加粗的宋体字,算成功.(我还用Debian之woody版试过,失败)

B、建立斜体字,在这里它运用了一个三阶变化矩阵
a  b  0
c  d  0
tx ty 1
PostScript 将它记为[a b c d tx ty]
而新的x' y'则为
x'=ax+cy+tx
y'=bx+dy+ty
由此来完成对图形的位置偏移,放大缩小,平行四边形变形,旋转变化
据我看,在这里运用的是平行四边形变化
B.1、建立文件~/.fonts/Arphic-SongGB-Italic
%!PS-Adobe-3.0 Resource-CIDFont
%%BeginResource: CIDFont (Arphic-SongGB-Italic)
/Arphic-SongGB-Italic
/Arphic-SongGB /CIDFont findresource
dup length dict begin { 1 index /FontMatrix eq { [1 0 .3 1 0 0] matrix concatmatrix def } { def } ifelse } forall currentdict end
/CIDFont defineresource pop
%%EndResource
%%EOF

B.2、建立文件~/.fonts/Arphic-SongGB-Italic-GB-EUC-H
%!PS-Adobe-3.0 Resource-CIDFont
/Arphic-SongGB-Italic-GB-EUC-H
/Arphic-SongGB-Italic (/home/kevin/.fonts/Arphic-SongGB-Italic)
/GB-EUC-H (CMap/GB-EUC-H)

1 index /CMap resourcestatus
{pop pop pop}
{runlibfile} ifelse
/CMap findresource

3 1 roll
1 index /CIDFont resourcestatus
{pop pop pop}
{runlibfile} ifelse
/CIDFont findresource

[ exch ] composefont pop

B.3、测试,重建~/Arphic-SongGB_all.ps或向其增加这几行,

/Arphic-SongGB-Italic-GB-EUC-H findfont 48 scalefont setfont
50 550 moveto
(宋体加斜) show

见到斜的字体,算成功.(我还用Debian之woody版试过,成功)

C、建立粗斜体字,就是先作加粗,再作加斜
C.1、建立文件~/.fonts/Arphic-SongGB-BoldItalic

%!PS-Adobe-3.0 Resource-CIDFont
%%BeginResource: CIDFont (Arphic-SongGB-BoldItalic)
/Arphic-SongGB-BoldItalic
/Arphic-SongGB /CIDFont findresource
16 dict begin
  /basecidfont exch def
  /basefont-H /.basefont-H /Identity-H [ basecidfont ] composefont def
  /basefont-V /.basefont-V /Identity-V [ basecidfont ] composefont def
  /CIDFontName dup basecidfont exch get def
  /CIDFontType 1 def
  /CIDSystemInfo dup basecidfont exch get def
  /FontInfo dup basecidfont exch get def
  /FontMatrix [ 1 0 0 1 0 0 ] def
  /FontBBox [
    basecidfont /FontBBox get cvx exec
    4 2 roll basecidfont /FontMatrix get transform
    4 2 roll basecidfont /FontMatrix get transform
  ] def
  /cid 2 string def
  /BuildGlyph {
    gsave
    exch begin
      dup 256 idiv cid exch 0 exch put
      256 mod cid exch 1 exch put
      rootfont /WMode known { rootfont /WMode get 1 eq } { false } ifelse
      { basefont-V } { basefont-H } ifelse setfont
      .03 setlinewidth 1 setlinejoin
      newpath
      0 0 moveto cid false charpath stroke
      0 0 moveto cid show
      currentpoint setcharwidth
    end
    grestore
  } bind def
  currentdict
dup length dict begin { 1 index /FontMatrix eq { [1 0 .3 1 0 0] matrix concatmatrix def } { def } ifelse } forall currentdict end
/CIDFont defineresource pop
%%EndResource
%%EOF

C.2、建立文件~/.fonts/Arphic-SongGB-BoldItalic-GB-EUC-H
%!PS-Adobe-3.0 Resource-CIDFont
/Arphic-SongGB-BoldItalic-GB-EUC-H
/Arphic-SongGB-BoldItalic (/home/kevin/.fonts/Arphic-SongGB-BoldItalic)
/GB-EUC-H (CMap/GB-EUC-H)

1 index /CMap resourcestatus
{pop pop pop}
{runlibfile} ifelse
/CMap findresource

3 1 roll
1 index /CIDFont resourcestatus
{pop pop pop}
{runlibfile} ifelse
/CIDFont findresource

[ exch ] composefont pop

C.3、测试,重建~/Arphic-SongGB_all.ps或向其增加这几行,

/Arphic-SongGB-BoldItalic-GB-EUC-H findfont 48 scalefont setfont
50 500 moveto
(宋体加粗加斜) show

见到又粗又斜的字体,所成功。(我还用Debian之woody版试过,失败)

参考:
中文的列印[繁体]: http://freebsd.sinica.edu.tw/zh-tut/print.html
ttfm下载[简体]:   http://www.linuxeden.com/download/softdetail.php?softid=650

*这种方法的局限性
是只能在某个用户下使用
如果想字体所有用户都能用,字体就要放在大家都见得到的地方,可能用ttfm来生成这些文件是再好不过了

Debian3.0Woody不能完全支持,可能是因为gs版本(6.53)不够高,而RedHat9的gs(7.05)就支持的很好了

所有参考:
名称              : 地址
------------------:----------------------------------------------------------------
Font_lookup       : http://www.cs.wisc.edu/~ghost/doc/gnu/7.05/Use.htm#Font_lookup
CJK               : http://www.cs.wisc.edu/~ghost/doc/gnu/7.05/CJK.htm
中文的列印[繁体]  : http://freebsd.sinica.edu.tw/zh-tut/print.html
ttfm下载[简体]    : http://www.linuxeden.com/download/softdetail.php?softid=650
PostScript手册参考:http://partners.adobe.com/asn/developer/pdfs/tn/PLRM.pdf
PostScript参考集合:http://partners.adobe.com/asn/tech/ps/technotes.jsp
------------------:-----------------------------------------------------------------
发表于 2004-11-14 17:11:20 | 显示全部楼层
up
发表于 2005-3-14 01:48:09 | 显示全部楼层
这些东东找了好久了,真的很谢谢楼上的高手们.........没别的话说了,一个字:顶
回复 支持 反对

使用道具 举报

发表于 2005-3-14 08:01:31 | 显示全部楼层
现在xorg也适用吗?
回复 支持 反对

使用道具 举报

发表于 2006-1-7 14:14:16 | 显示全部楼层
第2贴和第5贴一样
第4贴和第13贴一样
回复 支持 反对

使用道具 举报

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

本版积分规则

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