Corrected using a 1 mode mask with I;16* images

This commit is contained in:
Andrew Murray 2024-06-08 14:35:10 +10:00
parent 0fbc3db081
commit 08b5a2e9a7
3 changed files with 35 additions and 4 deletions

Binary file not shown.

View File

@ -631,6 +631,19 @@ def test_polygon(points: Coords) -> None:
assert_image_equal_tofile(im, "Tests/images/imagedraw_polygon.png") 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("mode", ("RGB", "L"))
@pytest.mark.parametrize("kite_points", KITE_POINTS) @pytest.mark.parametrize("kite_points", KITE_POINTS)
def test_polygon_kite( def test_polygon_kite(

View File

@ -65,15 +65,32 @@ paste_mask_1(
int x, y; int x, y;
if (imOut->image8) { 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++) { for (y = 0; y < ysize; y++) {
UINT8 *out = imOut->image8[y + dy] + dx; UINT8 *out = imOut->image8[y + dy] + dx;
if (out_i16) {
out += dx;
}
UINT8 *in = imIn->image8[y + sy] + sx; UINT8 *in = imIn->image8[y + sy] + sx;
if (in_i16) {
in += sx;
}
UINT8 *mask = imMask->image8[y + sy] + sx; UINT8 *mask = imMask->image8[y + sy] + sx;
for (x = 0; x < xsize; x++) { for (x = 0; x < xsize; x++) {
if (*mask++) { if (*mask) {
*out = *in; *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; unsigned int tmp1;
if (imOut->image8) { if (imOut->image8) {
int i16 = strncmp(imOut->mode, "I;16", 4) == 0;
for (y = 0; y < ysize; y++) { for (y = 0; y < ysize; y++) {
UINT8 *out = imOut->image8[y + dy] + dx; UINT8 *out = imOut->image8[y + dy] + dx;
if (strncmp(imOut->mode, "I;16", 4) == 0) { if (i16) {
out += dx; out += dx;
} }
UINT8 *mask = imMask->image8[y + sy] + sx; UINT8 *mask = imMask->image8[y + sy] + sx;
for (x = 0; x < xsize; x++) { for (x = 0; x < xsize; x++) {
*out = BLEND(*mask, *out, ink[0], tmp1); *out = BLEND(*mask, *out, ink[0], tmp1);
if (strncmp(imOut->mode, "I;16", 4) == 0) { if (i16) {
out++; out++;
*out = BLEND(*mask, *out, ink[1], tmp1); *out = BLEND(*mask, *out, ink[1], tmp1);
} }