OpenType GPOS LookupType 8 - 跳过标记

Posted

技术标签:

【中文标题】OpenType GPOS LookupType 8 - 跳过标记【英文标题】:OpenType GPOS LookupType 8 - skipping marks 【发布时间】:2019-08-18 16:04:24 【问题描述】:

我正在尝试使用字体 Jameel_Noori_Nastaleeq.ttf 理解“بڑ”(乌尔都语 - Unicode 1576、1681)的渲染。

字符串由 GSUB 表转换为字形 [607, 460, 471, 1651]。我可以检测到第一个字形下第二个字形的正确锚附件。但是我找不到合适的 GSUB 子表,它将第三个字形放在第一个字形的顶部。这里,左边是正确的,右边是我的程序现在做的。

另外,我不太了解 GSUB 的 LookupType 8。一些 LookupTable 可以有 LookupFlags,包括位 8 - ignoreMarks。在匹配 Backtrack、Input 和 Lookahead 序列时,我是否应该考虑这些标志,即跳过标记? LookupType 8的匹配和应用机制到底是什么?

【问题讨论】:

你 100% 想在typedrawers.com 上问这个问题,而不是在这里。 OpenType 编程是一个超级小众主题,typedrawers.com 上到处都是几乎所有致力于塑造 opentype 规范本身的人,他们确切地知道你在问什么,并且能够给你一个比几乎任何人都更详细的答案所以可以给你。 【参考方案1】:

两个标记(小 tah 和 'beh' 的点)的定位是通过在 GPOS 表的标记定位 ('mark') 功能中查找完成的,该功能已应用应用 GSUB 规则之后。没有 GSUB 唯一的方法来获得正确的最终定位。必须处理 GPOS(在 GSUB 之后)。

关于 ignoreMarks 标志:该标志并非特定于 GSUB LookupType8。任何查找(GSUB 或 GPOS)都可以设置此标志。它告诉布局引擎忽略正在考虑的序列中的标记,以匹配上下文。这允许仅使用序列的“根”字形定义替换上下文,因此如果上下文规则为 A B C,则设置了 ignoreMarks 标志的查找将匹配 A (mark) B CA B (mark) CA B C 等。

在这种字体中发挥作用是因为首先将两个输入字符分解(在 GSUB 中)为一系列基本 + 标记字形,然后重新组合(也在 GSUB 中),然后定位标记(在 GPOS 中) )。

(顺便说一句:您为什么要自己进行文本布局,而不是使用现有的布局引擎,例如 HarfBuzz 或其他操作系统内置的引擎?)

【讨论】:

嗨,我正在制作一个照片编辑器 www.Photopea.com,它可以在浏览器中运行,每天有 100 000 人使用。遗憾的是,javascript 中没有 OpenType 布局引擎,所以我不得不自己制作一个名为 Typr.js 的引擎。它已经相当先进了,但是随着我的照片编辑器的扩展,我不得不逐渐添加缺失的部分(比如渲染乌尔都语等)。 那么你能告诉我,哪个查找表负责重新定位“tiny b”吗? “标记”功能提到了 15 条查找记录,我无法将其与其中任何一条记录匹配 :( 看看 GPOS lookupList index #20。这是“标记”功能引用的查找,它定位点和小 tah(“小 b”)。它实际上是一个标记到连字查找(GPOS lookupType 5)。 哦,看看github.com/prezi/harfbuzz-js,它声称是 HarfBuzz 的 JavaScript 实现(通过 Emscripten)。听起来项目需要一些帮助,困难的部分(OpenType 布局逻辑)已经完成。 当然可以。实际上,我们在 *** 上也有一些人知道这些东西 ;-)

以上是关于OpenType GPOS LookupType 8 - 跳过标记的主要内容,如果未能解决你的问题,请参考以下文章

我需要解析 OpenType 文件中的 GSUB 和 GPOS 表。有没有可用的软件可以做到这一点?

如何从 Opentype 字体的 GPOS 表中使用和提取字距调整对,以在 Java 中将字形正确显示为 Path2D?

有条件地显示 WinForms UserControl 的属性?

为啥后备字体会禁用 opentype 功能?

可安装 OpenType 字体的 Windows 要求是啥?

opentype.js 和 maker.js 为文本呈现不正确的路径