# "lcar" 表

# 介绍

连字插入符表(标签名称:“lcar” ligature caret)允许您设计 AAT 字体,并在部分或全部连字内部包含分割点。 这允许您指定应用程序如何分割连字。 如果没有连字插入符表规范,应用程序可能会使用偶数 n 路分割,从而导致不希望的连字划分。

考虑“wi”连字。 连字的“w”部分较宽,连字的“i”部分相对较窄。 如果应用程序均匀地分割连字,插入符号将太靠近“w”,而不是在字形的两个部分之间适当间隔。 连字插入符表允许您正确指定分割点,以确保线条的外观最佳。

# 连字插入符表格式

连字插入符表的整体结构由连字插入符表头、查找表和实际连字插入符条目组成,如下图所示:

FF37

连字插入符表头格式如下:

类型 名称 描述
fixed32 version 连字插入符号表的版本号(初始版本为 0x00010000)。
uint16 format 连字插入符号表的格式。 格式0表示距离,格式1表示控制点,如下所述。
variable lookup 将字形与 LigCaretClassEntry 记录相关联的数据查找表。 有关如何解释查找值的详细信息,请参阅下文。

查找表用于查找与特定字形关联的 LigCaretClassEntry 记录。 以下是解释 5 种查找表格式中每种格式的查找值的方法:

查找格式 解释
0 16 位偏移量数组,每个偏移量对应字体中的每个字形。 每个偏移量都是从 Ligature Caret 表的开头到该字形的特定 LigCaretClassEntry 记录。
2 每个lookupSegment 的值是从Ligature Caret 表的开头到该段中字形的特定LigCaretClassEntry 记录的16 位偏移量。
4 每个lookupSegment 的值是从Ligature Caret 表的开头到段中每个字形的LigCaretClassEntry 记录的16 位偏移量数组的16 位偏移量。
6 每个lookupSingle 的值是从Ligature Caret 表的开头到该字形的特定LigCaretClassEntry 记录的16 位偏移量。
8 valueArray 是一个 16 位偏移量的数组,一个偏移量对应于修剪数组中的每个字形。 每个偏移量都是从 Ligature Caret 表的开头到该字形的特定 LigCaretClassEntry 记录。

查找表中的每个条目都是 LigCaretClassEntry 类型记录的偏移量,并且针对一个特定的连字字形。 该条目包含与字形关联的值的数量,后跟分割点值本身。 请注意,值的数量通常比组成连字的字符数少 1。

LigCaretClassEntry记录的格式如下:

类型 名称 描述
uint16 count 部分数组中的条目数。
int16 partials[count] 单一值。

格式字段包含当前表的格式类型。 连字插入符表有两种可能的格式:

格式 描述
0 距离。 与特定字形相关联的一个或多个值是 FUnit 值,表示沿着基线的位置,通过该位置与基线正交地进行细分。
1 控制点。 与特定字形关联的值(或多个值)是控制点编号,通过控制点编号正交于基线进行细分。

格式 0 距离指定为沿基线从 x = 0 到连字分割点。 如果要包含多个划分点,则必须相对于 x = 0 指定每个划分点。例如,连字“fr”的划分点距离可以是 x = 221 FUnits,而连字“fr”的划分点距离可以是 x = 221 FUnits。 连字“ffi”对于“ff”可以分别是x = 240 FUnit,对于“fi”可以分别是x = 483 FUnit。

格式 1 分割点由沿基线指定的控制点的编号指定。 如果控制点高于或低于基线,则以控制点到基线的正交投影作为分割点。 然后,它使用与格式 0 距离完全相同的点来指定分割点。 控制点在“glyf”表中指定。

格式 1 控制点格式提供了比格式 0 更高级别的控制。可以提示控制点更改其位置,以改善每面小像素字形的外观。 对于格式 0 距离,无法进行此校正。

# 连字插入符表示例

# 示例:格式 0 连字插入符表

对于此示例,字体包含罗马字体中的“fr”和“ffl”连字。 “fr”连字的字形索引为 272,分割点到字形的距离为 x = 220 FUnits。 “ffl”连字的字形索引为 274。“ff”分割点到字形 274 的距离为 x = 239 FUnits。 “fl”分割点到字形 274 的距离是 x = 475 FUnits。 两个连字的分割点如下图所示:

FF39

下表总结了连字插入符数据:

Glyph Index	 Division Points	 Ligature	 Distance
	   272				    1			        fr			 220
	   274				    2			        ffl
									                (ff)			 239
									                (fl)			 475

下表显示了如何为示例字体构建 Format 0 连字插入符号表:

字形索引的字节,以及从该连字插入符号表开始的偏移量的 2 个字节)。

Offset/
length

Value

Name

Comment

0/4 0x00010000 version 连字插入符号表的版本号,采用定点格式。
4/2 0 format 连字插入符号表的格式。 该表将使用格式0,表示划分点是指定的距离。
(A 格式6查找表 这里开始)
6/2 6 format 查找表格式 6(单表格式)。
(接下来的五个字段是查找表的 BinSrchHeader)
8/2 4 unitSize LookupSingle 记录的大小(2 个 16 位字)
10/2 2 nUnits 要搜索的前一个unitSize的单元数。 表中包含 2 个连字。
12/2 8 searchRange unitSize 乘以小于或等于 nUnits 的最大二的幂。
14/2 1 entrySelector 小于或等于 nUnits 的最大的两个幂的对数以 2 为底。
16/2 0 rangeShift unitSize 乘以 nUnits 的差值减去两个小于或等于 nUnits 的最大幂。
(LookupSingle 记录条目从这里开始)
18/2 272 glyph “fr”连字的字形索引。
20/2 30 value “fr”连字的 LigCaretClassEntry 记录的偏移量。
22/2 274 glyph “ffl”连字的字形索引。
24/2 34 value “ffl”连字的 LigCaretClassEntry 记录的偏移量。
26/2 0xFFFF glyph 特殊的保护值。
28/2 0 value 特殊的保护值。
(LigCaretClassEntry 记录从这里开始)
30/2 1 count 内部连字的数量。 “fr”连字有 1 个内部连字插入符位置。
32/2 220 partial “fr”连字的分割点的 FUnit 距离。
34/2 2 count 内部连字的数量。 “ffl”连字有 2 个内部连字插入符位置。
36/2 239 partial “ffl”连字的“ff”划分的 FUnit 距离。
38/2 475 partial “ffl”连字的“fl”划分的 FUnit 距离。

# 示例:格式 1 连字插入符表

对于此格式 1 连字插入符表示例,字体再次包含罗马字体中的“fr”和“ffl”连字。 “fr”连字的字形索引为 272,分割点的控制点为 50。“ffl”连字的字形索引为 274。“ff”分割点的控制点为 55。控制点 'fl' 的分割点是 75。两个连字的插入符号位置如图 5-3 所示。

FF40

下表总结了连字插入符数据。

Glyph Index	 Division Points	 Ligature	 Control Point
    272				      1			        fr			    50
    274				      2			        ffl
                                  (ff)			  55
                                  (fl)			  75

Offset/
length

Value

Name

Comment

0/4 0x00010000 version 连字插入符号表的版本号,采用定点格式。
4/2 1 format 连字插入符号表的格式。 该表将使用格式1,表示划分点是控制点。
(格式 6 查找表从这里开始)
6/2 6 format 查找表格式 6(单表格式)。
(接下来的五个字段是查找表的 BinSrchHeader)
8/2 4 unitSize LookupSingle 记录的大小(2 个字节用于字形索引,2 个字节用于距此连字插入符号表开头的偏移量)。
10/2 2 nUnits 要搜索的前一个unitSize的单元数。 表中包含 2 个连字。
12/2 8 searchRange unitSize 乘以小于或等于 nUnits 的最大二的幂。
14/2 1 entrySelector 小于或等于 nUnits 的最大的两个幂的对数以 2 为底。
16/2 0 rangeShift unitSize 乘以 nUnits 的差值减去两个小于或等于 nUnits 的最大幂。
(LookupSingle 记录条目从这里开始)
18/2 272 glyph “fr”连字的字形索引。
20/2 30 value Offset of LigCaretClassEntry record for the 'fr' ligature.
22/2 274 glyph “ffl”连字的字形索引。
24/2 34 value “ffl”连字的 LigCaretClassEntry 记录的偏移量。
26/2 0xFFFF glyph 特殊的保护值。
28/2 0 value 特殊的保护值。
(LigCaretClassEntry 记录从这里开始)
30/2 1 count 内部连字的数量。 “fr”连字有 1 个内部连字插入符位置。
32/2 50 partial “fr”连字的分割点的控制点。
34/2 2 count 内部连字的数量。 “ffl”连字有 2 个内部连字插入符位置。
36/2 55 partial “ffl”连字的“ff”分隔的控制点。
38/2 75 partial “ffl”连字的“fl”部分的控制点。