[varLib.varStore] Add VarStoreInstancer

This commit is contained in:
Behdad Esfahbod 2017-10-20 13:50:08 -04:00
parent 8db7a65d39
commit 7494943c1b
2 changed files with 44 additions and 20 deletions

View File

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

View File

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