Skip to content

Commit a92dcc7

Browse files
committed
Pass start and end to arc, chord and pieslice
1 parent 2f28a0e commit a92dcc7

File tree

2 files changed

+87
-13
lines changed

2 files changed

+87
-13
lines changed

Tests/test_imagedraw2.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,36 @@ def test_mode() -> None:
6565
ImageDraw2.Draw("L")
6666

6767

68+
@pytest.mark.parametrize("bbox", BBOX)
69+
@pytest.mark.parametrize("start, end", ((0, 180), (0.5, 180.4)))
70+
def test_arc(bbox: Coords, start: float, end: float) -> None:
71+
# Arrange
72+
im = Image.new("RGB", (W, H))
73+
draw = ImageDraw2.Draw(im)
74+
pen = ImageDraw2.Pen("white", width=1)
75+
76+
# Act
77+
draw.arc(bbox, pen, start, end)
78+
79+
# Assert
80+
assert_image_similar_tofile(im, "Tests/images/imagedraw_arc.png", 1)
81+
82+
83+
@pytest.mark.parametrize("bbox", BBOX)
84+
def test_chord(bbox: Coords) -> None:
85+
# Arrange
86+
im = Image.new("RGB", (W, H))
87+
draw = ImageDraw2.Draw(im)
88+
pen = ImageDraw2.Pen("yellow")
89+
brush = ImageDraw2.Brush("red")
90+
91+
# Act
92+
draw.chord(bbox, pen, 0, 180, brush)
93+
94+
# Assert
95+
assert_image_similar_tofile(im, "Tests/images/imagedraw_chord_RGB.png", 1)
96+
97+
6898
@pytest.mark.parametrize("bbox", BBOX)
6999
def test_ellipse(bbox: Coords) -> None:
70100
# Arrange
@@ -123,6 +153,22 @@ def test_line_pen_as_brush(points: Coords) -> None:
123153
assert_image_equal_tofile(im, "Tests/images/imagedraw_line.png")
124154

125155

156+
@pytest.mark.parametrize("bbox", BBOX)
157+
@pytest.mark.parametrize("start, end", ((-92, 46), (-92.2, 46.2)))
158+
def test_pieslice(bbox: Coords, start: float, end: float) -> None:
159+
# Arrange
160+
im = Image.new("RGB", (W, H))
161+
draw = ImageDraw2.Draw(im)
162+
pen = ImageDraw2.Pen("blue")
163+
brush = ImageDraw2.Brush("white")
164+
165+
# Act
166+
draw.pieslice(bbox, pen, start, end, brush)
167+
168+
# Assert
169+
assert_image_similar_tofile(im, "Tests/images/imagedraw_pieslice.png", 1)
170+
171+
126172
@pytest.mark.parametrize("points", POINTS)
127173
def test_polygon(points: Coords) -> None:
128174
# Arrange

src/PIL/ImageDraw2.py

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,12 @@ def flush(self) -> Image.Image:
8080
return self.image
8181

8282
def render(
83-
self, op: str, xy: Coords, pen: Pen | Brush | None, brush: Brush | Pen | None = None
83+
self,
84+
op: str,
85+
xy: Coords,
86+
pen: Pen | Brush | None,
87+
brush: Brush | Pen | None = None,
88+
**kwargs: Any,
8489
) -> None:
8590
# handle color arguments
8691
outline = fill = None
@@ -101,35 +106,51 @@ def render(
101106
path.transform(self.transform)
102107
xy = path
103108
# render the item
104-
if op == "arc":
105-
self.draw.arc(xy, fill=outline)
106-
elif op == "line":
107-
self.draw.line(xy, fill=outline, width=width)
109+
if op in ("arc", "line"):
110+
kwargs.setdefault("fill", outline)
108111
else:
109-
getattr(self.draw, op)(xy, fill=fill, outline=outline)
112+
kwargs.setdefault("fill", fill)
113+
kwargs.setdefault("outline", outline)
114+
if op == "line":
115+
kwargs.setdefault("width", width)
116+
getattr(self.draw, op)(xy, **kwargs)
110117

111118
def settransform(self, offset: tuple[float, float]) -> None:
112119
"""Sets a transformation offset."""
113120
(xoffset, yoffset) = offset
114121
self.transform = (1, 0, xoffset, 0, 1, yoffset)
115122

116-
def arc(self, xy: Coords, pen: Pen | Brush | None, start, end, *options: Any) -> None:
123+
def arc(
124+
self,
125+
xy: Coords,
126+
pen: Pen | Brush | None,
127+
start: float,
128+
end: float,
129+
*options: Any,
130+
) -> None:
117131
"""
118132
Draws an arc (a portion of a circle outline) between the start and end
119133
angles, inside the given bounding box.
120134
121135
.. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc`
122136
"""
123-
self.render("arc", xy, pen, start, end, *options)
137+
self.render("arc", xy, pen, *options, start=start, end=end)
124138

125-
def chord(self, xy: Coords, pen: Pen | Brush | None, start, end, *options: Any) -> None:
139+
def chord(
140+
self,
141+
xy: Coords,
142+
pen: Pen | Brush | None,
143+
start: float,
144+
end: float,
145+
*options: Any,
146+
) -> None:
126147
"""
127148
Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points
128149
with a straight line.
129150
130151
.. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord`
131152
"""
132-
self.render("chord", xy, pen, start, end, *options)
153+
self.render("chord", xy, pen, *options, start=start, end=end)
133154

134155
def ellipse(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None:
135156
"""
@@ -147,14 +168,21 @@ def line(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None:
147168
"""
148169
self.render("line", xy, pen, *options)
149170

150-
def pieslice(self, xy: Coords, pen: Pen | Brush | None, start, end, *options: Any) -> None:
171+
def pieslice(
172+
self,
173+
xy: Coords,
174+
pen: Pen | Brush | None,
175+
start: float,
176+
end: float,
177+
*options: Any,
178+
) -> None:
151179
"""
152180
Same as arc, but also draws straight lines between the end points and the
153181
center of the bounding box.
154182
155183
.. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice`
156184
"""
157-
self.render("pieslice", xy, pen, start, end, *options)
185+
self.render("pieslice", xy, pen, *options, start=start, end=end)
158186

159187
def polygon(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None:
160188
"""
@@ -169,7 +197,7 @@ def polygon(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None:
169197
"""
170198
self.render("polygon", xy, pen, *options)
171199

172-
def rectangle(self, xy: Coords, pen: Pen | Brush | None, *options) -> None:
200+
def rectangle(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None:
173201
"""
174202
Draws a rectangle.
175203

0 commit comments

Comments
 (0)