[varLib.varStore] New module

This commit is contained in:
Behdad Esfahbod 2017-10-20 11:32:15 -04:00
parent 117f8f0eb3
commit 8db7a65d39
4 changed files with 66 additions and 58 deletions

View File

@ -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 = []

View File

@ -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):

View File

@ -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):

View File

@ -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