1
from __future__ import annotations
7
from .helper import CachedProperty, assert_image_equal
10
class TestImagingPaste:
13
def assert_9points_image(
14
self, im: Image.Image, expected: list[tuple[int, int, int, int]]
20
px[self.size // 2, 0],
22
px[0, self.size // 2],
23
px[self.size // 2, self.size // 2],
24
px[self.size - 1, self.size // 2],
26
px[self.size // 2, self.size - 1],
27
px[self.size - 1, self.size - 1],
30
point[0] if im.mode == "L" else point[: len(im.mode)] for point in expected
33
def assert_9points_paste(
36
im2: Image.Image | str | tuple[int, ...],
38
expected: list[tuple[int, int, int, int]],
41
im3.paste(im2, (0, 0), mask)
42
self.assert_9points_image(im3, expected)
46
self.assert_9points_image(im, expected)
49
def mask_1(self) -> Image.Image:
50
mask = Image.new("1", (self.size, self.size))
53
for y in range(mask.height):
54
for x in range(mask.width):
55
px[y, x] = (x + y) % 2
59
def mask_L(self) -> Image.Image:
60
return self.gradient_L.transpose(Image.Transpose.ROTATE_270)
63
def gradient_L(self) -> Image.Image:
64
gradient = Image.new("L", (self.size, self.size))
67
for y in range(gradient.height):
68
for x in range(gradient.width):
69
px[y, x] = (x + y) % 255
73
def gradient_RGB(self) -> Image.Image:
78
self.gradient_L.transpose(Image.Transpose.ROTATE_90),
79
self.gradient_L.transpose(Image.Transpose.ROTATE_180),
84
def gradient_LA(self) -> Image.Image:
89
self.gradient_L.transpose(Image.Transpose.ROTATE_90),
94
def gradient_RGBA(self) -> Image.Image:
99
self.gradient_L.transpose(Image.Transpose.ROTATE_90),
100
self.gradient_L.transpose(Image.Transpose.ROTATE_180),
101
self.gradient_L.transpose(Image.Transpose.ROTATE_270),
106
def gradient_RGBa(self) -> Image.Image:
111
self.gradient_L.transpose(Image.Transpose.ROTATE_90),
112
self.gradient_L.transpose(Image.Transpose.ROTATE_180),
113
self.gradient_L.transpose(Image.Transpose.ROTATE_270),
117
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
118
def test_image_solid(self, mode: str) -> None:
119
im = Image.new(mode, (200, 200), "red")
120
im2 = getattr(self, "gradient_" + mode)
122
im.paste(im2, (12, 23))
124
im = im.crop((12, 23, im2.width + 12, im2.height + 23))
125
assert_image_equal(im, im2)
127
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
128
def test_image_mask_1(self, mode: str) -> None:
129
im = Image.new(mode, (200, 200), "white")
130
im2 = getattr(self, "gradient_" + mode)
132
self.assert_9points_paste(
137
(255, 255, 255, 255),
138
(255, 255, 255, 255),
140
(255, 255, 255, 255),
141
(255, 255, 255, 255),
145
(255, 255, 255, 255),
149
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
150
def test_image_mask_L(self, mode: str) -> None:
151
im = Image.new(mode, (200, 200), "white")
152
im2 = getattr(self, "gradient_" + mode)
154
self.assert_9points_paste(
159
(128, 191, 255, 191),
160
(208, 239, 239, 208),
161
(255, 255, 255, 255),
162
(112, 111, 206, 207),
163
(192, 191, 191, 191),
164
(239, 239, 207, 207),
166
(207, 113, 112, 207),
167
(255, 191, 128, 191),
171
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
172
def test_image_mask_LA(self, mode: str) -> None:
173
im = Image.new(mode, (200, 200), "white")
174
im2 = getattr(self, "gradient_" + mode)
176
self.assert_9points_paste(
181
(128, 191, 255, 191),
182
(112, 207, 206, 111),
184
(208, 208, 239, 239),
185
(192, 191, 191, 191),
186
(207, 207, 112, 113),
187
(255, 255, 255, 255),
188
(239, 207, 207, 239),
189
(255, 191, 128, 191),
193
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
194
def test_image_mask_RGBA(self, mode: str) -> None:
195
im = Image.new(mode, (200, 200), "white")
196
im2 = getattr(self, "gradient_" + mode)
198
self.assert_9points_paste(
203
(128, 191, 255, 191),
204
(208, 239, 239, 208),
205
(255, 255, 255, 255),
206
(112, 111, 206, 207),
207
(192, 191, 191, 191),
208
(239, 239, 207, 207),
210
(207, 113, 112, 207),
211
(255, 191, 128, 191),
215
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
216
def test_image_mask_RGBa(self, mode: str) -> None:
217
im = Image.new(mode, (200, 200), "white")
218
im2 = getattr(self, "gradient_" + mode)
220
self.assert_9points_paste(
225
(128, 255, 126, 255),
227
(126, 253, 126, 255),
228
(128, 127, 254, 255),
230
(126, 125, 254, 255),
233
(126, 255, 128, 255),
237
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
238
def test_color_solid(self, mode: str) -> None:
239
im = Image.new(mode, (200, 200), "black")
241
rect = (12, 23, 128 + 12, 128 + 23)
242
im.paste("white", rect)
244
hist = im.crop(rect).histogram()
246
head, hist = hist[:256], hist[256:]
247
assert head[255] == 128 * 128
248
assert sum(head[:255]) == 0
250
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
251
def test_color_mask_1(self, mode: str) -> None:
252
im = Image.new(mode, (200, 200), (50, 60, 70, 80)[: len(mode)])
253
color = (10, 20, 30, 40)[: len(mode)]
255
self.assert_9points_paste(
272
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
273
def test_color_mask_L(self, mode: str) -> None:
274
im = getattr(self, "gradient_" + mode).copy()
277
self.assert_9points_paste(
282
(127, 191, 254, 191),
283
(111, 207, 206, 110),
285
(207, 207, 239, 239),
286
(191, 191, 190, 191),
287
(207, 206, 111, 112),
288
(254, 254, 254, 255),
289
(239, 206, 206, 238),
290
(254, 191, 127, 191),
294
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
295
def test_color_mask_RGBA(self, mode: str) -> None:
296
im = getattr(self, "gradient_" + mode).copy()
299
self.assert_9points_paste(
304
(127, 191, 254, 191),
305
(111, 207, 206, 110),
307
(207, 207, 239, 239),
308
(191, 191, 190, 191),
309
(207, 206, 111, 112),
310
(254, 254, 254, 255),
311
(239, 206, 206, 238),
312
(254, 191, 127, 191),
316
@pytest.mark.parametrize("mode", ["RGBA", "RGB", "L"])
317
def test_color_mask_RGBa(self, mode: str) -> None:
318
im = getattr(self, "gradient_" + mode).copy()
321
self.assert_9points_paste(
328
(126, 253, 126, 255),
338
def test_different_sizes(self) -> None:
339
im = Image.new("RGB", (100, 100))
340
im2 = Image.new("RGB", (50, 50))
343
im.copy().paste(im2, (0, 0))
345
def test_incorrect_abbreviated_form(self) -> None:
346
im = Image.new("L", (1, 1))
347
with pytest.raises(ValueError):