Unidecribe Kerning

时间:2009-08-05 09:45:51

标签: text fonts kerning uniscribe

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

我们当前的文本引擎是使用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上运行 - 谢天谢地,平台可移植性不是我现在需要担心的问题。

提前干杯!

3 个答案:

答案 0 :(得分:1)

您可以使用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。

答案 1 :(得分:0)

如果您在Windows XP上运行,我相信您必须在控制面板的区域选项中启用以下功能:

  • 安装复杂脚本和从右向左语言(包括泰语)的文件
  • 安装东亚语言文件

用于Uniscribe字距调整工作。

答案 2 :(得分:0)

默认情况下,如果所选字体支持,则ScriptShape / ScriptPlace会应用字距调整。但是,如果你想打开/关闭它,你应该使用OpenType Api的uniscribe。