From d4c443ef68acc419e9af767855c343fc910f5388 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 24 Jan 2018 16:55:20 +0000 Subject: [PATCH 1/3] Allow new-style buffer interfaces to be read/write when mapped that way --- src/PIL/Image.py | 2 +- src/PIL/ImageFile.py | 2 +- src/_imaging.c | 6 ++++++ src/libImaging/Imaging.h | 1 + src/libImaging/Storage.c | 1 + src/map.c | 2 ++ 6 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index dec94f2d0..2e88b6c6f 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2639,7 +2639,7 @@ def frombuffer(mode, size, data, decoder_name="raw", *args): if args[0] in _MAPMODES: im = new(mode, (1, 1)) im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) - im.readonly = 1 + im.readonly = im.im.readonly return im return frombytes(mode, size, data, decoder_name, args) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 628796865..1fb83f2d7 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -196,7 +196,7 @@ class ImageFile(Image.Image): self.im = Image.core.map_buffer( self.map, self.size, decoder_name, offset, args ) - readonly = 1 + readonly = self.im.readonly # After trashing self.im, # we might need to reload the palette data. if self.palette: diff --git a/src/_imaging.c b/src/_imaging.c index 190b312bc..1e21a5925 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3391,6 +3391,11 @@ _getattr_unsafe_ptrs(ImagingObject* self, void* closure) ); }; +static PyObject* +_getattr_readonly(ImagingObject* self, void* closure) +{ + return PyInt_FromLong(self->image->readonly); +} static struct PyGetSetDef getsetters[] = { { "mode", (getter) _getattr_mode }, @@ -3399,6 +3404,7 @@ static struct PyGetSetDef getsetters[] = { { "id", (getter) _getattr_id }, { "ptr", (getter) _getattr_ptr }, { "unsafe_ptrs", (getter) _getattr_unsafe_ptrs }, + { "readonly", (getter) _getattr_readonly }, { NULL } }; diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index 71dc9c003..9023e4b06 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -89,6 +89,7 @@ struct ImagingMemoryInstance { int bands; /* Number of bands (1, 2, 3, or 4) */ int xsize; /* Image dimension. */ int ysize; + int readonly; /* Colour palette (for "P" images only) */ ImagingPalette palette; diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index ab476939a..7d0b91a31 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -64,6 +64,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) im->xsize = xsize; im->ysize = ysize; + im->readonly = 0; im->type = IMAGING_TYPE_UINT8; if (strcmp(mode, "1") == 0) { diff --git a/src/map.c b/src/map.c index 9a0b4d326..27bf83ed5 100644 --- a/src/map.c +++ b/src/map.c @@ -217,6 +217,7 @@ mapping_readimage(ImagingMapperObject* mapper, PyObject* args) if (!im) return NULL; + im->readonly = 1; /* setup file pointers */ if (orientation > 0) for (y = 0; y < ysize; y++) @@ -366,6 +367,7 @@ PyImaging_MapBuffer(PyObject* self, PyObject* args) if (!im) return NULL; + im->readonly = view.readonly; /* setup file pointers */ if (ystep > 0) for (y = 0; y < ysize; y++) From c0ea69efa4fd4344f64a34289e99a8e847f98f6a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 15 Feb 2020 14:52:11 +1100 Subject: [PATCH 2/3] Updated code for Python 3 --- src/_imaging.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_imaging.c b/src/_imaging.c index 1e21a5925..4affef92e 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3394,7 +3394,7 @@ _getattr_unsafe_ptrs(ImagingObject* self, void* closure) static PyObject* _getattr_readonly(ImagingObject* self, void* closure) { - return PyInt_FromLong(self->image->readonly); + return PyLong_FromLong(self->image->readonly); } static struct PyGetSetDef getsetters[] = { From 057651a50c083cb618b84e228877467f387ed1cc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 22 May 2024 10:17:38 +0000 Subject: [PATCH 3/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/_imaging.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index ed64f3868..f6be22fd4 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3750,9 +3750,8 @@ _getattr_unsafe_ptrs(ImagingObject *self, void *closure) { self->image->image); } -static PyObject* -_getattr_readonly(ImagingObject* self, void* closure) -{ +static PyObject * +_getattr_readonly(ImagingObject *self, void *closure) { return PyLong_FromLong(self->image->readonly); } @@ -3763,7 +3762,7 @@ static struct PyGetSetDef getsetters[] = { {"id", (getter)_getattr_id}, {"ptr", (getter)_getattr_ptr}, {"unsafe_ptrs", (getter)_getattr_unsafe_ptrs}, - {"readonly", (getter) _getattr_readonly}, + {"readonly", (getter)_getattr_readonly}, {NULL}}; /* basic sequence semantics */