字体类型
以Windows为例,有4种字体技术:
Raster:光栅型,就是用位图来绘制字形(glyph),每个字都以位图形式保存
Vector:矢量型,就是用一系列直线的结束点来表示字形
TrueType:使用一系列直线、曲线和一些提示(hint)命令来绘制字形
Microsoft OpenType:与TrueType一致
因为TrueType等字体的hint能够调节只想的长度和曲线的形状,所以,它能够在不同大小的字体中表现良好。而Raster字体则是跟设备具体分辨率相关,而Vector字体则好一些,但是它的绘制效率较低,要比其他字体慢很多。
对于Raster和Vector字体,一般其资源文件的文件名以.fon结尾,内部分成表述字体度量信息的header和实际的glyph数据这两部分,而对于TrueType和OpenType,则分成两个文件,第一个以.fot结尾,描述了相关的header,另一个则以.ttf命名,包含真正的内容。
字体和字符集
字符集就是Character Sets。字符集中的每个字符都有一个数字与之对应。在Windows中有以下几种字符集在使用。
Windows Character Set:本质上与US ASCII character set一样,第一个字符的数字是0x20,最有一个是0xFF。对于字符集上不存在的字符,会用默认字型显示,如Raster和Vector字体会用.来显示,而TTF则会用方框表示。
Unicode Character Set:用2个字节的数字来表示多达2^16个字符(好像后来增加到4个字节),每个字符有独立的数字表示。注意这里是字符集,而不是编码。
另外还有OEM Character Set、Symbol Character Set和Vendor-Specific Characters Sets等
TTF文件结构
TTF字体就是TrueType Font的意思,一般文件后缀是ttf,TTF还允许不同的字体组合在一个文件中,这时候后缀为ttc,就是TrueType collect的意思。
TTF文件是由一系列的表组成的。第一张表就是font directory,它很特殊,专门用来指示其他的表;进阶着就是包含font数据的其他表。每个表有一个四字符定义的表名,其中有些表是要求每个font文件必备的。如:
cmap | 定义了字符到字形索引的对应关系,就是通过字内码得到表loca中使用的index。包含了多个子表,用于支持不同的平台和编码集 |
glyf | 包含了字形数据,就是字形的轮廓定义和调整指令 |
head | 定义了font header,字体全局信息 |
hhea | 定义了水平header |
hmtx | 定义了水平metric |
loca | 定义了各字形在glyf表中偏移,根据cmap中得到的字形索引,在这里能够得到对应的字型在glyf表中的偏移 |
maxp | 定义了最大值profile,用于为字体分配内存 |
name | 定义字体名称、风格名以及版权说明等 |
post | PostScript |
有一个问题,字符如何在TTF文件中找到自己的字形呢,见下面的说明:
详细说明一下cmap表,因为这个表是最重要的。由于存在不同的系统和编码集,cmap表内涵多个子表,每个子表包含的基本信息有系统ID、编码集以及在表的偏移量。一般系统ID有3和1,前者是Windows,后者是Macintosh。一般而言,TTF文件至少包含两张子表,即Macintosh的Roman体系(PlatformID=1, Encoding=0)和Windows的UGI体系(PlatformID=3, Encoding=1),其中Encoding=1就是Unicode编码。这些子表中保存了字符内码到glyph index的对应。拿到glyph index的值可以到表loca中查到对应glyph表glyf中的偏移。
在Windows中,可以用下面的WIN32 API获得字体信息。
DWORD GetFontData(HDC hDC, DWORD dwTable, DWORD dwOffset, LPVOID lpbBuffer, DWORD cbData)
具体可见http://bbs.chinaunix.net/thread-2041402-1-1.html
FontForge:字体的开发工具
用于开发和编辑字体的开源工具,详见http://fontforge.sourceforge.net/
QT中的字体
QTE(Qt for Embedded)使用FreeType 2字体引擎来支持字体显示。比如TrueType(ttf),Postscript Type(PFA/PFB),Bitmap Distrubution Format fonts(BDF)等。同时QTE自己还支持Qt Prerendered Font(QPF)字体,是一种位图字体,不可缩放,作为QTE的本地字体。
TrueType是由苹果和微软为主开发的矢量字体技术(与之对应的是点阵字体),可以不变形的放大和缩小,文件名一般是*.fon、*.ttf和*.ttc,ttc是ttf的新标准,而fon是以前的老标准。目前有FreeType的字体引擎,作为一个软件库,能够帮助处理TrueType字体的显示。
BDF字体是X窗口系统的位图字体格式,其文件分成两部分,第一部分是描述整体属性的header,第二部分则是每个字型的属性和位图数据。
QPF字体格式仅用于QT/Embedded的不可缩放字体,属于QTE的官方字体,可用工具makeqpf,将ttf文件生成qpf字体文件。
在Qt中直接使用TTF字体或者PFA/PFB这些矢量字体,应用程序会在显示的时候需要将矢量信息计算成点阵形式,会占用大量的计算能力和RAM。如果选用BDF字体,则速度非常慢,而且也需要占用较多资源。QPF是位图字体,不需要再显示时计算点阵,且由于不可缩放,位图直接拿去显示即可,速度和资源占用是最好的。
当QTE应用启动时,会到$QT/lib/fonts目录下去寻找对应的字体文件,包括QBF和TTF字体文件,为兼容期间也会继续读取该目录下的fontdir文件。在代码中使用QFont来应用字体,如果选定字体不存在,QFont有内在的match策略,自动选择默认字体。