在工作中,我的任务是改进我们应用程序的文本呈现,以更好地支持文本字符字距调整。我们的应用程序生成出现在电视上的图像,因此图像质量至关重要。因此,即使对我们生成的任何输出的外观进行很小的改进也是非常有用的。
我们当前的文本引擎是使用 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 手动实现字距调整。
我通过手动创建 ScriptTextOut 的 const 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;
}
}
这假设您已经为
pcGlyphs
、 piAdvance
和 psva
调用了 ScriptItemize、ScriptShape 和 ScriptPlace。关于text - 单字字距,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1232204/