[varLib.mutator] Apply avar
This commit is contained in:
parent
acd2f490af
commit
1adacb34f0
@ -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()
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user