Initial commit for a normalize() method.

- instance locations
- source locations
- axis extremes and default values.

todo:
axis.map values.
This commit is contained in:
Erik 2016-11-28 17:12:46 +01:00
parent 324f6aa685
commit 1b6ae36bab

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals
from __future__ import print_function, division, absolute_import
import os
import xml.etree.ElementTree as ET
@ -14,6 +15,7 @@ import xml.etree.ElementTree as ET
__all__ = [ 'DesignSpaceDocumentError', 'BaseDocReader', 'DesignSpaceDocument', 'SourceDescriptor', 'InstanceDescriptor', 'AxisDescriptor', 'BaseDocReader', 'BaseDocWriter']
class DesignSpaceDocumentError(Exception):
def __init__(self, msg, obj=None):
self.msg = msg
@ -642,6 +644,49 @@ class DesignSpaceDocument(object):
names.append(axisDescriptor.name)
return names
def normalizeLocation(self, location):
# scale this location based on the axes
# accept only values for the axes that we have definitions for
# only normalise if we're valid?
# normalise anisotropic cooordinates to isotropic.
# copied from fontTools.varlib.models.normalizeLocation
new = {}
for axis in self.axes:
if not axis.name in location:
# skipping this dimension it seems
continue
v = location.get(axis.name, axis.default)
if type(v)==tuple:
v = v[0]
if v == axis.default:
v = 0.0
elif v < axis.default:
if axis.default == axis.minimum:
v = 0.0
else:
v = (max(v, axis.minimum) - axis.default) / (axis.default - axis.minimum)
else:
if axis.default == axis.maximum:
v = 0.0
else:
v = (min(v, axis.maximum) - axis.default) / (axis.maximum - axis.default)
new[axis.name] = v
return new
def normalize(self):
# scale all the locations of all masters and instances to the -1 - 0 - 1 value.
for item in self.sources:
item.location = self.normalizeLocation(item.location)
for item in self.instances:
item.location = self.normalizeLocation(item.location)
for axis in self.axes:
minimum = self.normalizeLocation({axis.name:axis.minimum}).get(axis.name)
maximum = self.normalizeLocation({axis.name:axis.maximum}).get(axis.name)
default = self.normalizeLocation({axis.name:axis.default}).get(axis.name)
axis.minimum = minimum
axis.maximum = maximum
axis.default = default
if __name__ == "__main__":
@ -769,7 +814,103 @@ if __name__ == "__main__":
... axes[axis.tag].append(axis.serialize())
>>> for v in axes.values():
... a, b = v
... assert a == b
... assert a == b
"""
def testNormalise():
"""
>>> doc = DesignSpaceDocument()
>>> # write some axes
>>> a1 = AxisDescriptor()
>>> a1.minimum = -1000
>>> a1.maximum = 1000
>>> a1.default = 0
>>> a1.name = "aaa"
>>> doc.addAxis(a1)
>>> doc.normalizeLocation(dict(aaa=0))
{'aaa': 0.0}
>>> doc.normalizeLocation(dict(aaa=1000))
{'aaa': 1.0}
>>> # clipping beyond max values:
>>> doc.normalizeLocation(dict(aaa=1001))
{'aaa': 1.0}
>>> doc.normalizeLocation(dict(aaa=500))
{'aaa': 0.5}
>>> doc.normalizeLocation(dict(aaa=-1000))
{'aaa': -1.0}
>>> doc.normalizeLocation(dict(aaa=-1001))
{'aaa': -1.0}
>>> # anisotropic coordinates normalise to isotropic
>>> doc.normalizeLocation(dict(aaa=(1000,-1000)))
{'aaa': 1.0}
>>> doc.normalize()
>>> r = []
>>> for axis in doc.axes:
... r.append((axis.name, axis.minimum, axis.default, axis.maximum))
>>> r.sort()
>>> r
[('aaa', -1.0, 0.0, 1.0)]
>>> doc = DesignSpaceDocument()
>>> # write some axes
>>> a2 = AxisDescriptor()
>>> a2.minimum = 100
>>> a2.maximum = 1000
>>> a2.default = 100
>>> a2.name = "bbb"
>>> doc.addAxis(a2)
>>> doc.normalizeLocation(dict(bbb=0))
{'bbb': 0.0}
>>> doc.normalizeLocation(dict(bbb=1000))
{'bbb': 1.0}
>>> # clipping beyond max values:
>>> doc.normalizeLocation(dict(bbb=1001))
{'bbb': 1.0}
>>> doc.normalizeLocation(dict(bbb=500))
{'bbb': 0.4444444444444444}
>>> doc.normalizeLocation(dict(bbb=-1000))
{'bbb': 0.0}
>>> doc.normalizeLocation(dict(bbb=-1001))
{'bbb': 0.0}
>>> # anisotropic coordinates normalise to isotropic
>>> doc.normalizeLocation(dict(bbb=(1000,-1000)))
{'bbb': 1.0}
>>> doc.normalizeLocation(dict(bbb=1001))
{'bbb': 1.0}
>>> doc.normalize()
>>> r = []
>>> for axis in doc.axes:
... r.append((axis.name, axis.minimum, axis.default, axis.maximum))
>>> r.sort()
>>> r
[('bbb', 0.0, 0.0, 1.0)]
>>> doc = DesignSpaceDocument()
>>> # write some axes
>>> a3 = AxisDescriptor()
>>> a3.minimum = -1000
>>> a3.maximum = 0
>>> a3.default = 0
>>> a3.name = "ccc"
>>> doc.addAxis(a3)
>>> doc.normalizeLocation(dict(ccc=0))
{'ccc': 0.0}
>>> doc.normalizeLocation(dict(ccc=1))
{'ccc': 0.0}
>>> doc.normalizeLocation(dict(ccc=-1000))
{'ccc': -1.0}
>>> doc.normalizeLocation(dict(ccc=-1001))
{'ccc': -1.0}
>>> doc.normalize()
>>> r = []
>>> for axis in doc.axes:
... r.append((axis.name, axis.minimum, axis.default, axis.maximum))
>>> r.sort()
>>> r
[('ccc', -1.0, 0.0, 0.0)]
"""
def _test():