diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py index 5bca2a31a..610b2fac8 100644 --- a/Lib/fontTools/varLib/__init__.py +++ b/Lib/fontTools/varLib/__init__.py @@ -29,7 +29,7 @@ from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates from fontTools.ttLib.tables.ttProgram import Program from fontTools.ttLib.tables.TupleVariation import TupleVariation from fontTools.ttLib.tables import otTables as ot -from fontTools.varLib import builder, designspace, models +from fontTools.varLib import builder, designspace, models, varStore from fontTools.varLib.merger import VariationMerger, _all_equal from fontTools.varLib.mvar import MVAR_entries from fontTools.varLib.iup import iup_delta_optimize @@ -417,13 +417,13 @@ def _add_HVAR(font, model, master_ttfs, axisTags): del uniq varData = builder.buildVarData(varTupleIndexes, items) - varStore = builder.buildVarStore(varTupleList, [varData]) + varstore = builder.buildVarStore(varTupleList, [varData]) assert "HVAR" not in font HVAR = font["HVAR"] = newTable('HVAR') hvar = HVAR.table = ot.HVAR() hvar.Version = 0x00010000 - hvar.VarStore = varStore + hvar.VarStore = varstore hvar.AdvWidthMap = advanceMapping hvar.LsbMap = hvar.RsbMap = None @@ -431,7 +431,7 @@ def _add_MVAR(font, model, master_ttfs, axisTags): log.info("Generating MVAR") - store_builder = builder.OnlineVarStoreBuilder(axisTags) + store_builder = varStore.OnlineVarStoreBuilder(axisTags) store_builder.setModel(model) records = [] diff --git a/Lib/fontTools/varLib/builder.py b/Lib/fontTools/varLib/builder.py index 8afa41237..388f247ca 100644 --- a/Lib/fontTools/varLib/builder.py +++ b/Lib/fontTools/varLib/builder.py @@ -39,7 +39,7 @@ def _reorderItem(lst, narrows): out.append(lst[i]) return out -def calculateNumShorts(self, optimize=True): +def varDataCalculateNumShorts(self, optimize=True): count = self.VarRegionCount items = self.Item narrows = set(range(count)) @@ -69,7 +69,7 @@ def buildVarData(varRegionIndices, items, optimize=True): assert len(item) == regionCount records.append(list(item)) self.ItemCount = len(self.Item) - calculateNumShorts(self, optimize=optimize) + varDataCalculateNumShorts(self, optimize=optimize) return self @@ -82,56 +82,6 @@ def buildVarStore(varRegionList, varDataList): return self -def _getLocationKey(loc): - return tuple(sorted(loc.items(), key=lambda kv: kv[0])) - -class OnlineVarStoreBuilder(object): - - def __init__(self, axisTags): - self._axisTags = axisTags - self._regionMap = {} - self._regionList = buildVarRegionList([], axisTags) - self._store = buildVarStore(self._regionList, []) - - def setModel(self, model): - self._model = model - - regionMap = self._regionMap - regionList = self._regionList - - regions = model.supports[1:] - regionIndices = [] - for region in regions: - key = _getLocationKey(region) - idx = regionMap.get(key) - if idx is None: - varRegion = buildVarRegion(region, self._axisTags) - idx = regionMap[key] = len(regionList.Region) - regionList.Region.append(varRegion) - regionIndices.append(idx) - - data = self._data = buildVarData(regionIndices, [], optimize=False) - 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) - calculateNumShorts(data, optimize) - return self._store - - def storeMasters(self, master_values): - deltas = [int(round(d)) for d in self._model.getDeltas(master_values)] - base = deltas.pop(0) - inner = len(self._data.Item) - self._data.Item.append(deltas) - # TODO Check for full data array? - return base, (self._outer << 16) + inner - - - # Variation helpers def buildVarIdxMap(varIdxes): diff --git a/Lib/fontTools/varLib/merger.py b/Lib/fontTools/varLib/merger.py index eefc0d43b..9b79870ac 100644 --- a/Lib/fontTools/varLib/merger.py +++ b/Lib/fontTools/varLib/merger.py @@ -7,7 +7,7 @@ from fontTools.misc import classifyTools from fontTools.ttLib.tables import otTables as ot from fontTools.ttLib.tables import otBase as otBase from fontTools.ttLib.tables.DefaultTable import DefaultTable -from fontTools.varLib import builder +from fontTools.varLib import builder, varStore from functools import reduce @@ -684,7 +684,7 @@ class VariationMerger(AligningMerger): def __init__(self, model, axisTags, font): Merger.__init__(self, font) self.model = model - self.store_builder = builder.OnlineVarStoreBuilder(axisTags) + self.store_builder = varStore.OnlineVarStoreBuilder(axisTags) self.store_builder.setModel(model) def _all_equal(lst): diff --git a/Lib/fontTools/varLib/varStore.py b/Lib/fontTools/varLib/varStore.py new file mode 100644 index 000000000..aad753735 --- /dev/null +++ b/Lib/fontTools/varLib/varStore.py @@ -0,0 +1,58 @@ +from __future__ import print_function, division, absolute_import +from __future__ import unicode_literals +from fontTools.misc.py23 import * +from fontTools.varLib.builder import (buildVarRegionList, buildVarStore, + buildVarRegion, buildVarData, + varDataCalculateNumShorts) + + +def _getLocationKey(loc): + return tuple(sorted(loc.items(), key=lambda kv: kv[0])) + + +class OnlineVarStoreBuilder(object): + + def __init__(self, axisTags): + self._axisTags = axisTags + self._regionMap = {} + self._regionList = buildVarRegionList([], axisTags) + self._store = buildVarStore(self._regionList, []) + + def setModel(self, model): + self._model = model + + regionMap = self._regionMap + regionList = self._regionList + + regions = model.supports[1:] + regionIndices = [] + for region in regions: + key = _getLocationKey(region) + idx = regionMap.get(key) + if idx is None: + varRegion = buildVarRegion(region, self._axisTags) + idx = regionMap[key] = len(regionList.Region) + regionList.Region.append(varRegion) + regionIndices.append(idx) + + data = self._data = buildVarData(regionIndices, [], optimize=False) + 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) + varDataCalculateNumShorts(data, optimize) + return self._store + + def storeMasters(self, master_values): + deltas = [int(round(d)) for d in self._model.getDeltas(master_values)] + base = deltas.pop(0) + inner = len(self._data.Item) + self._data.Item.append(deltas) + # TODO Check for full data array? + return base, (self._outer << 16) + inner + +