Qt QFont 字距调整 - 不影响/字距调整字体

Posted

技术标签:

【中文标题】Qt QFont 字距调整 - 不影响/字距调整字体【英文标题】:Qt QFont Kerning - Not Affecting/Kerning Font 【发布时间】:2017-01-10 22:54:39 【问题描述】:

问题:对我的QFont 进行字距调整对我的QApplication 中显示的字体字距调整没有影响。

在 Qt 中,字距调整默认应用于 QFont 尝试QFont.setKerning(True)不成功 QFont.setKerning(False) 对字体显示也没有影响 字体为 OpenType (.otf),QFont.kerning() 返回 True 在其他应用程序(例如 Microsoft Word)中调整此字体是成功的 其他QFont 方法,例如QFont.setLetterSpacing 可以成功处理此字体 字体是 Idler,文件名是 Idler-Inner.otf

显然没有其他人遇到这个问题。找不到有关此主题的任何内容。

更新

这似乎与字体类型有关。我能够紧缩 ttf 字体并且无法在 Qt 中紧缩其他 otf 字体。虽然 otf>ttf 转换是某些字体的解决方案,但对于像我这样的其他字体来说,它似乎会破坏字体。

令人惊讶的是,Qt 不支持主要字体类型的字距调整。否则,我能想到的唯一解决方案是破解字体(转换为 ttx 并以不弃用的方式手动转换为 ttf)。

字体工作量太大;至少对于字体开发者来说。

【问题讨论】:

你想做什么?启用字距调整还是禁用它? 启用字距调整。 您的更新似乎成功了。在 TTF 中,字距调整是一个简单的表格。在 OpenType 字体中可以使用相同的字体,但此外它还支持更复杂的方案。因为这提供了对字距的更多控制,所以字体设计师更喜欢它而不是旧的“一次 2 个字符”方法。 【参考方案1】:

查看qfontengine.cpp中的源码,找到了一个函数loadKerningPairs。这包含行

QByteArray tab = getSfntTable(MAKE_TAG('k', 'e', 'r', 'n'));

这似乎是从字体的主表列表中加载旧样式的 TTF 紧缩表

此字距调整表包含成对的字符及其相关的调整值。它被存储在QFont 中,并且在绘制时,一个简单的查找即可检索这些值。

但是,在现代 OpenType 字体(TrueType 或 Type-1 风格)中,kern 子表可能不存在,因为 OpenType 功能 GPOS 更强大。该表的二进制格式也复杂得多;例如,可以为要紧缩的左、右或两个字符定义字符,而不是单个字符。似乎这一点以及其他 OpenType 功能尚未在 QFont 中实现(截至 2016 年 9 月 11 日)。

GPOS 不仅定义了字距调整,还定义了许多其他功能,例如大写字母的自定义跟踪、上标和下标定位,以及自动在字符上或下放置重音符号,对于所有这些功能,您可以指定不同脚本类型甚至不同语言的不同值。

【讨论】:

以上是关于Qt QFont 字距调整 - 不影响/字距调整字体的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 SwiftUI 中为 TextField 添加字距调整?

跨浏览器字距调整正确技术

带有 itext 的 OpenType 字体字距调整

ios:自定义字体的字距调整

如何从 Opentype 字体的 GPOS 表中使用和提取字距调整对,以在 Java 中将字形正确显示为 Path2D?

构建用于调整字体中字符的字距和间距的软件[关闭]