From 5ef018e48514c193f80e2e27cb1adfb4017b644b Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 5 Oct 2020 17:50:24 +0100 Subject: [PATCH 1/3] [instancer] FeatureVariations table is optional and can be None --- Lib/fontTools/varLib/instancer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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) From e78d7cf50a0b7ca26876a98f8fab8ccae0f6078f Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 5 Oct 2020 18:17:14 +0100 Subject: [PATCH 2/3] backport fix to varLib.mutator as well --- Lib/fontTools/varLib/mutator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: From e16cf0f8b8820c6dfbda1e871e7d30875f218f94 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 5 Oct 2020 18:59:21 +0100 Subject: [PATCH 3/3] instancer_test: check GSUB.FeatureVariations set to None is skipped and doesn't raise TypeError exception. --- Tests/varLib/instancer_test.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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):