From b878b867c0558b3907fe74fc8d4aa16b1adb0c59 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 30 May 2019 13:05:07 +0100 Subject: [PATCH] instancer: don't break on unsupported condition formats continue checking subsequent condition tables in case the other may be format=1 and may reference a pinned axis; in which case, these conditions need to be dropped from the condition set, or the whole record needs to be dropped if the instance coordinate is outside the condition range. Condition tables within a condition set are associated with a AND boolean operator, so if any one doesn't match, the whole set doesn't apply. Even if we don't recognize one condition format, if we do ascertain that another condition table does not match the current partial instance location, we can drop the FeatureVariation record since it doesn't apply. --- Lib/fontTools/varLib/instancer.py | 1 - Tests/varLib/instancer_test.py | 12 ++++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Lib/fontTools/varLib/instancer.py b/Lib/fontTools/varLib/instancer.py index c3d342433..bcedab03d 100644 --- a/Lib/fontTools/varLib/instancer.py +++ b/Lib/fontTools/varLib/instancer.py @@ -474,7 +474,6 @@ def _instantiateFeatureVariations(table, fvarAxes, location): ) applies = False newConditions.append(condition) - break if retainRecord and newConditions: record.ConditionSet.ConditionTable = newConditions diff --git a/Tests/varLib/instancer_test.py b/Tests/varLib/instancer_test.py index 7b945778a..a29dfbede 100644 --- a/Tests/varLib/instancer_test.py +++ b/Tests/varLib/instancer_test.py @@ -1316,18 +1316,22 @@ class InstantiateFeatureVariationsTest(object): ) ] ) - gsub = font["GSUB"].table - featureVariations = gsub.FeatureVariations + featureVariations = font["GSUB"].table.FeatureVariations rec1 = featureVariations.FeatureVariationRecord[0] + assert len(rec1.ConditionSet.ConditionTable) == 2 rec1.ConditionSet.ConditionTable[0].Format = 2 with CapturingLogHandler("fontTools.varLib.instancer", "WARNING") as captor: - instancer.instantiateFeatureVariations(font, {"wght": 0}) + instancer.instantiateFeatureVariations(font, {"wdth": 0}) captor.assertRegex( r"Condition table 0 of FeatureVariationRecord 0 " r"has unsupported format \(2\); ignored" ) - # check that record with unsupported condition format is kept + # check that record with unsupported condition format (but whose other + # conditions do not reference pinned axes) is kept as is + featureVariations = font["GSUB"].table.FeatureVariations assert featureVariations.FeatureVariationRecord[0] is rec1 + assert len(rec1.ConditionSet.ConditionTable) == 2 + assert rec1.ConditionSet.ConditionTable[0].Format == 2