4

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

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

到目前为止,我在研究中发现,要走的路似乎是实现自定义 DirectWrite 文本布局,但我还没有找到任何关于如何做到这一点的好的指导方针,尤其是在字符间距方面(关于MSDN 关于如何创建自定义文本布局对我来说有点模糊)。

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

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

4

1 回答 1

2

由于双向和换行以及需要调用较低级别的 API,自定义布局非常复杂,但这里有一个示例 [ https://msdn.microsoft.com/en-us/library/windows/desktop/dd941711( v=vs.85).aspx]。至于字符间距,一旦你从整形过程(IDWriteTextAnalyzer::GetGlyphs)得到字形前进的数组,只需在所有前进上添加一个增量。在链接的 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)。

于 2015-07-02T08:48:03.373 回答