more doctests
git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@455 4cde692c-a291-49d1-8350-778aa11640f8
This commit is contained in:
parent
f184f75486
commit
deca398915
@ -84,6 +84,16 @@ class Transform:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, xx=1, xy=0, yx=0, yy=1, dx=0, dy=0):
|
def __init__(self, xx=1, xy=0, yx=0, yy=1, dx=0, dy=0):
|
||||||
|
"""Transform's constructor takes six arguments, all of which are
|
||||||
|
optional, and can be used as keyword arguments:
|
||||||
|
>>> Transform(12)
|
||||||
|
<Transform [12 0 0 1 0 0]>
|
||||||
|
>>> Transform(dx=12)
|
||||||
|
<Transform [1 0 0 1 12 0]>
|
||||||
|
>>> Transform(yx=12)
|
||||||
|
<Transform [1 0 12 1 0 0]>
|
||||||
|
>>>
|
||||||
|
"""
|
||||||
self.__affine = xx, xy, yx, yy, dx, dy
|
self.__affine = xx, xy, yx, yy, dx, dy
|
||||||
|
|
||||||
def transformPoint(self, (x, y)):
|
def transformPoint(self, (x, y)):
|
||||||
@ -212,9 +222,12 @@ class Transform:
|
|||||||
"""Return the inverse transformation.
|
"""Return the inverse transformation.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
>>> t = Transform(2, 0, 0, 3, 1, 6)
|
>>> t = Identity.translate(2, 3).scale(4, 5)
|
||||||
>>> t.inverse()
|
>>> t.transformPoint((10, 20))
|
||||||
<Transform [0.5 0.0 0.0 0.333333333333 -0.5 -2.0]>
|
(42, 103)
|
||||||
|
>>> it = t.inverse()
|
||||||
|
>>> it.transformPoint((42, 103))
|
||||||
|
(10.0, 20.0)
|
||||||
>>>
|
>>>
|
||||||
"""
|
"""
|
||||||
if self.__affine == (1, 0, 0, 1, 0, 0):
|
if self.__affine == (1, 0, 0, 1, 0, 0):
|
||||||
@ -226,24 +239,92 @@ class Transform:
|
|||||||
return self.__class__(xx, xy, yx, yy, dx, dy)
|
return self.__class__(xx, xy, yx, yy, dx, dy)
|
||||||
|
|
||||||
def toPS(self):
|
def toPS(self):
|
||||||
|
"""Return a PostScript representation:
|
||||||
|
>>> t = Identity.scale(2, 3).translate(4, 5)
|
||||||
|
>>> t.toPS()
|
||||||
|
'[2 0 0 3 8 15]'
|
||||||
|
>>>
|
||||||
|
"""
|
||||||
return "[%s %s %s %s %s %s]" % self.__affine
|
return "[%s %s %s %s %s %s]" % self.__affine
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
|
"""Transform instances also behave like sequences of length 6:
|
||||||
|
>>> len(Identity)
|
||||||
|
6
|
||||||
|
>>>
|
||||||
|
"""
|
||||||
return 6
|
return 6
|
||||||
|
|
||||||
def __getitem__(self, index):
|
def __getitem__(self, index):
|
||||||
|
"""Transform instances also behave like sequences of length 6:
|
||||||
|
>>> list(Identity)
|
||||||
|
[1, 0, 0, 1, 0, 0]
|
||||||
|
>>> tuple(Identity)
|
||||||
|
(1, 0, 0, 1, 0, 0)
|
||||||
|
>>>
|
||||||
|
"""
|
||||||
return self.__affine[index]
|
return self.__affine[index]
|
||||||
|
|
||||||
def __getslice__(self, i, j):
|
def __getslice__(self, i, j):
|
||||||
|
"""Transform instances also behave like sequences and even support
|
||||||
|
slicing:
|
||||||
|
>>> t = Offset(100, 200)
|
||||||
|
>>> t
|
||||||
|
<Transform [1 0 0 1 100 200]>
|
||||||
|
>>> t[4:]
|
||||||
|
(100, 200)
|
||||||
|
>>>
|
||||||
|
"""
|
||||||
return self.__affine[i:j]
|
return self.__affine[i:j]
|
||||||
|
|
||||||
def __cmp__(self, other):
|
def __cmp__(self, other):
|
||||||
|
"""Transform instances are comparable:
|
||||||
|
>>> t1 = Identity.scale(2, 3).translate(4, 6)
|
||||||
|
>>> t2 = Identity.translate(8, 18).scale(2, 3)
|
||||||
|
>>> t1 == t2
|
||||||
|
1
|
||||||
|
>>>
|
||||||
|
|
||||||
|
But beware of floating point rounding errors:
|
||||||
|
>>> t1 = Identity.scale(0.2, 0.3).translate(0.4, 0.6)
|
||||||
|
>>> t2 = Identity.translate(0.08, 0.18).scale(0.2, 0.3)
|
||||||
|
>>> t1
|
||||||
|
<Transform [0.2 0.0 0.0 0.3 0.08 0.18]>
|
||||||
|
>>> t2
|
||||||
|
<Transform [0.2 0.0 0.0 0.3 0.08 0.18]>
|
||||||
|
>>> t1 == t2
|
||||||
|
0
|
||||||
|
>>>
|
||||||
|
"""
|
||||||
xx1, xy1, yx1, yy1, dx1, dy1 = self.__affine
|
xx1, xy1, yx1, yy1, dx1, dy1 = self.__affine
|
||||||
xx2, xy2, yx2, yy2, dx2, dy2 = other
|
xx2, xy2, yx2, yy2, dx2, dy2 = other
|
||||||
return cmp((xx1, xy1, yx1, yy1, dx1, dy1),
|
return cmp((xx1, xy1, yx1, yy1, dx1, dy1),
|
||||||
(xx2, xy2, yx2, yy2, dx2, dy2))
|
(xx2, xy2, yx2, yy2, dx2, dy2))
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
|
"""Transform instances are hashable, meaning you can use them as
|
||||||
|
keys in dictionaries:
|
||||||
|
>>> d = {Scale(12, 13): None}
|
||||||
|
>>> d
|
||||||
|
{<Transform [12 0 0 13 0 0]>: None}
|
||||||
|
>>>
|
||||||
|
|
||||||
|
But again, beware of floating point rounding errors:
|
||||||
|
>>> t1 = Identity.scale(0.2, 0.3).translate(0.4, 0.6)
|
||||||
|
>>> t2 = Identity.translate(0.08, 0.18).scale(0.2, 0.3)
|
||||||
|
>>> t1
|
||||||
|
<Transform [0.2 0.0 0.0 0.3 0.08 0.18]>
|
||||||
|
>>> t2
|
||||||
|
<Transform [0.2 0.0 0.0 0.3 0.08 0.18]>
|
||||||
|
>>> d = {t1: None}
|
||||||
|
>>> d
|
||||||
|
{<Transform [0.2 0.0 0.0 0.3 0.08 0.18]>: None}
|
||||||
|
>>> d[t2]
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<stdin>", line 1, in ?
|
||||||
|
KeyError: <Transform [0.2 0.0 0.0 0.3 0.08 0.18]>
|
||||||
|
>>>
|
||||||
|
"""
|
||||||
return hash(self.__affine)
|
return hash(self.__affine)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -278,8 +359,8 @@ def Scale(x, y=None):
|
|||||||
|
|
||||||
|
|
||||||
def _test():
|
def _test():
|
||||||
import doctest, fontTools.misc.transform
|
import doctest, transform
|
||||||
return doctest.testmod(fontTools.misc.transform)
|
return doctest.testmod(transform)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
_test()
|
_test()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user