Consider I;16 pixel size when drawing

This commit is contained in:
Andrew Murray 2019-06-23 07:33:55 +10:00
parent 32d10505a3
commit e0cbfb2708
3 changed files with 25 additions and 4 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

View File

@ -479,6 +479,19 @@ class TestImageDraw(PillowTestCase):
# Assert # Assert
self.assert_image_equal(im, Image.open(expected)) 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): def test_floodfill(self):
red = ImageColor.getrgb("red") red = ImageColor.getrgb("red")

View File

@ -68,7 +68,12 @@ 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)
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 static inline void
@ -95,7 +100,7 @@ point32rgba(Imaging im, int x, int y, int ink)
static inline void static inline void
hline8(Imaging im, int x0, int y0, int x1, int ink) hline8(Imaging im, int x0, int y0, int x1, int ink)
{ {
int tmp; int tmp, pixelwidth;
if (y0 >= 0 && y0 < im->ysize) { if (y0 >= 0 && y0 < im->ysize) {
if (x0 > x1) if (x0 > x1)
@ -108,8 +113,11 @@ hline8(Imaging im, int x0, int y0, int x1, int ink)
return; return;
else if (x1 >= im->xsize) else if (x1 >= im->xsize)
x1 = im->xsize-1; x1 = im->xsize-1;
if (x0 <= x1) if (x0 <= x1) {
memset(im->image8[y0] + x0, (UINT8) ink, x1 - x0 + 1); pixelwidth = strncmp(im->mode, "I;16", 4) == 0 ? 2 : 1;
memset(im->image8[y0] + x0 * pixelwidth, (UINT8) ink,
(x1 - x0 + 1) * pixelwidth);
}
} }
} }