diff --git a/Lib/fontTools/varLib/instancer/featureVars.py b/Lib/fontTools/varLib/instancer/featureVars.py index 5b5ddfd7b..12eefac24 100644 --- a/Lib/fontTools/varLib/instancer/featureVars.py +++ b/Lib/fontTools/varLib/instancer/featureVars.py @@ -1,4 +1,5 @@ +from fontTools.ttLib.tables import otTables as ot from fontTools.varLib.models import normalizeValue from copy import deepcopy import logging @@ -117,6 +118,7 @@ def _instantiateFeatureVariations(table, fvarAxes, axisLimits): featureVariationApplied = False uniqueRecords = set() newRecords = [] + defaultsSubsts = None for i, record in enumerate(table.FeatureVariations.FeatureVariationRecord): applies, shouldKeep, universal = _instantiateFeatureVariationRecord( @@ -128,7 +130,10 @@ def _instantiateFeatureVariations(table, fvarAxes, axisLimits): if applies and not featureVariationApplied: assert record.FeatureTableSubstitution.Version == 0x00010000 - for rec in record.FeatureTableSubstitution.SubstitutionRecord: + defaultsSubsts = deepcopy(record.FeatureTableSubstitution) + for default,rec in zip(defaultsSubsts.SubstitutionRecord, + record.FeatureTableSubstitution.SubstitutionRecord): + default.Feature = deepcopy(table.FeatureList.FeatureRecord[rec.FeatureIndex].Feature) table.FeatureList.FeatureRecord[rec.FeatureIndex].Feature = deepcopy( rec.Feature ) @@ -139,6 +144,16 @@ def _instantiateFeatureVariations(table, fvarAxes, axisLimits): if universal: break + # Insert a catch-all record to reinstate the old features if necessary + if featureVariationApplied and newRecords and not universal: + defaultRecord = ot.FeatureVariationRecord() + defaultRecord.ConditionSet = ot.ConditionSet() + defaultRecord.ConditionSet.ConditionTable = [] + defaultRecord.ConditionSet.ConditionCount = 0 + defaultRecord.FeatureTableSubstitution = defaultsSubsts + + newRecords.append(defaultRecord) + if newRecords: table.FeatureVariations.FeatureVariationRecord = newRecords table.FeatureVariations.FeatureVariationCount = len(newRecords) diff --git a/Tests/varLib/instancer/instancer_test.py b/Tests/varLib/instancer/instancer_test.py index b3e40ebe7..9d77155a9 100644 --- a/Tests/varLib/instancer/instancer_test.py +++ b/Tests/varLib/instancer/instancer_test.py @@ -1588,13 +1588,13 @@ class InstantiateFeatureVariationsTest(object): "location, appliedSubs, expectedRecords", [ ({"wght": 0}, {}, [({"cntr": (0.75, 1.0)}, {"uni0041": "uni0061"})]), - # Buggy. See: https://github.com/fonttools/fonttools/issues/2737 ( {"wght": -1.0}, {"uni0061": "uni0041"}, [ ({"cntr": (0, 0.25)}, {"uni0061": "uni0041"}), ({"cntr": (0.75, 1.0)}, {"uni0041": "uni0061"}), + ({}, {}), ], ), ( @@ -1604,7 +1604,8 @@ class InstantiateFeatureVariationsTest(object): ( {"cntr": (0.75, 1.0)}, {"uni0024": "uni0024.nostroke", "uni0041": "uni0061"}, - ) + ), + ({}, {}) ], ), ( @@ -1622,7 +1623,8 @@ class InstantiateFeatureVariationsTest(object): ( {"wght": (0.20886, 1.0)}, {"uni0024": "uni0024.nostroke", "uni0041": "uni0061"}, - ) + ), + ({}, {}) ], ), (