2
* The Python Imaging Library.
4
* standard encoder interfaces for the Imaging library
7
* 1996-04-19 fl Based on decoders.c
8
* 1996-05-12 fl Compile cleanly as C++
9
* 1996-12-30 fl Plugged potential memory leak for tiled images
10
* 1997-01-03 fl Added GIF encoder
11
* 1997-01-05 fl Plugged encoder buffer leaks
12
* 1997-01-11 fl Added encode_to_file method
13
* 1998-03-09 fl Added mode/rawmode argument to encoders
14
* 1998-07-09 fl Added interlace argument to GIF encoder
15
* 1999-02-07 fl Added PCX encoder
17
* Copyright (c) 1997-2001 by Secret Labs AB
18
* Copyright (c) 1996-1997 by Fredrik Lundh
20
* See the README file for information on usage and redistribution.
23
/* FIXME: make these pluggable! */
27
#if PY_VERSION_HEX < 0x01060000
28
#define PyObject_New PyObject_NEW
29
#define PyObject_Del PyMem_DEL
36
#include <unistd.h> /* write */
39
/* -------------------------------------------------------------------- */
41
/* -------------------------------------------------------------------- */
45
int (*encode)(Imaging im, ImagingCodecState state,
46
UINT8* buffer, int bytes);
47
struct ImagingCodecStateInstance state;
50
} ImagingEncoderObject;
52
staticforward PyTypeObject ImagingEncoderType;
54
static ImagingEncoderObject*
55
PyImaging_EncoderNew(int contextsize)
57
ImagingEncoderObject *encoder;
60
ImagingEncoderType.ob_type = &PyType_Type;
62
encoder = PyObject_New(ImagingEncoderObject, &ImagingEncoderType);
66
/* Clear the encoder state */
67
memset(&encoder->state, 0, sizeof(encoder->state));
69
/* Allocate encoder context */
70
if (contextsize > 0) {
71
context = (void*) calloc(1, contextsize);
74
(void) PyErr_NoMemory();
80
/* Initialize encoder context */
81
encoder->state.context = context;
91
_dealloc(ImagingEncoderObject* encoder)
93
free(encoder->state.buffer);
94
free(encoder->state.context);
95
Py_XDECREF(encoder->lock);
96
PyObject_Del(encoder);
100
_encode(ImagingEncoderObject* encoder, PyObject* args)
106
/* Encode to a Python string (allocated by this method) */
110
if (!PyArg_ParseTuple(args, "|i", &bufsize))
113
buf = PyString_FromStringAndSize(NULL, bufsize);
117
status = encoder->encode(encoder->im, &encoder->state,
118
(UINT8*) PyString_AsString(buf), bufsize);
120
/* adjust string length to avoid slicing in encoder */
121
if (_PyString_Resize(&buf, (status > 0) ? status : 0) < 0)
124
result = Py_BuildValue("iiO", status, encoder->state.errcode, buf);
126
Py_DECREF(buf); /* must release buffer!!! */
132
_encode_to_file(ImagingEncoderObject* encoder, PyObject* args)
136
ImagingSectionCookie cookie;
138
/* Encode to a file handle */
143
if (!PyArg_ParseTuple(args, "i|i", &fh, &bufsize))
146
/* Allocate an encoder buffer */
147
buf = (UINT8*) malloc(bufsize);
149
return PyErr_NoMemory();
151
ImagingSectionEnter(&cookie);
155
/* This replaces the inner loop in the ImageFile _save
158
status = encoder->encode(encoder->im, &encoder->state, buf, bufsize);
161
if (write(fh, buf, status) < 0) {
162
ImagingSectionLeave(&cookie);
164
return PyErr_SetFromErrno(PyExc_IOError);
167
} while (encoder->state.errcode == 0);
169
ImagingSectionLeave(&cookie);
173
return Py_BuildValue("i", encoder->state.errcode);
176
extern Imaging PyImaging_AsImaging(PyObject *op);
179
_setimage(ImagingEncoderObject* encoder, PyObject* args)
183
ImagingCodecState state;
186
/* Define where image data should be stored */
188
x0 = y0 = x1 = y1 = 0;
190
/* FIXME: should publish the ImagingType descriptor */
191
if (!PyArg_ParseTuple(args, "O|(iiii)", &op, &x0, &y0, &x1, &y1))
193
im = PyImaging_AsImaging(op);
199
state = &encoder->state;
201
if (x0 == 0 && x1 == 0) {
202
state->xsize = im->xsize;
203
state->ysize = im->ysize;
207
state->xsize = x1 - x0;
208
state->ysize = y1 - y0;
211
if (state->xsize <= 0 ||
212
state->xsize + state->xoff > im->xsize ||
214
state->ysize + state->yoff > im->ysize) {
215
PyErr_SetString(PyExc_SystemError, "tile cannot extend outside image");
219
/* Allocate memory buffer (if bits field is set) */
220
if (state->bits > 0) {
221
state->bytes = (state->bits * state->xsize+7)/8;
222
state->buffer = (UINT8*) malloc(state->bytes);
224
return PyErr_NoMemory();
227
/* Keep a reference to the image object, to make sure it doesn't
228
go away before we do */
230
Py_XDECREF(encoder->lock);
237
static struct PyMethodDef methods[] = {
238
{"encode", (PyCFunction)_encode, 1},
239
{"encode_to_file", (PyCFunction)_encode_to_file, 1},
240
{"setimage", (PyCFunction)_setimage, 1},
241
{NULL, NULL} /* sentinel */
245
_getattr(ImagingEncoderObject* self, char* name)
247
return Py_FindMethod(methods, (PyObject*) self, name);
250
statichere PyTypeObject ImagingEncoderType = {
251
PyObject_HEAD_INIT(NULL)
253
"ImagingEncoder", /*tp_name*/
254
sizeof(ImagingEncoderObject), /*tp_size*/
257
(destructor)_dealloc, /*tp_dealloc*/
259
(getattrfunc)_getattr, /*tp_getattr*/
266
/* -------------------------------------------------------------------- */
269
get_packer(ImagingEncoderObject* encoder, const char* mode,
273
ImagingShuffler pack;
275
pack = ImagingFindPacker(mode, rawmode, &bits);
278
PyErr_SetString(PyExc_SystemError, "unknown raw mode");
282
encoder->state.shuffle = pack;
283
encoder->state.bits = bits;
289
/* -------------------------------------------------------------------- */
291
/* -------------------------------------------------------------------- */
294
PyImaging_EpsEncoderNew(PyObject* self, PyObject* args)
296
ImagingEncoderObject* encoder;
298
encoder = PyImaging_EncoderNew(0);
302
encoder->encode = ImagingEpsEncode;
304
return (PyObject*) encoder;
308
/* -------------------------------------------------------------------- */
310
/* -------------------------------------------------------------------- */
313
PyImaging_GifEncoderNew(PyObject* self, PyObject* args)
315
ImagingEncoderObject* encoder;
321
if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &bits, &interlace))
324
encoder = PyImaging_EncoderNew(sizeof(GIFENCODERSTATE));
328
if (get_packer(encoder, mode, rawmode) < 0)
331
encoder->encode = ImagingGifEncode;
333
((GIFENCODERSTATE*)encoder->state.context)->bits = bits;
334
((GIFENCODERSTATE*)encoder->state.context)->interlace = interlace;
336
return (PyObject*) encoder;
340
/* -------------------------------------------------------------------- */
342
/* -------------------------------------------------------------------- */
345
PyImaging_PcxEncoderNew(PyObject* self, PyObject* args)
347
ImagingEncoderObject* encoder;
352
if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &bits))
355
encoder = PyImaging_EncoderNew(0);
359
if (get_packer(encoder, mode, rawmode) < 0)
362
encoder->encode = ImagingPcxEncode;
364
return (PyObject*) encoder;
368
/* -------------------------------------------------------------------- */
370
/* -------------------------------------------------------------------- */
373
PyImaging_RawEncoderNew(PyObject* self, PyObject* args)
375
ImagingEncoderObject* encoder;
382
if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &stride, &ystep))
385
encoder = PyImaging_EncoderNew(0);
389
if (get_packer(encoder, mode, rawmode) < 0)
392
encoder->encode = ImagingRawEncode;
394
encoder->state.ystep = ystep;
395
encoder->state.count = stride;
397
return (PyObject*) encoder;
401
/* -------------------------------------------------------------------- */
403
/* -------------------------------------------------------------------- */
406
PyImaging_XbmEncoderNew(PyObject* self, PyObject* args)
408
ImagingEncoderObject* encoder;
410
encoder = PyImaging_EncoderNew(0);
414
if (get_packer(encoder, "1", "1;R") < 0)
417
encoder->encode = ImagingXbmEncode;
419
return (PyObject*) encoder;
423
/* -------------------------------------------------------------------- */
425
/* -------------------------------------------------------------------- */
432
PyImaging_ZipEncoderNew(PyObject* self, PyObject* args)
434
ImagingEncoderObject* encoder;
439
char* dictionary = NULL;
440
int dictionary_size = 0;
441
if (!PyArg_ParseTuple(args, "ss|is#", &mode, &rawmode, &optimize,
442
&dictionary, &dictionary_size))
445
encoder = PyImaging_EncoderNew(sizeof(ZIPSTATE));
449
if (get_packer(encoder, mode, rawmode) < 0)
452
encoder->encode = ImagingZipEncode;
454
if (rawmode[0] == 'P')
455
/* disable filtering */
456
((ZIPSTATE*)encoder->state.context)->mode = ZIP_PNG_PALETTE;
458
((ZIPSTATE*)encoder->state.context)->optimize = optimize;
459
((ZIPSTATE*)encoder->state.context)->dictionary = dictionary;
460
((ZIPSTATE*)encoder->state.context)->dictionary_size = dictionary_size;
462
return (PyObject*) encoder;
467
/* -------------------------------------------------------------------- */
469
/* -------------------------------------------------------------------- */
473
/* We better define this encoder last in this file, so the following
474
undef's won't mess things up for the Imaging library proper. */
476
#undef HAVE_PROTOTYPES
489
PyImaging_JpegEncoderNew(PyObject* self, PyObject* args)
491
ImagingEncoderObject* encoder;
499
int streamtype = 0; /* 0=interchange, 1=tables only, 2=image only */
500
int xdpi = 0, ydpi = 0;
501
int subsampling = -1; /* -1=default, 0=none, 1=medium, 2=high */
502
char* extra = NULL; int extra_size;
503
if (!PyArg_ParseTuple(args, "ss|iiiiiiiis#", &mode, &rawmode, &quality,
504
&progressive, &smooth, &optimize, &streamtype,
505
&xdpi, &ydpi, &subsampling, &extra, &extra_size))
508
encoder = PyImaging_EncoderNew(sizeof(JPEGENCODERSTATE));
512
if (get_packer(encoder, mode, rawmode) < 0)
515
if (extra && extra_size > 0) {
516
char* p = malloc(extra_size);
518
return PyErr_NoMemory();
519
memcpy(p, extra, extra_size);
524
encoder->encode = ImagingJpegEncode;
526
((JPEGENCODERSTATE*)encoder->state.context)->quality = quality;
527
((JPEGENCODERSTATE*)encoder->state.context)->subsampling = subsampling;
528
((JPEGENCODERSTATE*)encoder->state.context)->progressive = progressive;
529
((JPEGENCODERSTATE*)encoder->state.context)->smooth = smooth;
530
((JPEGENCODERSTATE*)encoder->state.context)->optimize = optimize;
531
((JPEGENCODERSTATE*)encoder->state.context)->streamtype = streamtype;
532
((JPEGENCODERSTATE*)encoder->state.context)->xdpi = xdpi;
533
((JPEGENCODERSTATE*)encoder->state.context)->ydpi = ydpi;
534
((JPEGENCODERSTATE*)encoder->state.context)->extra = extra;
535
((JPEGENCODERSTATE*)encoder->state.context)->extra_size = extra_size;
537
return (PyObject*) encoder;