32
#define PY_SSIZE_T_CLEAN
35
#include "libImaging/Imaging.h"
37
#include "libImaging/Bit.h"
38
#include "libImaging/Bcn.h"
39
#include "libImaging/Gif.h"
40
#include "libImaging/Raw.h"
41
#include "libImaging/Sgi.h"
48
PyObject_HEAD int (*decode)(
49
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes
51
int (*cleanup)(ImagingCodecState state);
52
struct ImagingCodecStateInstance state;
56
} ImagingDecoderObject;
58
static PyTypeObject ImagingDecoderType;
60
static ImagingDecoderObject *
61
PyImaging_DecoderNew(int contextsize) {
62
ImagingDecoderObject *decoder;
65
if (PyType_Ready(&ImagingDecoderType) < 0) {
69
decoder = PyObject_New(ImagingDecoderObject, &ImagingDecoderType);
70
if (decoder == NULL) {
75
memset(&decoder->state, 0, sizeof(decoder->state));
78
if (contextsize > 0) {
79
context = (void *)calloc(1, contextsize);
82
(void)ImagingError_MemoryError();
90
decoder->state.context = context;
97
decoder->cleanup = NULL;
101
decoder->pulls_fd = 0;
107
_dealloc(ImagingDecoderObject *decoder) {
108
if (decoder->cleanup) {
109
decoder->cleanup(&decoder->state);
111
free(decoder->state.buffer);
112
free(decoder->state.context);
113
Py_XDECREF(decoder->lock);
114
Py_XDECREF(decoder->state.fd);
115
PyObject_Del(decoder);
119
_decode(ImagingDecoderObject *decoder, PyObject *args) {
122
ImagingSectionCookie cookie;
124
if (!PyArg_ParseTuple(args, "y*", &buffer)) {
128
if (!decoder->pulls_fd) {
129
ImagingSectionEnter(&cookie);
132
status = decoder->decode(decoder->im, &decoder->state, buffer.buf, buffer.len);
134
if (!decoder->pulls_fd) {
135
ImagingSectionLeave(&cookie);
138
PyBuffer_Release(&buffer);
139
return Py_BuildValue("ii", status, decoder->state.errcode);
143
_decode_cleanup(ImagingDecoderObject *decoder, PyObject *args) {
146
if (decoder->cleanup) {
147
status = decoder->cleanup(&decoder->state);
150
return Py_BuildValue("i", status);
154
PyImaging_AsImaging(PyObject *op);
157
_setimage(ImagingDecoderObject *decoder, PyObject *args) {
160
ImagingCodecState state;
163
x0 = y0 = x1 = y1 = 0;
166
if (!PyArg_ParseTuple(args, "O|(iiii)", &op, &x0, &y0, &x1, &y1)) {
169
im = PyImaging_AsImaging(op);
176
state = &decoder->state;
179
if (x0 == 0 && x1 == 0) {
180
state->xsize = im->xsize;
181
state->ysize = im->ysize;
185
state->xsize = x1 - x0;
186
state->ysize = y1 - y0;
189
if (state->xsize <= 0 || state->xsize + state->xoff > (int)im->xsize ||
190
state->ysize <= 0 || state->ysize + state->yoff > (int)im->ysize) {
191
PyErr_SetString(PyExc_ValueError, "tile cannot extend outside image");
196
if (state->bits > 0) {
198
if (state->xsize > ((INT_MAX / state->bits) - 7)) {
199
return ImagingError_MemoryError();
201
state->bytes = (state->bits * state->xsize + 7) / 8;
204
state->buffer = (UINT8 *)calloc(1, state->bytes);
205
if (!state->buffer) {
206
return ImagingError_MemoryError();
213
Py_XDECREF(decoder->lock);
221
_setfd(ImagingDecoderObject *decoder, PyObject *args) {
223
ImagingCodecState state;
225
if (!PyArg_ParseTuple(args, "O", &fd)) {
229
state = &decoder->state;
239
_get_pulls_fd(ImagingDecoderObject *decoder, void *closure) {
240
return PyBool_FromLong(decoder->pulls_fd);
243
static struct PyMethodDef methods[] = {
244
{"decode", (PyCFunction)_decode, METH_VARARGS},
245
{"cleanup", (PyCFunction)_decode_cleanup, METH_VARARGS},
246
{"setimage", (PyCFunction)_setimage, METH_VARARGS},
247
{"setfd", (PyCFunction)_setfd, METH_VARARGS},
251
static struct PyGetSetDef getseters[] = {
253
(getter)_get_pulls_fd,
255
"True if this decoder expects to pull from self.fd itself.",
257
{NULL, NULL, NULL, NULL, NULL}
260
static PyTypeObject ImagingDecoderType = {
261
PyVarObject_HEAD_INIT(NULL, 0) "ImagingDecoder",
262
sizeof(ImagingDecoderObject),
265
(destructor)_dealloc,
296
get_unpacker(ImagingDecoderObject *decoder, const char *mode, const char *rawmode) {
298
ImagingShuffler unpack;
300
unpack = ImagingFindUnpacker(mode, rawmode, &bits);
303
PyErr_SetString(PyExc_ValueError, "unknown raw mode for given image mode");
307
decoder->state.shuffle = unpack;
308
decoder->state.bits = bits;
318
PyImaging_BitDecoderNew(PyObject *self, PyObject *args) {
319
ImagingDecoderObject *decoder;
327
if (!PyArg_ParseTuple(args, "s|iiiii", &mode, &bits, &pad, &fill, &sign, &ystep)) {
331
if (strcmp(mode, "F") != 0) {
332
PyErr_SetString(PyExc_ValueError, "bad image mode");
336
decoder = PyImaging_DecoderNew(sizeof(BITSTATE));
337
if (decoder == NULL) {
341
decoder->decode = ImagingBitDecode;
343
decoder->state.ystep = ystep;
345
((BITSTATE *)decoder->state.context)->bits = bits;
346
((BITSTATE *)decoder->state.context)->pad = pad;
347
((BITSTATE *)decoder->state.context)->fill = fill;
348
((BITSTATE *)decoder->state.context)->sign = sign;
350
return (PyObject *)decoder;
358
PyImaging_BcnDecoderNew(PyObject *self, PyObject *args) {
359
ImagingDecoderObject *decoder;
364
char *pixel_format = "";
365
if (!PyArg_ParseTuple(args, "si|s", &mode, &n, &pixel_format)) {
384
PyErr_SetString(PyExc_ValueError, "block compression type unknown");
388
if (strcmp(mode, actual) != 0) {
389
PyErr_SetString(PyExc_ValueError, "bad image mode");
393
decoder = PyImaging_DecoderNew(sizeof(char *));
394
if (decoder == NULL) {
398
decoder->decode = ImagingBcnDecode;
399
decoder->state.state = n;
400
((BCNSTATE *)decoder->state.context)->pixel_format = pixel_format;
402
return (PyObject *)decoder;
410
PyImaging_FliDecoderNew(PyObject *self, PyObject *args) {
411
ImagingDecoderObject *decoder;
413
decoder = PyImaging_DecoderNew(0);
414
if (decoder == NULL) {
418
decoder->decode = ImagingFliDecode;
420
return (PyObject *)decoder;
428
PyImaging_GifDecoderNew(PyObject *self, PyObject *args) {
429
ImagingDecoderObject *decoder;
434
int transparency = -1;
435
if (!PyArg_ParseTuple(args, "s|iii", &mode, &bits, &interlace, &transparency)) {
439
if (strcmp(mode, "L") != 0 && strcmp(mode, "P") != 0) {
440
PyErr_SetString(PyExc_ValueError, "bad image mode");
444
decoder = PyImaging_DecoderNew(sizeof(GIFDECODERSTATE));
445
if (decoder == NULL) {
449
decoder->decode = ImagingGifDecode;
451
((GIFDECODERSTATE *)decoder->state.context)->bits = bits;
452
((GIFDECODERSTATE *)decoder->state.context)->interlace = interlace;
453
((GIFDECODERSTATE *)decoder->state.context)->transparency = transparency;
455
return (PyObject *)decoder;
463
PyImaging_HexDecoderNew(PyObject *self, PyObject *args) {
464
ImagingDecoderObject *decoder;
468
if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) {
472
decoder = PyImaging_DecoderNew(0);
473
if (decoder == NULL) {
477
if (get_unpacker(decoder, mode, rawmode) < 0) {
481
decoder->decode = ImagingHexDecode;
483
return (PyObject *)decoder;
492
#include "libImaging/TiffDecode.h"
497
PyImaging_LibTiffDecoderNew(PyObject *self, PyObject *args) {
498
ImagingDecoderObject *decoder;
505
if (!PyArg_ParseTuple(args, "sssiI", &mode, &rawmode, &compname, &fp, &ifdoffset)) {
509
TRACE(("new tiff decoder %s\n", compname));
511
decoder = PyImaging_DecoderNew(sizeof(TIFFSTATE));
512
if (decoder == NULL) {
516
if (get_unpacker(decoder, mode, rawmode) < 0) {
520
if (!ImagingLibTiffInit(&decoder->state, fp, ifdoffset)) {
522
PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed");
526
decoder->decode = ImagingLibTiffDecode;
528
return (PyObject *)decoder;
538
PyImaging_PackbitsDecoderNew(PyObject *self, PyObject *args) {
539
ImagingDecoderObject *decoder;
543
if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) {
547
decoder = PyImaging_DecoderNew(0);
548
if (decoder == NULL) {
552
if (get_unpacker(decoder, mode, rawmode) < 0) {
556
decoder->decode = ImagingPackbitsDecode;
558
return (PyObject *)decoder;
566
PyImaging_PcdDecoderNew(PyObject *self, PyObject *args) {
567
ImagingDecoderObject *decoder;
569
decoder = PyImaging_DecoderNew(0);
570
if (decoder == NULL) {
575
if (get_unpacker(decoder, "RGB", "YCC;P") < 0) {
579
decoder->decode = ImagingPcdDecode;
581
return (PyObject *)decoder;
589
PyImaging_PcxDecoderNew(PyObject *self, PyObject *args) {
590
ImagingDecoderObject *decoder;
595
if (!PyArg_ParseTuple(args, "ssi", &mode, &rawmode, &stride)) {
599
decoder = PyImaging_DecoderNew(0);
600
if (decoder == NULL) {
604
if (get_unpacker(decoder, mode, rawmode) < 0) {
608
decoder->state.bytes = stride;
610
decoder->decode = ImagingPcxDecode;
612
return (PyObject *)decoder;
620
PyImaging_RawDecoderNew(PyObject *self, PyObject *args) {
621
ImagingDecoderObject *decoder;
627
if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &stride, &ystep)) {
631
decoder = PyImaging_DecoderNew(sizeof(RAWSTATE));
632
if (decoder == NULL) {
636
if (get_unpacker(decoder, mode, rawmode) < 0) {
640
decoder->decode = ImagingRawDecode;
642
decoder->state.ystep = ystep;
644
((RAWSTATE *)decoder->state.context)->stride = stride;
646
return (PyObject *)decoder;
654
PyImaging_SgiRleDecoderNew(PyObject *self, PyObject *args) {
655
ImagingDecoderObject *decoder;
661
if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &bpc)) {
665
decoder = PyImaging_DecoderNew(sizeof(SGISTATE));
666
if (decoder == NULL) {
670
if (get_unpacker(decoder, mode, rawmode) < 0) {
674
decoder->pulls_fd = 1;
675
decoder->decode = ImagingSgiRleDecode;
676
decoder->state.ystep = ystep;
678
((SGISTATE *)decoder->state.context)->bpc = bpc;
680
return (PyObject *)decoder;
688
PyImaging_SunRleDecoderNew(PyObject *self, PyObject *args) {
689
ImagingDecoderObject *decoder;
693
if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) {
697
decoder = PyImaging_DecoderNew(0);
698
if (decoder == NULL) {
702
if (get_unpacker(decoder, mode, rawmode) < 0) {
706
decoder->decode = ImagingSunRleDecode;
708
return (PyObject *)decoder;
716
PyImaging_TgaRleDecoderNew(PyObject *self, PyObject *args) {
717
ImagingDecoderObject *decoder;
723
if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &depth)) {
727
decoder = PyImaging_DecoderNew(0);
728
if (decoder == NULL) {
732
if (get_unpacker(decoder, mode, rawmode) < 0) {
736
decoder->decode = ImagingTgaRleDecode;
738
decoder->state.ystep = ystep;
739
decoder->state.count = depth / 8;
741
return (PyObject *)decoder;
749
PyImaging_XbmDecoderNew(PyObject *self, PyObject *args) {
750
ImagingDecoderObject *decoder;
752
decoder = PyImaging_DecoderNew(0);
753
if (decoder == NULL) {
757
if (get_unpacker(decoder, "1", "1;R") < 0) {
761
decoder->decode = ImagingXbmDecode;
763
return (PyObject *)decoder;
772
#include "libImaging/ZipCodecs.h"
775
PyImaging_ZipDecoderNew(PyObject *self, PyObject *args) {
776
ImagingDecoderObject *decoder;
781
if (!PyArg_ParseTuple(args, "ss|i", &mode, &rawmode, &interlaced)) {
785
decoder = PyImaging_DecoderNew(sizeof(ZIPSTATE));
786
if (decoder == NULL) {
790
if (get_unpacker(decoder, mode, rawmode) < 0) {
794
decoder->decode = ImagingZipDecode;
795
decoder->cleanup = ImagingZipDecodeCleanup;
797
((ZIPSTATE *)decoder->state.context)->interlaced = interlaced;
799
return (PyObject *)decoder;
812
#undef HAVE_PROTOTYPES
822
#include "libImaging/Jpeg.h"
825
PyImaging_JpegDecoderNew(PyObject *self, PyObject *args) {
826
ImagingDecoderObject *decoder;
834
if (!PyArg_ParseTuple(args, "ssz|ii", &mode, &rawmode, &jpegmode, &scale, &draft)) {
842
decoder = PyImaging_DecoderNew(sizeof(JPEGSTATE));
843
if (decoder == NULL) {
850
if (ImagingJpegUseJCSExtensions() && strcmp(rawmode, "RGB") == 0) {
854
if (get_unpacker(decoder, mode, rawmode) < 0) {
858
decoder->decode = ImagingJpegDecode;
859
decoder->cleanup = ImagingJpegDecodeCleanup;
861
strncpy(((JPEGSTATE *)decoder->state.context)->rawmode, rawmode, 8);
862
strncpy(((JPEGSTATE *)decoder->state.context)->jpegmode, jpegmode, 8);
864
((JPEGSTATE *)decoder->state.context)->scale = scale;
865
((JPEGSTATE *)decoder->state.context)->draft = draft;
867
return (PyObject *)decoder;
877
#include "libImaging/Jpeg2K.h"
880
PyImaging_Jpeg2KDecoderNew(PyObject *self, PyObject *args) {
881
ImagingDecoderObject *decoder;
882
JPEG2KDECODESTATE *context;
886
OPJ_CODEC_FORMAT codec_format;
890
PY_LONG_LONG length = -1;
892
if (!PyArg_ParseTuple(
893
args, "ss|iiiL", &mode, &format, &reduce, &layers, &fd, &length
898
if (strcmp(format, "j2k") == 0) {
899
codec_format = OPJ_CODEC_J2K;
900
} else if (strcmp(format, "jpt") == 0) {
901
codec_format = OPJ_CODEC_JPT;
902
} else if (strcmp(format, "jp2") == 0) {
903
codec_format = OPJ_CODEC_JP2;
908
decoder = PyImaging_DecoderNew(sizeof(JPEG2KDECODESTATE));
909
if (decoder == NULL) {
913
decoder->pulls_fd = 1;
914
decoder->decode = ImagingJpeg2KDecode;
915
decoder->cleanup = ImagingJpeg2KDecodeCleanup;
917
context = (JPEG2KDECODESTATE *)decoder->state.context;
920
context->length = (off_t)length;
921
context->format = codec_format;
922
context->reduce = reduce;
923
context->layers = layers;
925
return (PyObject *)decoder;