From e299650f9f81908bf2685f907ab8215ec0f4ee1a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 21 Feb 2018 15:12:20 -0800 Subject: [PATCH] [varStore] In OnlikeVarStoreBuilder, dedup items While we optimize VarStore later, just deduping here reduces amount of data we have to work with later by 8x in NotoSans-VF.ttf test case. It's a cheap optimization, so do it. --- Lib/fontTools/varLib/varStore.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Lib/fontTools/varLib/varStore.py b/Lib/fontTools/varLib/varStore.py index 916301f16..3df4fc4a4 100644 --- a/Lib/fontTools/varLib/varStore.py +++ b/Lib/fontTools/varLib/varStore.py @@ -22,9 +22,12 @@ class OnlineVarStoreBuilder(object): self._regionList = buildVarRegionList([], axisTags) self._store = buildVarStore(self._regionList, []) self._data = None + self._model = None + self._cache = {} def setModel(self, model): self._model = model + self._cache = {} # Empty cached items def finish(self, optimize=True): self._regionList.RegionCount = len(self._regionList.Region) @@ -54,17 +57,25 @@ class OnlineVarStoreBuilder(object): self._store.VarData.append(data) 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) + deltas = tuple(deltas) + varIdx = self._cache.get(deltas) + if varIdx is not None: + return base, varIdx + + if not self._data: + self._add_VarData() inner = len(self._data.Item) if inner == 0xFFFF: # Full array. Start new one. self._add_VarData() return self.storeMasters(master_values) self._data.Item.append(deltas) - return base, (self._outer << 16) + inner + + varIdx = (self._outer << 16) + inner + self._cache[deltas] = varIdx + return base, varIdx def VarRegion_get_support(self, fvar_axes):