我试图理解字体为Jameel_Noori_Nastaleeq.ttf的“بڑ”(乌尔都语-Unicode 1576、1681)的呈现方式。
该字符串由GSUB表转换为字形[607、460、471、1651]。我可以在第一个字形下检测到第二个字形的正确锚定连接。但是我找不到合适的GSUB子表,该子表会将第三个字形放在第一个字形的顶部。在这里,左边的是正确的,右边的是我的程序当前所做的。
此外,我不太了解GSUB的LookupType 8。一些LookupTable可以具有包含8位的LookupFlags-ignoreMarks。在匹配Backtrack,Input和Lookahead序列时,我应该考虑这些标志,即跳过标志吗?匹配和应用LookupType 8的确切机制是什么?
答案 0 :(得分:1)
通过在 GPOS 表的“标记位置”(“ mark”)功能中进行查找来完成两个标记(“ tah”和小圆点)的定位。 之后将应用GSUB规则。没有仅GSUB方式才能获得正确的最终定位。必须处理GPOS(在GSUB之后)。
关于ignoreMarks标志:该标志不是特定于GSUB LookupType8的。任何查询(GSUB或GPOS)都可以设置此标志。它告诉布局引擎出于匹配上下文的目的而忽略所考虑序列中的标记。这允许仅使用序列的“根”字形来定义替换上下文,因此,如果上下文规则为A B C
,则设置了ignoreMarks标志的查找将与A (mark) B C
,A B (mark) C
,{ {1}},等等。
它以这种字体起作用,因为首先将两个输入字符分解(在GSUB中)为一系列基本+标记字形,然后重新构成(也在GSUB中),然后将标记定位(在GPOS中) )。
(顺便说一句:为什么您要自己进行文本布局,而不是使用现有的布局引擎,例如HarfBuzz或其他操作系统内置的引擎?)