我是skia和harfbuzz的新手,我的项目依靠skia来渲染文本(Skia依靠harfbuzz来塑造文本。
因此,如果我尝试渲染文本"ff"或"fl"或"fi"(或者可能是其他一些组合idk.(,而不是渲染2"f",skia将渲染一个由2个字符组成的字形("ff"或"fl"或"fi"(,如果我设置文本字母空间属性,它将变得更加明显。
通过跟踪断点,我跟踪并发现这一切都是 harfbuzz 的塑造结果的结果。如果文本是"ff"或"fl"或"fi",Harfbuzz 将给出 1 个字形。
似乎通过制作一些 harfbuzz 的配置,我可以避免这种情况,但是 idk 如何,请给我一些提示。
PS:如果我使用不同的字体文件,形状结果会有所不同,所以这也与我用来塑造的字体文件有关。
您观察到的是文本布局期间发生的连字形替换的结果。
Harfbuzz 正在使用字体中的 OpenType 布局功能执行高级文本布局。OpenType 功能是一种机制,用于启用字体中支持的不同排版功能。
正确显示脚本需要某些功能。例如,某些功能用于触发阿拉伯文字中的单词上下文形式,或触发孟加拉语脚本中元音标记或拉丁字母变音符号的位置。这些对于正确显示这些脚本是必需的。
其他功能会触发字体的可选排版功能 - 它们对于正确显示脚本不是必需的,但对于高质量排版可能是必需的。小型大写字母或上标形式是可选功能的两个示例。默认情况下,许多可选功能不应在应用程序中使用。例如,仅当内容作者明确需要时才应使用小型大写字母。
但在 OpenType 中,建议默认使用一些可选功能,因为它们旨在为任何正文文本提供高质量的排版。其中一个功能是"标准连字"。
您的具体情况,"ff"、"fi"等被视为标准连字。在任何具有高质量排版的出版物中,这些将始终用于正文中。因为OpenType规范建议默认应用标准连字,所以这正是Harfbuzz正在做的事情。
您可以阅读 Harfbuzz 文档,以了解有关如何启用或禁用 OpenType 功能的更多信息。您可以在 OpenType 布局标签注册表(OpenType 规范的一部分(中找到所有 OpenType 功能的描述。
OpenType 功能使用直接包含在字体中的数据。Harfbuzz 将默认启用标准连字功能,但并非所有字体都必须具有与该功能相关的数据。这就是为什么您会看到某些字体的行为,而不是其他字体。
当字体确实支持功能时,字体数据描述要执行的字形级操作。Harfbuzz(或任何OpenType布局引擎(将读取数据并执行所描述的操作。可以执行多种类型的操作。一种是连字替换,即用单个字形(连字字形(替换字形序列。连字替换操作可用于字体中的各种目的。形成"ff"连字就是一个例子。但是,字体也可以将默认字形替换为基本字母,并在组合标记之后使用单个字形替换,该字形将基本字母和标记与该组合的标记的精确定位合并在一起。这对于正确显示脚本至关重要,但应该是可选的。
因此,禁用所有连字替换将是一个坏主意。这就是 OpenType 具有触发器/控制机制的功能:功能围绕不同的排版结果进行组织,而不是用于实现这些结果的特定字形级操作。因此,您可以禁用标准连字等功能,而不会阻止字体用于其他排版目的的连字替换操作。