diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py index a5503d0db..5bca2a31a 100644 --- a/Lib/fontTools/varLib/__init__.py +++ b/Lib/fontTools/varLib/__init__.py @@ -497,6 +497,44 @@ def _merge_OTL(font, model, master_fonts, axisTags): GDEF.VarStore = store + +# Pretty much all of this file should be redesigned and moved inot submodules... +# Such a mess right now, but kludging along... +class _DesignspaceAxis(object): + + def __repr__(self): + return repr(self.__dict__) + + @staticmethod + def _map(v, map): + keys = map.keys() + if not keys: + return v + if v in keys: + return map[v] + k = min(keys) + if v < k: + return v + map[k] - k + k = max(keys) + if v > k: + return v + map[k] - k + # Interpolate + a = max(k for k in keys if k < v) + b = min(k for k in keys if k > v) + va = map[a] + vb = map[b] + return va + (vb - va) * (v - a) / (b - a) + + def map_forward(self, v): + if self.map is None: return v + return self._map(v, self.map) + + def map_backward(self, v): + if self.map is None: return v + map = {v:k for k,v in self.map.items()} + return self._map(v, map) + + def load_designspace(designspace_filename): ds = designspace.load(designspace_filename) @@ -515,40 +553,6 @@ def load_designspace(designspace_filename): # Setup axes - class DesignspaceAxis(object): - - def __repr__(self): - return repr(self.__dict__) - - @staticmethod - def _map(v, map): - keys = map.keys() - if not keys: - return v - if v in keys: - return map[v] - k = min(keys) - if v < k: - return v + map[k] - k - k = max(keys) - if v > k: - return v + map[k] - k - # Interpolate - a = max(k for k in keys if k < v) - b = min(k for k in keys if k > v) - va = map[a] - vb = map[b] - return va + (vb - va) * (v - a) / (b - a) - - def map_forward(self, v): - if self.map is None: return v - return self._map(v, self.map) - - def map_backward(self, v): - if self.map is None: return v - map = {v:k for k,v in self.map.items()} - return self._map(v, map) - axis_objects = OrderedDict() if axes is not None: for axis_dict in axes: @@ -566,7 +570,7 @@ def load_designspace(designspace_filename): if 'labelname' not in axis_dict: axis_dict['labelname'] = standard_axis_map[axis_name][1].copy() - axis = DesignspaceAxis() + axis = _DesignspaceAxis() for item in ['name', 'tag', 'minimum', 'default', 'maximum', 'map']: assert item in axis_dict, 'Axis does not have "%s"' % item if 'labelname' not in axis_dict: @@ -591,7 +595,7 @@ def load_designspace(designspace_filename): if name not in axis_names: continue - axis = DesignspaceAxis() + axis = _DesignspaceAxis() axis.name = name axis.tag = tag axis.labelname = labelname.copy() diff --git a/Lib/fontTools/varLib/mutator.py b/Lib/fontTools/varLib/mutator.py index b328acb0f..8ecd17940 100644 --- a/Lib/fontTools/varLib/mutator.py +++ b/Lib/fontTools/varLib/mutator.py @@ -7,7 +7,7 @@ from __future__ import print_function, division, absolute_import from fontTools.misc.py23 import * from fontTools.ttLib import TTFont from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates -from fontTools.varLib import _GetCoordinates, _SetCoordinates +from fontTools.varLib import _GetCoordinates, _SetCoordinates, _DesignspaceAxis from fontTools.varLib.models import supportScalar, normalizeLocation from fontTools.varLib.mvar import MVAR_entries from fontTools.varLib.iup import iup_delta @@ -37,9 +37,11 @@ def instantiateVariableFont(varfont, location, inplace=False): fvar = varfont['fvar'] axes = {a.axisTag:(a.minValue,a.defaultValue,a.maxValue) for a in fvar.axes} - # TODO Apply avar - # TODO Round to F2Dot14? loc = normalizeLocation(location, axes) + if 'avar' in varfont: + maps = varfont['avar'].segments + loc = {k:_DesignspaceAxis._map(v, maps[k]) for k,v in loc.items()} + # TODO Round to F2Dot14? # Location is normalized now log.info("Normalized location: %s", loc)