From d4c443ef68acc419e9af767855c343fc910f5388 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 24 Jan 2018 16:55:20 +0000 Subject: [PATCH] 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++)