diff --git a/Lib/fontTools/misc/transform.py b/Lib/fontTools/misc/transform.py index 997598f53..22ad776a2 100644 --- a/Lib/fontTools/misc/transform.py +++ b/Lib/fontTools/misc/transform.py @@ -171,6 +171,31 @@ class Transform(NamedTuple): xx, xy, yx, yy, dx, dy = self return [(xx*x + yx*y + dx, xy*x + yy*y + dy) for x, y in points] + def transformVector(self, v): + """Transform an (dx, dy) vector, treating translation as zero. + + Example: + >>> t = Transform(2, 0, 0, 2, 10, 20) + >>> t.transformVector((3, -4)) + (6, -8) + >>> + """ + (dx, dy) = v + xx, xy, yx, yy = self[:4] + return (xx*dx + yx*dy, xy*dx + yy*dy) + + def transformVectors(self, vectors): + """Transform a list of (dx, dy) vector, treating translation as zero. + + Example: + >>> t = Transform(2, 0, 0, 2, 10, 20) + >>> t.transformVectors([(3, -4), (5, -6)]) + [(6, -8), (10, -12)] + >>> + """ + xx, xy, yx, yy = self[:4] + return [(xx*dx + yx*dy, xy*dx + yy*dy) for dx, dy in vectors] + def translate(self, x=0, y=0): """Return a new transformation, translated (offset) by x, y. diff --git a/Tests/misc/transform_test.py b/Tests/misc/transform_test.py index 4efab81f4..53d4a2029 100644 --- a/Tests/misc/transform_test.py +++ b/Tests/misc/transform_test.py @@ -23,6 +23,14 @@ class TransformTest(object): [(0, 0), (0, 100), (100, 100), (100, 0)] ) == [(0, 0), (0, 300), (200, 300), (200, 0)] + def test_transformVector(self): + t = Transform(2, 0, 0, 3, -10, 30) + assert t.transformVector((-4, 5)) == (-8, 15) + + def test_transformVectors(self): + t = Transform(2, 0, 0, 3, -10, 30) + assert t.transformVectors([(-4, 5), (-6, 7)]) == [(-8, 15), (-12, 21)] + def test_translate(self): t = Transform() assert t.translate(20, 30) == Transform(1, 0, 0, 1, 20, 30)