在工作中,我的任务是改进应用程序的文本渲染,以便更好地支持文本字符紧排。我们的应用程序生成出现在电视上的图像,因此图像质量是最重要的。因此,即使是对我们生成的任何输出的外观进行微小的改进也是非常有用的。
我们目前的文本引擎是使用Uniscribe实现的,这似乎是一个理想的解决方案。正如前面提到的here,它通过复杂的脚本以上下文感知的方式支持连字替换。它还处理从右到左的语言和BiDi。这一切都很重要,因为我们需要能够完美地呈现阿拉伯语/草书语言。
因此,Uniscribe似乎并不输出字形字距调整信息,这似乎相当奇怪。我已经附上了一个屏幕截图来演示这个问题。
alt text http://www.aliparr.net/kerning.jpg
我的应用和记事本一样,每个字形看起来都是“等宽的”。请注意,在Photoshop CS2中,'T‘顶部的桥恰到好处地突出了'e’。我想重现这一切。
我知道还有其他的API,比如Pango/Freetype --但如果Uniscribe在其他所有方面都做得很好,那么仅仅为了完成这项任务的最后1%,包含所有这些API似乎是一个相当重量级的解决方案。
使用Uniscribe我是不是错过了一个步骤?对此最好的解决方案是什么?Freetype能否以轻量级的方式导出字距调整信息,以便我可以将其与现有的Uniscribe解决方案集成?
注:我们只需要在Windows上运行-谢天谢地,平台的可移植性不是我现在需要担心的问题。
提前干杯!
发布于 2013-12-27 16:50:29
您可以使用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。
发布于 2009-11-21 08:06:40
如果您运行的是Windows XP,我相信您必须在“控制面板”的“区域选项”中启用以下选项:
复杂脚本和从右向左的语言(包括泰语)的
使Uniscribe字距调整起作用。
发布于 2014-10-31 00:52:35
默认情况下,如果所选字体支持字距调整,则ScriptShape/ScriptPlace将应用字距调整。然而,如果你想打开/关闭它,你应该使用uniscribe的OpenType Api。
https://stackoverflow.com/questions/1232204
复制相似问题