diff --git a/Lib/fontTools/ttLib/tables/otTables.py b/Lib/fontTools/ttLib/tables/otTables.py index 237864bb2..97a4487a7 100644 --- a/Lib/fontTools/ttLib/tables/otTables.py +++ b/Lib/fontTools/ttLib/tables/otTables.py @@ -546,21 +546,26 @@ class VarIdxMap(BaseTable): def populateDefaults(self, propagator=None): if not hasattr(self, 'mapping'): - self.mapping = [] + self.mapping = {} def postRead(self, rawTable, font): assert (rawTable['EntryFormat'] & 0xFFC0) == 0 - self.mapping = rawTable['mapping'] + glyphOrder = font.getGlyphOrder() + mapList = rawTable['mapping'] + mapList.extend([mapList[-1]] * (len(glyphOrder) - len(mapList))) + self.mapping = dict(zip(glyphOrder, mapList)) def preWrite(self, font): mapping = getattr(self, "mapping", None) if mapping is None: - mapping = self.mapping = [] + mapping = self.mapping = {} + + glyphOrder = font.getGlyphOrder() + mapping = [mapping[g] for g in glyphOrder] + rawTable = { 'mapping': mapping } rawTable['MappingCount'] = len(mapping) - # TODO Remove this abstraction/optimization and move it varLib.builder? - ored = 0 for idx in mapping: ored |= idx @@ -589,9 +594,9 @@ class VarIdxMap(BaseTable): return rawTable def toXML2(self, xmlWriter, font): - for i, value in enumerate(getattr(self, "mapping", [])): + for glyph, value in sorted(getattr(self, "mapping", {}).items()): attrs = ( - ('index', i), + ('glyph', glyph), ('outer', value >> 16), ('inner', value & 0xFFFF), ) @@ -601,12 +606,13 @@ class VarIdxMap(BaseTable): def fromXML(self, name, attrs, content, font): mapping = getattr(self, "mapping", None) if mapping is None: - mapping = [] + mapping = {} self.mapping = mapping + glyph = attrs['glyph'] outer = safeEval(attrs['outer']) inner = safeEval(attrs['inner']) assert inner <= 0xFFFF - mapping.append((outer << 16) | inner) + mapping[glyph] = (outer << 16) | inner class SingleSubst(FormatSwitchingBaseTable): diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py index d622d21d4..47d266a5a 100644 --- a/Lib/fontTools/varLib/__init__.py +++ b/Lib/fontTools/varLib/__init__.py @@ -436,9 +436,7 @@ def _add_HVAR(font, model, master_ttfs, axisTags): newItems = sorted(uniq) mapper = {v:i for i,v in enumerate(newItems)} mapping = [mapper[item] for item in items] - while len(mapping) > 1 and mapping[-1] == mapping[-2]: - del mapping[-1] - advanceMapping = builder.buildVarIdxMap(mapping) + advanceMapping = builder.buildVarIdxMap(mapping, font.getGlyphOrder()) items = newItems del mapper, mapping, newItems del uniq diff --git a/Lib/fontTools/varLib/builder.py b/Lib/fontTools/varLib/builder.py index 9f73ea01b..887e4fb75 100644 --- a/Lib/fontTools/varLib/builder.py +++ b/Lib/fontTools/varLib/builder.py @@ -84,10 +84,9 @@ def buildVarStore(varRegionList, varDataList): # Variation helpers -def buildVarIdxMap(varIdxes): - # TODO Change VarIdxMap mapping to hold separate outer,inner indices +def buildVarIdxMap(varIdxes, glyphOrder): self = ot.VarIdxMap() - self.mapping = list(varIdxes) + self.mapping = {g:v for g,v in zip(glyphOrder, varIdxes)} return self def buildVarDevTable(varIdx): diff --git a/Tests/varLib/data/master_ttx_varfont_ttf/Mutator_IUP.ttx b/Tests/varLib/data/master_ttx_varfont_ttf/Mutator_IUP.ttx index 8cbd8a69c..23c240eff 100755 --- a/Tests/varLib/data/master_ttx_varfont_ttf/Mutator_IUP.ttx +++ b/Tests/varLib/data/master_ttx_varfont_ttf/Mutator_IUP.ttx @@ -405,11 +405,13 @@ - - - - - + + + + + + +