在工作中,我的任务是改进应用程序的文本呈现,以更好地支持文本字符字距调整。我们的应用程序生成出现在电视上的图像,因此图像质量至关重要。因此,即使对我们生成的任何输出的外观进行微小改进也非常有用。
我们当前的文本引擎是使用Uniscribe实现的,这似乎是一个理想的解决方案。如前面提到的here,它支持以复杂脚本的上下文感知方式进行连字替换。它还处理从右到左的语言和BiDi。这一点非常重要,因为我们需要能够完美地呈现阿拉伯语/草书语言。
因此,Uniscribe似乎不会输出字形字距调整信息。我附上了一个截图来证明这个问题。alt text http://www.aliparr.net/kerning.jpg
我的应用程序与记事本的执行方式相同,因为每个字形都显示为“等宽”。注意在Photoshop CS2中,'T'顶部的桥接器很好地悬在'e'上。我想重新创建它。
我知道其他API,例如Pango / Freetype--但它似乎是一个相当重要的解决方案,包括所有这些只是为了完成这项任务的最后1%,如果Uniscribe在其他一切方面都非常出色。
我是否错过了使用Uniscribe的步骤?这是什么最好的解决方案? Freetype能否以轻量级方式导出字距调整信息,以便我可以将其与现有的Uniscribe解决方案集成?
N.b。我们只需要在Windows上运行 - 谢天谢地,平台可移植性不是我现在需要担心的问题。
提前干杯!
答案 0 :(得分:1)
您可以使用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。
答案 1 :(得分:0)
如果您在Windows XP上运行,我相信您必须在控制面板的区域选项中启用以下功能:
用于Uniscribe字距调整工作。
答案 2 :(得分:0)
默认情况下,如果所选字体支持,则ScriptShape / ScriptPlace会应用字距调整。但是,如果你想打开/关闭它,你应该使用OpenType Api的uniscribe。