在工作中,我的任务是改进我们应用程序的文本呈现,以更好地支持文本字符字距调整。我们的应用程序生成出现在电视上的图像,因此图像质量至关重要。因此,即使对我们生成的任何输出的外观进行很小的改进也是非常有用的。

我们当前的文本引擎是使用 Uniscribe 实现的,这似乎是一个理想的解决方案。正如提到的 here ,它支持以上下文感知方式使用复杂脚本进行连字替换。它还处理从右到左的语言和 BiDi。这一点很重要,因为我们需要能够完美地呈现阿拉伯语/草书语言。

因此,Uniscribe 似乎不输出字形字距调整信息似乎很奇怪。我附上了一个截图来演示这个问题。

alt text http://www.aliparr.net/kerning.jpg

我的应用程序的性能与记事本相同,因为每个字形都显示为“等宽”。请注意在 Photoshop CS2 中,“T”顶部的桥如何很好地悬在“e”之上。我想重新创建这个。

我知道其他 API,例如 Pango/Freetype - 但如果 Uniscribe 在其他所有方面都非常出色,那么它似乎是一个相当重量级的解决方案,包括所有这些只是为了完成此任务的最后 1%。

我是否缺少使用 Uniscribe 的步骤?对此的最佳解决方案是什么? Freetype 能否以轻量级的方式导出字距调整信息,以便我可以将其与现有的 Uniscribe 解决方案集成?

备注我们只需要在 Windows 上运行 - 幸运的是,平台可移植性不是我现在需要担心的问题。

提前加油!

最佳答案

您可以使用 Uniscribe 手动实现字距调整。

我通过手动创建 ScriptTextOutconst int *piJustify 参数来做到这一点。

// Initially the justification is simply a copy of the advance array
int* piJustify = (int *)malloc(pcGlyphs);
memcpy(piJustify, piAdvance, pcGlyphs);

// Apply kerning to each glyph
for (size_t i = 0; i < pcGlyphs; i++) {
    if (psva[i].fClusterStart) {
        // Only add kerning to the first glyph in each cluster
        piJustify[i] += myKerning;
    }
}

这假设您已经为 pcGlyphspiAdvancepsva 调用了 ScriptItemize、ScriptShape 和 ScriptPlace。

关于text - 单字字距,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1232204/

10-12 15:26