mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-08-27 15:44:46 +03:00
Added PyAccess methods for I;16S, tests for setvalue
This commit is contained in:
parent
efe8479af9
commit
d4f28b5d97
|
@ -188,6 +188,21 @@ class _PyAccessI16_N(PyAccess):
|
||||||
self.pixels[y][x] = min(color[0], 65535)
|
self.pixels[y][x] = min(color[0], 65535)
|
||||||
|
|
||||||
|
|
||||||
|
class _PyAccessI16_NS(PyAccess):
|
||||||
|
""" I;16S access, native bitendian without conversion """
|
||||||
|
def _post_init(self, *args, **kwargs):
|
||||||
|
self.pixels = ffi.cast('short **', self.image)
|
||||||
|
|
||||||
|
def get_pixel(self, x, y):
|
||||||
|
return self.pixels[y][x]
|
||||||
|
|
||||||
|
def set_pixel(self, x, y, color):
|
||||||
|
try:
|
||||||
|
self.pixels[y][x] = max(min(color, 2**15-1), -2**15)
|
||||||
|
except TypeError:
|
||||||
|
self.pixels[y][x] = max(min(color[0], 2**15-1), -2**15)
|
||||||
|
|
||||||
|
|
||||||
class _PyAccessI16_L(PyAccess):
|
class _PyAccessI16_L(PyAccess):
|
||||||
""" I;16L access, with conversion """
|
""" I;16L access, with conversion """
|
||||||
def _post_init(self, *args, **kwargs):
|
def _post_init(self, *args, **kwargs):
|
||||||
|
@ -208,6 +223,34 @@ class _PyAccessI16_L(PyAccess):
|
||||||
pixel.r = color >> 8
|
pixel.r = color >> 8
|
||||||
|
|
||||||
|
|
||||||
|
class _PyAccessI16_LS(PyAccess):
|
||||||
|
""" Littleendian I;16S access, with conversion """
|
||||||
|
def _post_init(self, *args, **kwargs):
|
||||||
|
self.pixels = ffi.cast('struct Pixel_I16 **', self.image)
|
||||||
|
|
||||||
|
def reverse(self, i):
|
||||||
|
orig = ffi.new('short *', i)
|
||||||
|
chars = ffi.cast('unsigned char *', orig)
|
||||||
|
chars[0], chars[1], = chars[1], chars[0]
|
||||||
|
return ffi.cast('short *', chars)[0]
|
||||||
|
|
||||||
|
def get_pixel(self, x, y):
|
||||||
|
return self.reverse(self.pixels[y][x])
|
||||||
|
|
||||||
|
def set_pixel(self, x, y, color):
|
||||||
|
pixel = self.pixels[y][x]
|
||||||
|
|
||||||
|
try:
|
||||||
|
color = max(min(color, 2**15-1), -2**15)
|
||||||
|
except TypeError:
|
||||||
|
color = max(min(color[0], 2**15-1), -2**15)
|
||||||
|
|
||||||
|
mask = color < 0 and 0x80 or 0x00
|
||||||
|
|
||||||
|
pixel.l = color & 0xFF
|
||||||
|
pixel.r = (color >> 8) | mask
|
||||||
|
|
||||||
|
|
||||||
class _PyAccessI16_B(PyAccess):
|
class _PyAccessI16_B(PyAccess):
|
||||||
""" I;16B access, with conversion """
|
""" I;16B access, with conversion """
|
||||||
def _post_init(self, *args, **kwargs):
|
def _post_init(self, *args, **kwargs):
|
||||||
|
@ -298,6 +341,7 @@ if sys.byteorder == 'little':
|
||||||
mode_map['I;16'] = _PyAccessI16_N
|
mode_map['I;16'] = _PyAccessI16_N
|
||||||
mode_map['I;16L'] = _PyAccessI16_N
|
mode_map['I;16L'] = _PyAccessI16_N
|
||||||
mode_map['I;16B'] = _PyAccessI16_B
|
mode_map['I;16B'] = _PyAccessI16_B
|
||||||
|
mode_map['I;16S'] = _PyAccessI16_NS
|
||||||
|
|
||||||
mode_map['I;32L'] = _PyAccessI32_N
|
mode_map['I;32L'] = _PyAccessI32_N
|
||||||
mode_map['I;32B'] = _PyAccessI32_Swap
|
mode_map['I;32B'] = _PyAccessI32_Swap
|
||||||
|
@ -305,6 +349,7 @@ else:
|
||||||
mode_map['I;16'] = _PyAccessI16_L
|
mode_map['I;16'] = _PyAccessI16_L
|
||||||
mode_map['I;16L'] = _PyAccessI16_L
|
mode_map['I;16L'] = _PyAccessI16_L
|
||||||
mode_map['I;16B'] = _PyAccessI16_N
|
mode_map['I;16B'] = _PyAccessI16_N
|
||||||
|
mode_map['I;16S'] = _PyAccessI16_LS
|
||||||
|
|
||||||
mode_map['I;32L'] = _PyAccessI32_Swap
|
mode_map['I;32L'] = _PyAccessI32_Swap
|
||||||
mode_map['I;32B'] = _PyAccessI32_N
|
mode_map['I;32B'] = _PyAccessI32_N
|
||||||
|
|
|
@ -6,6 +6,7 @@ import struct
|
||||||
HAS_PYACCESS = False
|
HAS_PYACCESS = False
|
||||||
try:
|
try:
|
||||||
from PIL import PyAccess
|
from PIL import PyAccess
|
||||||
|
HAS_PYACCESS = True
|
||||||
except: pass
|
except: pass
|
||||||
|
|
||||||
class TestModeI16(PillowTestCase):
|
class TestModeI16(PillowTestCase):
|
||||||
|
@ -134,9 +135,15 @@ class TestModeI16(PillowTestCase):
|
||||||
if HAS_PYACCESS:
|
if HAS_PYACCESS:
|
||||||
py_access = PyAccess.new(im, im.readonly)
|
py_access = PyAccess.new(im, im.readonly)
|
||||||
for ix, val in enumerate(pixels):
|
for ix, val in enumerate(pixels):
|
||||||
|
self.assertEqual(access[(ix, 0)], val)
|
||||||
|
access[(ix,0)] = 0
|
||||||
|
access[(ix,0)] = val
|
||||||
self.assertEqual(access[(ix, 0)], val)
|
self.assertEqual(access[(ix, 0)], val)
|
||||||
if HAS_PYACCESS:
|
if HAS_PYACCESS:
|
||||||
self.assertEqual(py_access[(ix, 0)], val)
|
self.assertEqual(py_access[(ix, 0)], val)
|
||||||
|
py_access[(ix,0)] = 0
|
||||||
|
py_access[(ix,0)] = val
|
||||||
|
self.assertEqual(py_access[(ix, 0)], val)
|
||||||
|
|
||||||
_test_access(im, pixels)
|
_test_access(im, pixels)
|
||||||
_test_access(im.convert('I'), pixels) # lossless
|
_test_access(im.convert('I'), pixels) # lossless
|
||||||
|
|
Loading…
Reference in New Issue
Block a user