From 4eee7c071df9e2207220db4b54b00645efaebd5a Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 24 Oct 2019 14:05:29 +0100 Subject: [PATCH] varLib: don't add empty gvar or cvar with no variations --- Lib/fontTools/varLib/__init__.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py index 2dfe9e12c..80bd09b4b 100644 --- a/Lib/fontTools/varLib/__init__.py +++ b/Lib/fontTools/varLib/__init__.py @@ -213,15 +213,13 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True): log.info("Generating gvar") assert "gvar" not in font - gvar = font["gvar"] = newTable('gvar') - gvar.version = 1 - gvar.reserved = 0 - gvar.variations = {} glyf = font['glyf'] # use hhea.ascent of base master as default vertical origin when vmtx is missing baseAscent = font['hhea'].ascent + + variations = {} for glyph in font.getGlyphOrder(): isComposite = glyf[glyph].isComposite() @@ -241,7 +239,6 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True): del allControls # Update gvar - gvar.variations[glyph] = [] deltas = model.getDeltas(allCoords) supports = model.supports assert len(deltas) == len(supports) @@ -280,7 +277,14 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True): if optimized_len < unoptimized_len: var = var_opt - gvar.variations[glyph].append(var) + variations.setdefault(glyph, []).append(var) + + if variations: + gvar = font["gvar"] = newTable('gvar') + gvar.version = 1 + gvar.reserved = 0 + gvar.variations = {g: variations.get(g, []) for g in font.getGlyphOrder()} + def _remove_TTHinting(font): for tag in ("cvar", "cvt ", "fpgm", "prep"): @@ -350,19 +354,21 @@ def _merge_TTHinting(font, masterModel, master_ttfs, tolerance=0.5): _remove_TTHinting(font) return - # We can build the cvar table now. - - cvar = font["cvar"] = newTable('cvar') - cvar.version = 1 - cvar.variations = [] - + variations = [] deltas, supports = masterModel.getDeltasAndSupports(all_cvs) for i,(delta,support) in enumerate(zip(deltas[1:], supports[1:])): delta = [otRound(d) for d in delta] if all(abs(v) <= tolerance for v in delta): continue var = TupleVariation(support, delta) - cvar.variations.append(var) + variations.append(var) + + # We can build the cvar table now. + if variations: + cvar = font["cvar"] = newTable('cvar') + cvar.version = 1 + cvar.variations = variations + _MetricsFields = namedtuple('_MetricsFields', ['tableTag', 'metricsTag', 'sb1', 'sb2', 'advMapping', 'vOrigMapping'])