From ad492ee4d80c5578dc75afe5ee4d8abba3c7a9f2 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 25 Jan 2025 16:21:15 +0000 Subject: [PATCH] Pull readonly in from the C level --- Tests/test_arrow.py | 8 ++++++++ src/PIL/Image.py | 8 ++++++++ src/_imaging.c | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/Tests/test_arrow.py b/Tests/test_arrow.py index 5d7d3cdb5..c5237c902 100644 --- a/Tests/test_arrow.py +++ b/Tests/test_arrow.py @@ -147,3 +147,11 @@ def test_release_array(): array, schema = img.__arrow_c_array__() del(array) del(schema) + + +def test_readonly(): + img = hopper('L') + reloaded = Image.fromarrow(img, img.mode, img.size) + assert reloaded.readonly == 1 + reloaded._readonly = 0 + assert reloaded.readonly == 1 diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 96521657f..ecca5a52a 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -584,6 +584,14 @@ class Image: def mode(self) -> str: return self._mode + @property + def readonly(self) -> int: + return (self._im and self._im.readonly) or self._readonly + + @readonly.setter + def readonly(self, readonly: int) -> None: + self._readonly = readonly + def _new(self, im: core.ImagingCore) -> Image: new = Image() new.im = im diff --git a/src/_imaging.c b/src/_imaging.c index 727e8a494..c7ea0b932 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3821,6 +3821,11 @@ _getattr_unsafe_ptrs(ImagingObject *self, void *closure) { ); } +static PyObject * +_getattr_readonly(ImagingObject *self, void *closure) { + return PyLong_FromLong(self->image->read_only); +} + static struct PyGetSetDef getsetters[] = { {"mode", (getter)_getattr_mode}, {"size", (getter)_getattr_size}, @@ -3828,6 +3833,7 @@ static struct PyGetSetDef getsetters[] = { {"id", (getter)_getattr_id}, {"ptr", (getter)_getattr_ptr}, {"unsafe_ptrs", (getter)_getattr_unsafe_ptrs}, + {"readonly", (getter)_getattr_readonly}, {NULL} };