truetype字体怎么转换成普通字体_【转】TrueType(二)字体格式解析

1. 概述

TrueType字体使用Mac轮廓字体资源的格式编码,标记名为"sfnt"。

字体目录TableDirectory包含了字体格式的版本号和几个表。

typedef struct

{

Fixed sfntversion; // 版本号. 对于Version 1.0为0x10000

USHORT numTables;

USHORT searchRange;

USHORT entrySelector;

USHORT rangeShift;

TableEntry entries[1]; // TableEntry数组,长度可变

} TableDirectory;

TrueType字体中的数据使用big-endian编码。

如果TrueType字体文件开头如下,则它的版本为1.0,有23个表。

00 01 00 00 00 17

TableDirectory中的每个表对应一个TableEntry项。TableEntry结构包含了资源标记、校验和、偏移量和每个表的长度。TalbeEntry的定义如下:

typedef struct

{

char tag[4];

ULONG checkSum;

ULONG offset;

ULONG length;

} TableEntry;

TableEntry中保存了不同类型的数据,如图元数据、字符到图元的映射、字距调整信息等。有些表是必需的,有些是可选的。

如下列出TrueType字体的常见表。

表名

功能

说明

head

字体头

字体的全局信息

name

命名表

版权说明、字体名、字体族名、风格名等

cmap

字符代码到图元的映射

将字符代码映射为图元索引

loca

位置表索引

将图元索引转换为图元位置

maxp

最大需求表

字体中所需内存分配情况的数据

mmtx

水平规格

图元的水平规格

hmtx

水平布局

字体水平布局信息:上高、下高、行间距、最大前进宽度、最小左支撑、最小右支撑

kerm

字距调整表

字距调整对的数组

fpgm

指令数据

开始访问字体时执行的指令序列

prep

指令数据

字体改变时执行的指令序列

glyf

图元数据

图元轮廓定义以及指令数据

在TableDirectory结构中,所有的TableEntry表项都必须根据预定的标记名排序。比如,cmap必须出现在head前,而head必须在glyf前。但是它们指向的表则可以以任意顺序出现在文件中。

2. 表

2.1. head

包含字体的全局信息。如:

主版本号、修订版本号

创建、修改时间

应用到整个文件的排版设置。比如字体的边界框(bounding box),字形的方向,如何在master grid(或者更老的说法是em square)中放置等。

绘制字形时,假想将它放在一个正方形的网格中。网格中单元的大小,决定网格的精确度。单元越小,则字形绘制得越细致,越清晰。这个不可见的网格就是master grid。

2.2 name

包含关于字体特性的描述信息。

版权提示

字体名、风格(style)名。以任何人类可读的语言撰写。软件会向用户展示它们。

2.3 cmap

包含从字符代码(character code)到图元(glyph indices)的索引。图元索引保存在loca表中。

选择哪种字符编码(encoding),取决于希望在哪个平台上使用该字体。如果希望跨平台使用,可能需要多种字符编码,这样cmap中就包含多个编码表(encoding table)。

2.4 loca

保存图元在glyf表中的偏移位置(offset)。

借助cmap表和loca表,可以从一个指定的字符代码,快速访问它对应的图元。

2.5 glyh

定义字形的外形(apperance)数据,包括:

字形的轮廓线,

用于填充master grid单元的指令(intruction)序列等。

TrueType字体中,字形的轮廓由直线和二次贝塞尔曲线(bézier)片段构成。

字形数据保存轮廓曲线上的若干控制点。参考这些控制点在master grid绘制轮廓,并填充其中的单元。

作为矢量字体,既要让小字体在低分辨率设备上清晰可读,也要让大字体在高分辨率设备完美显示。要让各种情况下的显示效果最小化。TrueType字体使用指令(intruction)做到这一点。解释器(interpreter)调用指令,将曲线在master grid上以恰当的方式光栅化(rasterization)。比如,

控制各部件之间的间距

避免锯齿问题,等等。

glyph表中的指令从属于它关联的字形,称为glyph program。

还有从属于整个TrueType文件的指令,有两种:font program 和 control value program。

TrueType支持简单字形 ,也支持组合字形,也就是由若干字形组合成的复合字形。下图是组合字形的若干例子。

2.6 fpgm

保存从属于文件的指令font program。

font program只在程序开始访问字体时调用一次。其中主要定义给glyph program使用的全局函数。

2.7 prep

保存从属于文件的指令cotrol value program。

control value program在字体大小改变时调用。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值