ttf文件结构解析

TrueType字体通常包含在单个TrueType字体文件中,其文件后缀为.TTF。OpenType字体是以类似   于TrueType字体的格式编码的POSTSCRIPT字体。OPENTYPE字体使用.OTF文件后缀。OPENTYPE还允许把多个OPENTYPE字体组合在一个文件中以利于数据共享。这些字体被称为TrueType字体集(TrueType   collection),其文件后缀为.TTC。
      TrueType字体用machintosh的轮廓字体资源的格式编码,有一个唯一的标记名"sfnt"。windows没有macintosh的位图字体资源格式,字体目录   包含了字体格式的版本号和几个表,每个表都有一个tableentry结构项,tableentry结构包含了资源标记、校验和、偏移量和每个表的大小。下面是TrueType字体目录的c语言定义:
typedef   sturct
{
char   tag[4];
ULONG   checkSum;
ULONG   offset;
ULONG   length;
}TableEntry;

typedef   struct
{
Fixed   sfntversion;   //0x10000   for   version   1.0
USHORT   numTables;
USHORT   searchRange;
USHORT   entrySelector;
USHORT   rangeShift;
TableEntry   entries[1];//variable   number   of   TableEntry
}TableDirectory;

        TrueType   字体中的所有数据都使用big-endian编码,最高位字节在最前面(因为TrueType字体最初是由apple公司定义的,而apple公司的os运行在motorola的cpu上)。如果一人TrueType字体以00   01   00   00   ,00   17开头,我们就可以知道它的格式是轮廓字体资源("sfnt")版本1.0的格式,有23个表。

        TableDirectory结构的最后一个字段是可变长度的tableentry结构的数组,安体中的每个表对应其中一项。TrueType字体中的每个表都保存了不同的逻辑信息-----如图元中数据、字符到图元的映射、字距调整信息等等。有表是必须的,有些是可选的。下表列出了TrueType字体中常见的表。
  
head           字体头                                           字体的全局信息
cmap           字符代码到图元的映射               把字符代码映射为图元索引
glyf           图元数据                                       图元轮廓定义以及网格调整指令
maxp           最大需求表                                   字体中所需内存分配情况的汇总数据
mmtx           水平规格                                       图元水平规格
loca           位置表索引                                   把元索引转换为图元的位置
name           命名表                                           版权说明、字体名、字体族名、风格名等等
hmtx           水平布局                                       字体水平布局星系:上高、下高、行间距、最大前进宽度、最小左支撑、最小右支撑
kerm           字距调整表                                   字距调整对的数组
post           PostScript信息                           所有图元的PostScript   FontInfo目录项和PostScript名
PCLT           PCL   5数据                                     HP   PCL   5Printer   Language   的字体信息:字体数、宽度、x高度、风格、记号集等等
OS/2           OS/2和Windows特有的规格         TrueType字体所需的规格集
        在TableDirectory结构中,所有的TableEntry结构都必须根据它们的标记名排序。比如,cmap必须出现在head前,而head必须在glyf前。但是实际的表可以出现在TrueType字体文件中的任意位置。
        Win32API   提供了一个应用程序可用于查询原始TrueType字体信息的函数:
DWORD   GetFontData(HDC   hDC,DWORD   dwTable   ,DWORD   dwOffset,   LPVOID   lpbBuffer   ,DWORD   cbData);
        GetFontData函数可以用于查询设备上下文中当前逻辑字体所对应的TrueType字体,因此传递的不是逻辑字体句柄,而是设备上下文句柄。你可以查询整个TrueType文件基是文件中的一个表。要查询整个文件的话dwTable参数应该为0;否则,应该传递要查询的表的四字符标记的DWORD格式。参数dwOffset是要查询的表中的起始偏移,要查询整个表的话应该为0;参数;pvBuffer是缓冲区的地址,cbData是缓冲区的大小。如果最后个参数为NULL和0,GetFontData函数返回字体文件或表的大小;就会把到的数据拷贝到应用程序所提供的缓冲区中。
下面的例和查询整个TrueType字体的原始数据:
  TableDirctory   *   GetTrueTypeFont   (HDC   hDC   ,DWORD   &nFontSize)
{
//query   font   size
nFontSize=GetFontData(hDC,0,0,NULL,0);

TableDirectory   *   pFont   =(TableDirectory   *)new   BYTE(nFontSize);
if   (pFont==NULL)
return     NULL;
GetFontData(hDC,0,0,pFont,nFontSize);

return   pFont;
}
        GetFontData使得应用程序能够在自己的文档中内嵌TrueType字体,以确保这些文档能在没有相应字体的其他机器上显示。它的做法是允许应用程序查询字体数据,然后写入到文档中作为文档的一部分,在文档被打于时再安装该字体以确保文档能以创建时同样的方式显示。比如,Windows   NT/2000的假脱机程序在打印到远端服务器时会在假脱机文件中内嵌入TrueType字体以保证文档能在另一台机器上正确地打印。
一旦接受到TrueType字体的原始数据,它的头中的TableDirectory结构很容易分析。需要检查的只有版本号和表的数目,然后就可以检查单个的表。我们来看一些重要的和有趣的表。
1.字体头
    字体头表(head表)中包含了TrueType字体的全局信息。下面是字体头表的结构。
typedef   sturct
{
Fixed   Table;//x00010000   ro   version   1.0
Fixed   fontRevision;//Set   by   font   manufacturer.
ULONG   checkSumAdjustment;
ULONG   magicNumer;   //Set   to   0x5f0f3cf5
USHORT   flags;
USHORT   unitsPerEm;   //Valid   range   is   from   16   to   16384
longDT   created;   //International   date   (8-byte   field).
longDT   modified;   //International   date   (8-byte   field).
FWord   xMin;   //For   all   glyph   bounding   boxes.
FWord   yMin;   //For   all   glyph   bounding   boxes.
FWord   xMax;   //For   all   glyph   bounding   boxes.
FWord   xMax;   //For   all   glyph   bounding   boxes.
USHORT   macStyle;
USHORT   lowestRecPPEM;   //Smallest   readable   size   in   pixels.
SHORT   fontDirctionHint;
SHORT   indexToLocFormat;   //0   for   short   offsets   ,1   for   long.
SHORT   glyphDataFormat;     //0   for   current   format.
}Table_head;

        字体的历史记录在三个字段中

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值