[varLib.models] Add optional rounding to VariationModel() relevant methods

Users to be updated to benefit.

Part of https://github.com/fonttools/fonttools/issues/2213
This commit is contained in:
Behdad Esfahbod 2021-03-03 19:03:12 -07:00
parent 3a9a2bd4b1
commit fdd8267065

View File

@ -5,6 +5,7 @@ __all__ = ['nonNone', 'allNone', 'allEqual', 'allEqualTo', 'subList',
'supportScalar', 'supportScalar',
'VariationModel'] 'VariationModel']
from fontTools.misc.roundTools import noRound
from .errors import VariationModelError from .errors import VariationModelError
@ -358,7 +359,7 @@ class VariationModel(object):
self.supports = supports self.supports = supports
self.deltaWeights = deltaWeights self.deltaWeights = deltaWeights
def getDeltas(self, masterValues): def getDeltas(self, masterValues, round=noRound):
assert len(masterValues) == len(self.deltaWeights) assert len(masterValues) == len(self.deltaWeights)
mapping = self.reverseMapping mapping = self.reverseMapping
out = [] out = []
@ -366,12 +367,12 @@ class VariationModel(object):
delta = masterValues[mapping[i]] delta = masterValues[mapping[i]]
for j,weight in weights.items(): for j,weight in weights.items():
delta -= out[j] * weight delta -= out[j] * weight
out.append(delta) out.append(round(delta))
return out return out
def getDeltasAndSupports(self, items): def getDeltasAndSupports(self, items, round=noRound):
model, items = self.getSubModel(items) model, items = self.getSubModel(items)
return model.getDeltas(items), model.supports return model.getDeltas(items, round=round), model.supports
def getScalars(self, loc): def getScalars(self, loc):
return [supportScalar(loc, support) for support in self.supports] return [supportScalar(loc, support) for support in self.supports]
@ -393,12 +394,12 @@ class VariationModel(object):
scalars = self.getScalars(loc) scalars = self.getScalars(loc)
return self.interpolateFromDeltasAndScalars(deltas, scalars) return self.interpolateFromDeltasAndScalars(deltas, scalars)
def interpolateFromMasters(self, loc, masterValues): def interpolateFromMasters(self, loc, masterValues, round=noRound):
deltas = self.getDeltas(masterValues) deltas = self.getDeltas(masterValues, round=round)
return self.interpolateFromDeltas(loc, deltas) return self.interpolateFromDeltas(loc, deltas)
def interpolateFromMastersAndScalars(self, masterValues, scalars): def interpolateFromMastersAndScalars(self, masterValues, scalars, round=noRound):
deltas = self.getDeltas(masterValues) deltas = self.getDeltas(masterValues, round=round)
return self.interpolateFromDeltasAndScalars(deltas, scalars) return self.interpolateFromDeltasAndScalars(deltas, scalars)