[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
|
OS2_WIDTH_CLASS_VALUES[half] = i
|
||||||
|
|
||||||
|
|
||||||
def interpolate_cff2_PrivateDict(topDict, applyScalars):
|
def interpolate_cff2_PrivateDict(topDict, interpolateFromDeltas):
|
||||||
pd_blend_lists = ("BlueValues", "OtherBlues", "FamilyBlues",
|
pd_blend_lists = ("BlueValues", "OtherBlues", "FamilyBlues",
|
||||||
"FamilyOtherBlues", "StemSnapH",
|
"FamilyOtherBlues", "StemSnapH",
|
||||||
"StemSnapV")
|
"StemSnapV")
|
||||||
@ -42,8 +42,8 @@ def interpolate_cff2_PrivateDict(topDict, applyScalars):
|
|||||||
vsindex = pd.vsindex if (hasattr(pd, 'vsindex')) else 0
|
vsindex = pd.vsindex if (hasattr(pd, 'vsindex')) else 0
|
||||||
for key, value in pd.rawDict.items():
|
for key, value in pd.rawDict.items():
|
||||||
if (key in pd_blend_values) and isinstance(value, list):
|
if (key in pd_blend_values) and isinstance(value, list):
|
||||||
deltas = value[1:]
|
delta = interpolateFromDeltas(vsindex, value[1:])
|
||||||
pd.rawDict[key] = otRound(value[0] + applyScalars(vsindex, deltas))
|
pd.rawDict[key] = otRound(value[0] + delta)
|
||||||
elif (key in pd_blend_lists) and isinstance(value[0], list):
|
elif (key in pd_blend_lists) and isinstance(value[0], list):
|
||||||
"""If any argument in a BlueValues list is a blend list,
|
"""If any argument in a BlueValues list is a blend list,
|
||||||
then they all are. The first value of each list is an
|
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."""
|
deltas to date to each successive absolute value."""
|
||||||
delta = 0
|
delta = 0
|
||||||
for i, val_list in enumerate(value):
|
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
|
value[i] = val_list[0] + delta
|
||||||
|
|
||||||
|
|
||||||
def interpolate_cff2_charstrings(topDict, applyScalars, glyphOrder):
|
def interpolate_cff2_charstrings(topDict, interpolateFromDeltas, glyphOrder):
|
||||||
charstrings = topDict.CharStrings
|
charstrings = topDict.CharStrings
|
||||||
for gname in glyphOrder:
|
for gname in glyphOrder:
|
||||||
charstring = charstrings[gname]
|
charstring = charstrings[gname]
|
||||||
@ -83,8 +84,8 @@ def interpolate_cff2_charstrings(topDict, applyScalars, glyphOrder):
|
|||||||
while argi < end_args:
|
while argi < end_args:
|
||||||
next_ti = tuplei + num_regions
|
next_ti = tuplei + num_regions
|
||||||
deltas = charstring.program[tuplei:next_ti]
|
deltas = charstring.program[tuplei:next_ti]
|
||||||
delta = otRound(applyScalars(vsindex, deltas))
|
delta = interpolateFromDeltas(vsindex, deltas)
|
||||||
charstring.program[argi] += delta
|
charstring.program[argi] += otRound(delta)
|
||||||
tuplei = next_ti
|
tuplei = next_ti
|
||||||
argi += 1
|
argi += 1
|
||||||
new_program.extend(charstring.program[last_i:end_args])
|
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]
|
topDict = varfont['CFF2'].cff.topDictIndex[0]
|
||||||
vsInstancer = VarStoreInstancer(topDict.VarStore.otVarStore,
|
vsInstancer = VarStoreInstancer(topDict.VarStore.otVarStore,
|
||||||
fvar.axes, loc)
|
fvar.axes, loc)
|
||||||
applyScalars = vsInstancer.applyScalars
|
interpolateFromDeltas = vsInstancer.interpolateFromDeltas
|
||||||
interpolate_cff2_PrivateDict(topDict, applyScalars)
|
interpolate_cff2_PrivateDict(topDict, interpolateFromDeltas)
|
||||||
interpolate_cff2_charstrings(topDict, applyScalars, glyphOrder)
|
interpolate_cff2_charstrings(topDict, interpolateFromDeltas,
|
||||||
|
glyphOrder)
|
||||||
|
|
||||||
if 'MVAR' in varfont:
|
if 'MVAR' in varfont:
|
||||||
log.info("Mutating MVAR table")
|
log.info("Mutating MVAR table")
|
||||||
|
@ -162,27 +162,26 @@ class VarStoreInstancer(object):
|
|||||||
self._scalars[regionIdx] = scalar
|
self._scalars[regionIdx] = scalar
|
||||||
return scalar
|
return scalar
|
||||||
|
|
||||||
def __getitem__(self, varidx):
|
@staticmethod
|
||||||
|
def interpolateFromDeltasAndScalars(deltas, scalars):
|
||||||
major, minor = varidx >> 16, varidx & 0xFFFF
|
|
||||||
|
|
||||||
varData = self._varData
|
|
||||||
scalars = [self._getScalar(ri) for ri in varData[major].VarRegionIndex]
|
|
||||||
|
|
||||||
deltas = varData[major].Item[minor]
|
|
||||||
delta = 0.
|
delta = 0.
|
||||||
for d,s in zip(deltas, scalars):
|
for d,s in zip(deltas, scalars):
|
||||||
|
if not s: continue
|
||||||
delta += d * s
|
delta += d * s
|
||||||
return delta
|
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
|
varData = self._varData
|
||||||
scalars = [self._getScalar(ri) for ri in
|
scalars = [self._getScalar(ri) for ri in
|
||||||
varData[varDataIndex].VarRegionIndex]
|
varData[varDataIndex].VarRegionIndex]
|
||||||
delta = 0.
|
return interpolateFromDeltasAndScalars(deltas, scalars)
|
||||||
for d,s in zip(deltas, scalars):
|
|
||||||
delta += d * s
|
|
||||||
return delta
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from __future__ import print_function, division, absolute_import
|
from __future__ import print_function, division, absolute_import
|
||||||
|
from fontTools.misc.py23 import *
|
||||||
from fontTools.ttLib import TTFont
|
from fontTools.ttLib import TTFont
|
||||||
from fontTools.varLib import build
|
from fontTools.varLib import build
|
||||||
from fontTools.varLib import main as varLib_main
|
from fontTools.varLib import main as varLib_main
|
||||||
|
Loading…
x
Reference in New Issue
Block a user