Skip to content

Commit a0e1608

Browse files
committed
Support accessing I;16N pixels
1 parent 8cfc256 commit a0e1608

File tree

3 files changed

+16
-18
lines changed

3 files changed

+16
-18
lines changed

Tests/test_image_access.py

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -266,15 +266,10 @@ def test_get_vs_c(self):
266266
# self._test_get_access(hopper('PA')) # PA -- how do I make a PA image?
267267
self._test_get_access(hopper("F"))
268268

269-
im = Image.new("I;16", (10, 10), 40000)
270-
self._test_get_access(im)
271-
im = Image.new("I;16L", (10, 10), 40000)
272-
self._test_get_access(im)
273-
im = Image.new("I;16B", (10, 10), 40000)
274-
self._test_get_access(im)
275-
276-
im = Image.new("I", (10, 10), 40000)
277-
self._test_get_access(im)
269+
for mode in ("I;16", "I;16L", "I;16B", "I;16N", "I"):
270+
im = Image.new(mode, (10, 10), 40000)
271+
self._test_get_access(im)
272+
278273
# These don't actually appear to be modes that I can actually make,
279274
# as unpack sets them directly into the I mode.
280275
# im = Image.new('I;32L', (10, 10), -2**10)
@@ -313,15 +308,10 @@ def test_set_vs_c(self):
313308
# self._test_set_access(i, (128, 128)) #PA -- undone how to make
314309
self._test_set_access(hopper("F"), 1024.0)
315310

316-
im = Image.new("I;16", (10, 10), 40000)
317-
self._test_set_access(im, 45000)
318-
im = Image.new("I;16L", (10, 10), 40000)
319-
self._test_set_access(im, 45000)
320-
im = Image.new("I;16B", (10, 10), 40000)
321-
self._test_set_access(im, 45000)
311+
for mode in ("I;16", "I;16L", "I;16B", "I;16N", "I"):
312+
im = Image.new(mode, (10, 10), 40000)
313+
self._test_set_access(im, 45000)
322314

323-
im = Image.new("I", (10, 10), 40000)
324-
self._test_set_access(im, 45000)
325315
# im = Image.new('I;32L', (10, 10), -(2**10))
326316
# self._test_set_access(im, -(2**13)+1)
327317
# im = Image.new('I;32B', (10, 10), 2**10)

src/PIL/PyAccess.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ def set_pixel(self, x, y, color):
318318
"1": _PyAccess8,
319319
"L": _PyAccess8,
320320
"P": _PyAccess8,
321+
"I;16N": _PyAccessI16_N,
321322
"LA": _PyAccess32_2,
322323
"La": _PyAccess32_2,
323324
"PA": _PyAccess32_2,

src/libImaging/Access.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
/* use make_hash.py from the pillow-scripts repository to calculate these values */
1515
#define ACCESS_TABLE_SIZE 27
16-
#define ACCESS_TABLE_HASH 3078
16+
#define ACCESS_TABLE_HASH 33051
1717

1818
static struct ImagingAccessInstance access_table[ACCESS_TABLE_SIZE];
1919

@@ -92,6 +92,12 @@ get_pixel_16B(Imaging im, int x, int y, void *color) {
9292
#endif
9393
}
9494

95+
static void
96+
get_pixel_16(Imaging im, int x, int y, void *color) {
97+
UINT8 *in = (UINT8 *)&im->image[y][x + x];
98+
memcpy(color, in, sizeof(UINT16));
99+
}
100+
95101
static void
96102
get_pixel_32(Imaging im, int x, int y, void *color) {
97103
memcpy(color, &im->image32[y][x], sizeof(INT32));
@@ -186,6 +192,7 @@ ImagingAccessInit() {
186192
ADD("I;16", get_pixel_16L, put_pixel_16L);
187193
ADD("I;16L", get_pixel_16L, put_pixel_16L);
188194
ADD("I;16B", get_pixel_16B, put_pixel_16B);
195+
ADD("I;16N", get_pixel_16, put_pixel_16L);
189196
ADD("I;32L", get_pixel_32L, put_pixel_32L);
190197
ADD("I;32B", get_pixel_32B, put_pixel_32B);
191198
ADD("F", get_pixel_32, put_pixel_32);

0 commit comments

Comments
 (0)