diff --git a/Lib/fontTools/varLib/instancer.py b/Lib/fontTools/varLib/instancer.py index 5651670df..fba178429 100644 --- a/Lib/fontTools/varLib/instancer.py +++ b/Lib/fontTools/varLib/instancer.py @@ -683,8 +683,8 @@ def instantiateOTL(varfont, axisLimits): def instantiateFeatureVariations(varfont, axisLimits): for tableTag in ("GPOS", "GSUB"): - if tableTag not in varfont or not hasattr( - varfont[tableTag].table, "FeatureVariations" + if tableTag not in varfont or not getattr( + varfont[tableTag].table, "FeatureVariations", None ): continue log.info("Instantiating FeatureVariations of %s table", tableTag) diff --git a/Lib/fontTools/varLib/mutator.py b/Lib/fontTools/varLib/mutator.py index b5954f8b9..199657864 100644 --- a/Lib/fontTools/varLib/mutator.py +++ b/Lib/fontTools/varLib/mutator.py @@ -257,7 +257,7 @@ def instantiateVariableFont(varfont, location, inplace=False, overlap=True): if not tableTag in varfont: continue table = varfont[tableTag].table - if not hasattr(table, 'FeatureVariations'): + if not getattr(table, 'FeatureVariations', None): continue variations = table.FeatureVariations for record in variations.FeatureVariationRecord: diff --git a/Tests/varLib/instancer_test.py b/Tests/varLib/instancer_test.py index 0554933c2..5e999dc83 100644 --- a/Tests/varLib/instancer_test.py +++ b/Tests/varLib/instancer_test.py @@ -1666,6 +1666,19 @@ class InstantiateFeatureVariationsTest(object): assert len(rec1.ConditionSet.ConditionTable) == 2 assert rec1.ConditionSet.ConditionTable[0].Format == 2 + def test_GSUB_FeatureVariations_is_None(self, varfont2): + varfont2["GSUB"].table.Version = 0x00010001 + varfont2["GSUB"].table.FeatureVariations = None + tmp = BytesIO() + varfont2.save(tmp) + varfont = ttLib.TTFont(tmp) + + # DO NOT raise an exception when the optional 'FeatureVariations' attribute is + # present but is set to None (e.g. with GSUB 1.1); skip and do nothing. + assert varfont["GSUB"].table.FeatureVariations is None + instancer.instantiateFeatureVariations(varfont, {"wght": 400, "wdth": 100}) + assert varfont["GSUB"].table.FeatureVariations is None + class LimitTupleVariationAxisRangesTest: def check_limit_single_var_axis_range(self, var, axisTag, axisRange, expected):