Allow new-style buffer interfaces to be read/write when mapped that way

This commit is contained in:
Eric Soroos 2018-01-24 16:55:20 +00:00 committed by Andrew Murray
parent 9174a4596c
commit d4c443ef68
6 changed files with 12 additions and 2 deletions

View File

@ -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)

View File

@ -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:

View File

@ -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 }
};

View File

@ -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;

View File

@ -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) {

View File

@ -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++)