1

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

不使用任何 IDWriteTypography 对象。

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

使用空的 IDWriteTypography 对象。

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

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

我的目标是出于不相关的原因IDWriteTypography在我的对象上使用一个对象IDWriteTextLayout,但要避免将文本挂在布局区域之外。因此,或者,是否有其他方法可以解决这种行为?

4

1 回答 1

1

您在这里发生了很多事情,这让我觉得这有点像XY 问题,但我至少可以回答有关哪个字体功能控制阿拉伯语中的词尾形式的具体问题。那就是“终端形式”或“fina”功能。它是阿拉伯语脚本的一个必不可少的非可选功能,不仅“默认开启”,而且无法通过 Windows 文本布局禁用它。这就是为什么在与它对应的 DWRITE_FONT_FEATURE_TAG 枚举中看不到任何内容的原因。

对于我关于 XY 问题的初始点:您是否真的期望这样的情况(单个重复字符占据文本框的全部内容)?也许您最好使用更真实的文本进行测试:例如,多语言“lorem-ipsum”生成器的输出?虽然 DWrite 非常强大,但我非常怀疑它的设计者是否试图在这种极端情况下达到完美。你可能会发现很多奇怪的案例是 DWrite “错误”,使用完全不切实际的文本。

于 2015-09-15T01:38:39.240 回答