From 08b5a2e9a7d290f4cd2cfb35dd556d50145a7dea Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 8 Jun 2024 14:35:10 +1000 Subject: [PATCH] Corrected using a 1 mode mask with I;16* images --- Tests/images/imagedraw_polygon_width_I.tiff | Bin 0 -> 20122 bytes Tests/test_imagedraw.py | 13 ++++++++++ src/libImaging/Paste.c | 26 +++++++++++++++++--- 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 Tests/images/imagedraw_polygon_width_I.tiff diff --git a/Tests/images/imagedraw_polygon_width_I.tiff b/Tests/images/imagedraw_polygon_width_I.tiff new file mode 100644 index 0000000000000000000000000000000000000000..ce1917d61fe9f4a8d04e6d2bdf0cfd057c0d8e9d GIT binary patch literal 20122 zcmeI$K@Ng25QX8X7^6Gg=*ER>Z^Fh?cnU9%Ekk3GZXl3!nxDkjG==cKSJc?HPdSRn zNyP2N`O(|ITr%Fdrk_9i`DPf0b%$hp8P%4 DH7N{| literal 0 HcmV?d00001 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index c221fe008..505bba80c 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -631,6 +631,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); }