对齐、字距调整和间距

从 Windows 8 开始,DirectWrite 提供了许多功能,可用于控制基本版式、布局和间距功能,例如字符间距、对字距调整和对齐。

字符间距

字符间距也称为“跟踪”,是文本运行中字符之间的间距。

下面是一个跟踪示例。 第一行不对文本应用任何跟踪。 第二行增加字符间距,第三行减少字符间距。

同一文本的三个示例,没有跟踪,间距更大,间距更少。

从 Windows 8 开始,DirectWrite在此处添加这些方法来控制文本中字符的间距。

如果使用 DirectWrite 布局,则可以使用 IDWriteTextLayout1::GetCharacterSpacingIDWriteTextLayout1::SetCharacterSpacing 方法实现此目的。

使用 GetCharacterSpacing 方法可确定当前字符间距,并返回当前字符、字符前后间距、最小前进宽度以及包含剩余文本起始位置和长度信息的 DWRITE_TEXT_RANGE 结构。

使用 DWriteTextLayout1 接口上的 SetCharacterSpacing 将你自己的字符间距应用于布局中的文本。 SetCharacterSpacing 方法采用字符前后所需的空间量、允许的最小前移量,以及定义要应用间距的范围的DWRITE_TEXT_RANGE

如果使用自定义布局,DirectWrite支持使用 IDWriteTextAnalyzer1::ApplyCharacterSpacing 设置字符间距。 如果需要自定义文本布局才能对布局进行高级控制,请使用此方法。 使用此方法可为 ApplyCharacterSpacing 提供前导和尾随间距、最小前进宽度、分类映射的长度、字形数、从字符范围到字形的映射以及每个字形的前进宽度(如果使用自定义布局)。 方法返回修改后的字形前移和具有每个字形原点的新偏移量的 DWRITE_GLYPH_OFFSET 枚举。

字距调整

字距调整是字母对或三胞胎之间的上下文间距调整。 字符集之间的特定间距可以提高可读性并使文本看起来更好。 字距调整和字符间距之间的重要区别在于,字母间距与它所分隔的文本无关,而字距调整在某些情况下用于字体中定义的某些字符对之间。

她的图像是字距调整的示例。 顶行上的“AVATAR”一词经过字距调整,以使单词看起来更自然。 从字符周围的红色框中可以看到,前四个字母之间应用了更多的间距,而末尾的 R 前面有更多的空间。 不调整字距的原始文本位于第二行。 此示例中的字距调整使单词更具可读性和自然性。

应用了和未应用字距调整的相同单词的示例。

字符在字体 kern 存储在 kern 表中的字符对之间前进,DirectWrite分析该表并通过字距调整 API 返回信息。

如果想知道字体是否支持对字距调整,可以使用 IDWriteFontFace1::HasKerningPairs 方法。 如果字体支持字距调整对,则此方法返回布尔值 1。

IDWriteFontFace1 还有一种方法,可用于访问字形索引的字距调整对。 GetKerningPairAdjustments 允许输入字形索引数组,DirectWrite返回字形提前调整数组。 如果字体不支持 kern 表,该方法返回字形提前调整的零。

如果使用DirectWrite布局,IDWriteTextLayout1 接口上有两种方法,可用于设置对字距调整,并详细了解布局中的对字距调整。 SetPairKerning 方法采用布尔值表示形式,表示是否要启用对字距调整,以及定义要应用该字距的文本范围的DWRITE_TEXT_RANGE。 如果要了解是否对文本范围启用了成对字距调整,可以使用 GetPairKerning 方法,该方法采用当前位置并返回一个布尔值,该布尔值对应于是否启用成对字距调整以及字距调整设置适用的文本范围。

理由

对齐是对齐文本的过程,以便它通过增加字符或字形分类之间的前进或添加对齐字符来实现相同的效果来填充列内的所有空间。 通常,这是通过确定需要向文本行中添加空格的位置,并在这些中断机会中插入间距字符来实现的。 这些间距元素可能也有所不同,在拉丁文脚本中,文本通过增加元素之间的前向宽度来对齐,而在阿拉伯语中,文本与 kashida 对齐。 下面是两种对齐和不对齐的阿拉伯语和拉丁语脚本的示例。

阿拉伯文和拉丁文脚本的一个示例,既对齐,又不对齐。

从Windows 8开始,DirectWrite有许多方法可用于使应用中的文本对齐。

DWRITE_TEXT_ALIGNMENT 枚举中还有一个附加值。 可以使用 SetTextAlignment 方法并传入DWRITE_TEXT_ALIGNMENT_JUSTIFIED常量,DirectWrite对齐文本并为脚本插入适当的对齐字符。

如果使用自定义布局,可以使用许多方法,以便利用理由。 DirectWriteIDWriteTextAnalyzer1 接口上有三种方法,可用于向自定义布局添加理由。

第一种方法是 GetJustificationOpportunities,它接受要对齐的文本,并返回 一个DWRITE_JUSTIFICATION_OPPORTUNITY 结构,该结构概述了可以添加对齐字符以对齐文本的位置。

第二个函数是 JustifyGlyphAdvances,它对齐字形前进数组,以便它们适合线条宽度。 此方法采用 GetJustificationOpportunities 生成的DWRITE_JUSTIFICATION_OPPORTUNITY结构、字形前进和字形偏移。 然后,它生成对齐字形前移和包含对齐字形偏移量的 DWRITE_GLYPH_OFFSET 枚举。

第三个函数是 GetJustifiedGlyphs,它填充复杂脚本的新字形,其中理由增加了字形的进步。 仅当脚本具有 GetScriptProperties 返回的特定对齐字符时,才需要调用 GetJustifiedGlyphs。 此方法获取有关字体、文本长度、字形大小、文本脚本、字形数、分类图、原始字形前进/偏移量、对齐字形前移/偏移量和字形属性的信息。 方法返回实际字形计数、更新的分类映射、具有插入对齐字形的更新字形索引、更新的字形偏移量和更新的字形前进。