text - 单字字距

标签 text fonts kerning uniscribe

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

我们当前的文本引擎是使用 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 手动实现字距调整。

我通过手动创建 const int *piJustify 来做到这一点。 ScriptTextOut 的论据.

// 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 调用了 ScriptItemize、ScriptShape 和 ScriptPlace。 , piAdvancepsva .

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

相关文章:

css - 与 CSS 同步加载字体

css - Material.io 字体 arrow_right 未显示

javascript - CSS3 转换导致屏幕闪烁或字体别名

macos - Cocoa (OS X) 小字体 - 字距调整看起来很糟糕

java - 从文本文件读取数据,一个写得不好的文本文件

c - 只保留重复模式的最后一行

c++ - 由于隐藏/控制字符,在 C++ 中读取文本文件行失败

ios - 如何在 Xcode 7 中使用 Interface Builder 调整文本字距?

wpf - 如何在文本框中更改 XAML 中的字符间距?

linux - 在 Linux 中使用 Nasm 在控制台中的文本中使用箭头键导航