使用DirectWrite进行部分连字选择

Fil*_*unc 5 opentype directwrite ligature

使用来自IDWriteTextLayout的HitTestTextPosition样式API 我没有设法在"ti","ffi"或其他带有Calibri等字体的连字中正确处理文本位置.它总是在结束之后或之前返回位置,如t | i或f | f | i.

使用DirectWrite API在连线内部进行插入符号移动的推荐方法是什么?

Mik*_*ans 2

如果您打开了 GSUB 替代品,那么...没有“内部”位置吗?

\n

Opentype GSUB 连字是代码点序列的单个字形替换,而不是“多个字形,混合在一起”。它们实际上是不同的、单个字形、单个边界框以及用于光标放置/对齐的单个左侧和右侧轴承。如果您有文本A + E并且字体具有连字替换,可以将其变成\xd3\x94then 并启用连字,该代码序列中实际上只有两个光标位置:|\xd3\x94\xd3\x94|。你不能把光标放在“中间”,因为没有“中间”;它是一个单一的、原子的、不可分割的元素。

\n

对于诸如、、 、、、或 之类f.的连字也是如此:这些是在 GSUB 打开时成形的单个字形。这实际上是应该发生的事情:启用 GSUB 连字意味着您明确希望呈现文本\xe2\x80\x94用于所有意图和目的\xe2\x80\x94,因为具有用于多对一替换的原子字形,例如转动完整短语“\xd8\xb5\xd9\x84\xd9\x89\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\xd9 \x88\xd8\xb9\xd9\x84\xd9\x89\xd8\xa2\xd9\x84\xd9\x87\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\xe2\x80\x8e",以及它的变体,变成单个字形 \xef\xb7\xba。\xef\xac\x80\xef\xac\x81\xef\xac\x82\xef\xac\x83\xef\xac\x84\xef\xac\x85

\n

如果您想使用基本代码点序列(这样,如果您有文本,f + f + i则不会将其转换为\xef\xac\x83),您将需要在禁用 OpenType 功能的情况下加载字体liga

\n

  • 从*字形*的角度来看,您(当然)是正确的,但从文本编辑器的角度来看,这就是插入符定位表的用途:“连字插入符列表表(LigCaretList)定义了所有字体中的连字。” 该表旨在准确提供第二段中所需的信息。不过,它是一个子集,并不意味着所有*可能的*连字(根据您的阿拉伯语示例)。另一个例子是 `:)` 自动显示为 ``,在这种情况下它也是无用的。 (2认同)
  • 连字内的定位必须是可能的,请参阅 TrueType 的类似内容:https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6lcar.html (2认同)