有没有一种好方法可以统一转换字体的每个字形?

Is there a good way to transform every glyph of a font uniformly?

我对如何使用 fonttools 对特定字体的每个字形应用转换有点困惑。我正在玩一种开源字体,其中每个字符在其边界框中都只是一个太高的 taaaad,所以我希望将其向下转换。

它是一种可变字体(Source Sans)。这是重要的代码示例:

from fontTools import ttLib
from fontTools.pens.transformPen import TransformPen
from fontTools.pens.ttGlyphPen import TTGlyphPen

font = ttLib.TTFont(font_path)


for glyphName in font["glyf"].keys():
    print(glyphName)
    glyph = font.getGlyphSet().get(glyphName)
    glyphPen = TTGlyphPen(font.getGlyphSet())
    transformPen = TransformPen(glyphPen, (1.0, 0.0, 0.0, 1.0, 0, -300))
    glyph.draw(transformPen)
    transformedGlyph = glyphPen.glyph()
    font["glyf"][glyphName] = transformedGlyph

但是,当我这样做时,转换并没有完全按预期进行...一些字符向下移动了 很多,而其他字符只向下移动了一点. i3456 是一些值得注意的示例,而其他字母和数字不受影响。

通常有更简单的方法来执行此操作吗?如果没有,为什么有些字母的转换方式与其他字母不同?

我知道发生了什么事了。

一些字形由其他嵌套字形组成。这些被称为 复合字形 ,而不是 简单字形

因为我要转换所有字形,所以我要转换所有复合字形,以及构成它们的简单字形。这导致复合字形看起来像是被变换了两次。

新代码如下所示:

glyphPen = TTGlyphPen(font.getGlyphSet())
transformPen = TransformPen(glyphPen, Transform().translate(0, -25))

for glyphName in font.getGlyphOrder():
    glyph = font['glyf'][glyphName]

    # Avoid double-transforming composite glyphs
    if glyph.isComposite():
        continue

    glyph.draw(transformPen, font['glyf'])
    font['glyf'][glyphName] = glyphPen.glyph()