如何使用DirectWrite确定基线位置

3
使用DirectWrite和Direct2D1,我试图模仿Illustrator CS6对区域文本框的渲染。CS6有一个选项,可以将基线放置在距离区域文本框顶部相等于字体的“em框大小”的距离处。例如,使用Trajan Pro字体,100pt字号,基线距离区域文本框顶部为87.5pt。
从IDWriteFontFace对象中,我可以获取ascent、descent、designUnitsPerEm值等等。
似乎缺少的是相对于em框顶部的基线位置。
是否有一种方法可以获取设计单位中基线位置与em框顶部的相对位置?
DWRITE_FONT_METRICS没有这个功能。 我查看了DWRITE_LINE_METRICS,但其基线值是ascent + lineGap,并不匹配。
1个回答

1
这只是部分回答,但请看以下我的做法
在类似的情境下我处理的方法是:
EM高度-上升=基线
我不确定的是如何或是否应该应用行间距。许多字体都有零行间距,因此它并不相关。实际上,在我认为我熟悉的CSS世界中,通过指示行高为1.2*EM高度来添加行间距并不罕见。当我真正需要了解该空隙的分布时,我总是将其归为合适的高度之后,但我并不完全相信这是100%正确的,它对我所做的事情已足够好。
总的来说,EM高度=上升+下降+行间距,按此顺序排列。同时,我认为负线间距完全有效,因此无论它如何分配(全部在底部,一半在顶部,一半在底部(我认为这确实没有意义,但我可能错了),或其他任何方式),你都需要保持一致性。希望这可以帮到您。

IDWriteTextLayout 将字体行间距添加到上升高度中,至少对于使用自然度量的水平阅读方向而言是如此。 上升高度+下降高度+行间距通常比 EM 盒子(designUnitsPerEm)大,一般范围从 1.1 到 1.4。例如,Segoe UI 的 A+D+LG 比率为 1.33(2724/2048)。OpenType OS/2::sTypoLineGap 在技术上是一个带符号的字段,但我从未见过任何具有负值的字体。 - Dwayne Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接