From fddd5b2baefbe11dc3ab245b62811a90099e44f8 Mon Sep 17 00:00:00 2001 From: ReadRoberts Date: Wed, 14 Nov 2018 10:20:48 -0800 Subject: [PATCH] [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. --- Lib/fontTools/varLib/mutator.py | 22 ++++++++++++---------- Lib/fontTools/varLib/varStore.py | 25 ++++++++++++------------- Tests/varLib/varLib_test.py | 2 +- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Lib/fontTools/varLib/mutator.py b/Lib/fontTools/varLib/mutator.py index a1fde6395..4042c7bc3 100644 --- a/Lib/fontTools/varLib/mutator.py +++ b/Lib/fontTools/varLib/mutator.py @@ -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") diff --git a/Lib/fontTools/varLib/varStore.py b/Lib/fontTools/varLib/varStore.py index d281108fc..a16014794 100644 --- a/Lib/fontTools/varLib/varStore.py +++ b/Lib/fontTools/varLib/varStore.py @@ -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) # diff --git a/Tests/varLib/varLib_test.py b/Tests/varLib/varLib_test.py index 31cf4bd4f..3cb41b106 100644 --- a/Tests/varLib/varLib_test.py +++ b/Tests/varLib/varLib_test.py @@ -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