diff --git a/Tests/images/imagedraw_polygon_width_I.tiff b/Tests/images/imagedraw_polygon_width_I.tiff new file mode 100644 index 000000000..ce1917d61 Binary files /dev/null and b/Tests/images/imagedraw_polygon_width_I.tiff differ diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index a24aa16ca..1466ab1ba 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -634,6 +634,19 @@ def test_polygon(points: Coords) -> None: assert_image_equal_tofile(im, "Tests/images/imagedraw_polygon.png") +@pytest.mark.parametrize("points", POINTS) +def test_polygon_width_I16(points: Coords) -> None: + # Arrange + im = Image.new("I;16", (W, H)) + draw = ImageDraw.Draw(im) + + # Act + draw.polygon(points, outline=0xFFFF, width=2) + + # Assert + assert_image_equal_tofile(im, "Tests/images/imagedraw_polygon_width_I.tiff") + + @pytest.mark.parametrize("mode", ("RGB", "L")) @pytest.mark.parametrize("kite_points", KITE_POINTS) def test_polygon_kite( diff --git a/src/libImaging/Paste.c b/src/libImaging/Paste.c index a018225b2..dc67cb41d 100644 --- a/src/libImaging/Paste.c +++ b/src/libImaging/Paste.c @@ -65,15 +65,32 @@ paste_mask_1( int x, y; if (imOut->image8) { + int in_i16 = strncmp(imIn->mode, "I;16", 4) == 0; + int out_i16 = strncmp(imOut->mode, "I;16", 4) == 0; for (y = 0; y < ysize; y++) { UINT8 *out = imOut->image8[y + dy] + dx; + if (out_i16) { + out += dx; + } UINT8 *in = imIn->image8[y + sy] + sx; + if (in_i16) { + in += sx; + } UINT8 *mask = imMask->image8[y + sy] + sx; for (x = 0; x < xsize; x++) { - if (*mask++) { + if (*mask) { *out = *in; } - out++, in++; + if (in_i16) { + in++; + } + if (out_i16) { + out++; + if (*mask) { + *out = *in; + } + } + out++, in++, mask++; } } @@ -415,15 +432,16 @@ fill_mask_L( unsigned int tmp1; if (imOut->image8) { + int i16 = strncmp(imOut->mode, "I;16", 4) == 0; for (y = 0; y < ysize; y++) { UINT8 *out = imOut->image8[y + dy] + dx; - if (strncmp(imOut->mode, "I;16", 4) == 0) { + if (i16) { out += dx; } UINT8 *mask = imMask->image8[y + sy] + sx; for (x = 0; x < xsize; x++) { *out = BLEND(*mask, *out, ink[0], tmp1); - if (strncmp(imOut->mode, "I;16", 4) == 0) { + if (i16) { out++; *out = BLEND(*mask, *out, ink[1], tmp1); }