[varLib.mutator] Apply avar

This commit is contained in:
Behdad Esfahbod 2017-10-19 13:59:43 -07:00
parent acd2f490af
commit 1adacb34f0
2 changed files with 45 additions and 39 deletions

View File

@ -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()

View File

@ -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)