Skip to content

Commit ad492ee

Browse files
committed
Pull readonly in from the C level
1 parent 55f5351 commit ad492ee

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

Tests/test_arrow.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,11 @@ def test_release_array():
147147
array, schema = img.__arrow_c_array__()
148148
del(array)
149149
del(schema)
150+
151+
152+
def test_readonly():
153+
img = hopper('L')
154+
reloaded = Image.fromarrow(img, img.mode, img.size)
155+
assert reloaded.readonly == 1
156+
reloaded._readonly = 0
157+
assert reloaded.readonly == 1

src/PIL/Image.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,14 @@ def size(self) -> tuple[int, int]:
584584
def mode(self) -> str:
585585
return self._mode
586586

587+
@property
588+
def readonly(self) -> int:
589+
return (self._im and self._im.readonly) or self._readonly
590+
591+
@readonly.setter
592+
def readonly(self, readonly: int) -> None:
593+
self._readonly = readonly
594+
587595
def _new(self, im: core.ImagingCore) -> Image:
588596
new = Image()
589597
new.im = im

src/_imaging.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3821,13 +3821,19 @@ _getattr_unsafe_ptrs(ImagingObject *self, void *closure) {
38213821
);
38223822
}
38233823

3824+
static PyObject *
3825+
_getattr_readonly(ImagingObject *self, void *closure) {
3826+
return PyLong_FromLong(self->image->read_only);
3827+
}
3828+
38243829
static struct PyGetSetDef getsetters[] = {
38253830
{"mode", (getter)_getattr_mode},
38263831
{"size", (getter)_getattr_size},
38273832
{"bands", (getter)_getattr_bands},
38283833
{"id", (getter)_getattr_id},
38293834
{"ptr", (getter)_getattr_ptr},
38303835
{"unsafe_ptrs", (getter)_getattr_unsafe_ptrs},
3836+
{"readonly", (getter)_getattr_readonly},
38313837
{NULL}
38323838
};
38333839

0 commit comments

Comments
 (0)