Skip to content
39 changes: 0 additions & 39 deletions Tests/test_imagedraw.py
Original file line number Diff line number Diff line change
Expand Up @@ -625,18 +625,6 @@ def test_point(points: Coords) -> None:
assert_image_equal_tofile(im, "Tests/images/imagedraw_point.png")


def test_point_I16() -> None:
# 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)
def test_polygon(points: Coords) -> None:
# Arrange
Expand All @@ -650,19 +638,6 @@ 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(
Expand Down Expand Up @@ -791,20 +766,6 @@ def test_rectangle_zero_width(bbox: Coords) -> None:
assert_image_equal_tofile(im, "Tests/images/imagedraw_rectangle_zero_width.png")


@pytest.mark.parametrize("bbox", BBOX)
def test_rectangle_I16(bbox: Coords) -> None:
# Arrange
im = Image.new("I;16", (W, H))
draw = ImageDraw.Draw(im)

# Act
draw.rectangle(bbox, outline=0xCDEF)

# Assert
assert im.getpixel((X0, Y0)) == 0xCDEF
assert_image_equal_tofile(im, "Tests/images/imagedraw_rectangle_I.tiff")


@pytest.mark.parametrize("bbox", BBOX)
def test_rectangle_translucent_outline(bbox: Coords) -> None:
# Arrange
Expand Down
96 changes: 96 additions & 0 deletions Tests/test_imagedraw_i16.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
from __future__ import annotations

import pytest

from PIL import Image, ImageDraw

from .helper import assert_image_equal_tofile
from .test_imagedraw import BBOX, POINTS, X0, Y0, H, W

TYPE_CHECKING = False

if TYPE_CHECKING:
from PIL._typing import Coords

I16_MODES = ("I;16", "I;16L", "I;16B", "I;16N")
I16_INK = 0x1234


def create_I16_image_draw(mode: str) -> tuple[Image.Image, ImageDraw.ImageDraw]:
img = Image.new(mode, (8, 8))
return img, ImageDraw.Draw(img)


@pytest.mark.parametrize("mode", I16_MODES)
def test_point_I16(mode: str) -> None:
img, draw = create_I16_image_draw(mode)
draw.point((4, 4), fill=I16_INK)
assert img.getpixel((4, 4)) == I16_INK


@pytest.mark.parametrize("mode", I16_MODES)
@pytest.mark.parametrize(
"xy",
# horizontal, vertical, diagonal
((0, 4, 7, 4), (4, 0, 4, 7), (0, 0, 7, 7)),
)
def test_line_I16(mode: str, xy: tuple[int, int, int, int]) -> None:
img, draw = create_I16_image_draw(mode)
draw.line(xy, fill=I16_INK)
assert img.getpixel((4, 4)) == I16_INK
Comment thread
akx marked this conversation as resolved.


@pytest.mark.parametrize("mode", I16_MODES)
def test_rectangle_fill_I16(mode: str) -> None:
img, draw = create_I16_image_draw(mode)
draw.rectangle((0, 0, 7, 7), fill=I16_INK)
assert img.getpixel((4, 4)) == I16_INK


@pytest.mark.parametrize("bbox", BBOX)
def test_rectangle_I16(bbox: Coords) -> None:
# Arrange
im = Image.new("I;16", (W, H))
draw = ImageDraw.Draw(im)

# Act
draw.rectangle(bbox, outline=0xCDEF)

# Assert
assert im.getpixel((X0, Y0)) == 0xCDEF
assert_image_equal_tofile(im, "Tests/images/imagedraw_rectangle_I.tiff")


@pytest.mark.parametrize("mode", I16_MODES)
def test_polygon_I16(mode: str) -> None:
img, draw = create_I16_image_draw(mode)
draw.polygon([(0, 0), (7, 0), (7, 7), (0, 7)], fill=I16_INK)
assert img.getpixel((4, 4)) == I16_INK


@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", I16_MODES)
def test_masked_polygon_I16(mode: str) -> None:
# A polygon outline wider than one pixel is drawn through a mask.
img, draw = create_I16_image_draw(mode)
draw.polygon([(0, 0), (7, 0), (7, 7), (0, 7)], outline=I16_INK, width=8)
assert img.getpixel((4, 4)) == I16_INK


@pytest.mark.parametrize("mode", I16_MODES)
def test_ellipse_I16(mode: str) -> None:
img, draw = create_I16_image_draw(mode)
draw.ellipse((0, 0, 7, 7), fill=I16_INK)
assert img.getpixel((4, 4)) == I16_INK
6 changes: 6 additions & 0 deletions docs/releasenotes/13.0.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,12 @@ Fixed ImageChops.offset() for 16-bit images

:py:meth:`~PIL.ImageChops.offset` now works correctly for 16-bit-per-channel images.

Fixed drawing on I;16B images
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When drawing on an ``I;16B`` image, some drawing methods wrote in the wrong byte order.
All drawing operations now use the byte order of the image mode.

Fixed histograms for masked LA, La and PA images
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Expand Down
Loading
Loading