[varLib.varStore] Add VarStoreInstancer
This commit is contained in:
parent
8db7a65d39
commit
7494943c1b
@ -10,6 +10,7 @@ from fontTools.ttLib import TTFont
|
||||
from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates
|
||||
from fontTools.varLib import _GetCoordinates, _SetCoordinates, _DesignspaceAxis
|
||||
from fontTools.varLib.models import supportScalar, normalizeLocation
|
||||
from fontTools.varLib.varStore import VarStoreInstancer
|
||||
from fontTools.varLib.mvar import MVAR_entries
|
||||
from fontTools.varLib.iup import iup_delta
|
||||
import os.path
|
||||
@ -87,34 +88,18 @@ def instantiateVariableFont(varfont, location, inplace=False):
|
||||
|
||||
if 'MVAR' in varfont:
|
||||
mvar = varfont['MVAR'].table
|
||||
varstore = mvar.VarStore
|
||||
varStoreInstancer = VarStoreInstancer(mvar.VarStore, fvar.axes, loc)
|
||||
records = mvar.ValueRecord
|
||||
for rec in records:
|
||||
mvarTag = rec.ValueTag
|
||||
if mvarTag not in MVAR_entries:
|
||||
continue
|
||||
tableTag, itemName = MVAR_entries[mvarTag]
|
||||
|
||||
varIdx = rec.VarIdx
|
||||
major,minor = varIdx >> 16, varIdx & 0xFFFF
|
||||
|
||||
assert varstore.Format == 1
|
||||
deltas = varstore.VarData[major].Item[minor]
|
||||
def VarRegion_get_support(self, fvar):
|
||||
axes = fvar.axes
|
||||
return {axes[i].axisTag: (reg.StartCoord,reg.PeakCoord,reg.EndCoord)
|
||||
for i,reg in enumerate(self.VarRegionAxis)}
|
||||
supports = [VarRegion_get_support(varstore.VarRegionList.Region[ri], fvar)
|
||||
for ri in varstore.VarData[major].VarRegionIndex]
|
||||
delta = 0.
|
||||
for d,s in zip(deltas, supports):
|
||||
if not d: continue
|
||||
scalar = supportScalar(loc, s)
|
||||
delta += d * scalar
|
||||
delta = int(round(delta))
|
||||
delta = int(round(varStoreInstancer[rec.VarIdx]))
|
||||
if not delta:
|
||||
continue
|
||||
setattr(varfont[tableTag], itemName, getattr(varfont[tableTag], itemName) + delta)
|
||||
setattr(varfont[tableTag], itemName,
|
||||
getattr(varfont[tableTag], itemName) + delta)
|
||||
|
||||
log.info("Removing variable tables")
|
||||
for tag in ('avar','cvar','fvar','gvar','HVAR','MVAR','VVAR','STAT'):
|
||||
|
@ -1,6 +1,7 @@
|
||||
from __future__ import print_function, division, absolute_import
|
||||
from __future__ import unicode_literals
|
||||
from fontTools.misc.py23 import *
|
||||
from fontTools.varLib.models import supportScalar
|
||||
from fontTools.varLib.builder import (buildVarRegionList, buildVarStore,
|
||||
buildVarRegion, buildVarData,
|
||||
varDataCalculateNumShorts)
|
||||
@ -56,3 +57,41 @@ class OnlineVarStoreBuilder(object):
|
||||
return base, (self._outer << 16) + inner
|
||||
|
||||
|
||||
def VarRegion_get_support(self, fvar_axes):
|
||||
return {fvar_axes[i].axisTag: (reg.StartCoord,reg.PeakCoord,reg.EndCoord)
|
||||
for i,reg in enumerate(self.VarRegionAxis)}
|
||||
|
||||
class VarStoreInstancer(object):
|
||||
|
||||
def __init__(self, varstore, fvar_axes, location={}):
|
||||
assert varstore.Format == 1
|
||||
self.varstore = varstore
|
||||
self.fvar_axes = fvar_axes
|
||||
self._varData = varstore.VarData
|
||||
self._regions = varstore.VarRegionList.Region
|
||||
self.setLocation(location)
|
||||
|
||||
def setLocation(self, location):
|
||||
self.location = dict(location)
|
||||
self._clearCaches()
|
||||
|
||||
def _clearCaches(self):
|
||||
pass
|
||||
#self._scalars = {}
|
||||
|
||||
def __getitem__(self, varidx):
|
||||
|
||||
major, minor = varidx >> 16, varidx & 0xFFFF
|
||||
|
||||
varData = self._varData
|
||||
supports = [VarRegion_get_support(self._regions[ri], self.fvar_axes)
|
||||
for ri in varData[major].VarRegionIndex]
|
||||
|
||||
deltas = varData[major].Item[minor]
|
||||
delta = 0.
|
||||
for d,s in zip(deltas, supports):
|
||||
if not d: continue
|
||||
scalar = supportScalar(self.location, s)
|
||||
delta += d * scalar
|
||||
return delta
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user