[varLib.varStore] New module
This commit is contained in:
parent
117f8f0eb3
commit
8db7a65d39
@ -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 = []
|
||||
|
@ -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):
|
||||
|
@ -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):
|
||||
|
58
Lib/fontTools/varLib/varStore.py
Normal file
58
Lib/fontTools/varLib/varStore.py
Normal 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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user