以下使用尺寸为250x100的IDWriteTextLayout
进行布局。它只包含150个阿拉伯字母U + 062A,没有空格,使用Calibri 24(正常重量/样式/拉伸)。蓝色框显示250x100布局区域(文本溢出,因为我没有设置修剪模式),绿色框显示指标的布局尺寸,粉红色框考虑到悬垂指标,灰色框来自每个角色的测试。
将其与以下内容进行比较,唯一的区别是我调用了IDWriteTextLayout::SetTypography
并传递了由IDWriteTypography
创建的空IDWriteFactory::CreateTypography
对象,并且根本没有修改
只要查看文本的外观,每行的最后一个字符就是阿拉伯语"结束"语境形式,我认为它通常适用于单词的最后一个字符(我不懂阿拉伯语)。在我目前只能猜到的是DirectWrite中的一个错误,这导致文本实际上挂在指定的布局区域和指标返回的区域之外(它挂在框外的数量似乎等于添加的额外宽度通过上下文形式的变化)。
从其他实验中,似乎设置空IDWriteTypography
对象具有禁用每个可能的字体功能的效果。因此,通过禁用默认情况下显然已启用的某些印刷字体功能,我已使其使用" end"行尾的字符形式,即使它们不在单词的末尾。哪种字体功能控制此行为?我已经尝试调整IDWriteTypography
实例以启用(将其值设置为1)一次documentation中列出的每个字体功能,并且它们都不会导致旧外观。相关特征是实际使用整数值而不是布尔值的那个吗?
我的目标是在IDWriteTypography
IDWriteTextLayout
上使用if (grade <= 100 || grade >= 90) {
letter = 'A';
对象,原因无关,但请避免将文字悬挂在布局区域之外。那么另外,还有其他方法来解决这种行为吗?
答案 0 :(得分:1)
你在这里有很多让我认为这有点像XY Problem,但我至少可以回答有关哪个字体功能控制阿拉伯语中的单词最终形式的具体问题。那是"Terminal Forms", or 'fina' feature。它是阿拉伯语脚本的一个基本的非可选功能,不仅“默认打开”,也无法使用Windows文本布局禁用它。这就是为什么你没有在DWRITE_FONT_FEATURE_TAG枚举中看到任何与之对应的内容。
关于XY问题的初步观点:你是否真实地期望这样的情况(一个重复的特征占据文本框的全部内容)?也许您可以更好地使用更真实的文本进行测试:例如,multilingual "lorem-ipsum" generator的输出?虽然DWrite非常强大,但我非常怀疑它的设计师试图通过这种极端情况来实现完美。您可以使用完全不切实际的文本找到许多具有DWrite“bug”的古怪案例。