管理插入点放置和命中测试

复杂的脚本语言被 ScriptShape 分解为群集。 字符重新排序始终发生在群集边界内。 群集本身可以保证按阅读顺序前进。

逻辑群集数组中的分类信息用于在它们表示的逻辑字符之间平均共享标志符号群集的宽度。 例如,lam alef 字形分为四个区域:

  • 林的前半部分。
  • 林的尾随一半。
  • 阿莱夫的前半部分。
  • 尾随的一半。

在群集中放置插入点的约定取决于脚本。 对于阿拉伯文脚本,如果在基字符与其组合标记之间设置了插入点位置,则插入点显示在基字符的中间位置。 对于泰语脚本,插入点不能定位在群集中。 因此,当用户推进插入点时,应用程序必须前进到构成群集的所有字形。

ScriptXtoCPScriptCPtoX 函数在插入点位置 (代码点偏移) 和 x 位置之间转换, (像素) 。 ScriptXtoCP 函数了解每个脚本的插入点位置约定:

  • 对于印度和泰国语,插入点位置贴靠到群集边界。
  • 对于阿拉伯语,插入点位置与群集一起内插。
  • 对于希伯来语,在 Usp10.dll 版本 1.420 之前的版本中,插入点位置与群集一起内插。 从 Usp10.dll 版本 1.420 开始,插入点位置贴靠到群集边界。

ScriptXtoCPScriptCPtoX 仅在运行中运行。 函数要求某些参数来自早期的 Uniscribe 调用,如下表所示。

参数
Psa ScriptItemize 返回。
cGlyphspwLogClust
psva
ScriptShape 返回。
piAdvance ScriptPlace 返回。

 

应用程序必须在将信息传递给 ScriptCPtoXScriptXtoCP 之前,建立给定插入点偏移量或 x 位置所在的运行。 如果应用程序不保存宽度信息,它可以在显示每次运行后执行命中测试和插入点放置。 作为替代方法,应用程序可以缓存足够的信息,以在当前行上执行命中测试和插入点放置,而无需重新处理段落。

ScriptXtoCP 返回一个尾随边缘值,以便应用程序知道用户单击的字符或群集的一侧。 该值为 0 或字符或分类的宽度(以码位为单位)。 返回的字符位置是用户单击的字符的位置。 有关详细信息,请参阅 在双向字符串中显示插入点

对于用户通常不希望将插入点放入群集的语言(例如泰语), ScriptXtoCP 将尾随标志设置为 0 或群集宽度。 对于用户希望能够在群集中编辑的语言(如阿拉伯语), ScriptXtoCP 将尾随标志设置为 0 或 1。

为了帮助应用程序在处理箭头键时为插入点建立有效位置,Uniscribe 提供了 ScriptBreak 返回的逻辑属性中 fCharStop 成员中的有效插入点位置的信息。 对于大多数字符,返回 TRUE;对于脚本(如泰语)中的群集间字符,返回 FALSE。 应用程序应检查项的SCRIPT_PROPERTIES结构中的 fNeedsCaretInfo 值,以查看是否需要调用 ScriptBreak 来检查以获取有效的插入点位置。 如果 fNeedsCaretInfo 值为 FALSE,则所有码位都是有效的插入点位置。

使用 Uniscribe