123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925 |
- /*
- * The Python Imaging Library.
- *
- * standard decoder interfaces for the Imaging library
- *
- * history:
- * 1996-03-28 fl Moved from _imagingmodule.c
- * 1996-04-15 fl Support subregions in setimage
- * 1996-04-19 fl Allocate decoder buffer (where appropriate)
- * 1996-05-02 fl Added jpeg decoder
- * 1996-05-12 fl Compile cleanly as C++
- * 1996-05-16 fl Added hex decoder
- * 1996-05-26 fl Added jpeg configuration parameters
- * 1996-12-14 fl Added zip decoder
- * 1996-12-30 fl Plugged potential memory leak for tiled images
- * 1997-01-03 fl Added fli and msp decoders
- * 1997-01-04 fl Added sun_rle and tga_rle decoders
- * 1997-05-31 fl Added bitfield decoder
- * 1998-09-11 fl Added orientation and pixelsize fields to tga_rle decoder
- * 1998-12-29 fl Added mode/rawmode argument to decoders
- * 1998-12-30 fl Added mode argument to *all* decoders
- * 2002-06-09 fl Added stride argument to pcx decoder
- *
- * Copyright (c) 1997-2002 by Secret Labs AB.
- * Copyright (c) 1995-2002 by Fredrik Lundh.
- *
- * See the README file for information on usage and redistribution.
- */
- /* FIXME: make these pluggable! */
- #define PY_SSIZE_T_CLEAN
- #include "Python.h"
- #include "libImaging/Imaging.h"
- #include "libImaging/Bit.h"
- #include "libImaging/Bcn.h"
- #include "libImaging/Gif.h"
- #include "libImaging/Raw.h"
- #include "libImaging/Sgi.h"
- /* -------------------------------------------------------------------- */
- /* Common */
- /* -------------------------------------------------------------------- */
- typedef struct {
- PyObject_HEAD int (*decode)(
- Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
- int (*cleanup)(ImagingCodecState state);
- struct ImagingCodecStateInstance state;
- Imaging im;
- PyObject *lock;
- int pulls_fd;
- } ImagingDecoderObject;
- static PyTypeObject ImagingDecoderType;
- static ImagingDecoderObject *
- PyImaging_DecoderNew(int contextsize) {
- ImagingDecoderObject *decoder;
- void *context;
- if (PyType_Ready(&ImagingDecoderType) < 0) {
- return NULL;
- }
- decoder = PyObject_New(ImagingDecoderObject, &ImagingDecoderType);
- if (decoder == NULL) {
- return NULL;
- }
- /* Clear the decoder state */
- memset(&decoder->state, 0, sizeof(decoder->state));
- /* Allocate decoder context */
- if (contextsize > 0) {
- context = (void *)calloc(1, contextsize);
- if (!context) {
- Py_DECREF(decoder);
- (void)ImagingError_MemoryError();
- return NULL;
- }
- } else {
- context = 0;
- }
- /* Initialize decoder context */
- decoder->state.context = context;
- /* Target image */
- decoder->lock = NULL;
- decoder->im = NULL;
- /* Initialize the cleanup function pointer */
- decoder->cleanup = NULL;
- /* set if the decoder needs to pull data from the fd, instead of
- having it pushed */
- decoder->pulls_fd = 0;
- return decoder;
- }
- static void
- _dealloc(ImagingDecoderObject *decoder) {
- if (decoder->cleanup) {
- decoder->cleanup(&decoder->state);
- }
- free(decoder->state.buffer);
- free(decoder->state.context);
- Py_XDECREF(decoder->lock);
- Py_XDECREF(decoder->state.fd);
- PyObject_Del(decoder);
- }
- static PyObject *
- _decode(ImagingDecoderObject *decoder, PyObject *args) {
- Py_buffer buffer;
- int status;
- ImagingSectionCookie cookie;
- if (!PyArg_ParseTuple(args, "y*", &buffer)) {
- return NULL;
- }
- if (!decoder->pulls_fd) {
- ImagingSectionEnter(&cookie);
- }
- status = decoder->decode(decoder->im, &decoder->state, buffer.buf, buffer.len);
- if (!decoder->pulls_fd) {
- ImagingSectionLeave(&cookie);
- }
- PyBuffer_Release(&buffer);
- return Py_BuildValue("ii", status, decoder->state.errcode);
- }
- static PyObject *
- _decode_cleanup(ImagingDecoderObject *decoder, PyObject *args) {
- int status = 0;
- if (decoder->cleanup) {
- status = decoder->cleanup(&decoder->state);
- }
- return Py_BuildValue("i", status);
- }
- extern Imaging
- PyImaging_AsImaging(PyObject *op);
- static PyObject *
- _setimage(ImagingDecoderObject *decoder, PyObject *args) {
- PyObject *op;
- Imaging im;
- ImagingCodecState state;
- int x0, y0, x1, y1;
- x0 = y0 = x1 = y1 = 0;
- /* FIXME: should publish the ImagingType descriptor */
- if (!PyArg_ParseTuple(args, "O|(iiii)", &op, &x0, &y0, &x1, &y1)) {
- return NULL;
- }
- im = PyImaging_AsImaging(op);
- if (!im) {
- return NULL;
- }
- decoder->im = im;
- state = &decoder->state;
- /* Setup decoding tile extent */
- if (x0 == 0 && x1 == 0) {
- state->xsize = im->xsize;
- state->ysize = im->ysize;
- } else {
- state->xoff = x0;
- state->yoff = y0;
- state->xsize = x1 - x0;
- state->ysize = y1 - y0;
- }
- if (state->xsize <= 0 || state->xsize + state->xoff > (int)im->xsize ||
- state->ysize <= 0 || state->ysize + state->yoff > (int)im->ysize) {
- PyErr_SetString(PyExc_ValueError, "tile cannot extend outside image");
- return NULL;
- }
- /* Allocate memory buffer (if bits field is set) */
- if (state->bits > 0) {
- if (!state->bytes) {
- if (state->xsize > ((INT_MAX / state->bits) - 7)) {
- return ImagingError_MemoryError();
- }
- state->bytes = (state->bits * state->xsize + 7) / 8;
- }
- /* malloc check ok, overflow checked above */
- state->buffer = (UINT8 *)calloc(1, state->bytes);
- if (!state->buffer) {
- return ImagingError_MemoryError();
- }
- }
- /* Keep a reference to the image object, to make sure it doesn't
- go away before we do */
- Py_INCREF(op);
- Py_XDECREF(decoder->lock);
- decoder->lock = op;
- Py_INCREF(Py_None);
- return Py_None;
- }
- static PyObject *
- _setfd(ImagingDecoderObject *decoder, PyObject *args) {
- PyObject *fd;
- ImagingCodecState state;
- if (!PyArg_ParseTuple(args, "O", &fd)) {
- return NULL;
- }
- state = &decoder->state;
- Py_XINCREF(fd);
- state->fd = fd;
- Py_INCREF(Py_None);
- return Py_None;
- }
- static PyObject *
- _get_pulls_fd(ImagingDecoderObject *decoder, void *closure) {
- return PyBool_FromLong(decoder->pulls_fd);
- }
- static struct PyMethodDef methods[] = {
- {"decode", (PyCFunction)_decode, METH_VARARGS},
- {"cleanup", (PyCFunction)_decode_cleanup, METH_VARARGS},
- {"setimage", (PyCFunction)_setimage, METH_VARARGS},
- {"setfd", (PyCFunction)_setfd, METH_VARARGS},
- {NULL, NULL} /* sentinel */
- };
- static struct PyGetSetDef getseters[] = {
- {"pulls_fd",
- (getter)_get_pulls_fd,
- NULL,
- "True if this decoder expects to pull from self.fd itself.",
- NULL},
- {NULL, NULL, NULL, NULL, NULL} /* sentinel */
- };
- static PyTypeObject ImagingDecoderType = {
- PyVarObject_HEAD_INIT(NULL, 0) "ImagingDecoder", /*tp_name*/
- sizeof(ImagingDecoderObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- /* methods */
- (destructor)_dealloc, /*tp_dealloc*/
- 0, /*tp_vectorcall_offset*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_as_async*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- 0, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- 0, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- methods, /*tp_methods*/
- 0, /*tp_members*/
- getseters, /*tp_getset*/
- };
- /* -------------------------------------------------------------------- */
- int
- get_unpacker(ImagingDecoderObject *decoder, const char *mode, const char *rawmode) {
- int bits;
- ImagingShuffler unpack;
- unpack = ImagingFindUnpacker(mode, rawmode, &bits);
- if (!unpack) {
- Py_DECREF(decoder);
- PyErr_SetString(PyExc_ValueError, "unknown raw mode for given image mode");
- return -1;
- }
- decoder->state.shuffle = unpack;
- decoder->state.bits = bits;
- return 0;
- }
- /* -------------------------------------------------------------------- */
- /* BIT (packed fields) */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_BitDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- int bits = 8;
- int pad = 8;
- int fill = 0;
- int sign = 0;
- int ystep = 1;
- if (!PyArg_ParseTuple(args, "s|iiiii", &mode, &bits, &pad, &fill, &sign, &ystep)) {
- return NULL;
- }
- if (strcmp(mode, "F") != 0) {
- PyErr_SetString(PyExc_ValueError, "bad image mode");
- return NULL;
- }
- decoder = PyImaging_DecoderNew(sizeof(BITSTATE));
- if (decoder == NULL) {
- return NULL;
- }
- decoder->decode = ImagingBitDecode;
- decoder->state.ystep = ystep;
- ((BITSTATE *)decoder->state.context)->bits = bits;
- ((BITSTATE *)decoder->state.context)->pad = pad;
- ((BITSTATE *)decoder->state.context)->fill = fill;
- ((BITSTATE *)decoder->state.context)->sign = sign;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* BCn: GPU block-compressed texture formats */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_BcnDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *actual;
- int n = 0;
- char *pixel_format = "";
- if (!PyArg_ParseTuple(args, "si|s", &mode, &n, &pixel_format)) {
- return NULL;
- }
- switch (n) {
- case 1: /* BC1: 565 color, 1-bit alpha */
- case 2: /* BC2: 565 color, 4-bit alpha */
- case 3: /* BC3: 565 color, 2-endpoint 8-bit interpolated alpha */
- case 7: /* BC7: 4-channel 8-bit via everything */
- actual = "RGBA";
- break;
- case 4: /* BC4: 1-channel 8-bit via 1 BC3 alpha block */
- actual = "L";
- break;
- case 5: /* BC5: 2-channel 8-bit via 2 BC3 alpha blocks */
- case 6: /* BC6: 3-channel 16-bit float */
- actual = "RGB";
- break;
- default:
- PyErr_SetString(PyExc_ValueError, "block compression type unknown");
- return NULL;
- }
- if (strcmp(mode, actual) != 0) {
- PyErr_SetString(PyExc_ValueError, "bad image mode");
- return NULL;
- }
- decoder = PyImaging_DecoderNew(sizeof(char *));
- if (decoder == NULL) {
- return NULL;
- }
- decoder->decode = ImagingBcnDecode;
- decoder->state.state = n;
- ((BCNSTATE *)decoder->state.context)->pixel_format = pixel_format;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* FLI */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_FliDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- decoder = PyImaging_DecoderNew(0);
- if (decoder == NULL) {
- return NULL;
- }
- decoder->decode = ImagingFliDecode;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* GIF */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_GifDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- int bits = 8;
- int interlace = 0;
- int transparency = -1;
- if (!PyArg_ParseTuple(args, "s|iii", &mode, &bits, &interlace, &transparency)) {
- return NULL;
- }
- if (strcmp(mode, "L") != 0 && strcmp(mode, "P") != 0) {
- PyErr_SetString(PyExc_ValueError, "bad image mode");
- return NULL;
- }
- decoder = PyImaging_DecoderNew(sizeof(GIFDECODERSTATE));
- if (decoder == NULL) {
- return NULL;
- }
- decoder->decode = ImagingGifDecode;
- ((GIFDECODERSTATE *)decoder->state.context)->bits = bits;
- ((GIFDECODERSTATE *)decoder->state.context)->interlace = interlace;
- ((GIFDECODERSTATE *)decoder->state.context)->transparency = transparency;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* HEX */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_HexDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode;
- if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) {
- return NULL;
- }
- decoder = PyImaging_DecoderNew(0);
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- decoder->decode = ImagingHexDecode;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* LibTiff */
- /* -------------------------------------------------------------------- */
- #ifdef HAVE_LIBTIFF
- #include "libImaging/TiffDecode.h"
- #include <string.h>
- PyObject *
- PyImaging_LibTiffDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode;
- char *compname;
- int fp;
- uint32_t ifdoffset;
- if (!PyArg_ParseTuple(args, "sssiI", &mode, &rawmode, &compname, &fp, &ifdoffset)) {
- return NULL;
- }
- TRACE(("new tiff decoder %s\n", compname));
- decoder = PyImaging_DecoderNew(sizeof(TIFFSTATE));
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- if (!ImagingLibTiffInit(&decoder->state, fp, ifdoffset)) {
- Py_DECREF(decoder);
- PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed");
- return NULL;
- }
- decoder->decode = ImagingLibTiffDecode;
- return (PyObject *)decoder;
- }
- #endif
- /* -------------------------------------------------------------------- */
- /* PackBits */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_PackbitsDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode;
- if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) {
- return NULL;
- }
- decoder = PyImaging_DecoderNew(0);
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- decoder->decode = ImagingPackbitsDecode;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* PCD */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_PcdDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- decoder = PyImaging_DecoderNew(0);
- if (decoder == NULL) {
- return NULL;
- }
- /* Unpack from PhotoYCC to RGB */
- if (get_unpacker(decoder, "RGB", "YCC;P") < 0) {
- return NULL;
- }
- decoder->decode = ImagingPcdDecode;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* PCX */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_PcxDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode;
- int stride;
- if (!PyArg_ParseTuple(args, "ssi", &mode, &rawmode, &stride)) {
- return NULL;
- }
- decoder = PyImaging_DecoderNew(0);
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- decoder->state.bytes = stride;
- decoder->decode = ImagingPcxDecode;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* RAW */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_RawDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode;
- int stride = 0;
- int ystep = 1;
- if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &stride, &ystep)) {
- return NULL;
- }
- decoder = PyImaging_DecoderNew(sizeof(RAWSTATE));
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- decoder->decode = ImagingRawDecode;
- decoder->state.ystep = ystep;
- ((RAWSTATE *)decoder->state.context)->stride = stride;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* SGI RLE */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_SgiRleDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode;
- int ystep = 1;
- int bpc = 1;
- if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &bpc)) {
- return NULL;
- }
- decoder = PyImaging_DecoderNew(sizeof(SGISTATE));
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- decoder->pulls_fd = 1;
- decoder->decode = ImagingSgiRleDecode;
- decoder->state.ystep = ystep;
- ((SGISTATE *)decoder->state.context)->bpc = bpc;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* SUN RLE */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_SunRleDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode;
- if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) {
- return NULL;
- }
- decoder = PyImaging_DecoderNew(0);
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- decoder->decode = ImagingSunRleDecode;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* TGA RLE */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_TgaRleDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode;
- int ystep = 1;
- int depth = 8;
- if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &depth)) {
- return NULL;
- }
- decoder = PyImaging_DecoderNew(0);
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- decoder->decode = ImagingTgaRleDecode;
- decoder->state.ystep = ystep;
- decoder->state.count = depth / 8;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* XBM */
- /* -------------------------------------------------------------------- */
- PyObject *
- PyImaging_XbmDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- decoder = PyImaging_DecoderNew(0);
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, "1", "1;R") < 0) {
- return NULL;
- }
- decoder->decode = ImagingXbmDecode;
- return (PyObject *)decoder;
- }
- /* -------------------------------------------------------------------- */
- /* ZIP */
- /* -------------------------------------------------------------------- */
- #ifdef HAVE_LIBZ
- #include "libImaging/ZipCodecs.h"
- PyObject *
- PyImaging_ZipDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode;
- int interlaced = 0;
- if (!PyArg_ParseTuple(args, "ss|i", &mode, &rawmode, &interlaced)) {
- return NULL;
- }
- decoder = PyImaging_DecoderNew(sizeof(ZIPSTATE));
- if (decoder == NULL) {
- return NULL;
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- decoder->decode = ImagingZipDecode;
- decoder->cleanup = ImagingZipDecodeCleanup;
- ((ZIPSTATE *)decoder->state.context)->interlaced = interlaced;
- return (PyObject *)decoder;
- }
- #endif
- /* -------------------------------------------------------------------- */
- /* JPEG */
- /* -------------------------------------------------------------------- */
- #ifdef HAVE_LIBJPEG
- /* We better define this decoder last in this file, so the following
- undef's won't mess things up for the Imaging library proper. */
- #undef HAVE_PROTOTYPES
- #undef HAVE_STDDEF_H
- #undef HAVE_STDLIB_H
- #undef UINT8
- #undef UINT16
- #undef UINT32
- #undef INT8
- #undef INT16
- #undef INT32
- #include "libImaging/Jpeg.h"
- PyObject *
- PyImaging_JpegDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- char *mode;
- char *rawmode; /* what we want from the decoder */
- char *jpegmode; /* what's in the file */
- int scale = 1;
- int draft = 0;
- if (!PyArg_ParseTuple(args, "ssz|ii", &mode, &rawmode, &jpegmode, &scale, &draft)) {
- return NULL;
- }
- if (!jpegmode) {
- jpegmode = "";
- }
- decoder = PyImaging_DecoderNew(sizeof(JPEGSTATE));
- if (decoder == NULL) {
- return NULL;
- }
- // libjpeg-turbo supports different output formats.
- // We are choosing Pillow's native format (3 color bytes + 1 padding)
- // to avoid extra conversion in Unpack.c.
- if (ImagingJpegUseJCSExtensions() && strcmp(rawmode, "RGB") == 0) {
- rawmode = "RGBX";
- }
- if (get_unpacker(decoder, mode, rawmode) < 0) {
- return NULL;
- }
- decoder->decode = ImagingJpegDecode;
- decoder->cleanup = ImagingJpegDecodeCleanup;
- strncpy(((JPEGSTATE *)decoder->state.context)->rawmode, rawmode, 8);
- strncpy(((JPEGSTATE *)decoder->state.context)->jpegmode, jpegmode, 8);
- ((JPEGSTATE *)decoder->state.context)->scale = scale;
- ((JPEGSTATE *)decoder->state.context)->draft = draft;
- return (PyObject *)decoder;
- }
- #endif
- /* -------------------------------------------------------------------- */
- /* JPEG 2000 */
- /* -------------------------------------------------------------------- */
- #ifdef HAVE_OPENJPEG
- #include "libImaging/Jpeg2K.h"
- PyObject *
- PyImaging_Jpeg2KDecoderNew(PyObject *self, PyObject *args) {
- ImagingDecoderObject *decoder;
- JPEG2KDECODESTATE *context;
- char *mode;
- char *format;
- OPJ_CODEC_FORMAT codec_format;
- int reduce = 0;
- int layers = 0;
- int fd = -1;
- PY_LONG_LONG length = -1;
- if (!PyArg_ParseTuple(
- args, "ss|iiiL", &mode, &format, &reduce, &layers, &fd, &length)) {
- return NULL;
- }
- if (strcmp(format, "j2k") == 0) {
- codec_format = OPJ_CODEC_J2K;
- } else if (strcmp(format, "jpt") == 0) {
- codec_format = OPJ_CODEC_JPT;
- } else if (strcmp(format, "jp2") == 0) {
- codec_format = OPJ_CODEC_JP2;
- } else {
- return NULL;
- }
- decoder = PyImaging_DecoderNew(sizeof(JPEG2KDECODESTATE));
- if (decoder == NULL) {
- return NULL;
- }
- decoder->pulls_fd = 1;
- decoder->decode = ImagingJpeg2KDecode;
- decoder->cleanup = ImagingJpeg2KDecodeCleanup;
- context = (JPEG2KDECODESTATE *)decoder->state.context;
- context->fd = fd;
- context->length = (off_t)length;
- context->format = codec_format;
- context->reduce = reduce;
- context->layers = layers;
- return (PyObject *)decoder;
- }
- #endif /* HAVE_OPENJPEG */
|