diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index bceb0e3d4..c0579df86 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -762,3 +762,22 @@ class TestImageDraw(PillowTestCase): expected = ("Tests/images/imagedraw_outline" "_{}_{}.png".format(operation, mode)) self.assert_image_similar(im, Image.open(expected), 1) + + def test_xy(self): + im = hopper() + draw = ImageDraw.Draw(im) + + for xy in [ + [(X0, Y0), (X1, Y1)], + [[X0, Y0], [X1, Y1]], + [X0, Y0, X1, Y1] + ]: + draw.arc(xy, 0, 90) + draw.chord(xy, 0, 90) + draw.pieslice(xy, 0, 90) + + draw.ellipse(xy) + draw.line(xy) + draw.point(xy) + draw.polygon(xy) + draw.rectangle(xy) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 86512bb82..373d35402 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -98,6 +98,10 @@ class ImageDraw(object): self.font = ImageFont.load_default() return self.font + def _getxy(self, xy): + return [tuple(coord) if isinstance(coord, list) else coord + for coord in xy] + def _getink(self, ink, fill=None): if ink is None and fill is None: if self.fill: @@ -121,6 +125,7 @@ class ImageDraw(object): def arc(self, xy, start, end, fill=None, width=0): """Draw an arc.""" + xy = self._getxy(xy) ink, fill = self._getink(fill) if ink is not None: self.draw.draw_arc(xy, start, end, ink, width) @@ -136,6 +141,7 @@ class ImageDraw(object): def chord(self, xy, start, end, fill=None, outline=None, width=0): """Draw a chord.""" + xy = self._getxy(xy) ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_chord(xy, start, end, fill, 1) @@ -144,6 +150,7 @@ class ImageDraw(object): def ellipse(self, xy, fill=None, outline=None, width=0): """Draw an ellipse.""" + xy = self._getxy(xy) ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_ellipse(xy, fill, 1) @@ -152,6 +159,7 @@ class ImageDraw(object): def line(self, xy, fill=None, width=0, joint=None): """Draw a line, or a connected sequence of line segments.""" + xy = self._getxy(xy) ink = self._getink(fill)[0] if ink is not None: self.draw.draw_lines(xy, ink, width) @@ -220,6 +228,7 @@ class ImageDraw(object): def pieslice(self, xy, start, end, fill=None, outline=None, width=0): """Draw a pieslice.""" + xy = self._getxy(xy) ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_pieslice(xy, start, end, fill, 1) @@ -228,12 +237,14 @@ class ImageDraw(object): def point(self, xy, fill=None): """Draw one or more individual pixels.""" + xy = self._getxy(xy) ink, fill = self._getink(fill) if ink is not None: self.draw.draw_points(xy, ink) def polygon(self, xy, fill=None, outline=None): """Draw a polygon.""" + xy = self._getxy(xy) ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_polygon(xy, fill, 1) @@ -242,6 +253,7 @@ class ImageDraw(object): def rectangle(self, xy, fill=None, outline=None, width=0): """Draw a rectangle.""" + xy = self._getxy(xy) ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_rectangle(xy, fill, 1) @@ -264,6 +276,7 @@ class ImageDraw(object): if self._multiline_check(text): return self.multiline_text(xy, text, fill, font, anchor, *args, **kwargs) + xy = self._getxy(xy) ink, fill = self._getink(fill) if font is None: font = self.getfont()