You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:47:46