diff --git a/Lib/fontTools/varLib/featureVars.py b/Lib/fontTools/varLib/featureVars.py index d5735776e..58fb3b6e6 100644 --- a/Lib/fontTools/varLib/featureVars.py +++ b/Lib/fontTools/varLib/featureVars.py @@ -7,6 +7,7 @@ from fontTools.misc.dictTools import hashdict from fontTools.misc.intTools import popCount from fontTools.ttLib import newTable from fontTools.ttLib.tables import otTables as ot +from fontTools.ttLib.ttVisitor import TTVisitor from fontTools.otlLib.builder import buildLookup, buildSingleSubstSubtable from collections import OrderedDict @@ -356,7 +357,7 @@ def addFeatureVariationsRaw(font, table, conditionalSubstitutions, featureTag='r records = [] for varFeatureIndex in varFeatureIndices: existingLookupIndices = table.FeatureList.FeatureRecord[varFeatureIndex].Feature.LookupListIndex - records.append(buildFeatureTableSubstitutionRecord(varFeatureIndex, existingLookupIndices + lookupIndices)) + records.append(buildFeatureTableSubstitutionRecord(varFeatureIndex, lookupIndices + existingLookupIndices)) featureVariationRecords.append(buildFeatureVariationRecord(conditionTable, records)) table.FeatureVariations = buildFeatureVariations(featureVariationRecords) @@ -414,19 +415,44 @@ def makeSubstitutionsHashable(conditionalSubstitutions): condSubst.append((conditionSet, substitutions)) return condSubst, sorted(allSubstitutions) +class ShifterVisitor(TTVisitor): + def __init__(self, shift): + self.shift = shift + +@ShifterVisitor.register_attr(ot.Feature, "LookupListIndex") # GSUB/GPOS +def visit(visitor, obj, attr, value): + shift = visitor.shift + value = [l + shift for l in value] + setattr(obj, attr, value) + +@ShifterVisitor.register_attr( + (ot.SubstLookupRecord, ot.PosLookupRecord), + "LookupListIndex" +) +def visit(visitor, obj, attr, value): + setattr(obj, attr, visitor.shift + value) def buildSubstitutionLookups(gsub, allSubstitutions): """Build the lookups for the glyph substitutions, return a dict mapping the substitution to lookup indices.""" - firstIndex = len(gsub.LookupList.Lookup) + + # Insert lookups at the beginning of the lookup vector + # https://github.com/googlefonts/fontmake/issues/950 + lookupMap = {} for i, substitutionMap in enumerate(allSubstitutions): - lookupMap[substitutionMap] = i + firstIndex + lookupMap[substitutionMap] = i - for subst in allSubstitutions: + # Shift all lookup indices in gsub by len(allSubstitutions) + shift = len(allSubstitutions) + visitor = ShifterVisitor(shift) + visitor.visit(gsub.FeatureList.FeatureRecord) + visitor.visit(gsub.LookupList.Lookup) + + for i, subst in enumerate(allSubstitutions): substMap = dict(subst) lookup = buildLookup([buildSingleSubstSubtable(substMap)]) - gsub.LookupList.Lookup.append(lookup) + gsub.LookupList.Lookup.insert(i, lookup) assert gsub.LookupList.Lookup[lookupMap[subst]] is lookup gsub.LookupList.LookupCount = len(gsub.LookupList.Lookup) return lookupMap diff --git a/Tests/varLib/data/test_results/FeatureVars_rclt.ttx b/Tests/varLib/data/test_results/FeatureVars_rclt.ttx index b889f3a5f..e930ce72f 100644 --- a/Tests/varLib/data/test_results/FeatureVars_rclt.ttx +++ b/Tests/varLib/data/test_results/FeatureVars_rclt.ttx @@ -1,5 +1,5 @@ - + @@ -54,14 +54,14 @@ - + - + @@ -72,7 +72,7 @@ - + @@ -88,7 +88,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -133,7 +133,7 @@ - + @@ -141,9 +141,9 @@ - - - + + + @@ -169,15 +169,15 @@ - - + + - + @@ -199,7 +199,7 @@ - + @@ -208,7 +208,7 @@ - + @@ -230,15 +230,15 @@ - + - - + +