Allow PixelAccess to use Python __int__ when parsing x and y

This commit is contained in:
Andrew Murray 2021-01-14 21:31:25 +11:00
parent 543fa2ceb7
commit bdbf1694fc
2 changed files with 24 additions and 2 deletions

View File

@ -23,6 +23,11 @@ else:
except ImportError:
cffi = None
try:
import numpy
except ImportError:
numpy = None
class AccessTest:
# initial value
@ -109,6 +114,13 @@ class TestImagePutPixel(AccessTest):
assert_image_equal(im1, im2)
@pytest.mark.skipif(numpy is None, reason="NumPy not installed")
def test_numpy(self):
im = hopper()
pix = im.load()
assert pix[numpy.int32(1), numpy.int32(2)] == (18, 20, 59)
class TestImageGetPixel(AccessTest):
@staticmethod

View File

@ -1108,18 +1108,28 @@ _getxy(PyObject *xy, int *x, int *y) {
*x = PyLong_AS_LONG(value);
} else if (PyFloat_Check(value)) {
*x = (int)PyFloat_AS_DOUBLE(value);
} else {
PyObject *int_value = PyObject_CallMethod(value, "__int__", NULL);
if (int_value != NULL && PyLong_Check(int_value)) {
*x = PyLong_AS_LONG(int_value);
} else {
goto badval;
}
}
value = PyTuple_GET_ITEM(xy, 1);
if (PyLong_Check(value)) {
*y = PyLong_AS_LONG(value);
} else if (PyFloat_Check(value)) {
*y = (int)PyFloat_AS_DOUBLE(value);
} else {
PyObject *int_value = PyObject_CallMethod(value, "__int__", NULL);
if (int_value != NULL && PyLong_Check(int_value)) {
*y = PyLong_AS_LONG(int_value);
} else {
goto badval;
}
}
return 0;