Qt QFont 字距调整 - 不影响/字距调整字体
Posted
技术标签:
【中文标题】Qt QFont 字距调整 - 不影响/字距调整字体【英文标题】:Qt QFont Kerning - Not Affecting/Kerning Font 【发布时间】:2017-01-10 22:54:39 【问题描述】:问题:对我的QFont
进行字距调整对我的QApplication
中显示的字体字距调整没有影响。
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 添加字距调整?
如何从 Opentype 字体的 GPOS 表中使用和提取字距调整对,以在 Java 中将字形正确显示为 Path2D?