285 lines
25 KiB
HTML
285 lines
25 KiB
HTML
|
|
<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
<html><head><title>Python: module fontTools.misc.transform</title>
|
|
</head><body bgcolor="#f0f0f8">
|
|
|
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
|
|
<tr bgcolor="#7799ee">
|
|
<td valign=bottom> <br>
|
|
<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="fontTools.html"><font color="#ffffff">fontTools</font></a>.<a href="fontTools.misc.html"><font color="#ffffff">misc</font></a>.transform</strong></big></big></font></td
|
|
><td align=right valign=bottom
|
|
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/code/fontTools/Lib/fontTools/misc/transform.py">/code/fontTools/Lib/fontTools/misc/transform.py</a></font></td></tr></table>
|
|
<p><tt>Affine 2D transformation matrix class.<br>
|
|
<br>
|
|
The <a href="#Transform">Transform</a> class implements various transformation matrix operations,<br>
|
|
both on the matrix itself, as well as on 2D coordinates.<br>
|
|
<br>
|
|
<a href="#Transform">Transform</a> instances are effectively immutable: all methods that operate on the<br>
|
|
transformation itself always return a new instance. This has as the<br>
|
|
interesting side effect that <a href="#Transform">Transform</a> instances are hashable, ie. they can be<br>
|
|
used as dictionary keys.<br>
|
|
<br>
|
|
This module exports the following symbols:<br>
|
|
<br>
|
|
<a href="#Transform">Transform</a> -- this is the main class<br>
|
|
Identity -- <a href="#Transform">Transform</a> instance set to the identity transformation<br>
|
|
Offset -- Convenience function that returns a translating transformation<br>
|
|
Scale -- Convenience function that returns a scaling transformation<br>
|
|
<br>
|
|
Examples:<br>
|
|
<br>
|
|
>>> t = <a href="#Transform">Transform</a>(2, 0, 0, 3, 0, 0)<br>
|
|
>>> t.transformPoint((100, 100))<br>
|
|
(200, 300)<br>
|
|
>>> t = <a href="#-Scale">Scale</a>(2, 3)<br>
|
|
>>> t.transformPoint((100, 100))<br>
|
|
(200, 300)<br>
|
|
>>> t.transformPoint((0, 0))<br>
|
|
(0, 0)<br>
|
|
>>> t = <a href="#-Offset">Offset</a>(2, 3)<br>
|
|
>>> t.transformPoint((100, 100))<br>
|
|
(102, 103)<br>
|
|
>>> t.transformPoint((0, 0))<br>
|
|
(2, 3)<br>
|
|
>>> t2 = t.scale(0.5)<br>
|
|
>>> t2.transformPoint((100, 100))<br>
|
|
(52.0, 53.0)<br>
|
|
>>> import math<br>
|
|
>>> t3 = t2.rotate(math.pi / 2)<br>
|
|
>>> t3.transformPoint((0, 0))<br>
|
|
(2.0, 3.0)<br>
|
|
>>> t3.transformPoint((100, 100))<br>
|
|
(-48.0, 53.0)<br>
|
|
>>> t = Identity.scale(0.5).translate(100, 200).skew(0.1, 0.2)<br>
|
|
>>> t.transformPoints([(0, 0), (1, 1), (100, 100)])<br>
|
|
[(50.0, 100.0), (50.550167336042726, 100.60135501775433), (105.01673360427253, 160.13550177543362)]<br>
|
|
>>></tt></p>
|
|
<p>
|
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
|
<tr bgcolor="#ee77aa">
|
|
<td colspan=3 valign=bottom> <br>
|
|
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
|
|
|
|
<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
|
|
<td width="100%"><dl>
|
|
<dt><font face="helvetica, arial"><a href="fontTools.misc.transform.html#Transform">Transform</a>
|
|
</font></dt></dl>
|
|
<p>
|
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
|
<tr bgcolor="#ffc8d8">
|
|
<td colspan=3 valign=bottom> <br>
|
|
<font color="#000000" face="helvetica, arial"><a name="Transform">class <strong>Transform</strong></a></font></td></tr>
|
|
|
|
<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
|
|
<td colspan=2><tt>2x2 transformation matrix plus offset, a.k.a. Affine transform.<br>
|
|
<a href="#Transform">Transform</a> instances are immutable: all transforming methods, eg.<br>
|
|
<a href="#Transform-rotate">rotate</a>(), return a new <a href="#Transform">Transform</a> instance.<br>
|
|
<br>
|
|
Examples:<br>
|
|
>>> t = <a href="#Transform">Transform</a>()<br>
|
|
>>> t<br>
|
|
<<a href="#Transform">Transform</a> [1 0 0 1 0 0]><br>
|
|
>>> t.<a href="#Transform-scale">scale</a>(2)<br>
|
|
<<a href="#Transform">Transform</a> [2 0 0 2 0 0]><br>
|
|
>>> t.<a href="#Transform-scale">scale</a>(2.5, 5.5)<br>
|
|
<<a href="#Transform">Transform</a> [2.5 0.0 0.0 5.5 0 0]><br>
|
|
>>><br>
|
|
>>> t.<a href="#Transform-scale">scale</a>(2, 3).<a href="#Transform-transformPoint">transformPoint</a>((100, 100))<br>
|
|
(200, 300)<br> </tt></td></tr>
|
|
<tr><td> </td>
|
|
<td width="100%">Methods defined here:<br>
|
|
<dl><dt><a name="Transform-__cmp__"><strong>__cmp__</strong></a>(self, other)</dt><dd><tt><a href="#Transform">Transform</a> instances are comparable:<br>
|
|
>>> t1 = Identity.<a href="#Transform-scale">scale</a>(2, 3).<a href="#Transform-translate">translate</a>(4, 6)<br>
|
|
>>> t2 = Identity.<a href="#Transform-translate">translate</a>(8, 18).<a href="#Transform-scale">scale</a>(2, 3)<br>
|
|
>>> t1 == t2<br>
|
|
1<br>
|
|
>>><br>
|
|
<br>
|
|
But beware of floating point rounding errors:<br>
|
|
>>> t1 = Identity.<a href="#Transform-scale">scale</a>(0.2, 0.3).<a href="#Transform-translate">translate</a>(0.4, 0.6)<br>
|
|
>>> t2 = Identity.<a href="#Transform-translate">translate</a>(0.08, 0.18).<a href="#Transform-scale">scale</a>(0.2, 0.3)<br>
|
|
>>> t1<br>
|
|
<<a href="#Transform">Transform</a> [0.2 0.0 0.0 0.3 0.08 0.18]><br>
|
|
>>> t2<br>
|
|
<<a href="#Transform">Transform</a> [0.2 0.0 0.0 0.3 0.08 0.18]><br>
|
|
>>> t1 == t2<br>
|
|
0<br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-__getitem__"><strong>__getitem__</strong></a>(self, index)</dt><dd><tt><a href="#Transform">Transform</a> instances also behave like sequences of length 6:<br>
|
|
>>> list(Identity)<br>
|
|
[1, 0, 0, 1, 0, 0]<br>
|
|
>>> tuple(Identity)<br>
|
|
(1, 0, 0, 1, 0, 0)<br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-__getslice__"><strong>__getslice__</strong></a>(self, i, j)</dt><dd><tt><a href="#Transform">Transform</a> instances also behave like sequences and even support<br>
|
|
slicing:<br>
|
|
>>> t = <a href="#-Offset">Offset</a>(100, 200)<br>
|
|
>>> t<br>
|
|
<<a href="#Transform">Transform</a> [1 0 0 1 100 200]><br>
|
|
>>> t[4:]<br>
|
|
(100, 200)<br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-__hash__"><strong>__hash__</strong></a>(self)</dt><dd><tt><a href="#Transform">Transform</a> instances are hashable, meaning you can use them as<br>
|
|
keys in dictionaries:<br>
|
|
>>> d = {<a href="#-Scale">Scale</a>(12, 13): None}<br>
|
|
>>> d<br>
|
|
{<<a href="#Transform">Transform</a> [12 0 0 13 0 0]>: None}<br>
|
|
>>><br>
|
|
<br>
|
|
But again, beware of floating point rounding errors:<br>
|
|
>>> t1 = Identity.<a href="#Transform-scale">scale</a>(0.2, 0.3).<a href="#Transform-translate">translate</a>(0.4, 0.6)<br>
|
|
>>> t2 = Identity.<a href="#Transform-translate">translate</a>(0.08, 0.18).<a href="#Transform-scale">scale</a>(0.2, 0.3)<br>
|
|
>>> t1<br>
|
|
<<a href="#Transform">Transform</a> [0.2 0.0 0.0 0.3 0.08 0.18]><br>
|
|
>>> t2<br>
|
|
<<a href="#Transform">Transform</a> [0.2 0.0 0.0 0.3 0.08 0.18]><br>
|
|
>>> d = {t1: None}<br>
|
|
>>> d<br>
|
|
{<<a href="#Transform">Transform</a> [0.2 0.0 0.0 0.3 0.08 0.18]>: None}<br>
|
|
>>> d[t2]<br>
|
|
Traceback (most recent call last):<br>
|
|
File "<stdin>", line 1, in ?<br>
|
|
KeyError: <<a href="#Transform">Transform</a> [0.2 0.0 0.0 0.3 0.08 0.18]><br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-__init__"><strong>__init__</strong></a>(self, xx<font color="#909090">=1</font>, xy<font color="#909090">=0</font>, yx<font color="#909090">=0</font>, yy<font color="#909090">=1</font>, dx<font color="#909090">=0</font>, dy<font color="#909090">=0</font>)</dt><dd><tt><a href="#Transform">Transform</a>'s constructor takes six arguments, all of which are<br>
|
|
optional, and can be used as keyword arguments:<br>
|
|
>>> <a href="#Transform">Transform</a>(12)<br>
|
|
<<a href="#Transform">Transform</a> [12 0 0 1 0 0]><br>
|
|
>>> <a href="#Transform">Transform</a>(dx=12)<br>
|
|
<<a href="#Transform">Transform</a> [1 0 0 1 12 0]><br>
|
|
>>> <a href="#Transform">Transform</a>(yx=12)<br>
|
|
<<a href="#Transform">Transform</a> [1 0 12 1 0 0]><br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-__len__"><strong>__len__</strong></a>(self)</dt><dd><tt><a href="#Transform">Transform</a> instances also behave like sequences of length 6:<br>
|
|
>>> len(Identity)<br>
|
|
6<br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-__repr__"><strong>__repr__</strong></a>(self)</dt></dl>
|
|
|
|
<dl><dt><a name="Transform-inverse"><strong>inverse</strong></a>(self)</dt><dd><tt>Return the inverse transformation.<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> t = Identity.<a href="#Transform-translate">translate</a>(2, 3).<a href="#Transform-scale">scale</a>(4, 5)<br>
|
|
>>> t.<a href="#Transform-transformPoint">transformPoint</a>((10, 20))<br>
|
|
(42, 103)<br>
|
|
>>> it = t.<a href="#Transform-inverse">inverse</a>()<br>
|
|
>>> it.<a href="#Transform-transformPoint">transformPoint</a>((42, 103))<br>
|
|
(10.0, 20.0)<br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-reverseTransform"><strong>reverseTransform</strong></a>(self, other)</dt><dd><tt>Return a new transformation, which is the other transformation<br>
|
|
transformed by self. <a href="#Transform-reverseTransform">reverseTransform</a>(other) is equivalent to<br>
|
|
other.<a href="#Transform-transform">transform</a>(self).<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> t = <a href="#Transform">Transform</a>(2, 0, 0, 3, 1, 6)<br>
|
|
>>> t.<a href="#Transform-reverseTransform">reverseTransform</a>((4, 3, 2, 1, 5, 6))<br>
|
|
<<a href="#Transform">Transform</a> [8 6 6 3 21 15]><br>
|
|
>>> <a href="#Transform">Transform</a>(4, 3, 2, 1, 5, 6).<a href="#Transform-transform">transform</a>((2, 0, 0, 3, 1, 6))<br>
|
|
<<a href="#Transform">Transform</a> [8 6 6 3 21 15]><br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-rotate"><strong>rotate</strong></a>(self, angle)</dt><dd><tt>Return a new transformation, rotated by 'angle' (radians).<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> import math<br>
|
|
>>> t = <a href="#Transform">Transform</a>()<br>
|
|
>>> t.<a href="#Transform-rotate">rotate</a>(math.pi / 2)<br>
|
|
<<a href="#Transform">Transform</a> [0 1 -1 0 0 0]><br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-scale"><strong>scale</strong></a>(self, x<font color="#909090">=1</font>, y<font color="#909090">=None</font>)</dt><dd><tt>Return a new transformation, scaled by x, y. The 'y' argument<br>
|
|
may be None, which implies to use the x value for y as well.<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> t = <a href="#Transform">Transform</a>()<br>
|
|
>>> t.<a href="#Transform-scale">scale</a>(5)<br>
|
|
<<a href="#Transform">Transform</a> [5 0 0 5 0 0]><br>
|
|
>>> t.<a href="#Transform-scale">scale</a>(5, 6)<br>
|
|
<<a href="#Transform">Transform</a> [5 0 0 6 0 0]><br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-skew"><strong>skew</strong></a>(self, x<font color="#909090">=0</font>, y<font color="#909090">=0</font>)</dt><dd><tt>Return a new transformation, skewed by x and y.<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> import math<br>
|
|
>>> t = <a href="#Transform">Transform</a>()<br>
|
|
>>> t.<a href="#Transform-skew">skew</a>(math.pi / 4)<br>
|
|
<<a href="#Transform">Transform</a> [1.0 0.0 1.0 1.0 0 0]><br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-toPS"><strong>toPS</strong></a>(self)</dt><dd><tt>Return a PostScript representation:<br>
|
|
>>> t = Identity.<a href="#Transform-scale">scale</a>(2, 3).<a href="#Transform-translate">translate</a>(4, 5)<br>
|
|
>>> t.<a href="#Transform-toPS">toPS</a>()<br>
|
|
'[2 0 0 3 8 15]'<br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-transform"><strong>transform</strong></a>(self, other)</dt><dd><tt>Return a new transformation, transformed by another<br>
|
|
transformation.<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> t = <a href="#Transform">Transform</a>(2, 0, 0, 3, 1, 6)<br>
|
|
>>> t.<a href="#Transform-transform">transform</a>((4, 3, 2, 1, 5, 6))<br>
|
|
<<a href="#Transform">Transform</a> [8 9 4 3 11 24]><br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-transformPoint"><strong>transformPoint</strong></a>(self, (x, y))</dt><dd><tt><a href="#Transform">Transform</a> a point.<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> t = <a href="#Transform">Transform</a>()<br>
|
|
>>> t = t.<a href="#Transform-scale">scale</a>(2.5, 5.5)<br>
|
|
>>> t.<a href="#Transform-transformPoint">transformPoint</a>((100, 100))<br>
|
|
(250.0, 550.0)</tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-transformPoints"><strong>transformPoints</strong></a>(self, points)</dt><dd><tt><a href="#Transform">Transform</a> a list of points.<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> t = <a href="#-Scale">Scale</a>(2, 3)<br>
|
|
>>> t.<a href="#Transform-transformPoints">transformPoints</a>([(0, 0), (0, 100), (100, 100), (100, 0)])<br>
|
|
[(0, 0), (0, 300), (200, 300), (200, 0)]<br>
|
|
>>></tt></dd></dl>
|
|
|
|
<dl><dt><a name="Transform-translate"><strong>translate</strong></a>(self, x<font color="#909090">=0</font>, y<font color="#909090">=0</font>)</dt><dd><tt>Return a new transformation, translated (offset) by x, y.<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> t = <a href="#Transform">Transform</a>()<br>
|
|
>>> t.<a href="#Transform-translate">translate</a>(20, 30)<br>
|
|
<<a href="#Transform">Transform</a> [1 0 0 1 20 30]><br>
|
|
>>></tt></dd></dl>
|
|
|
|
</td></tr></table></td></tr></table><p>
|
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
|
<tr bgcolor="#eeaa77">
|
|
<td colspan=3 valign=bottom> <br>
|
|
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
|
|
|
|
<tr><td bgcolor="#eeaa77"><tt> </tt></td><td> </td>
|
|
<td width="100%"><dl><dt><a name="-Offset"><strong>Offset</strong></a>(x<font color="#909090">=0</font>, y<font color="#909090">=0</font>)</dt><dd><tt>Return the identity transformation offset by x, y.<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> <a href="#-Offset">Offset</a>(2, 3)<br>
|
|
<<a href="#Transform">Transform</a> [1 0 0 1 2 3]><br>
|
|
>>></tt></dd></dl>
|
|
<dl><dt><a name="-Scale"><strong>Scale</strong></a>(x, y<font color="#909090">=None</font>)</dt><dd><tt>Return the identity transformation scaled by x, y. The 'y' argument<br>
|
|
may be None, which implies to use the x value for y as well.<br>
|
|
<br>
|
|
Example:<br>
|
|
>>> <a href="#-Scale">Scale</a>(2, 3)<br>
|
|
<<a href="#Transform">Transform</a> [2 0 0 3 0 0]><br>
|
|
>>></tt></dd></dl>
|
|
</td></tr></table><p>
|
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
|
<tr bgcolor="#55aa55">
|
|
<td colspan=3 valign=bottom> <br>
|
|
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
|
|
|
|
<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
|
|
<td width="100%"><strong>Identity</strong> = <Transform [1 0 0 1 0 0]><br>
|
|
<strong>__all__</strong> = ['Transform', 'Identity', 'Offset', 'Scale']</td></tr></table>
|
|
</body></html> |