[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:
parent
b5f12785e1
commit
fddd5b2bae
@ -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")
|
||||
|
@ -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)
|
||||
|
||||
|
||||
#
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user