Skip to content

Commit

Permalink
Pull readonly in from the C level
Browse files Browse the repository at this point in the history
  • Loading branch information
wiredfool committed Jan 25, 2025
1 parent 55f5351 commit ad492ee
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 0 deletions.
8 changes: 8 additions & 0 deletions Tests/test_arrow.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
8 changes: 8 additions & 0 deletions src/PIL/Image.py
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,14 @@ def size(self) -> tuple[int, int]:
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
Expand Down
6 changes: 6 additions & 0 deletions src/_imaging.c
Original file line number Diff line number Diff line change
Expand Up @@ -3821,13 +3821,19 @@ _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},
{"bands", (getter)_getattr_bands},
{"id", (getter)_getattr_id},
{"ptr", (getter)_getattr_ptr},
{"unsafe_ptrs", (getter)_getattr_unsafe_ptrs},
{"readonly", (getter)_getattr_readonly},
{NULL}
};

Expand Down

0 comments on commit ad492ee

Please sign in to comment.