# "特征" 表
# 一般表信息
# 介绍
功能名称表(标签名称:“feat”)允许您包含字体的文本功能、每个文本功能的设置以及功能和设置的常见(人类可读)名称的名称表索引。
Apple 定义了一组标准的文本功能。 您可以包含其中一项或多项或创建您自己的文本功能。 您的字体支持的字体功能必须是 Apple Inc. 维护的字体功能注册表的一部分。您可以通过发送电子邮件建议对此注册表进行添加:
# 特征名称表格式
特征名称表由特征名称表头、特征名称数组、设置名称数组和特征集记录组成。 特征名称表的整体结构如下图所示:
特征名称表头的格式如下:
| 类型 | 名称 | 描述 |
|---|---|---|
| fixed32 | version | 功能名称表的版本号(当前版本为 0x00010000)。 |
| uint16 | featureNameCount | 功能名称数组中的条目数。 |
| uint16 | (none) | 保留(设置为零)。 |
| uint32 | (none) | 保留(设置为零)。 |
| FeatureName | names[featureNameCount] | 功能名称数组。 |
功能名称数组位于功能名称标题后面。 要素名称数组按要素类型排序。 featureName 记录指定要素 ID、要素名称的名称表索引以及名称表中要素名称的偏移量(以字节为单位)。 特征名称数组的格式如下:
| 类型 | 名称 | 描述 |
|---|---|---|
| uint16 | feature | 特征类型。 |
| uint16 | nSettings | 设置名称数组中的记录数。 |
| uint32 | settingTable | 从该表的开头到该功能的设置名称数组的偏移量(以字节为单位)。 该偏移量所指的实际记录类型将取决于排他性值,如下所述。 |
| uint16 | featureFlags | 与要素类型关联的单位标志。 |
| int16 | nameIndex | 要素名称的名称表索引。 该索引的值大于 255 且小于 32768。 |
featureFlags 字段包含与要素类型关联的单位标志。 下表显示了标志及其解释:
| 掩码值 | 解释 |
|---|---|
| 0x8000 | 独占设置。 如果设置,则功能设置是互斥的。 |
| 0x4000 | 如果清除,则该功能的设置名称数组中索引为 0 的设置应被视为该功能的默认设置(如果需要)。 如果设置,则此 featureFlags 字段的位 0-15 包含将被视为默认值的设置的索引。 |
| 0x3F00 | 未使用,必须设置为0。 |
| 0x00FF | 如果设置了第 30 和 31 位,则这 16 位表示此功能的设置名称数组中的设置索引,应将其视为默认值。 |
设置名称数组位于功能名称数组之后。 设置名称数组的格式如下:
| 类型 | 名称 | 描述 |
|---|---|---|
| uint16 | setting | 设置。 |
| int16 | nameIndex | 设置名称的名称表索引。 nameIndex 必须大于 255 且小于 32768。 |
对于没有独占设置的要素类型,总是有一对值。 第一个值打开选择器,第二个值关闭选择器。 开启设置必须均匀,关闭设置必须比相应的开启设置大 1。 因此,关闭设置总是奇数。 因此,只有 on 设置应该在设置名称数组中具有条目。
设置名称数组必须位于功能名称数组之后。 每个设置名称数组均按设置排序。 然而,设置名称数组可以按任何顺序排列。
# 功能和设置
字体中使用的所有功能和设置都应在字体功能注册表中注册。 请参阅该文档了解当前的功能和选择器常量集。
# 默认功能设置
如果某个功能在 featureFlags 字段中被标记为“独占”(设置了位 31),则其设置之一将对应于根本没有应用任何设置时字形数组的状态。
# 功能和语言代码
特征类型 39 与“ltag”表结合使用以提供特定于语言的字形。 它必须始终被标记为专有功能。
对于功能类型 39,选择器值 0 表示与其他地方一样“无变化”,并且通常用于与语言无关的字形(例如通用西里尔字母)。 其他选择器值比“ltag”表中的索引多一个,可用于指示切换到一组特定于语言的字形(例如塞尔维亚语)。 有关详细信息,请参阅“ltag”表的文档。
请注意,由字体设计者决定哪些字形与语言无关,哪些字形特定于语言。
# 功能名称表示例
该示例字体具有在名称表中列出的四个特征,其偏移量在此特征名称表中指定。 表 17-26 总结了该字体要包含的功能名称数据。
例如,字母大小写功能 (ID 3) 定义了六个选择器(大写和小写、全部大写、全部小写、小写大写、首字母大写、首字母大写加小写)。 当没有对字母大小写功能的文本应用选择器时,文本将以混合大小写形式显示,就像应用了显式大小写选择器一样。
这很重要,因为菜单或其他 UI 元素需要能够在没有应用选择器时指示哪个选择器处于“打开”状态。
哪个选择器相当于默认行为通常可以(但并非总是)从“morx”表的内容中推断出来。 为了处理并非如此的情况,可以使用 featureFlags 字段的位 30 和 0-16 来确定应将哪个选择器视为默认选择器。 如果位 31 已清除(因此该功能被标记为“非排他性”),则这些位的值将被忽略。 如果设置了位 31,并且清除了位 30,则此功能的第一个选择器(即,其设置名称数组中索引为 0 的选择器)是默认选择器。 如果位 31 和 30 均已设置,则位 0-16 包含默认功能的设置名称数组中的索引。
| 文字特征 | 特征 | 环境 | 设定值 |
|---|---|---|---|
| All typographic features | 0 | On | 0 |
| Ligatures | 1 | Common on | 2 |
| Letter case | 3 | Upper and Lower | 0 |
| Letter case | 3 | Small caps | 3 |
| Letter case | 3 | Initial caps | 4 |
| Number spacing | 6 | Monospaced | 0 |
| Number spacing | 6 | Proportional | 1 |
该示例字体的特征名称表如下:
Offset/ length |
值
|
名称
|
备注
|
|---|---|---|---|
| 0/4 | 0x00010000 | version | 特征名称表的版本号,采用定点格式。 |
| 4/2 | 4 | featureNameCount | 该特征名称表中的特征数量为4。 |
| 6/2 | 0 | (reserved) | 保留,必须为零。 |
| 8/4 | 0 | (reserved) | 保留,必须为零。 |
(featureName 数组从这里开始。第一个特征是“所有印刷特征”,特征 0) | |||
| 12/2 | 0 | feature | 特征码为0。 |
| 14/2 | 1 | nSettings | 功能 0 有 1 个设置。 |
| 16/4 | 60 | settingTable | 从该表的开头到功能 0 的设置名称数组的偏移量为 60 字节。 |
| 20/2 | 0 | featureFlags | 零表示非独占设置。 |
| 22/2 | 260 | nameIndex | 该功能名称的名称表索引。 |
(第二个 featureName 从这里开始。第二个功能是“连字”,即功能 1) | |||
| 24/2 | 1 | feature | 特征码为1。 |
| 26/2 | 1 | nSettings | 功能 1 有 1 个设置。 |
| 28/4 | 64 | settingTable | 从该表的开头到该功能的设置名称数组的偏移量(以字节为单位)。 |
| 32/2 | 0 | featureFlags | 零表示非独占设置。 |
| 34/2 | 256 | nameIndex | 该功能名称的名称表索引。 |
(第三个 featureName 记录从这里开始。第三个功能是“字母大小写”,功能 3) | |||
| 36/2 | 3 | feature | 特征代码为3。 |
| 38/2 | 3 | nSettings | 功能 3 有 3 个设置。分别是 0、3 和 4。 |
| 40/4 | 68 | settingTable | 从该表的开头到该功能的设置名称数组的偏移量(以字节为单位)。 |
| 44/2 | 0x8000 | featureFlags | 高位亮表示该功能具有互斥设置; 由于位 30 已清除,因此第一个设置(大写和小写)是默认设置。 |
| 46/2 | 262 | nameIndex | 该功能名称的名称表索引。 |
(第四个也是最后一个 featureName 从这里开始。第四个功能是“数字间距”,功能 6) | |||
| 48/2 | 6 | feature | 特征代码为6 |
| 50/2 | 1 | nSettings | 功能 6 有 1 个设置。 |
| 52/4 | 80 | settingTable | 从该表的开头到该功能的设置名称数组的偏移量(以字节为单位)。 |
| 56/2 | 0xC001 | featureFlags | 高位打开意味着该功能具有互斥的设置。位 30 被设置,因此位 0-16 包含该功能的默认设置的索引,在本例中设置索引 1(值 1,比例数字)。 |
| 58/2 | 258 | nameIndex | 该功能名称的名称表索引。 |
(settingName 数组如下;第一个设置数组用于“所有印刷功能”功能) | |||
| 60/2 | 0 | setting | 设定值0(开)。 |
| 62/2 | 261 | nameIndex | 此功能设置名称的名称表索引。 |
(第二个 settingName 数组用于“连字”功能) | |||
| 64/2 | 2 | setting | 设置值 2(公共端亮起)。 |
| 66/2 | 257 | nameIndex | 此功能设置名称的名称表索引。 |
(第三个 settingName 数组用于“字母大小写”功能) | |||
| 68/2 | 0 | setting | 设置值0(大小写)。 |
| 70/2 | 268 | nameIndex | 此功能设置名称的名称表索引。 |
| 72/2 | 3 | setting | 设置值 3(小写字母)。 |
| 74/2 | 264 | nameIndex | 此功能设置名称的名称表索引。 |
| 76/2 | 4 | setting | 设置值 4(初始上限)。 |
| 78/2 | 265 | nameIndex | 此功能设置名称的名称表索引。 |
(第四个 settingName 数组用于“数字大小写”功能) | |||
| 80/2 | 0 | setting | 设置值 0(等宽)。 |
| 82/2 | 259 | nameIndex | 此功能设置名称的名称表索引。 |
| 84/2 | 1 | setting | 设定值1(比例)。 |
| 86/2 | 260 | nameIndex | 此功能设置名称的名称表索引。 |
# 依赖关系
“feat”表与扩展字形变形(“morx”)表密切相关。 对一个的编辑通常会导致对另一个的编辑。 请特别注意,featureFlags 字段的位 0-15 和 30 标识的任何默认设置应与从“morx”表中确定的内容一致。