encode.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256
  1. /*
  2. * The Python Imaging Library.
  3. *
  4. * standard encoder interfaces for the Imaging library
  5. *
  6. * History:
  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
  16. *
  17. * Copyright (c) 1997-2001 by Secret Labs AB
  18. * Copyright (c) 1996-1997 by Fredrik Lundh
  19. *
  20. * See the README file for information on usage and redistribution.
  21. */
  22. /* FIXME: make these pluggable! */
  23. #define PY_SSIZE_T_CLEAN
  24. #include "Python.h"
  25. #include "Imaging.h"
  26. #include "py3.h"
  27. #include "Gif.h"
  28. #ifdef HAVE_UNISTD_H
  29. #include <unistd.h> /* write */
  30. #endif
  31. /* -------------------------------------------------------------------- */
  32. /* Common */
  33. /* -------------------------------------------------------------------- */
  34. typedef struct {
  35. PyObject_HEAD
  36. int (*encode)(Imaging im, ImagingCodecState state,
  37. UINT8* buffer, int bytes);
  38. int (*cleanup)(ImagingCodecState state);
  39. struct ImagingCodecStateInstance state;
  40. Imaging im;
  41. PyObject* lock;
  42. int pushes_fd;
  43. } ImagingEncoderObject;
  44. static PyTypeObject ImagingEncoderType;
  45. static ImagingEncoderObject*
  46. PyImaging_EncoderNew(int contextsize)
  47. {
  48. ImagingEncoderObject *encoder;
  49. void *context;
  50. if(PyType_Ready(&ImagingEncoderType) < 0)
  51. return NULL;
  52. encoder = PyObject_New(ImagingEncoderObject, &ImagingEncoderType);
  53. if (encoder == NULL)
  54. return NULL;
  55. /* Clear the encoder state */
  56. memset(&encoder->state, 0, sizeof(encoder->state));
  57. /* Allocate encoder context */
  58. if (contextsize > 0) {
  59. context = (void*) calloc(1, contextsize);
  60. if (!context) {
  61. Py_DECREF(encoder);
  62. (void) PyErr_NoMemory();
  63. return NULL;
  64. }
  65. } else
  66. context = 0;
  67. /* Initialize encoder context */
  68. encoder->state.context = context;
  69. /* Most encoders don't need this */
  70. encoder->cleanup = NULL;
  71. /* Target image */
  72. encoder->lock = NULL;
  73. encoder->im = NULL;
  74. encoder->pushes_fd = 0;
  75. return encoder;
  76. }
  77. static void
  78. _dealloc(ImagingEncoderObject* encoder)
  79. {
  80. if (encoder->cleanup)
  81. encoder->cleanup(&encoder->state);
  82. free(encoder->state.buffer);
  83. free(encoder->state.context);
  84. Py_XDECREF(encoder->lock);
  85. Py_XDECREF(encoder->state.fd);
  86. PyObject_Del(encoder);
  87. }
  88. static PyObject*
  89. _encode_cleanup(ImagingEncoderObject* encoder, PyObject* args)
  90. {
  91. int status = 0;
  92. if (encoder->cleanup){
  93. status = encoder->cleanup(&encoder->state);
  94. }
  95. return Py_BuildValue("i", status);
  96. }
  97. static PyObject*
  98. _encode(ImagingEncoderObject* encoder, PyObject* args)
  99. {
  100. PyObject* buf;
  101. PyObject* result;
  102. int status;
  103. /* Encode to a Python string (allocated by this method) */
  104. Py_ssize_t bufsize = 16384;
  105. if (!PyArg_ParseTuple(args, "|n", &bufsize))
  106. return NULL;
  107. buf = PyBytes_FromStringAndSize(NULL, bufsize);
  108. if (!buf)
  109. return NULL;
  110. status = encoder->encode(encoder->im, &encoder->state,
  111. (UINT8*) PyBytes_AsString(buf), bufsize);
  112. /* adjust string length to avoid slicing in encoder */
  113. if (_PyBytes_Resize(&buf, (status > 0) ? status : 0) < 0)
  114. return NULL;
  115. result = Py_BuildValue("iiO", status, encoder->state.errcode, buf);
  116. Py_DECREF(buf); /* must release buffer!!! */
  117. return result;
  118. }
  119. static PyObject*
  120. _encode_to_pyfd(ImagingEncoderObject* encoder, PyObject* args)
  121. {
  122. PyObject *result;
  123. int status;
  124. if (!encoder->pushes_fd) {
  125. // UNDONE, appropriate errcode???
  126. result = Py_BuildValue("ii", 0, IMAGING_CODEC_CONFIG);;
  127. return result;
  128. }
  129. status = encoder->encode(encoder->im, &encoder->state,
  130. (UINT8*) NULL, 0);
  131. result = Py_BuildValue("ii", status, encoder->state.errcode);
  132. return result;
  133. }
  134. static PyObject*
  135. _encode_to_file(ImagingEncoderObject* encoder, PyObject* args)
  136. {
  137. UINT8* buf;
  138. int status;
  139. ImagingSectionCookie cookie;
  140. /* Encode to a file handle */
  141. Py_ssize_t fh;
  142. Py_ssize_t bufsize = 16384;
  143. if (!PyArg_ParseTuple(args, "n|n", &fh, &bufsize))
  144. return NULL;
  145. /* Allocate an encoder buffer */
  146. /* malloc check ok, either constant int, or checked by PyArg_ParseTuple */
  147. buf = (UINT8*) malloc(bufsize);
  148. if (!buf)
  149. return PyErr_NoMemory();
  150. ImagingSectionEnter(&cookie);
  151. do {
  152. /* This replaces the inner loop in the ImageFile _save
  153. function. */
  154. status = encoder->encode(encoder->im, &encoder->state, buf, bufsize);
  155. if (status > 0)
  156. if (write(fh, buf, status) < 0) {
  157. ImagingSectionLeave(&cookie);
  158. free(buf);
  159. return PyErr_SetFromErrno(PyExc_IOError);
  160. }
  161. } while (encoder->state.errcode == 0);
  162. ImagingSectionLeave(&cookie);
  163. free(buf);
  164. return Py_BuildValue("i", encoder->state.errcode);
  165. }
  166. extern Imaging PyImaging_AsImaging(PyObject *op);
  167. static PyObject*
  168. _setimage(ImagingEncoderObject* encoder, PyObject* args)
  169. {
  170. PyObject* op;
  171. Imaging im;
  172. ImagingCodecState state;
  173. Py_ssize_t x0, y0, x1, y1;
  174. /* Define where image data should be stored */
  175. x0 = y0 = x1 = y1 = 0;
  176. /* FIXME: should publish the ImagingType descriptor */
  177. if (!PyArg_ParseTuple(args, "O|(nnnn)", &op, &x0, &y0, &x1, &y1))
  178. return NULL;
  179. im = PyImaging_AsImaging(op);
  180. if (!im)
  181. return NULL;
  182. encoder->im = im;
  183. state = &encoder->state;
  184. if (x0 == 0 && x1 == 0) {
  185. state->xsize = im->xsize;
  186. state->ysize = im->ysize;
  187. } else {
  188. state->xoff = x0;
  189. state->yoff = y0;
  190. state->xsize = x1 - x0;
  191. state->ysize = y1 - y0;
  192. }
  193. if (state->xsize <= 0 ||
  194. state->xsize + state->xoff > im->xsize ||
  195. state->ysize <= 0 ||
  196. state->ysize + state->yoff > im->ysize) {
  197. PyErr_SetString(PyExc_SystemError, "tile cannot extend outside image");
  198. return NULL;
  199. }
  200. /* Allocate memory buffer (if bits field is set) */
  201. if (state->bits > 0) {
  202. if (state->xsize > ((INT_MAX / state->bits)-7)) {
  203. return PyErr_NoMemory();
  204. }
  205. state->bytes = (state->bits * state->xsize+7)/8;
  206. /* malloc check ok, overflow checked above */
  207. state->buffer = (UINT8*) malloc(state->bytes);
  208. if (!state->buffer)
  209. return PyErr_NoMemory();
  210. }
  211. /* Keep a reference to the image object, to make sure it doesn't
  212. go away before we do */
  213. Py_INCREF(op);
  214. Py_XDECREF(encoder->lock);
  215. encoder->lock = op;
  216. Py_INCREF(Py_None);
  217. return Py_None;
  218. }
  219. static PyObject*
  220. _setfd(ImagingEncoderObject* encoder, PyObject* args)
  221. {
  222. PyObject* fd;
  223. ImagingCodecState state;
  224. if (!PyArg_ParseTuple(args, "O", &fd))
  225. return NULL;
  226. state = &encoder->state;
  227. Py_XINCREF(fd);
  228. state->fd = fd;
  229. Py_INCREF(Py_None);
  230. return Py_None;
  231. }
  232. static PyObject *
  233. _get_pushes_fd(ImagingEncoderObject *encoder)
  234. {
  235. return PyBool_FromLong(encoder->pushes_fd);
  236. }
  237. static struct PyMethodDef methods[] = {
  238. {"encode", (PyCFunction)_encode, 1},
  239. {"cleanup", (PyCFunction)_encode_cleanup, 1},
  240. {"encode_to_file", (PyCFunction)_encode_to_file, 1},
  241. {"encode_to_pyfd", (PyCFunction)_encode_to_pyfd, 1},
  242. {"setimage", (PyCFunction)_setimage, 1},
  243. {"setfd", (PyCFunction)_setfd, 1},
  244. {NULL, NULL} /* sentinel */
  245. };
  246. static struct PyGetSetDef getseters[] = {
  247. {"pushes_fd", (getter)_get_pushes_fd, NULL,
  248. "True if this decoder expects to push directly to self.fd",
  249. NULL},
  250. {NULL, NULL, NULL, NULL, NULL} /* sentinel */
  251. };
  252. static PyTypeObject ImagingEncoderType = {
  253. PyVarObject_HEAD_INIT(NULL, 0)
  254. "ImagingEncoder", /*tp_name*/
  255. sizeof(ImagingEncoderObject), /*tp_size*/
  256. 0, /*tp_itemsize*/
  257. /* methods */
  258. (destructor)_dealloc, /*tp_dealloc*/
  259. 0, /*tp_print*/
  260. 0, /*tp_getattr*/
  261. 0, /*tp_setattr*/
  262. 0, /*tp_compare*/
  263. 0, /*tp_repr*/
  264. 0, /*tp_as_number */
  265. 0, /*tp_as_sequence */
  266. 0, /*tp_as_mapping */
  267. 0, /*tp_hash*/
  268. 0, /*tp_call*/
  269. 0, /*tp_str*/
  270. 0, /*tp_getattro*/
  271. 0, /*tp_setattro*/
  272. 0, /*tp_as_buffer*/
  273. Py_TPFLAGS_DEFAULT, /*tp_flags*/
  274. 0, /*tp_doc*/
  275. 0, /*tp_traverse*/
  276. 0, /*tp_clear*/
  277. 0, /*tp_richcompare*/
  278. 0, /*tp_weaklistoffset*/
  279. 0, /*tp_iter*/
  280. 0, /*tp_iternext*/
  281. methods, /*tp_methods*/
  282. 0, /*tp_members*/
  283. getseters, /*tp_getset*/
  284. };
  285. /* -------------------------------------------------------------------- */
  286. int
  287. get_packer(ImagingEncoderObject* encoder, const char* mode,
  288. const char* rawmode)
  289. {
  290. int bits;
  291. ImagingShuffler pack;
  292. pack = ImagingFindPacker(mode, rawmode, &bits);
  293. if (!pack) {
  294. Py_DECREF(encoder);
  295. PyErr_Format(PyExc_ValueError, "No packer found from %s to %s", mode, rawmode);
  296. return -1;
  297. }
  298. encoder->state.shuffle = pack;
  299. encoder->state.bits = bits;
  300. return 0;
  301. }
  302. /* -------------------------------------------------------------------- */
  303. /* EPS */
  304. /* -------------------------------------------------------------------- */
  305. PyObject*
  306. PyImaging_EpsEncoderNew(PyObject* self, PyObject* args)
  307. {
  308. ImagingEncoderObject* encoder;
  309. encoder = PyImaging_EncoderNew(0);
  310. if (encoder == NULL)
  311. return NULL;
  312. encoder->encode = ImagingEpsEncode;
  313. return (PyObject*) encoder;
  314. }
  315. /* -------------------------------------------------------------------- */
  316. /* GIF */
  317. /* -------------------------------------------------------------------- */
  318. PyObject*
  319. PyImaging_GifEncoderNew(PyObject* self, PyObject* args)
  320. {
  321. ImagingEncoderObject* encoder;
  322. char *mode;
  323. char *rawmode;
  324. Py_ssize_t bits = 8;
  325. Py_ssize_t interlace = 0;
  326. if (!PyArg_ParseTuple(args, "ss|nn", &mode, &rawmode, &bits, &interlace))
  327. return NULL;
  328. encoder = PyImaging_EncoderNew(sizeof(GIFENCODERSTATE));
  329. if (encoder == NULL)
  330. return NULL;
  331. if (get_packer(encoder, mode, rawmode) < 0)
  332. return NULL;
  333. encoder->encode = ImagingGifEncode;
  334. ((GIFENCODERSTATE*)encoder->state.context)->bits = bits;
  335. ((GIFENCODERSTATE*)encoder->state.context)->interlace = interlace;
  336. return (PyObject*) encoder;
  337. }
  338. /* -------------------------------------------------------------------- */
  339. /* PCX */
  340. /* -------------------------------------------------------------------- */
  341. PyObject*
  342. PyImaging_PcxEncoderNew(PyObject* self, PyObject* args)
  343. {
  344. ImagingEncoderObject* encoder;
  345. char *mode;
  346. char *rawmode;
  347. Py_ssize_t bits = 8;
  348. if (!PyArg_ParseTuple(args, "ss|n", &mode, &rawmode, &bits)) {
  349. return NULL;
  350. }
  351. encoder = PyImaging_EncoderNew(0);
  352. if (encoder == NULL) {
  353. return NULL;
  354. }
  355. if (get_packer(encoder, mode, rawmode) < 0) {
  356. return NULL;
  357. }
  358. encoder->encode = ImagingPcxEncode;
  359. return (PyObject*) encoder;
  360. }
  361. /* -------------------------------------------------------------------- */
  362. /* RAW */
  363. /* -------------------------------------------------------------------- */
  364. PyObject*
  365. PyImaging_RawEncoderNew(PyObject* self, PyObject* args)
  366. {
  367. ImagingEncoderObject* encoder;
  368. char *mode;
  369. char *rawmode;
  370. Py_ssize_t stride = 0;
  371. Py_ssize_t ystep = 1;
  372. if (!PyArg_ParseTuple(args, "ss|nn", &mode, &rawmode, &stride, &ystep))
  373. return NULL;
  374. encoder = PyImaging_EncoderNew(0);
  375. if (encoder == NULL)
  376. return NULL;
  377. if (get_packer(encoder, mode, rawmode) < 0)
  378. return NULL;
  379. encoder->encode = ImagingRawEncode;
  380. encoder->state.ystep = ystep;
  381. encoder->state.count = stride;
  382. return (PyObject*) encoder;
  383. }
  384. /* -------------------------------------------------------------------- */
  385. /* TGA */
  386. /* -------------------------------------------------------------------- */
  387. PyObject*
  388. PyImaging_TgaRleEncoderNew(PyObject* self, PyObject* args)
  389. {
  390. ImagingEncoderObject* encoder;
  391. char *mode;
  392. char *rawmode;
  393. Py_ssize_t ystep = 1;
  394. if (!PyArg_ParseTuple(args, "ss|n", &mode, &rawmode, &ystep))
  395. return NULL;
  396. encoder = PyImaging_EncoderNew(0);
  397. if (encoder == NULL)
  398. return NULL;
  399. if (get_packer(encoder, mode, rawmode) < 0)
  400. return NULL;
  401. encoder->encode = ImagingTgaRleEncode;
  402. encoder->state.ystep = ystep;
  403. return (PyObject*) encoder;
  404. }
  405. /* -------------------------------------------------------------------- */
  406. /* XBM */
  407. /* -------------------------------------------------------------------- */
  408. PyObject*
  409. PyImaging_XbmEncoderNew(PyObject* self, PyObject* args)
  410. {
  411. ImagingEncoderObject* encoder;
  412. encoder = PyImaging_EncoderNew(0);
  413. if (encoder == NULL)
  414. return NULL;
  415. if (get_packer(encoder, "1", "1;R") < 0)
  416. return NULL;
  417. encoder->encode = ImagingXbmEncode;
  418. return (PyObject*) encoder;
  419. }
  420. /* -------------------------------------------------------------------- */
  421. /* ZIP */
  422. /* -------------------------------------------------------------------- */
  423. #ifdef HAVE_LIBZ
  424. #include "Zip.h"
  425. PyObject*
  426. PyImaging_ZipEncoderNew(PyObject* self, PyObject* args)
  427. {
  428. ImagingEncoderObject* encoder;
  429. char* mode;
  430. char* rawmode;
  431. Py_ssize_t optimize = 0;
  432. Py_ssize_t compress_level = -1;
  433. Py_ssize_t compress_type = -1;
  434. char* dictionary = NULL;
  435. Py_ssize_t dictionary_size = 0;
  436. if (!PyArg_ParseTuple(args, "ss|nnn"PY_ARG_BYTES_LENGTH, &mode, &rawmode,
  437. &optimize,
  438. &compress_level, &compress_type,
  439. &dictionary, &dictionary_size))
  440. return NULL;
  441. /* Copy to avoid referencing Python's memory */
  442. if (dictionary && dictionary_size > 0) {
  443. /* malloc check ok, size comes from PyArg_ParseTuple */
  444. char* p = malloc(dictionary_size);
  445. if (!p)
  446. return PyErr_NoMemory();
  447. memcpy(p, dictionary, dictionary_size);
  448. dictionary = p;
  449. } else
  450. dictionary = NULL;
  451. encoder = PyImaging_EncoderNew(sizeof(ZIPSTATE));
  452. if (encoder == NULL) {
  453. free(dictionary);
  454. return NULL;
  455. }
  456. if (get_packer(encoder, mode, rawmode) < 0) {
  457. free(dictionary);
  458. return NULL;
  459. }
  460. encoder->encode = ImagingZipEncode;
  461. encoder->cleanup = ImagingZipEncodeCleanup;
  462. if (rawmode[0] == 'P')
  463. /* disable filtering */
  464. ((ZIPSTATE*)encoder->state.context)->mode = ZIP_PNG_PALETTE;
  465. ((ZIPSTATE*)encoder->state.context)->optimize = optimize;
  466. ((ZIPSTATE*)encoder->state.context)->compress_level = compress_level;
  467. ((ZIPSTATE*)encoder->state.context)->compress_type = compress_type;
  468. ((ZIPSTATE*)encoder->state.context)->dictionary = dictionary;
  469. ((ZIPSTATE*)encoder->state.context)->dictionary_size = dictionary_size;
  470. return (PyObject*) encoder;
  471. }
  472. #endif
  473. /* -------------------------------------------------------------------- */
  474. /* LibTiff */
  475. /* -------------------------------------------------------------------- */
  476. #ifdef HAVE_LIBTIFF
  477. #include "TiffDecode.h"
  478. #include <string.h>
  479. PyObject*
  480. PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args)
  481. {
  482. ImagingEncoderObject* encoder;
  483. char* mode;
  484. char* rawmode;
  485. char* compname;
  486. char* filename;
  487. Py_ssize_t fp;
  488. PyObject *tags, *types;
  489. PyObject *key, *value;
  490. Py_ssize_t pos = 0;
  491. int key_int, status, is_core_tag, is_var_length, num_core_tags, i;
  492. TIFFDataType type = TIFF_NOTYPE;
  493. // This list also exists in TiffTags.py
  494. const int core_tags[] = {
  495. 256, 257, 258, 259, 262, 263, 266, 269, 274, 277, 278, 280, 281, 340,
  496. 341, 282, 283, 284, 286, 287, 296, 297, 321, 338, 32995, 32998, 32996,
  497. 339, 32997, 330, 531, 530, 65537
  498. };
  499. Py_ssize_t tags_size;
  500. PyObject *item;
  501. if (! PyArg_ParseTuple(args, "sssnsOO", &mode, &rawmode, &compname, &fp, &filename, &tags, &types)) {
  502. return NULL;
  503. }
  504. if (!PyList_Check(tags)) {
  505. PyErr_SetString(PyExc_ValueError, "Invalid tags list");
  506. return NULL;
  507. } else {
  508. tags_size = PyList_Size(tags);
  509. TRACE(("tags size: %d\n", (int)tags_size));
  510. for (pos=0;pos<tags_size;pos++){
  511. item = PyList_GetItem(tags, pos);
  512. if (!PyTuple_Check(item) || PyTuple_Size(item) != 2) {
  513. PyErr_SetString(PyExc_ValueError, "Invalid tags list");
  514. return NULL;
  515. }
  516. }
  517. pos = 0;
  518. }
  519. if (!PyDict_Check(types)) {
  520. PyErr_SetString(PyExc_ValueError, "Invalid types dictionary");
  521. return NULL;
  522. }
  523. TRACE(("new tiff encoder %s fp: %d, filename: %s \n", compname, fp, filename));
  524. encoder = PyImaging_EncoderNew(sizeof(TIFFSTATE));
  525. if (encoder == NULL)
  526. return NULL;
  527. if (get_packer(encoder, mode, rawmode) < 0)
  528. return NULL;
  529. if (! ImagingLibTiffEncodeInit(&encoder->state, filename, fp)) {
  530. Py_DECREF(encoder);
  531. PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed");
  532. return NULL;
  533. }
  534. num_core_tags = sizeof(core_tags) / sizeof(int);
  535. for (pos = 0; pos < tags_size; pos++) {
  536. item = PyList_GetItem(tags, pos);
  537. // We already checked that tags is a 2-tuple list.
  538. key = PyTuple_GetItem(item, 0);
  539. key_int = (int)PyInt_AsLong(key);
  540. value = PyTuple_GetItem(item, 1);
  541. status = 0;
  542. is_core_tag = 0;
  543. is_var_length = 0;
  544. type = TIFF_NOTYPE;
  545. for (i=0; i<num_core_tags; i++) {
  546. if (core_tags[i] == key_int) {
  547. is_core_tag = 1;
  548. break;
  549. }
  550. }
  551. if (!is_core_tag) {
  552. PyObject *tag_type = PyDict_GetItem(types, key);
  553. if (tag_type) {
  554. int type_int = PyInt_AsLong(tag_type);
  555. if (type_int >= TIFF_BYTE && type_int <= TIFF_DOUBLE) {
  556. type = (TIFFDataType)type_int;
  557. }
  558. }
  559. }
  560. if (type == TIFF_NOTYPE) {
  561. // Autodetect type. Types should not be changed for backwards
  562. // compatibility.
  563. if (PyInt_Check(value)) {
  564. type = TIFF_LONG;
  565. } else if (PyFloat_Check(value)) {
  566. type = TIFF_DOUBLE;
  567. } else if (PyBytes_Check(value)) {
  568. type = TIFF_ASCII;
  569. }
  570. }
  571. if (PyBytes_Check(value) &&
  572. (type == TIFF_BYTE || type == TIFF_UNDEFINED)) {
  573. // For backwards compatibility
  574. type = TIFF_ASCII;
  575. }
  576. if (PyTuple_Check(value)) {
  577. Py_ssize_t len;
  578. len = PyTuple_Size(value);
  579. is_var_length = 1;
  580. if (!len) {
  581. continue;
  582. }
  583. if (type == TIFF_NOTYPE) {
  584. // Autodetect type based on first item. Types should not be
  585. // changed for backwards compatibility.
  586. if (PyInt_Check(PyTuple_GetItem(value,0))) {
  587. type = TIFF_LONG;
  588. } else if (PyFloat_Check(PyTuple_GetItem(value,0))) {
  589. type = TIFF_FLOAT;
  590. }
  591. }
  592. }
  593. if (!is_core_tag) {
  594. // Register field for non core tags.
  595. if (ImagingLibTiffMergeFieldInfo(&encoder->state, type, key_int, is_var_length)) {
  596. continue;
  597. }
  598. }
  599. if (is_var_length) {
  600. Py_ssize_t len,i;
  601. TRACE(("Setting from Tuple: %d \n", key_int));
  602. len = PyTuple_Size(value);
  603. if (type == TIFF_BYTE) {
  604. UINT8 *av;
  605. /* malloc check ok, calloc checks for overflow */
  606. av = calloc(len, sizeof(UINT8));
  607. if (av) {
  608. for (i=0;i<len;i++) {
  609. av[i] = (UINT8)PyInt_AsLong(PyTuple_GetItem(value,i));
  610. }
  611. status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
  612. free(av);
  613. }
  614. } else if (type == TIFF_SHORT) {
  615. UINT16 *av;
  616. /* malloc check ok, calloc checks for overflow */
  617. av = calloc(len, sizeof(UINT16));
  618. if (av) {
  619. for (i=0;i<len;i++) {
  620. av[i] = (UINT16)PyInt_AsLong(PyTuple_GetItem(value,i));
  621. }
  622. status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
  623. free(av);
  624. }
  625. } else if (type == TIFF_LONG) {
  626. UINT32 *av;
  627. /* malloc check ok, calloc checks for overflow */
  628. av = calloc(len, sizeof(UINT32));
  629. if (av) {
  630. for (i=0;i<len;i++) {
  631. av[i] = (UINT32)PyInt_AsLong(PyTuple_GetItem(value,i));
  632. }
  633. status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
  634. free(av);
  635. }
  636. } else if (type == TIFF_SBYTE) {
  637. INT8 *av;
  638. /* malloc check ok, calloc checks for overflow */
  639. av = calloc(len, sizeof(INT8));
  640. if (av) {
  641. for (i=0;i<len;i++) {
  642. av[i] = (INT8)PyInt_AsLong(PyTuple_GetItem(value,i));
  643. }
  644. status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
  645. free(av);
  646. }
  647. } else if (type == TIFF_SSHORT) {
  648. INT16 *av;
  649. /* malloc check ok, calloc checks for overflow */
  650. av = calloc(len, sizeof(INT16));
  651. if (av) {
  652. for (i=0;i<len;i++) {
  653. av[i] = (INT16)PyInt_AsLong(PyTuple_GetItem(value,i));
  654. }
  655. status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
  656. free(av);
  657. }
  658. } else if (type == TIFF_SLONG) {
  659. INT32 *av;
  660. /* malloc check ok, calloc checks for overflow */
  661. av = calloc(len, sizeof(INT32));
  662. if (av) {
  663. for (i=0;i<len;i++) {
  664. av[i] = (INT32)PyInt_AsLong(PyTuple_GetItem(value,i));
  665. }
  666. status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
  667. free(av);
  668. }
  669. } else if (type == TIFF_FLOAT) {
  670. FLOAT32 *av;
  671. /* malloc check ok, calloc checks for overflow */
  672. av = calloc(len, sizeof(FLOAT32));
  673. if (av) {
  674. for (i=0;i<len;i++) {
  675. av[i] = (FLOAT32)PyFloat_AsDouble(PyTuple_GetItem(value,i));
  676. }
  677. status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
  678. free(av);
  679. }
  680. } else if (type == TIFF_DOUBLE) {
  681. FLOAT64 *av;
  682. /* malloc check ok, calloc checks for overflow */
  683. av = calloc(len, sizeof(FLOAT64));
  684. if (av) {
  685. for (i=0;i<len;i++) {
  686. av[i] = PyFloat_AsDouble(PyTuple_GetItem(value,i));
  687. }
  688. status = ImagingLibTiffSetField(&encoder->state, (ttag_t) key_int, len, av);
  689. free(av);
  690. }
  691. }
  692. } else {
  693. if (type == TIFF_SHORT) {
  694. status = ImagingLibTiffSetField(&encoder->state,
  695. (ttag_t) key_int,
  696. (UINT16)PyInt_AsLong(value));
  697. } else if (type == TIFF_LONG) {
  698. status = ImagingLibTiffSetField(&encoder->state,
  699. (ttag_t) key_int,
  700. (UINT32)PyInt_AsLong(value));
  701. } else if (type == TIFF_SSHORT) {
  702. status = ImagingLibTiffSetField(&encoder->state,
  703. (ttag_t) key_int,
  704. (INT16)PyInt_AsLong(value));
  705. } else if (type == TIFF_SLONG) {
  706. status = ImagingLibTiffSetField(&encoder->state,
  707. (ttag_t) key_int,
  708. (INT32)PyInt_AsLong(value));
  709. } else if (type == TIFF_FLOAT) {
  710. status = ImagingLibTiffSetField(&encoder->state,
  711. (ttag_t) key_int,
  712. (FLOAT32)PyFloat_AsDouble(value));
  713. } else if (type == TIFF_DOUBLE) {
  714. status = ImagingLibTiffSetField(&encoder->state,
  715. (ttag_t) key_int,
  716. (FLOAT64)PyFloat_AsDouble(value));
  717. } else if (type == TIFF_BYTE) {
  718. status = ImagingLibTiffSetField(&encoder->state,
  719. (ttag_t) key_int,
  720. (UINT8)PyInt_AsLong(value));
  721. } else if (type == TIFF_SBYTE) {
  722. status = ImagingLibTiffSetField(&encoder->state,
  723. (ttag_t) key_int,
  724. (INT8)PyInt_AsLong(value));
  725. } else if (type == TIFF_ASCII) {
  726. status = ImagingLibTiffSetField(&encoder->state,
  727. (ttag_t) key_int,
  728. PyBytes_AsString(value));
  729. } else if (type == TIFF_RATIONAL) {
  730. status = ImagingLibTiffSetField(&encoder->state,
  731. (ttag_t) key_int,
  732. (FLOAT64)PyFloat_AsDouble(value));
  733. } else {
  734. TRACE(("Unhandled type for key %d : %s \n",
  735. key_int,
  736. PyBytes_AsString(PyObject_Str(value))));
  737. }
  738. }
  739. if (!status) {
  740. TRACE(("Error setting Field\n"));
  741. Py_DECREF(encoder);
  742. PyErr_SetString(PyExc_RuntimeError, "Error setting from dictionary");
  743. return NULL;
  744. }
  745. }
  746. encoder->encode = ImagingLibTiffEncode;
  747. return (PyObject*) encoder;
  748. }
  749. #endif
  750. /* -------------------------------------------------------------------- */
  751. /* JPEG */
  752. /* -------------------------------------------------------------------- */
  753. #ifdef HAVE_LIBJPEG
  754. /* We better define this encoder last in this file, so the following
  755. undef's won't mess things up for the Imaging library proper. */
  756. #undef HAVE_PROTOTYPES
  757. #undef HAVE_STDDEF_H
  758. #undef HAVE_STDLIB_H
  759. #undef UINT8
  760. #undef UINT16
  761. #undef UINT32
  762. #undef INT8
  763. #undef INT16
  764. #undef INT32
  765. #include "Jpeg.h"
  766. static unsigned int* get_qtables_arrays(PyObject* qtables, int* qtablesLen) {
  767. PyObject* tables;
  768. PyObject* table;
  769. PyObject* table_data;
  770. int i, j, num_tables;
  771. unsigned int *qarrays;
  772. if ((qtables == NULL) || (qtables == Py_None)) {
  773. return NULL;
  774. }
  775. if (!PySequence_Check(qtables)) {
  776. PyErr_SetString(PyExc_ValueError, "Invalid quantization tables");
  777. return NULL;
  778. }
  779. tables = PySequence_Fast(qtables, "expected a sequence");
  780. num_tables = PySequence_Size(qtables);
  781. if (num_tables < 1 || num_tables > NUM_QUANT_TBLS) {
  782. PyErr_SetString(PyExc_ValueError,
  783. "Not a valid number of quantization tables. Should be between 1 and 4.");
  784. Py_DECREF(tables);
  785. return NULL;
  786. }
  787. /* malloc check ok, num_tables <4, DCTSIZE2 == 64 from jpeglib.h */
  788. qarrays = (unsigned int*) malloc(num_tables * DCTSIZE2 * sizeof(unsigned int));
  789. if (!qarrays) {
  790. Py_DECREF(tables);
  791. PyErr_NoMemory();
  792. return NULL;
  793. }
  794. for (i = 0; i < num_tables; i++) {
  795. table = PySequence_Fast_GET_ITEM(tables, i);
  796. if (!PySequence_Check(table)) {
  797. PyErr_SetString(PyExc_ValueError, "Invalid quantization tables");
  798. goto JPEG_QTABLES_ERR;
  799. }
  800. if (PySequence_Size(table) != DCTSIZE2) {
  801. PyErr_SetString(PyExc_ValueError, "Invalid quantization table size");
  802. goto JPEG_QTABLES_ERR;
  803. }
  804. table_data = PySequence_Fast(table, "expected a sequence");
  805. for (j = 0; j < DCTSIZE2; j++) {
  806. qarrays[i * DCTSIZE2 + j] = PyInt_AS_LONG(PySequence_Fast_GET_ITEM(table_data, j));
  807. }
  808. Py_DECREF(table_data);
  809. }
  810. *qtablesLen = num_tables;
  811. JPEG_QTABLES_ERR:
  812. Py_DECREF(tables); // Run on both error and not error
  813. if (PyErr_Occurred()) {
  814. free(qarrays);
  815. qarrays = NULL;
  816. return NULL;
  817. }
  818. return qarrays;
  819. }
  820. PyObject*
  821. PyImaging_JpegEncoderNew(PyObject* self, PyObject* args)
  822. {
  823. ImagingEncoderObject* encoder;
  824. char *mode;
  825. char *rawmode;
  826. Py_ssize_t quality = 0;
  827. Py_ssize_t progressive = 0;
  828. Py_ssize_t smooth = 0;
  829. Py_ssize_t optimize = 0;
  830. Py_ssize_t streamtype = 0; /* 0=interchange, 1=tables only, 2=image only */
  831. Py_ssize_t xdpi = 0, ydpi = 0;
  832. Py_ssize_t subsampling = -1; /* -1=default, 0=none, 1=medium, 2=high */
  833. PyObject* qtables=NULL;
  834. unsigned int *qarrays = NULL;
  835. int qtablesLen = 0;
  836. char* extra = NULL;
  837. Py_ssize_t extra_size;
  838. char* rawExif = NULL;
  839. Py_ssize_t rawExifLen = 0;
  840. if (!PyArg_ParseTuple(args, "ss|nnnnnnnnO"PY_ARG_BYTES_LENGTH""PY_ARG_BYTES_LENGTH,
  841. &mode, &rawmode, &quality,
  842. &progressive, &smooth, &optimize, &streamtype,
  843. &xdpi, &ydpi, &subsampling, &qtables, &extra, &extra_size,
  844. &rawExif, &rawExifLen))
  845. return NULL;
  846. encoder = PyImaging_EncoderNew(sizeof(JPEGENCODERSTATE));
  847. if (encoder == NULL)
  848. return NULL;
  849. // libjpeg-turbo supports different output formats.
  850. // We are choosing Pillow's native format (3 color bytes + 1 padding)
  851. // to avoid extra conversion in Pack.c.
  852. if (ImagingJpegUseJCSExtensions() && strcmp(rawmode, "RGB") == 0) {
  853. rawmode = "RGBX";
  854. }
  855. if (get_packer(encoder, mode, rawmode) < 0)
  856. return NULL;
  857. // Freed in JpegEncode, Case 5
  858. qarrays = get_qtables_arrays(qtables, &qtablesLen);
  859. if (extra && extra_size > 0) {
  860. /* malloc check ok, length is from python parsearg */
  861. char* p = malloc(extra_size); // Freed in JpegEncode, Case 5
  862. if (!p)
  863. return PyErr_NoMemory();
  864. memcpy(p, extra, extra_size);
  865. extra = p;
  866. } else
  867. extra = NULL;
  868. if (rawExif && rawExifLen > 0) {
  869. /* malloc check ok, length is from python parsearg */
  870. char* pp = malloc(rawExifLen); // Freed in JpegEncode, Case 5
  871. if (!pp) {
  872. if (extra) free(extra);
  873. return PyErr_NoMemory();
  874. }
  875. memcpy(pp, rawExif, rawExifLen);
  876. rawExif = pp;
  877. } else
  878. rawExif = NULL;
  879. encoder->encode = ImagingJpegEncode;
  880. strncpy(((JPEGENCODERSTATE*)encoder->state.context)->rawmode, rawmode, 8);
  881. ((JPEGENCODERSTATE*)encoder->state.context)->quality = quality;
  882. ((JPEGENCODERSTATE*)encoder->state.context)->qtables = qarrays;
  883. ((JPEGENCODERSTATE*)encoder->state.context)->qtablesLen = qtablesLen;
  884. ((JPEGENCODERSTATE*)encoder->state.context)->subsampling = subsampling;
  885. ((JPEGENCODERSTATE*)encoder->state.context)->progressive = progressive;
  886. ((JPEGENCODERSTATE*)encoder->state.context)->smooth = smooth;
  887. ((JPEGENCODERSTATE*)encoder->state.context)->optimize = optimize;
  888. ((JPEGENCODERSTATE*)encoder->state.context)->streamtype = streamtype;
  889. ((JPEGENCODERSTATE*)encoder->state.context)->xdpi = xdpi;
  890. ((JPEGENCODERSTATE*)encoder->state.context)->ydpi = ydpi;
  891. ((JPEGENCODERSTATE*)encoder->state.context)->extra = extra;
  892. ((JPEGENCODERSTATE*)encoder->state.context)->extra_size = extra_size;
  893. ((JPEGENCODERSTATE*)encoder->state.context)->rawExif = rawExif;
  894. ((JPEGENCODERSTATE*)encoder->state.context)->rawExifLen = rawExifLen;
  895. return (PyObject*) encoder;
  896. }
  897. #endif
  898. /* -------------------------------------------------------------------- */
  899. /* JPEG 2000 */
  900. /* -------------------------------------------------------------------- */
  901. #ifdef HAVE_OPENJPEG
  902. #include "Jpeg2K.h"
  903. static void
  904. j2k_decode_coord_tuple(PyObject *tuple, int *x, int *y)
  905. {
  906. *x = *y = 0;
  907. if (tuple && PyTuple_Check(tuple) && PyTuple_GET_SIZE(tuple) == 2) {
  908. *x = (int)PyInt_AsLong(PyTuple_GET_ITEM(tuple, 0));
  909. *y = (int)PyInt_AsLong(PyTuple_GET_ITEM(tuple, 1));
  910. if (*x < 0)
  911. *x = 0;
  912. if (*y < 0)
  913. *y = 0;
  914. }
  915. }
  916. PyObject*
  917. PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args)
  918. {
  919. ImagingEncoderObject *encoder;
  920. JPEG2KENCODESTATE *context;
  921. char *mode;
  922. char *format;
  923. OPJ_CODEC_FORMAT codec_format;
  924. PyObject *offset = NULL, *tile_offset = NULL, *tile_size = NULL;
  925. char *quality_mode = "rates";
  926. PyObject *quality_layers = NULL;
  927. Py_ssize_t num_resolutions = 0;
  928. PyObject *cblk_size = NULL, *precinct_size = NULL;
  929. PyObject *irreversible = NULL;
  930. char *progression = "LRCP";
  931. OPJ_PROG_ORDER prog_order;
  932. char *cinema_mode = "no";
  933. OPJ_CINEMA_MODE cine_mode;
  934. Py_ssize_t fd = -1;
  935. if (!PyArg_ParseTuple(args, "ss|OOOsOnOOOssn", &mode, &format,
  936. &offset, &tile_offset, &tile_size,
  937. &quality_mode, &quality_layers, &num_resolutions,
  938. &cblk_size, &precinct_size,
  939. &irreversible, &progression, &cinema_mode,
  940. &fd))
  941. return NULL;
  942. if (strcmp (format, "j2k") == 0)
  943. codec_format = OPJ_CODEC_J2K;
  944. else if (strcmp (format, "jpt") == 0)
  945. codec_format = OPJ_CODEC_JPT;
  946. else if (strcmp (format, "jp2") == 0)
  947. codec_format = OPJ_CODEC_JP2;
  948. else
  949. return NULL;
  950. if (strcmp(progression, "LRCP") == 0)
  951. prog_order = OPJ_LRCP;
  952. else if (strcmp(progression, "RLCP") == 0)
  953. prog_order = OPJ_RLCP;
  954. else if (strcmp(progression, "RPCL") == 0)
  955. prog_order = OPJ_RPCL;
  956. else if (strcmp(progression, "PCRL") == 0)
  957. prog_order = OPJ_PCRL;
  958. else if (strcmp(progression, "CPRL") == 0)
  959. prog_order = OPJ_CPRL;
  960. else
  961. return NULL;
  962. if (strcmp(cinema_mode, "no") == 0)
  963. cine_mode = OPJ_OFF;
  964. else if (strcmp(cinema_mode, "cinema2k-24") == 0)
  965. cine_mode = OPJ_CINEMA2K_24;
  966. else if (strcmp(cinema_mode, "cinema2k-48") == 0)
  967. cine_mode = OPJ_CINEMA2K_48;
  968. else if (strcmp(cinema_mode, "cinema4k-24") == 0)
  969. cine_mode = OPJ_CINEMA4K_24;
  970. else
  971. return NULL;
  972. encoder = PyImaging_EncoderNew(sizeof(JPEG2KENCODESTATE));
  973. if (!encoder)
  974. return NULL;
  975. encoder->encode = ImagingJpeg2KEncode;
  976. encoder->cleanup = ImagingJpeg2KEncodeCleanup;
  977. encoder->pushes_fd = 1;
  978. context = (JPEG2KENCODESTATE *)encoder->state.context;
  979. context->fd = fd;
  980. context->format = codec_format;
  981. context->offset_x = context->offset_y = 0;
  982. j2k_decode_coord_tuple(offset, &context->offset_x, &context->offset_y);
  983. j2k_decode_coord_tuple(tile_offset,
  984. &context->tile_offset_x,
  985. &context->tile_offset_y);
  986. j2k_decode_coord_tuple(tile_size,
  987. &context->tile_size_x,
  988. &context->tile_size_y);
  989. /* Error on illegal tile offsets */
  990. if (context->tile_size_x && context->tile_size_y) {
  991. if (context->tile_offset_x <= context->offset_x - context->tile_size_x
  992. || context->tile_offset_y <= context->offset_y - context->tile_size_y) {
  993. PyErr_SetString(PyExc_ValueError,
  994. "JPEG 2000 tile offset too small; top left tile must "
  995. "intersect image area");
  996. Py_DECREF(encoder);
  997. return NULL;
  998. }
  999. if (context->tile_offset_x > context->offset_x
  1000. || context->tile_offset_y > context->offset_y) {
  1001. PyErr_SetString(PyExc_ValueError,
  1002. "JPEG 2000 tile offset too large to cover image area");
  1003. Py_DECREF(encoder);
  1004. return NULL;
  1005. }
  1006. }
  1007. if (quality_layers && PySequence_Check(quality_layers)) {
  1008. context->quality_is_in_db = strcmp (quality_mode, "dB") == 0;
  1009. context->quality_layers = quality_layers;
  1010. Py_INCREF(quality_layers);
  1011. }
  1012. context->num_resolutions = num_resolutions;
  1013. j2k_decode_coord_tuple(cblk_size,
  1014. &context->cblk_width,
  1015. &context->cblk_height);
  1016. j2k_decode_coord_tuple(precinct_size,
  1017. &context->precinct_width,
  1018. &context->precinct_height);
  1019. context->irreversible = PyObject_IsTrue(irreversible);
  1020. context->progression = prog_order;
  1021. context->cinema_mode = cine_mode;
  1022. return (PyObject *)encoder;
  1023. }
  1024. #endif
  1025. /*
  1026. * Local Variables:
  1027. * c-basic-offset: 4
  1028. * End:
  1029. *
  1030. */