[varLib.mutator] Interpolating CFF2 tables. Makes fixes per recommendations

varLib.py. restore import of 'fontTools.misc.py23 import *'
varStore.py. Rename 'applyScalar' to 'interpolateFromDeltasAndScalars', and refactor common code with __git__item to a static method.
mutator.py. Update to reflect function name change to interpolateFromDeltasAndScalars. Changed some logic from one line to several lines for readability, and i to avoid flake8 warnings about line too long.
This commit is contained in:
ReadRoberts 2018-11-14 10:20:48 -08:00
parent b5f12785e1
commit fddd5b2bae
3 changed files with 25 additions and 24 deletions

View File

@ -31,7 +31,7 @@ for i, (prev, curr) in enumerate(zip(percents[:-1], percents[1:]), start=1):
OS2_WIDTH_CLASS_VALUES[half] = i
def interpolate_cff2_PrivateDict(topDict, applyScalars):
def interpolate_cff2_PrivateDict(topDict, interpolateFromDeltas):
pd_blend_lists = ("BlueValues", "OtherBlues", "FamilyBlues",
"FamilyOtherBlues", "StemSnapH",
"StemSnapV")
@ -42,8 +42,8 @@ def interpolate_cff2_PrivateDict(topDict, applyScalars):
vsindex = pd.vsindex if (hasattr(pd, 'vsindex')) else 0
for key, value in pd.rawDict.items():
if (key in pd_blend_values) and isinstance(value, list):
deltas = value[1:]
pd.rawDict[key] = otRound(value[0] + applyScalars(vsindex, deltas))
delta = interpolateFromDeltas(vsindex, value[1:])
pd.rawDict[key] = otRound(value[0] + delta)
elif (key in pd_blend_lists) and isinstance(value[0], list):
"""If any argument in a BlueValues list is a blend list,
then they all are. The first value of each list is an
@ -52,11 +52,12 @@ def interpolate_cff2_PrivateDict(topDict, applyScalars):
deltas to date to each successive absolute value."""
delta = 0
for i, val_list in enumerate(value):
delta += otRound(applyScalars(vsindex, val_list[1:]))
delta += otRound(interpolateFromDeltas(vsindex,
val_list[1:]))
value[i] = val_list[0] + delta
def interpolate_cff2_charstrings(topDict, applyScalars, glyphOrder):
def interpolate_cff2_charstrings(topDict, interpolateFromDeltas, glyphOrder):
charstrings = topDict.CharStrings
for gname in glyphOrder:
charstring = charstrings[gname]
@ -83,8 +84,8 @@ def interpolate_cff2_charstrings(topDict, applyScalars, glyphOrder):
while argi < end_args:
next_ti = tuplei + num_regions
deltas = charstring.program[tuplei:next_ti]
delta = otRound(applyScalars(vsindex, deltas))
charstring.program[argi] += delta
delta = interpolateFromDeltas(vsindex, deltas)
charstring.program[argi] += otRound(delta)
tuplei = next_ti
argi += 1
new_program.extend(charstring.program[last_i:end_args])
@ -169,9 +170,10 @@ def instantiateVariableFont(varfont, location, inplace=False):
topDict = varfont['CFF2'].cff.topDictIndex[0]
vsInstancer = VarStoreInstancer(topDict.VarStore.otVarStore,
fvar.axes, loc)
applyScalars = vsInstancer.applyScalars
interpolate_cff2_PrivateDict(topDict, applyScalars)
interpolate_cff2_charstrings(topDict, applyScalars, glyphOrder)
interpolateFromDeltas = vsInstancer.interpolateFromDeltas
interpolate_cff2_PrivateDict(topDict, interpolateFromDeltas)
interpolate_cff2_charstrings(topDict, interpolateFromDeltas,
glyphOrder)
if 'MVAR' in varfont:
log.info("Mutating MVAR table")

View File

@ -162,27 +162,26 @@ class VarStoreInstancer(object):
self._scalars[regionIdx] = scalar
return scalar
def __getitem__(self, varidx):
major, minor = varidx >> 16, varidx & 0xFFFF
varData = self._varData
scalars = [self._getScalar(ri) for ri in varData[major].VarRegionIndex]
deltas = varData[major].Item[minor]
@staticmethod
def interpolateFromDeltasAndScalars(deltas, scalars):
delta = 0.
for d,s in zip(deltas, scalars):
if not s: continue
delta += d * s
return delta
def applyScalars(self, varDataIndex, deltas):
def __getitem__(self, varidx):
major, minor = varidx >> 16, varidx & 0xFFFF
varData = self._varData
scalars = [self._getScalar(ri) for ri in varData[major].VarRegionIndex]
deltas = varData[major].Item[minor]
return interpolateFromDeltasAndScalars(deltas, scalars)
def interpolateFromDeltas(self, varDataIndex, deltas):
varData = self._varData
scalars = [self._getScalar(ri) for ri in
varData[varDataIndex].VarRegionIndex]
delta = 0.
for d,s in zip(deltas, scalars):
delta += d * s
return delta
return interpolateFromDeltasAndScalars(deltas, scalars)
#

View File

@ -1,5 +1,5 @@
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools.ttLib import TTFont
from fontTools.varLib import build
from fontTools.varLib import main as varLib_main