我需要在使用GDI和GDI +的现有C ++代码中转换一些文本到位图渲染例程,以使用DirectWrite(需要CFF支持和OTF功能支持)。
我是DirectWrite的新手。花一些时间研究现有功能的迁移和进行原型设计所需的内容,我遇到了一个问题: 我的问题是DirectWrite(开箱即用)不支持字符间距调整(这是现有应用程序的要求),至少在Windows 7上没有。我知道它随附Windows 8,但这个现有应用程序的另一个要求是在Windows 7上运行,不幸的是。
到目前为止,我在研究中发现的方法似乎是实现自定义DirectWrite文本布局,但我还没有找到关于如何做到这一点的任何好的指导,特别是在字符间距方面(关于如何创建自定义文本布局的MSDN上的文档/示例对我来说有点模糊。
正如我想的那样,之前必须要做的,在花费数天和/或数周的时间研究和开发重新发明轮子之前,这里是否有人知道DirectWrite文本布局的示例实现,我可以使用自定义字符间距作为起点还是教程?
UPDATE1 :不是答案但是 - 我发现IDWriteTextLayout1接口(支持设置字符空间)不仅附带Windows 8,还附带" Windows 7平台更新for SP1" (Windows 2670838)在Windows 7上。因为我可以要求让应用程序正常运行,这解决了我的问题,尽管它没有回答我的问题。
答案 0 :(得分:2)
由于bidi和换行以及需要调用较低级别的API,自定义布局非常复杂,但样本在此处[https://msdn.microsoft.com/en-us/library/windows/desktop/dd941711(v=vs.85).aspx]。至于字符间距,一旦你从整形过程中返回字形数组(IDWriteTextAnalyzer :: GetGlyphs),只需在所有进度上添加一个delta。在链接的SDK示例中,您将在for
内添加FlowLayout::ShapeGlyphRuns
循环,以便在换行和绘图之前发生。
STDMETHODIMP FlowLayout::ShapeGlyphRuns(IDWriteTextAnalyzer* textAnalyzer)
{
...
hr = ShapeGlyphRun(textAnalyzer, runIndex, glyphStart);
...
// Add additional character spacing to each trailing edge of each glyph.
for (auto& advance : glyphAdvances_)
{
advance += 5.0f;
}
...
}
请注意,Windows 8中还添加了一个API ApplyCharacterSpacing
,它比自己手动添加它更强大,因为它考虑了每个群集有多个字形的更复杂的脚本(当然,如果你有这个API,那么你也是已经有IDWriteTextLayout::SetCharacterSpacing
)。