diff --git a/Tests/images/imagedraw_rectangle_I.png b/Tests/images/imagedraw_rectangle_I.png new file mode 100644 index 00000000000..4e94f6943dd Binary files /dev/null and b/Tests/images/imagedraw_rectangle_I.png differ diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index cff08a39c4a..825ce4dfc3b 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -488,6 +488,18 @@ def test_rectangle_width_fill(self): # Assert self.assert_image_equal(im, Image.open(expected)) + def test_rectangle_I16(self): + # Arrange + im = Image.new("I;16", (W, H)) + draw = ImageDraw.Draw(im) + + # Act + draw.rectangle(BBOX1, fill="black", outline="green") + + # Assert + self.assert_image_equal( + im.convert("I"), Image.open("Tests/images/imagedraw_rectangle_I.png")) + def test_floodfill(self): red = ImageColor.getrgb("red") diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 6bcd1d2b343..58af4f7f535 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -68,7 +68,12 @@ static inline void point8(Imaging im, int x, int y, int ink) { if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) - im->image8[y][x] = (UINT8) ink; + if (strncmp(im->mode, "I;16", 4) == 0) { + im->image8[y][x*2] = (UINT8) ink; + im->image8[y][x*2+1] = (UINT8) ink; + } else { + im->image8[y][x] = (UINT8) ink; + } } static inline void @@ -95,7 +100,7 @@ point32rgba(Imaging im, int x, int y, int ink) static inline void hline8(Imaging im, int x0, int y0, int x1, int ink) { - int tmp; + int tmp, pixelwidth; if (y0 >= 0 && y0 < im->ysize) { if (x0 > x1) @@ -108,8 +113,11 @@ hline8(Imaging im, int x0, int y0, int x1, int ink) return; else if (x1 >= im->xsize) x1 = im->xsize-1; - if (x0 <= x1) - memset(im->image8[y0] + x0, (UINT8) ink, x1 - x0 + 1); + if (x0 <= x1) { + pixelwidth = strncmp(im->mode, "I;16", 4) == 0 ? 2 : 1; + memset(im->image8[y0] + x0 * pixelwidth, (UINT8) ink, + (x1 - x0 + 1) * pixelwidth); + } } }