Glyph 为什么harfbuzz将2个单个字符塑造成一个字形?

Glyph 为什么harfbuzz将2个单个字符塑造成一个字形?,glyph,skia,harfbuzz,Glyph,Skia,Harfbuzz,我对skia和harfbuzz都是新手,我的项目依靠skia渲染文本skia依靠harfbuzz塑造文本 所以,如果我尝试渲染文本ff或fl或FIK,或者其他一些组合idk.,而不是渲染2 f,skia将渲染一个由2个字符组成的字形SFF或fl或fi,如果我设置文本字母空间属性,它将变得更加明显 通过跟踪断点,我从harfbuzz的整形结果中跟踪并发现了所有这些结果。如果文本为ff、fl或fi,Harfbuzz将给出1个字形 似乎通过配置harfbuzz,我可以避免这种情况,但idk如何,请给我

我对skia和harfbuzz都是新手,我的项目依靠skia渲染文本skia依靠harfbuzz塑造文本

所以,如果我尝试渲染文本ff或fl或FIK,或者其他一些组合idk.,而不是渲染2 f,skia将渲染一个由2个字符组成的字形SFF或fl或fi,如果我设置文本字母空间属性,它将变得更加明显

通过跟踪断点,我从harfbuzz的整形结果中跟踪并发现了所有这些结果。如果文本为ff、fl或fi,Harfbuzz将给出1个字形

似乎通过配置harfbuzz,我可以避免这种情况,但idk如何,请给我一些提示


PS:如果我使用不同的字体文件,形状结果将不同,因此这也与我用来形状的字体文件有关。

您观察到的是文本布局期间发生的连字字形替换的结果

Harfbuzz正在使用字体中的OpenType布局功能执行高级文本布局。OpenType功能是一种机制,用于启用字体中支持的不同排版功能

正确显示脚本需要一些功能。例如,某些功能用于触发阿拉伯语脚本中的单词上下文形式,或触发孟加拉语脚本中元音标记或拉丁语脚本中变音标记的定位。这些是正确显示这些脚本所必需的

其他功能触发字体的可选排版功能。这些功能对于正确显示脚本不是必需的,但对于高质量的排版来说可能是必需的。小大写或上标形式是可选功能的两个示例。默认情况下,应用程序中不应使用许多可选功能。例如,只有在内容作者明确要求时才应使用小写字母

但是在OpenType中,默认情况下建议使用一些可选功能,因为它们旨在为任何正文文本提供高质量的排版。其中一个特征就是标准的连字

您的特定病例,ff、fi等,被视为标准结扎。在任何具有高质量排版的出版物中,这些字体将始终用于正文。因为OpenType规范建议默认应用标准连字,所以Harfbuzz正是这么做的

您可以阅读以了解如何启用或禁用OpenType功能。您可以在OpenType规范的一部分中找到所有OpenType特性的描述

OpenType功能使用字体中直接包含的数据。默认情况下,Harfbuzz将启用标准连字功能,但并非所有字体都必须具有与该功能相关的数据。这就是为什么你看到一些字体的行为,而不是其他字体

当字体不支持功能时,字体数据描述要执行的字形级别操作。Harfbuzz或任何OpenType布局引擎将读取数据并执行所述操作。可以执行几种类型的操作。一种是连字替代,即用一个连字字形替换一系列字形。连字替换动作可用于多种用途的字体中。形成ff韧带就是一个例子。但是字体也可以用一个单独的字形来代替默认的基本字母和后面的组合标记,该字形将基本字母和标记与该组合的标记的精确定位结合在一起。这对于脚本的正确显示是必要的,但也应该是可选的


因此,禁用所有结扎替代是个坏主意。这就是为什么OpenType具有作为触发/控制机制的功能:功能是围绕不同的排版结果组织的,而不是用于实现这些结果的特定字形级别的操作。因此,您可以禁用标准连字等功能,而无需阻止字体用于其他印刷目的的连字替换操作。

回答很好,但有一点小小的注释:在任何具有高质量印刷的出版物中,这些[连字]将始终用于正文。并非所有语言都是如此。例如,在德语中,通常不使用这些连字,可能是因为允许使用连字和不允许使用连字的规则非常复杂。这不像英语那么简单,你可以随时使用它们。这很公平。让我提供一点更详细的信息:在OpenType字体中,字形操作在查找表中描述,并且这些操作由特性触发。上述连字由默认应用的任意连字功能触发。但是数据是由语言系统组织的。因此,字体开发人员可以为某些语言添加操作以形成连字,但对其他语言则没有相同的操作。无论哪种情况,默认情况下都会应用该功能,但实际的glyph动作可能会有所不同。