Fontforge:连续 kerned glyphs 时GPOS字距配对失效问题求助
字体字距调整连续配对异常的问题分析
我正在修复一款字体的字距调整,该功能在单独配对时工作正常,但当存在连续两个 kerned glyphs时出现异常。
我的Python代码如下:
if abs(round_kerning_value) > 20: left_glyph.addPosSub( subtable_name, right_glyph_name, 0, 0, 0, 0, # No change to first glyph round_kerning_value, 0, round_kerning_value, 0 # Apply kerning to second glyph )
参考Fontforge官方文档中glyph.addPosSub的参数定义:
glyph.addPosSub(subtable_name, other_glyph_name, xoff1, yoff1, xadv1, yadv1, xoff2, yoff2, xadv2, yadv2)
错误原因
你对addPosSub的参数逻辑理解有误:
- 当前代码只修改第二个字形的水平偏移(
xoff2)和水平宽度(xadv2),但未调整第一个字形的xadv1(水平宽度)。 - 单独配对时,第二个字形的偏移能生效;但连续出现 kerned glyphs时,第一个字形的原始宽度会导致后续字形定位错误——字距调整的核心是通过缩短前一个字形的宽度,让后一个字形自然左移,而非直接移动后一个字形。
修正方案
调整第一个字形的xadv1,保持第二个字形参数默认:
if abs(round_kerning_value) > 20: left_glyph.addPosSub( subtable_name, right_glyph_name, 0, 0, -round_kerning_value, 0, # 修改第一个字形的水平宽度,偏移不变 0, 0, 0, 0 # 第二个字形不做偏移和宽度调整 )
逻辑说明
xadv1控制第一个字形的有效宽度,设为-round_kerning_value(假设round_kerning_value为负的收紧值,比如-30,那么xadv1=30,即把第一个字形宽度缩短30,让第二个字形左移30)。- 这种方式符合OpenType字距调整的标准逻辑,连续多个 kerned glyphs时,每个配对的调整会正确累积,不会出现异常偏移。
内容的提问来源于stack exchange,提问作者A D
相关产品推荐
相关产品推荐

