[mutator] Implement MVAR

Test expectation needs updating.  Leaving for someone else to confirm
the new value is correct and update the test.
This commit is contained in:
Behdad Esfahbod 2017-10-19 11:12:03 -07:00
parent b9d4795be4
commit acd2f490af

View File

@ -9,6 +9,7 @@ from fontTools.ttLib import TTFont
from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates
from fontTools.varLib import _GetCoordinates, _SetCoordinates
from fontTools.varLib.models import supportScalar, normalizeLocation
from fontTools.varLib.mvar import MVAR_entries
from fontTools.varLib.iup import iup_delta
import os.path
import logging
@ -17,8 +18,6 @@ import logging
log = logging.getLogger("fontTools.varlib.mutator")
def instantiateVariableFont(varfont, location, inplace=False):
""" Generate a static instance from a variable TTFont and a dictionary
defining the desired location along the variable font's axes.
@ -69,8 +68,6 @@ def instantiateVariableFont(varfont, location, inplace=False):
coordinates += GlyphCoordinates(delta) * scalar
_SetCoordinates(varfont, glyphname, coordinates)
# Interpolate cvt
if 'cvar' in varfont:
cvar = varfont['cvar']
cvt = varfont['cvt ']
@ -84,6 +81,37 @@ def instantiateVariableFont(varfont, location, inplace=False):
for i, delta in deltas.items():
cvt[i] += int(round(delta))
if 'MVAR' in varfont:
mvar = varfont['MVAR'].table
varstore = mvar.VarStore
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))
if not delta:
continue
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'):
if tag in varfont: