首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Uniscribe字距调整

Uniscribe字距调整
EN

Stack Overflow用户
提问于 2009-08-05 09:45:51
回答 3查看 1.1K关注 0票数 4

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

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

提前干杯!

EN

回答 3

Stack Overflow用户

发布于 2013-12-27 16:50:29

您可以使用Uniscribe手动实现字距调整。

为此,我手动创建了ScriptTextOutconst int *piJustify参数。

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2009-11-21 08:06:40

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

复杂脚本和从右向左的语言(包括泰语)的

  • 安装文件东亚语言的
  • 安装文件

使Uniscribe字距调整起作用。

票数 0
EN

Stack Overflow用户

发布于 2014-10-31 00:52:35

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1232204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档