什么排版设置使阿拉伯文 "end" 上下文形式出现在单词中间的行末?

What typography setting is enabling Arabic "end" contextual forms at the end of lines wrapped in the middle of a word?

以下是使用尺寸为 250x100 的 IDWriteTextLayout 布局的。它只包含阿拉伯字母 U+062A 的 150,没有空格,使用 Calibri 24(正常 weight/style/stretch)。蓝色框显示 250x100 布局区域(文本溢出,因为我没有设置修剪模式),绿色框显示布局尺寸来自指标,粉红色框考虑悬垂指标,灰色框来自点击测试每个字符。

将其与以下内容进行比较,唯一的区别是我调用了 IDWriteTextLayout::SetTypography 并传递了一个由 IDWriteFactory::CreateTypography 创建且根本没有修改的空 IDWriteTypography 对象.

只看文本的外观,每行的最后一个字符都采用了阿拉伯语 "end" 上下文形式,我认为这通常适用于单词的最后一个字符(我不知道阿拉伯语)。我目前只能猜测是 DirectWrite 中的错误,这导致文本实际上挂在指定布局区域和指标返回的区域之外(它挂在框外的数量似乎等于添加的额外宽度通过上下文形式的变化)。

从其他实验来看,似乎设置一个空的 IDWriteTypography 对象具有禁用所有可能的字体功能的效果。因此,通过禁用某些默认情况下显然启用的印刷字体功能,我已使其对行尾字符使用 "end" 形式,即使它们不在单词末尾也是如此。哪种字体特性控制着这种行为?我尝试调整 IDWriteTypography 实例以一次启用(将其值设置为 1)documentation 中列出的每个字体功能,其中 none 导致旧外观.相关特征是实际使用整数值而不是布尔值的特征之一吗?

我的目标是出于不相关的原因在我的 IDWriteTextLayout 上使用 IDWriteTypography 对象,但要避免将文本挂在布局区域之外。那么,还有其他方法可以解决该行为吗?

你在这里发生了很多事情,这让我觉得这有点 XY Problem, but I can at least answer the specific question about which font feature controls word-final forms in Arabic. That is the "Terminal Forms", or 'fina' feature。它是阿拉伯文字的一项重要的、非可选的功能,不仅 "on by default",无法使用 Windows 文本布局禁用它。这就是为什么您在 DWRITE_FONT_FEATURE_TAG 枚举中看不到任何与之对应的内容的原因。

关于我关于 XY 问题的初始观点:您是否现实地期望这样的情况(单个重复字符占据文本框的全部内容)?也许您最好使用更真实的文本进行测试:例如,multilingual "lorem-ipsum" generator 的输出?虽然 DWrite 非常健壮,但我非常怀疑它的设计者是否力求在诸如此类的极端情况下达到完美。您可能会发现许多使用完全不切实际的文本的 DWrite "bugs" 的古怪案例。