c++ - 如何使用 DirectWrite 确定基线位置

标签 c++ truetype direct2d baseline directwrite

使用 DirectWrite 和 Direct2D1,我试图模仿 Illustrator CS6 对区域文本框所做的渲染。 CS6 有一个选项,其中基线可以放置在距离区域文本框顶部的距离等于字体的“em 框大小”。例如,使用Trajan Pro字体,100pt磅值,基线距离区域文本框顶部87.5pt。

从 IDWriteFontFace 对象,我可以获得上升、下降、designUnitsPerEm 值等。

似乎缺少的是相对于 em 框顶部的基线位置。

有没有办法获得相对于 em 框顶部的设计单位基线位置?

DWRITE_FONT_METRICS 没有。 我查看了 DWRITE_LINE_METRICS,但它的基线值是 ascent + lineGap 并且不匹配。

最佳答案

这只是部分答案,但这里有 我在类似情况下的处理方式是:

EM 高度 - 上升 = 基线

我不确定的是应该如何应用 linegap,或者是否应用 linegap。许多字体的行间距为零,因此它不相关,事实上,在我认为我熟悉的 css 世界中,通过指示行高度为 1.2*EM 高度来排序添加行间距并不少见。当我真的需要知道这个差距的分布时,我总是把它归为刚刚好之后,但我并不完全相信这是 100% 正确的,这对我所做的事情来说已经足够好了。

一般来说,EM 高度 = Ascent + Descent + linegap 按此顺序。同样,我相信有一个负的线间隙是完全有效的,所以它是分布的,全部在底部,一半在顶部,一半在底部(我认为这真的没有意义,但我可能是错的),或者其他什么,你需要保持一致。希望这会有所帮助。

关于c++ - 如何使用 DirectWrite 确定基线位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13939264/

相关文章:

c - 使用 ttf 库 SDL C 的段错误

php - php imagettftext 支持所有utf-8字符的字体

c++ - 为什么 ReadFile() 不返回 0 ?程序试图永远从管道中读取数据

c++ - 从类型 'int&' 的临时类型 'int' 的非常量引用的无效初始化

c++ - 使用捆绑属性时 BGL 中的不完整类型错误

css - CSS3中的这个字体是如何嵌入到css文件中的?

c++ - Direct2D如何打开共享纹理

c++ - 使用 Direct2D 和 DirectWrite(C++、DirectX)制作按钮

windows - 是否有任何性能测试可用于 Direct2D?

C++按 block 读取文本文件