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