diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py index cde090330..6bbd6b608 100644 --- a/Lib/fontTools/varLib/__init__.py +++ b/Lib/fontTools/varLib/__init__.py @@ -513,7 +513,11 @@ def _merge_OTL(font, model, master_fonts, axisTags): merger = VariationMerger(model, axisTags, font) merger.mergeTables(font, master_fonts, ['GPOS']) + # TODO Merge GSUB + # TODO Merge GDEF itself! store = merger.store_builder.finish() + if not store.VarData: + return try: GDEF = font['GDEF'].table assert GDEF.Version <= 0x00010002 @@ -527,7 +531,8 @@ def _merge_OTL(font, model, master_fonts, axisTags): # Optimize varidx_map = store.optimize() GDEF.remap_device_varidxes(varidx_map) - font['GPOS'].table.remap_device_varidxes(varidx_map) + if 'GPOS' in font: + font['GPOS'].table.remap_device_varidxes(varidx_map) diff --git a/Lib/fontTools/varLib/varStore.py b/Lib/fontTools/varLib/varStore.py index 5a642a9cf..b26298763 100644 --- a/Lib/fontTools/varLib/varStore.py +++ b/Lib/fontTools/varLib/varStore.py @@ -22,14 +22,24 @@ class OnlineVarStoreBuilder(object): self._regionMap = {} self._regionList = buildVarRegionList([], axisTags) self._store = buildVarStore(self._regionList, []) + self._data = None def setModel(self, model): self._model = model + def finish(self, optimize=True): + self._regionList.RegionCount = len(self._regionList.Region) + self._store.VarDataCount = len(self._store.VarData) + for data in self._store.VarData: + data.ItemCount = len(data.Item) + VarData_CalculateNumShorts(data, optimize) + return self._store + + def _add_VarData(self): regionMap = self._regionMap regionList = self._regionList - regions = model.supports[1:] + regions = self._model.supports[1:] regionIndices = [] for region in regions: key = _getLocationKey(region) @@ -44,21 +54,15 @@ class OnlineVarStoreBuilder(object): self._outer = len(self._store.VarData) self._store.VarData.append(data) - def finish(self, optimize=True): - self._regionList.RegionCount = len(self._regionList.Region) - self._store.VarDataCount = len(self._store.VarData) - for data in self._store.VarData: - data.ItemCount = len(data.Item) - VarData_CalculateNumShorts(data, optimize) - return self._store - def storeMasters(self, master_values): + if not self._data: + self._add_VarData() deltas = [round(d) for d in self._model.getDeltas(master_values)] base = deltas.pop(0) inner = len(self._data.Item) if inner == 0xFFFF: # Full array. Start new one. - self.setModel(self._model) + self._add_VarData() return self.storeMasters(master_values) self._data.Item.append(deltas) return base, (self._outer << 16) + inner diff --git a/Tests/varLib/data/test_results/Build.ttx b/Tests/varLib/data/test_results/Build.ttx index 9f43e7731..5d665e35f 100644 --- a/Tests/varLib/data/test_results/Build.ttx +++ b/Tests/varLib/data/test_results/Build.ttx @@ -1,83 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/varLib/data/test_results/Build3.ttx b/Tests/varLib/data/test_results/Build3.ttx index 656697a00..a6ae23ed8 100644 --- a/Tests/varLib/data/test_results/Build3.ttx +++ b/Tests/varLib/data/test_results/Build3.ttx @@ -1,30 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -92,17 +68,17 @@ - - + + - + - + diff --git a/Tests/varLib/data/test_results/BuildMain.ttx b/Tests/varLib/data/test_results/BuildMain.ttx index 9a3297304..f30351e5f 100644 --- a/Tests/varLib/data/test_results/BuildMain.ttx +++ b/Tests/varLib/data/test_results/BuildMain.ttx @@ -616,83 +616,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -