From 7494943c1bb0a4312dbd89c45774bbbc883565fe Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 20 Oct 2017 13:50:08 -0400 Subject: [PATCH] [varLib.varStore] Add VarStoreInstancer --- Lib/fontTools/varLib/mutator.py | 25 ++++---------------- Lib/fontTools/varLib/varStore.py | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/Lib/fontTools/varLib/mutator.py b/Lib/fontTools/varLib/mutator.py index 37adbf9aa..c8cbc9e31 100644 --- a/Lib/fontTools/varLib/mutator.py +++ b/Lib/fontTools/varLib/mutator.py @@ -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'): diff --git a/Lib/fontTools/varLib/varStore.py b/Lib/fontTools/varLib/varStore.py index aad753735..e75596927 100644 --- a/Lib/fontTools/varLib/varStore.py +++ b/Lib/fontTools/varLib/varStore.py @@ -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 +