gpt4 book ai didi

c++ - DirectWrite:Windows 7 上的字符间距

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:20 25 4
gpt4 key购买 nike

我需要将使用 GDI 和 GDI+ 的现有 C++ 代码中的一些文本到位图渲染例程转换为使用 DirectWrite(需要 CFF 支持和 OTF 功能支持)。

我是 DirectWrite 的新手。花了一些时间研究迁移现有功能所需的内容并进行了一些原型(prototype)设计,我遇到了一个问题:我的问题是 DirectWrite(开箱即用)不支持字符间距调整(这是现有应用程序的要求),至少在 Windows 7 上不支持。我知道它随 Windows 8 一起提供,但不幸的是,此现有应用程序的另一个要求是在 Windows 7 上运行。

到目前为止,我在研究中发现的方法似乎是实现自定义 DirectWrite 文本布局,但我还没有找到关于如何执行此操作的任何好的指南,尤其是在字符间距方面(文档/MSDN 上有关如何创建自定义文本布局的示例对我来说有点模糊)。

我认为这一定是以前完成的,在花费数天和/或数周的研究和开发重新发明轮子之前,这里有没有人知道我可以使用的具有自定义字符间距的 DirectWrite 文本布局的示例实现作为起点或教程?

UPDATE1:不是答案,但是 - 我发现 IDWriteTextLayout1 界面(支持设置字符空间)不仅随 Windows 8 一起提供,而且还随“Windows 7 SP1 平台更新”一起提供(KB 2670838) 在 Windows 7 上。因为我可以要求应用程序正常运行,这解决了我的问题,尽管它没有回答我的问题。

最佳答案

由于双向和换行以及调用较低级别 API 的需要,自定义布局非常复杂,但这里有一个示例 [ https://msdn.microsoft.com/en-us/library/windows/desktop/dd941711(v=vs.85).aspx] .至于字符间距,一旦从整形过程 (IDWriteTextAnalyzer::GetGlyphs) 中获得字形进步的数组,只需在所有进步上添加一个增量。在链接的 SDK 示例中,您将在 FlowLayout::ShapeGlyphRuns 中添加一个 for 循环,以便它发生在换行和绘制之前。

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;
}
...
}

注意 API ApplyCharacterSpacing 也被添加到 Windows 8 中,这比您自己手动添加它更健壮,因为它考虑了更复杂的脚本,每个群集有多个字形(当然,如果您有该 API,那么你也已经有了 IDWriteTextLayout::SetCharacterSpacing)。

关于c++ - DirectWrite:Windows 7 上的字符间距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29890744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com