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 C
、A B (mark) C
、A 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 的属性?