Corrected drawing I;16 points

This commit is contained in:
Andrew Murray 2023-07-05 08:49:47 +10:00
parent 3ee9259150
commit 5e2332a200
3 changed files with 31 additions and 9 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 180 B

View File

@ -586,6 +586,18 @@ def test_point(points):
assert_image_equal_tofile(im, "Tests/images/imagedraw_point.png") assert_image_equal_tofile(im, "Tests/images/imagedraw_point.png")
def test_point_I16():
# Arrange
im = Image.new("I;16", (1, 1))
draw = ImageDraw.Draw(im)
# Act
draw.point((0, 0), fill=0x1234)
# Assert
assert im.getpixel((0, 0)) == 0x1234
@pytest.mark.parametrize("points", POINTS) @pytest.mark.parametrize("points", POINTS)
def test_polygon(points): def test_polygon(points):
# Arrange # Arrange
@ -732,7 +744,7 @@ def test_rectangle_I16(bbox):
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
# Act # Act
draw.rectangle(bbox, fill="black", outline="green") draw.rectangle(bbox, outline=0xFFFF)
# Assert # Assert
assert_image_equal_tofile(im.convert("I"), "Tests/images/imagedraw_rectangle_I.png") assert_image_equal_tofile(im.convert("I"), "Tests/images/imagedraw_rectangle_I.png")

View File

@ -41,6 +41,7 @@
#define FLOOR(v) ((v) >= 0.0 ? (int)(v) : (int)floor(v)) #define FLOOR(v) ((v) >= 0.0 ? (int)(v) : (int)floor(v))
#define INK8(ink) (*(UINT8 *)ink) #define INK8(ink) (*(UINT8 *)ink)
#define INK16(ink) (*(UINT16 *)ink)
/* /*
* Rounds around zero (up=away from zero, down=towards zero) * Rounds around zero (up=away from zero, down=towards zero)
@ -68,8 +69,13 @@ static inline void
point8(Imaging im, int x, int y, int ink) { point8(Imaging im, int x, int y, int ink) {
if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) { if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) {
if (strncmp(im->mode, "I;16", 4) == 0) { if (strncmp(im->mode, "I;16", 4) == 0) {
im->image8[y][x * 2] = (UINT8)ink; #ifdef WORDS_BIGENDIAN
im->image8[y][x * 2] = (UINT8)(ink >> 8);
im->image8[y][x * 2 + 1] = (UINT8)ink; im->image8[y][x * 2 + 1] = (UINT8)ink;
#else
im->image8[y][x * 2] = (UINT8)ink;
im->image8[y][x * 2 + 1] = (UINT8)(ink >> 8);
#endif
} else { } else {
im->image8[y][x] = (UINT8)ink; im->image8[y][x] = (UINT8)ink;
} }
@ -634,7 +640,11 @@ DRAW draw32rgba = {point32rgba, hline32rgba, line32rgba, polygon32rgba};
#define DRAWINIT() \ #define DRAWINIT() \
if (im->image8) { \ if (im->image8) { \
draw = &draw8; \ draw = &draw8; \
if (strncmp(im->mode, "I;16", 4) == 0) { \
ink = INK16(ink_); \
} else { \
ink = INK8(ink_); \ ink = INK8(ink_); \
} \
} else { \ } else { \
draw = (op) ? &draw32rgba : &draw32; \ draw = (op) ? &draw32rgba : &draw32; \
memcpy(&ink, ink_, sizeof(ink)); \ memcpy(&ink, ink_, sizeof(ink)); \