1/*
2LodePNG version 20131222
3
4Copyright (c) 2005-2013 Lode Vandevenne
5
6This software is provided 'as-is', without any express or implied
7warranty. In no event will the authors be held liable for any damages
8arising from the use of this software.
9
10Permission is granted to anyone to use this software for any purpose,
11including commercial applications, and to alter it and redistribute it
12freely, subject to the following restrictions:
13
14    1. The origin of this software must not be misrepresented; you must not
15    claim that you wrote the original software. If you use this software
16    in a product, an acknowledgment in the product documentation would be
17    appreciated but is not required.
18
19    2. Altered source versions must be plainly marked as such, and must not be
20    misrepresented as being the original software.
21
22    3. This notice may not be removed or altered from any source
23    distribution.
24*/
25
26/*
27The manual and changelog are in the header file "lodepng.h"
28Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C.
29*/
30
31#include "lodepng.h"
32
33#include <stdio.h>
34#include <stdlib.h>
35
36#ifdef LODEPNG_COMPILE_CPP
37#include <fstream>
38#endif /*LODEPNG_COMPILE_CPP*/
39
40#define VERSION_STRING "20131222"
41
42/*
43This source file is built up in the following large parts. The code sections
44with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way.
45-Tools for C and common code for PNG and Zlib
46-C Code for Zlib (huffman, deflate, ...)
47-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...)
48-The C++ wrapper around all of the above
49*/
50
51/*The malloc, realloc and free functions defined here with "lodepng_" in front
52of the name, so that you can easily change them to others related to your
53platform if needed. Everything else in the code calls these. Pass
54-DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out
55#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and
56define them in your own project's source files without needing to change
57lodepng source code. Don't forget to remove "static" if you copypaste them
58from here.*/
59
60#ifdef LODEPNG_COMPILE_ALLOCATORS
61static void* lodepng_malloc(size_t size)
62{
63  return malloc(size);
64}
65
66static void* lodepng_realloc(void* ptr, size_t new_size)
67{
68  return realloc(ptr, new_size);
69}
70
71static void lodepng_free(void* ptr)
72{
73  free(ptr);
74}
75#else /*LODEPNG_COMPILE_ALLOCATORS*/
76void* lodepng_malloc(size_t size);
77void* lodepng_realloc(void* ptr, size_t new_size);
78void lodepng_free(void* ptr);
79#endif /*LODEPNG_COMPILE_ALLOCATORS*/
80
81/* ////////////////////////////////////////////////////////////////////////// */
82/* ////////////////////////////////////////////////////////////////////////// */
83/* // Tools for C, and common code for PNG and Zlib.                       // */
84/* ////////////////////////////////////////////////////////////////////////// */
85/* ////////////////////////////////////////////////////////////////////////// */
86
87/*
88Often in case of an error a value is assigned to a variable and then it breaks
89out of a loop (to go to the cleanup phase of a function). This macro does that.
90It makes the error handling code shorter and more readable.
91
92Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83);
93*/
94#define CERROR_BREAK(errorvar, code)\
95{\
96  errorvar = code;\
97  break;\
98}
99
100/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/
101#define ERROR_BREAK(code) CERROR_BREAK(error, code)
102
103/*Set error var to the error code, and return it.*/
104#define CERROR_RETURN_ERROR(errorvar, code)\
105{\
106  errorvar = code;\
107  return code;\
108}
109
110/*Try the code, if it returns error, also return the error.*/
111#define CERROR_TRY_RETURN(call)\
112{\
113  unsigned error = call;\
114  if(error) return error;\
115}
116
117/*
118About uivector, ucvector and string:
119-All of them wrap dynamic arrays or text strings in a similar way.
120-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version.
121-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated.
122-They're not used in the interface, only internally in this file as static functions.
123-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor.
124*/
125
126#ifdef LODEPNG_COMPILE_ZLIB
127/*dynamic vector of unsigned ints*/
128typedef struct uivector
129{
130  unsigned* data;
131  size_t size; /*size in number of unsigned longs*/
132  size_t allocsize; /*allocated size in bytes*/
133} uivector;
134
135static void uivector_cleanup(void* p)
136{
137  ((uivector*)p)->size = ((uivector*)p)->allocsize = 0;
138  lodepng_free(((uivector*)p)->data);
139  ((uivector*)p)->data = NULL;
140}
141
142/*returns 1 if success, 0 if failure ==> nothing done*/
143static unsigned uivector_resize(uivector* p, size_t size)
144{
145  if(size * sizeof(unsigned) > p->allocsize)
146  {
147    size_t newsize = size * sizeof(unsigned) * 2;
148    void* data = lodepng_realloc(p->data, newsize);
149    if(data)
150    {
151      p->allocsize = newsize;
152      p->data = (unsigned*)data;
153      p->size = size;
154    }
155    else return 0;
156  }
157  else p->size = size;
158  return 1;
159}
160
161/*resize and give all new elements the value*/
162static unsigned uivector_resizev(uivector* p, size_t size, unsigned value)
163{
164  size_t oldsize = p->size, i;
165  if(!uivector_resize(p, size)) return 0;
166  for(i = oldsize; i < size; i++) p->data[i] = value;
167  return 1;
168}
169
170static void uivector_init(uivector* p)
171{
172  p->data = NULL;
173  p->size = p->allocsize = 0;
174}
175
176#ifdef LODEPNG_COMPILE_ENCODER
177/*returns 1 if success, 0 if failure ==> nothing done*/
178static unsigned uivector_push_back(uivector* p, unsigned c)
179{
180  if(!uivector_resize(p, p->size + 1)) return 0;
181  p->data[p->size - 1] = c;
182  return 1;
183}
184
185/*copy q to p, returns 1 if success, 0 if failure ==> nothing done*/
186static unsigned uivector_copy(uivector* p, const uivector* q)
187{
188  size_t i;
189  if(!uivector_resize(p, q->size)) return 0;
190  for(i = 0; i < q->size; i++) p->data[i] = q->data[i];
191  return 1;
192}
193#endif /*LODEPNG_COMPILE_ENCODER*/
194#endif /*LODEPNG_COMPILE_ZLIB*/
195
196/* /////////////////////////////////////////////////////////////////////////// */
197
198/*dynamic vector of unsigned chars*/
199typedef struct ucvector
200{
201  unsigned char* data;
202  size_t size; /*used size*/
203  size_t allocsize; /*allocated size*/
204} ucvector;
205
206/*returns 1 if success, 0 if failure ==> nothing done*/
207static unsigned ucvector_resize(ucvector* p, size_t size)
208{
209  if(size * sizeof(unsigned char) > p->allocsize)
210  {
211    size_t newsize = size * sizeof(unsigned char) * 2;
212    void* data = lodepng_realloc(p->data, newsize);
213    if(data)
214    {
215      p->allocsize = newsize;
216      p->data = (unsigned char*)data;
217      p->size = size;
218    }
219    else return 0; /*error: not enough memory*/
220  }
221  else p->size = size;
222  return 1;
223}
224
225#ifdef LODEPNG_COMPILE_PNG
226
227static void ucvector_cleanup(void* p)
228{
229  ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0;
230  lodepng_free(((ucvector*)p)->data);
231  ((ucvector*)p)->data = NULL;
232}
233
234static void ucvector_init(ucvector* p)
235{
236  p->data = NULL;
237  p->size = p->allocsize = 0;
238}
239
240#ifdef LODEPNG_COMPILE_DECODER
241/*resize and give all new elements the value*/
242static unsigned ucvector_resizev(ucvector* p, size_t size, unsigned char value)
243{
244  size_t oldsize = p->size, i;
245  if(!ucvector_resize(p, size)) return 0;
246  for(i = oldsize; i < size; i++) p->data[i] = value;
247  return 1;
248}
249#endif /*LODEPNG_COMPILE_DECODER*/
250#endif /*LODEPNG_COMPILE_PNG*/
251
252#ifdef LODEPNG_COMPILE_ZLIB
253/*you can both convert from vector to buffer&size and vica versa. If you use
254init_buffer to take over a buffer and size, it is not needed to use cleanup*/
255static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size)
256{
257  p->data = buffer;
258  p->allocsize = p->size = size;
259}
260#endif /*LODEPNG_COMPILE_ZLIB*/
261
262#if (defined(LODEPNG_COMPILE_PNG) && defined(LODEPNG_COMPILE_ANCILLARY_CHUNKS)) || defined(LODEPNG_COMPILE_ENCODER)
263/*returns 1 if success, 0 if failure ==> nothing done*/
264static unsigned ucvector_push_back(ucvector* p, unsigned char c)
265{
266  if(!ucvector_resize(p, p->size + 1)) return 0;
267  p->data[p->size - 1] = c;
268  return 1;
269}
270#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/
271
272
273/* ////////////////////////////////////////////////////////////////////////// */
274
275#ifdef LODEPNG_COMPILE_PNG
276#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
277/*returns 1 if success, 0 if failure ==> nothing done*/
278static unsigned string_resize(char** out, size_t size)
279{
280  char* data = (char*)lodepng_realloc(*out, size + 1);
281  if(data)
282  {
283    data[size] = 0; /*null termination char*/
284    *out = data;
285  }
286  return data != 0;
287}
288
289/*init a {char*, size_t} pair for use as string*/
290static void string_init(char** out)
291{
292  *out = NULL;
293  string_resize(out, 0);
294}
295
296/*free the above pair again*/
297static void string_cleanup(char** out)
298{
299  lodepng_free(*out);
300  *out = NULL;
301}
302
303static void string_set(char** out, const char* in)
304{
305  size_t insize = strlen(in), i = 0;
306  if(string_resize(out, insize))
307  {
308    for(i = 0; i < insize; i++)
309    {
310      (*out)[i] = in[i];
311    }
312  }
313}
314#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
315#endif /*LODEPNG_COMPILE_PNG*/
316
317/* ////////////////////////////////////////////////////////////////////////// */
318
319unsigned lodepng_read32bitInt(const unsigned char* buffer)
320{
321  return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];
322}
323
324#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)
325/*buffer must have at least 4 allocated bytes available*/
326static void lodepng_set32bitInt(unsigned char* buffer, unsigned value)
327{
328  buffer[0] = (unsigned char)((value >> 24) & 0xff);
329  buffer[1] = (unsigned char)((value >> 16) & 0xff);
330  buffer[2] = (unsigned char)((value >>  8) & 0xff);
331  buffer[3] = (unsigned char)((value      ) & 0xff);
332}
333#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/
334
335#ifdef LODEPNG_COMPILE_ENCODER
336static void lodepng_add32bitInt(ucvector* buffer, unsigned value)
337{
338  ucvector_resize(buffer, buffer->size + 4); /*todo: give error if resize failed*/
339  lodepng_set32bitInt(&buffer->data[buffer->size - 4], value);
340}
341#endif /*LODEPNG_COMPILE_ENCODER*/
342
343/* ////////////////////////////////////////////////////////////////////////// */
344/* / File IO                                                                / */
345/* ////////////////////////////////////////////////////////////////////////// */
346
347#ifdef LODEPNG_COMPILE_DISK
348
349unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename)
350{
351  FILE* file;
352  long size;
353
354  /*provide some proper output values if error will happen*/
355  *out = 0;
356  *outsize = 0;
357
358  file = fopen(filename, "rb");
359  if(!file) return 78;
360
361  /*get filesize:*/
362  fseek(file , 0 , SEEK_END);
363  size = ftell(file);
364  rewind(file);
365
366  /*read contents of the file into the vector*/
367  *outsize = 0;
368  *out = (unsigned char*)lodepng_malloc((size_t)size);
369  if(size && (*out)) (*outsize) = fread(*out, 1, (size_t)size, file);
370
371  fclose(file);
372  if(!(*out) && size) return 83; /*the above malloc failed*/
373  return 0;
374}
375
376/*write given buffer to the file, overwriting the file, it doesn't append to it.*/
377unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename)
378{
379  FILE* file;
380  file = fopen(filename, "wb" );
381  if(!file) return 79;
382  fwrite((char*)buffer , 1 , buffersize, file);
383  fclose(file);
384  return 0;
385}
386
387#endif /*LODEPNG_COMPILE_DISK*/
388
389/* ////////////////////////////////////////////////////////////////////////// */
390/* ////////////////////////////////////////////////////////////////////////// */
391/* // End of common code and tools. Begin of Zlib related code.            // */
392/* ////////////////////////////////////////////////////////////////////////// */
393/* ////////////////////////////////////////////////////////////////////////// */
394
395#ifdef LODEPNG_COMPILE_ZLIB
396#ifdef LODEPNG_COMPILE_ENCODER
397/*TODO: this ignores potential out of memory errors*/
398#define addBitToStream(/*size_t**/ bitpointer, /*ucvector**/ bitstream, /*unsigned char*/ bit)\
399{\
400  /*add a new byte at the end*/\
401  if(((*bitpointer) & 7) == 0) ucvector_push_back(bitstream, (unsigned char)0);\
402  /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/\
403  (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7));\
404  (*bitpointer)++;\
405}
406
407static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits)
408{
409  size_t i;
410  for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1));
411}
412
413static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits)
414{
415  size_t i;
416  for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1));
417}
418#endif /*LODEPNG_COMPILE_ENCODER*/
419
420#ifdef LODEPNG_COMPILE_DECODER
421
422#define READBIT(bitpointer, bitstream) ((bitstream[bitpointer >> 3] >> (bitpointer & 0x7)) & (unsigned char)1)
423
424static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream)
425{
426  unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream));
427  (*bitpointer)++;
428  return result;
429}
430
431static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits)
432{
433  unsigned result = 0, i;
434  for(i = 0; i < nbits; i++)
435  {
436    result += ((unsigned)READBIT(*bitpointer, bitstream)) << i;
437    (*bitpointer)++;
438  }
439  return result;
440}
441#endif /*LODEPNG_COMPILE_DECODER*/
442
443/* ////////////////////////////////////////////////////////////////////////// */
444/* / Deflate - Huffman                                                      / */
445/* ////////////////////////////////////////////////////////////////////////// */
446
447#define FIRST_LENGTH_CODE_INDEX 257
448#define LAST_LENGTH_CODE_INDEX 285
449/*256 literals, the end code, some length codes, and 2 unused codes*/
450#define NUM_DEFLATE_CODE_SYMBOLS 288
451/*the distance codes have their own symbols, 30 used, 2 unused*/
452#define NUM_DISTANCE_SYMBOLS 32
453/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/
454#define NUM_CODE_LENGTH_CODES 19
455
456/*the base lengths represented by codes 257-285*/
457static const unsigned LENGTHBASE[29]
458  = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59,
459     67, 83, 99, 115, 131, 163, 195, 227, 258};
460
461/*the extra bits used by codes 257-285 (added to base length)*/
462static const unsigned LENGTHEXTRA[29]
463  = {0, 0, 0, 0, 0, 0, 0,  0,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,
464      4,  4,  4,   4,   5,   5,   5,   5,   0};
465
466/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/
467static const unsigned DISTANCEBASE[30]
468  = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513,
469     769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577};
470
471/*the extra bits of backwards distances (added to base)*/
472static const unsigned DISTANCEEXTRA[30]
473  = {0, 0, 0, 0, 1, 1, 2,  2,  3,  3,  4,  4,  5,  5,   6,   6,   7,   7,   8,
474       8,    9,    9,   10,   10,   11,   11,   12,    12,    13,    13};
475
476/*the order in which "code length alphabet code lengths" are stored, out of this
477the huffman tree of the dynamic huffman tree lengths is generated*/
478static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES]
479  = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
480
481/* ////////////////////////////////////////////////////////////////////////// */
482
483/*
484Huffman tree struct, containing multiple representations of the tree
485*/
486typedef struct HuffmanTree
487{
488  unsigned* tree2d;
489  unsigned* tree1d;
490  unsigned* lengths; /*the lengths of the codes of the 1d-tree*/
491  unsigned maxbitlen; /*maximum number of bits a single code can get*/
492  unsigned numcodes; /*number of symbols in the alphabet = number of codes*/
493} HuffmanTree;
494
495/*function used for debug purposes to draw the tree in ascii art with C++*/
496/*
497static void HuffmanTree_draw(HuffmanTree* tree)
498{
499  std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl;
500  for(size_t i = 0; i < tree->tree1d.size; i++)
501  {
502    if(tree->lengths.data[i])
503      std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl;
504  }
505  std::cout << std::endl;
506}*/
507
508static void HuffmanTree_init(HuffmanTree* tree)
509{
510  tree->tree2d = 0;
511  tree->tree1d = 0;
512  tree->lengths = 0;
513}
514
515static void HuffmanTree_cleanup(HuffmanTree* tree)
516{
517  lodepng_free(tree->tree2d);
518  lodepng_free(tree->tree1d);
519  lodepng_free(tree->lengths);
520}
521
522/*the tree representation used by the decoder. return value is error*/
523static unsigned HuffmanTree_make2DTree(HuffmanTree* tree)
524{
525  unsigned nodefilled = 0; /*up to which node it is filled*/
526  unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/
527  unsigned n, i;
528
529  tree->tree2d = (unsigned*)lodepng_malloc(tree->numcodes * 2 * sizeof(unsigned));
530  if(!tree->tree2d) return 83; /*alloc fail*/
531
532  /*
533  convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means
534  uninited, a value >= numcodes is an address to another bit, a value < numcodes
535  is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as
536  many columns as codes - 1.
537  A good huffmann tree has N * 2 - 1 nodes, of which N - 1 are internal nodes.
538  Here, the internal nodes are stored (what their 0 and 1 option point to).
539  There is only memory for such good tree currently, if there are more nodes
540  (due to too long length codes), error 55 will happen
541  */
542  for(n = 0; n < tree->numcodes * 2; n++)
543  {
544    tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/
545  }
546
547  for(n = 0; n < tree->numcodes; n++) /*the codes*/
548  {
549    for(i = 0; i < tree->lengths[n]; i++) /*the bits for this code*/
550    {
551      unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1);
552      if(treepos > tree->numcodes - 2) return 55; /*oversubscribed, see comment in lodepng_error_text*/
553      if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/
554      {
555        if(i + 1 == tree->lengths[n]) /*last bit*/
556        {
557          tree->tree2d[2 * treepos + bit] = n; /*put the current code in it*/
558          treepos = 0;
559        }
560        else
561        {
562          /*put address of the next step in here, first that address has to be found of course
563          (it's just nodefilled + 1)...*/
564          nodefilled++;
565          /*addresses encoded with numcodes added to it*/
566          tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes;
567          treepos = nodefilled;
568        }
569      }
570      else treepos = tree->tree2d[2 * treepos + bit] - tree->numcodes;
571    }
572  }
573
574  for(n = 0; n < tree->numcodes * 2; n++)
575  {
576    if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/
577  }
578
579  return 0;
580}
581
582/*
583Second step for the ...makeFromLengths and ...makeFromFrequencies functions.
584numcodes, lengths and maxbitlen must already be filled in correctly. return
585value is error.
586*/
587static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree)
588{
589  uivector blcount;
590  uivector nextcode;
591  unsigned bits, n, error = 0;
592
593  uivector_init(&blcount);
594  uivector_init(&nextcode);
595
596  tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned));
597  if(!tree->tree1d) error = 83; /*alloc fail*/
598
599  if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0)
600  || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0))
601    error = 83; /*alloc fail*/
602
603  if(!error)
604  {
605    /*step 1: count number of instances of each code length*/
606    for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths[bits]]++;
607    /*step 2: generate the nextcode values*/
608    for(bits = 1; bits <= tree->maxbitlen; bits++)
609    {
610      nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1;
611    }
612    /*step 3: generate all the codes*/
613    for(n = 0; n < tree->numcodes; n++)
614    {
615      if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++;
616    }
617  }
618
619  uivector_cleanup(&blcount);
620  uivector_cleanup(&nextcode);
621
622  if(!error) return HuffmanTree_make2DTree(tree);
623  else return error;
624}
625
626/*
627given the code lengths (as stored in the PNG file), generate the tree as defined
628by Deflate. maxbitlen is the maximum bits that a code in the tree can have.
629return value is error.
630*/
631static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen,
632                                            size_t numcodes, unsigned maxbitlen)
633{
634  unsigned i;
635  tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned));
636  if(!tree->lengths) return 83; /*alloc fail*/
637  for(i = 0; i < numcodes; i++) tree->lengths[i] = bitlen[i];
638  tree->numcodes = (unsigned)numcodes; /*number of symbols*/
639  tree->maxbitlen = maxbitlen;
640  return HuffmanTree_makeFromLengths2(tree);
641}
642
643#ifdef LODEPNG_COMPILE_ENCODER
644
645/*
646A coin, this is the terminology used for the package-merge algorithm and the
647coin collector's problem. This is used to generate the huffman tree.
648A coin can be multiple coins (when they're merged)
649*/
650typedef struct Coin
651{
652  uivector symbols;
653  float weight; /*the sum of all weights in this coin*/
654} Coin;
655
656static void coin_init(Coin* c)
657{
658  uivector_init(&c->symbols);
659}
660
661/*argument c is void* so that this dtor can be given as function pointer to the vector resize function*/
662static void coin_cleanup(void* c)
663{
664  uivector_cleanup(&((Coin*)c)->symbols);
665}
666
667static void coin_copy(Coin* c1, const Coin* c2)
668{
669  c1->weight = c2->weight;
670  uivector_copy(&c1->symbols, &c2->symbols);
671}
672
673static void add_coins(Coin* c1, const Coin* c2)
674{
675  size_t i;
676  for(i = 0; i < c2->symbols.size; i++) uivector_push_back(&c1->symbols, c2->symbols.data[i]);
677  c1->weight += c2->weight;
678}
679
680static void init_coins(Coin* coins, size_t num)
681{
682  size_t i;
683  for(i = 0; i < num; i++) coin_init(&coins[i]);
684}
685
686static void cleanup_coins(Coin* coins, size_t num)
687{
688  size_t i;
689  for(i = 0; i < num; i++) coin_cleanup(&coins[i]);
690}
691
692static int coin_compare(const void* a, const void* b) {
693  float wa = ((const Coin*)a)->weight;
694  float wb = ((const Coin*)b)->weight;
695  return wa > wb ? 1 : wa < wb ? -1 : 0;
696}
697
698static unsigned append_symbol_coins(Coin* coins, const unsigned* frequencies, unsigned numcodes, size_t sum)
699{
700  unsigned i;
701  unsigned j = 0; /*index of present symbols*/
702  for(i = 0; i < numcodes; i++)
703  {
704    if(frequencies[i] != 0) /*only include symbols that are present*/
705    {
706      coins[j].weight = frequencies[i] / (float)sum;
707      uivector_push_back(&coins[j].symbols, i);
708      j++;
709    }
710  }
711  return 0;
712}
713
714unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies,
715                                      size_t numcodes, unsigned maxbitlen)
716{
717  unsigned i, j;
718  size_t sum = 0, numpresent = 0;
719  unsigned error = 0;
720  Coin* coins; /*the coins of the currently calculated row*/
721  Coin* prev_row; /*the previous row of coins*/
722  unsigned numcoins;
723  unsigned coinmem;
724
725  if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/
726
727  for(i = 0; i < numcodes; i++)
728  {
729    if(frequencies[i] > 0)
730    {
731      numpresent++;
732      sum += frequencies[i];
733    }
734  }
735
736  for(i = 0; i < numcodes; i++) lengths[i] = 0;
737
738  /*ensure at least two present symbols. There should be at least one symbol
739  according to RFC 1951 section 3.2.7. To decoders incorrectly require two. To
740  make these work as well ensure there are at least two symbols. The
741  Package-Merge code below also doesn't work correctly if there's only one
742  symbol, it'd give it the theoritical 0 bits but in practice zlib wants 1 bit*/
743  if(numpresent == 0)
744  {
745    lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/
746  }
747  else if(numpresent == 1)
748  {
749    for(i = 0; i < numcodes; i++)
750    {
751      if(frequencies[i])
752      {
753        lengths[i] = 1;
754        lengths[i == 0 ? 1 : 0] = 1;
755        break;
756      }
757    }
758  }
759  else
760  {
761    /*Package-Merge algorithm represented by coin collector's problem
762    For every symbol, maxbitlen coins will be created*/
763
764    coinmem = numpresent * 2; /*max amount of coins needed with the current algo*/
765    coins = (Coin*)lodepng_malloc(sizeof(Coin) * coinmem);
766    prev_row = (Coin*)lodepng_malloc(sizeof(Coin) * coinmem);
767    if(!coins || !prev_row)
768    {
769      lodepng_free(coins);
770      lodepng_free(prev_row);
771      return 83; /*alloc fail*/
772    }
773    init_coins(coins, coinmem);
774    init_coins(prev_row, coinmem);
775
776    /*first row, lowest denominator*/
777    error = append_symbol_coins(coins, frequencies, numcodes, sum);
778    numcoins = numpresent;
779    qsort(coins, numcoins, sizeof(Coin), coin_compare);
780    if(!error)
781    {
782      unsigned numprev = 0;
783      for(j = 1; j <= maxbitlen && !error; j++) /*each of the remaining rows*/
784      {
785        unsigned tempnum;
786        Coin* tempcoins;
787        /*swap prev_row and coins, and their amounts*/
788        tempcoins = prev_row; prev_row = coins; coins = tempcoins;
789        tempnum = numprev; numprev = numcoins; numcoins = tempnum;
790
791        cleanup_coins(coins, numcoins);
792        init_coins(coins, numcoins);
793
794        numcoins = 0;
795
796        /*fill in the merged coins of the previous row*/
797        for(i = 0; i + 1 < numprev; i += 2)
798        {
799          /*merge prev_row[i] and prev_row[i + 1] into new coin*/
800          Coin* coin = &coins[numcoins++];
801          coin_copy(coin, &prev_row[i]);
802          add_coins(coin, &prev_row[i + 1]);
803        }
804        /*fill in all the original symbols again*/
805        if(j < maxbitlen)
806        {
807          error = append_symbol_coins(coins + numcoins, frequencies, numcodes, sum);
808          numcoins += numpresent;
809        }
810        qsort(coins, numcoins, sizeof(Coin), coin_compare);
811      }
812    }
813
814    if(!error)
815    {
816      /*calculate the lenghts of each symbol, as the amount of times a coin of each symbol is used*/
817      for(i = 0; i < numpresent - 1; i++)
818      {
819        Coin* coin = &coins[i];
820        for(j = 0; j < coin->symbols.size; j++) lengths[coin->symbols.data[j]]++;
821      }
822    }
823
824    cleanup_coins(coins, coinmem);
825    lodepng_free(coins);
826    cleanup_coins(prev_row, coinmem);
827    lodepng_free(prev_row);
828  }
829
830  return error;
831}
832
833/*Create the Huffman tree given the symbol frequencies*/
834static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies,
835                                                size_t mincodes, size_t numcodes, unsigned maxbitlen)
836{
837  unsigned error = 0;
838  while(!frequencies[numcodes - 1] && numcodes > mincodes) numcodes--; /*trim zeroes*/
839  tree->maxbitlen = maxbitlen;
840  tree->numcodes = (unsigned)numcodes; /*number of symbols*/
841  tree->lengths = (unsigned*)lodepng_realloc(tree->lengths, numcodes * sizeof(unsigned));
842  if(!tree->lengths) return 83; /*alloc fail*/
843  /*initialize all lengths to 0*/
844  memset(tree->lengths, 0, numcodes * sizeof(unsigned));
845
846  error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen);
847  if(!error) error = HuffmanTree_makeFromLengths2(tree);
848  return error;
849}
850
851static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index)
852{
853  return tree->tree1d[index];
854}
855
856static unsigned HuffmanTree_getLength(const HuffmanTree* tree, unsigned index)
857{
858  return tree->lengths[index];
859}
860#endif /*LODEPNG_COMPILE_ENCODER*/
861
862/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/
863static unsigned generateFixedLitLenTree(HuffmanTree* tree)
864{
865  unsigned i, error = 0;
866  unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned));
867  if(!bitlen) return 83; /*alloc fail*/
868
869  /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/
870  for(i =   0; i <= 143; i++) bitlen[i] = 8;
871  for(i = 144; i <= 255; i++) bitlen[i] = 9;
872  for(i = 256; i <= 279; i++) bitlen[i] = 7;
873  for(i = 280; i <= 287; i++) bitlen[i] = 8;
874
875  error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15);
876
877  lodepng_free(bitlen);
878  return error;
879}
880
881/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/
882static unsigned generateFixedDistanceTree(HuffmanTree* tree)
883{
884  unsigned i, error = 0;
885  unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned));
886  if(!bitlen) return 83; /*alloc fail*/
887
888  /*there are 32 distance codes, but 30-31 are unused*/
889  for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen[i] = 5;
890  error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15);
891
892  lodepng_free(bitlen);
893  return error;
894}
895
896#ifdef LODEPNG_COMPILE_DECODER
897
898/*
899returns the code, or (unsigned)(-1) if error happened
900inbitlength is the length of the complete buffer, in bits (so its byte length times 8)
901*/
902static unsigned huffmanDecodeSymbol(const unsigned char* in, size_t* bp,
903                                    const HuffmanTree* codetree, size_t inbitlength)
904{
905  unsigned treepos = 0, ct;
906  for(;;)
907  {
908    if(*bp >= inbitlength) return (unsigned)(-1); /*error: end of input memory reached without endcode*/
909    /*
910    decode the symbol from the tree. The "readBitFromStream" code is inlined in
911    the expression below because this is the biggest bottleneck while decoding
912    */
913    ct = codetree->tree2d[(treepos << 1) + READBIT(*bp, in)];
914    (*bp)++;
915    if(ct < codetree->numcodes) return ct; /*the symbol is decoded, return it*/
916    else treepos = ct - codetree->numcodes; /*symbol not yet decoded, instead move tree position*/
917
918    if(treepos >= codetree->numcodes) return (unsigned)(-1); /*error: it appeared outside the codetree*/
919  }
920}
921#endif /*LODEPNG_COMPILE_DECODER*/
922
923#ifdef LODEPNG_COMPILE_DECODER
924
925/* ////////////////////////////////////////////////////////////////////////// */
926/* / Inflator (Decompressor)                                                / */
927/* ////////////////////////////////////////////////////////////////////////// */
928
929/*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/
930static void getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d)
931{
932  /*TODO: check for out of memory errors*/
933  generateFixedLitLenTree(tree_ll);
934  generateFixedDistanceTree(tree_d);
935}
936
937/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/
938static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d,
939                                      const unsigned char* in, size_t* bp, size_t inlength)
940{
941  /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/
942  unsigned error = 0;
943  unsigned n, HLIT, HDIST, HCLEN, i;
944  size_t inbitlength = inlength * 8;
945
946  /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/
947  unsigned* bitlen_ll = 0; /*lit,len code lengths*/
948  unsigned* bitlen_d = 0; /*dist code lengths*/
949  /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/
950  unsigned* bitlen_cl = 0;
951  HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/
952
953  if((*bp) >> 3 >= inlength - 2) return 49; /*error: the bit pointer is or will go past the memory*/
954
955  /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/
956  HLIT =  readBitsFromStream(bp, in, 5) + 257;
957  /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/
958  HDIST = readBitsFromStream(bp, in, 5) + 1;
959  /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/
960  HCLEN = readBitsFromStream(bp, in, 4) + 4;
961
962  HuffmanTree_init(&tree_cl);
963
964  while(!error)
965  {
966    /*read the code length codes out of 3 * (amount of code length codes) bits*/
967
968    bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned));
969    if(!bitlen_cl) ERROR_BREAK(83 /*alloc fail*/);
970
971    for(i = 0; i < NUM_CODE_LENGTH_CODES; i++)
972    {
973      if(i < HCLEN) bitlen_cl[CLCL_ORDER[i]] = readBitsFromStream(bp, in, 3);
974      else bitlen_cl[CLCL_ORDER[i]] = 0; /*if not, it must stay 0*/
975    }
976
977    error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7);
978    if(error) break;
979
980    /*now we can use this tree to read the lengths for the tree that this function will return*/
981    bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned));
982    bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned));
983    if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/);
984    for(i = 0; i < NUM_DEFLATE_CODE_SYMBOLS; i++) bitlen_ll[i] = 0;
985    for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen_d[i] = 0;
986
987    /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/
988    i = 0;
989    while(i < HLIT + HDIST)
990    {
991      unsigned code = huffmanDecodeSymbol(in, bp, &tree_cl, inbitlength);
992      if(code <= 15) /*a length code*/
993      {
994        if(i < HLIT) bitlen_ll[i] = code;
995        else bitlen_d[i - HLIT] = code;
996        i++;
997      }
998      else if(code == 16) /*repeat previous*/
999      {
1000        unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/
1001        unsigned value; /*set value to the previous code*/
1002
1003        if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/
1004        if (i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/
1005
1006        replength += readBitsFromStream(bp, in, 2);
1007
1008        if(i < HLIT + 1) value = bitlen_ll[i - 1];
1009        else value = bitlen_d[i - HLIT - 1];
1010        /*repeat this value in the next lengths*/
1011        for(n = 0; n < replength; n++)
1012        {
1013          if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/
1014          if(i < HLIT) bitlen_ll[i] = value;
1015          else bitlen_d[i - HLIT] = value;
1016          i++;
1017        }
1018      }
1019      else if(code == 17) /*repeat "0" 3-10 times*/
1020      {
1021        unsigned replength = 3; /*read in the bits that indicate repeat length*/
1022        if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/
1023
1024        replength += readBitsFromStream(bp, in, 3);
1025
1026        /*repeat this value in the next lengths*/
1027        for(n = 0; n < replength; n++)
1028        {
1029          if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/
1030
1031          if(i < HLIT) bitlen_ll[i] = 0;
1032          else bitlen_d[i - HLIT] = 0;
1033          i++;
1034        }
1035      }
1036      else if(code == 18) /*repeat "0" 11-138 times*/
1037      {
1038        unsigned replength = 11; /*read in the bits that indicate repeat length*/
1039        if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/
1040
1041        replength += readBitsFromStream(bp, in, 7);
1042
1043        /*repeat this value in the next lengths*/
1044        for(n = 0; n < replength; n++)
1045        {
1046          if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/
1047
1048          if(i < HLIT) bitlen_ll[i] = 0;
1049          else bitlen_d[i - HLIT] = 0;
1050          i++;
1051        }
1052      }
1053      else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/
1054      {
1055        if(code == (unsigned)(-1))
1056        {
1057          /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol
1058          (10=no endcode, 11=wrong jump outside of tree)*/
1059          error = (*bp) > inbitlength ? 10 : 11;
1060        }
1061        else error = 16; /*unexisting code, this can never happen*/
1062        break;
1063      }
1064    }
1065    if(error) break;
1066
1067    if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/
1068
1069    /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/
1070    error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15);
1071    if(error) break;
1072    error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15);
1073
1074    break; /*end of error-while*/
1075  }
1076
1077  lodepng_free(bitlen_cl);
1078  lodepng_free(bitlen_ll);
1079  lodepng_free(bitlen_d);
1080  HuffmanTree_cleanup(&tree_cl);
1081
1082  return error;
1083}
1084
1085/*inflate a block with dynamic of fixed Huffman tree*/
1086static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size_t* bp,
1087                                    size_t* pos, size_t inlength, unsigned btype)
1088{
1089  unsigned error = 0;
1090  HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/
1091  HuffmanTree tree_d; /*the huffman tree for distance codes*/
1092  size_t inbitlength = inlength * 8;
1093
1094  HuffmanTree_init(&tree_ll);
1095  HuffmanTree_init(&tree_d);
1096
1097  if(btype == 1) getTreeInflateFixed(&tree_ll, &tree_d);
1098  else if(btype == 2) error = getTreeInflateDynamic(&tree_ll, &tree_d, in, bp, inlength);
1099
1100  while(!error) /*decode all symbols until end reached, breaks at end code*/
1101  {
1102    /*code_ll is literal, length or end code*/
1103    unsigned code_ll = huffmanDecodeSymbol(in, bp, &tree_ll, inbitlength);
1104    if(code_ll <= 255) /*literal symbol*/
1105    {
1106      if((*pos) >= out->size)
1107      {
1108        /*reserve more room at once*/
1109        if(!ucvector_resize(out, ((*pos) + 1) * 2)) ERROR_BREAK(83 /*alloc fail*/);
1110      }
1111      out->data[(*pos)] = (unsigned char)(code_ll);
1112      (*pos)++;
1113    }
1114    else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/
1115    {
1116      unsigned code_d, distance;
1117      unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/
1118      size_t start, forward, backward, length;
1119
1120      /*part 1: get length base*/
1121      length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX];
1122
1123      /*part 2: get extra bits and add the value of that to length*/
1124      numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX];
1125      if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/
1126      length += readBitsFromStream(bp, in, numextrabits_l);
1127
1128      /*part 3: get distance code*/
1129      code_d = huffmanDecodeSymbol(in, bp, &tree_d, inbitlength);
1130      if(code_d > 29)
1131      {
1132        if(code_ll == (unsigned)(-1)) /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/
1133        {
1134          /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol
1135          (10=no endcode, 11=wrong jump outside of tree)*/
1136          error = (*bp) > inlength * 8 ? 10 : 11;
1137        }
1138        else error = 18; /*error: invalid distance code (30-31 are never used)*/
1139        break;
1140      }
1141      distance = DISTANCEBASE[code_d];
1142
1143      /*part 4: get extra bits from distance*/
1144      numextrabits_d = DISTANCEEXTRA[code_d];
1145      if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/
1146
1147      distance += readBitsFromStream(bp, in, numextrabits_d);
1148
1149      /*part 5: fill in all the out[n] values based on the length and dist*/
1150      start = (*pos);
1151      if(distance > start) ERROR_BREAK(52); /*too long backward distance*/
1152      backward = start - distance;
1153      if((*pos) + length >= out->size)
1154      {
1155        /*reserve more room at once*/
1156        if(!ucvector_resize(out, ((*pos) + length) * 2)) ERROR_BREAK(83 /*alloc fail*/);
1157      }
1158
1159      for(forward = 0; forward < length; forward++)
1160      {
1161        out->data[(*pos)] = out->data[backward];
1162        (*pos)++;
1163        backward++;
1164        if(backward >= start) backward = start - distance;
1165      }
1166    }
1167    else if(code_ll == 256)
1168    {
1169      break; /*end code, break the loop*/
1170    }
1171    else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/
1172    {
1173      /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol
1174      (10=no endcode, 11=wrong jump outside of tree)*/
1175      error = (*bp) > inlength * 8 ? 10 : 11;
1176      break;
1177    }
1178  }
1179
1180  HuffmanTree_cleanup(&tree_ll);
1181  HuffmanTree_cleanup(&tree_d);
1182
1183  return error;
1184}
1185
1186static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength)
1187{
1188  /*go to first boundary of byte*/
1189  size_t p;
1190  unsigned LEN, NLEN, n, error = 0;
1191  while(((*bp) & 0x7) != 0) (*bp)++;
1192  p = (*bp) / 8; /*byte position*/
1193
1194  /*read LEN (2 bytes) and NLEN (2 bytes)*/
1195  if(p >= inlength - 4) return 52; /*error, bit pointer will jump past memory*/
1196  LEN = in[p] + 256 * in[p + 1]; p += 2;
1197  NLEN = in[p] + 256 * in[p + 1]; p += 2;
1198
1199  /*check if 16-bit NLEN is really the one's complement of LEN*/
1200  if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/
1201
1202  if((*pos) + LEN >= out->size)
1203  {
1204    if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/
1205  }
1206
1207  /*read the literal data: LEN bytes are now stored in the out buffer*/
1208  if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/
1209  for(n = 0; n < LEN; n++) out->data[(*pos)++] = in[p++];
1210
1211  (*bp) = p * 8;
1212
1213  return error;
1214}
1215
1216static unsigned lodepng_inflatev(ucvector* out,
1217                                 const unsigned char* in, size_t insize,
1218                                 const LodePNGDecompressSettings* settings)
1219{
1220  /*bit pointer in the "in" data, current byte is bp >> 3, current bit is bp & 0x7 (from lsb to msb of the byte)*/
1221  size_t bp = 0;
1222  unsigned BFINAL = 0;
1223  size_t pos = 0; /*byte position in the out buffer*/
1224
1225  unsigned error = 0;
1226
1227  (void)settings;
1228
1229  while(!BFINAL)
1230  {
1231    unsigned BTYPE;
1232    if(bp + 2 >= insize * 8) return 52; /*error, bit pointer will jump past memory*/
1233    BFINAL = readBitFromStream(&bp, in);
1234    BTYPE = 1 * readBitFromStream(&bp, in);
1235    BTYPE += 2 * readBitFromStream(&bp, in);
1236
1237    if(BTYPE == 3) return 20; /*error: invalid BTYPE*/
1238    else if(BTYPE == 0) error = inflateNoCompression(out, in, &bp, &pos, insize); /*no compression*/
1239    else error = inflateHuffmanBlock(out, in, &bp, &pos, insize, BTYPE); /*compression, BTYPE 01 or 10*/
1240
1241    if(error) return error;
1242  }
1243
1244  /*Only now we know the true size of out, resize it to that*/
1245  if(!ucvector_resize(out, pos)) error = 83; /*alloc fail*/
1246
1247  return error;
1248}
1249
1250unsigned lodepng_inflate(unsigned char** out, size_t* outsize,
1251                         const unsigned char* in, size_t insize,
1252                         const LodePNGDecompressSettings* settings)
1253{
1254  unsigned error;
1255  ucvector v;
1256  ucvector_init_buffer(&v, *out, *outsize);
1257  error = lodepng_inflatev(&v, in, insize, settings);
1258  *out = v.data;
1259  *outsize = v.size;
1260  return error;
1261}
1262
1263static unsigned inflate(unsigned char** out, size_t* outsize,
1264                        const unsigned char* in, size_t insize,
1265                        const LodePNGDecompressSettings* settings)
1266{
1267  if(settings->custom_inflate)
1268  {
1269    return settings->custom_inflate(out, outsize, in, insize, settings);
1270  }
1271  else
1272  {
1273    return lodepng_inflate(out, outsize, in, insize, settings);
1274  }
1275}
1276
1277#endif /*LODEPNG_COMPILE_DECODER*/
1278
1279#ifdef LODEPNG_COMPILE_ENCODER
1280
1281/* ////////////////////////////////////////////////////////////////////////// */
1282/* / Deflator (Compressor)                                                  / */
1283/* ////////////////////////////////////////////////////////////////////////// */
1284
1285static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258;
1286
1287/*bitlen is the size in bits of the code*/
1288static void addHuffmanSymbol(size_t* bp, ucvector* compressed, unsigned code, unsigned bitlen)
1289{
1290  addBitsToStreamReversed(bp, compressed, code, bitlen);
1291}
1292
1293/*search the index in the array, that has the largest value smaller than or equal to the given value,
1294given array must be sorted (if no value is smaller, it returns the size of the given array)*/
1295static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value)
1296{
1297  /*linear search implementation*/
1298  /*for(size_t i = 1; i < array_size; i++) if(array[i] > value) return i - 1;
1299  return array_size - 1;*/
1300
1301  /*binary search implementation (not that much faster) (precondition: array_size > 0)*/
1302  size_t left  = 1;
1303  size_t right = array_size - 1;
1304  while(left <= right)
1305  {
1306    size_t mid = (left + right) / 2;
1307    if(array[mid] <= value) left = mid + 1; /*the value to find is more to the right*/
1308    else if(array[mid - 1] > value) right = mid - 1; /*the value to find is more to the left*/
1309    else return mid - 1;
1310  }
1311  return array_size - 1;
1312}
1313
1314static void addLengthDistance(uivector* values, size_t length, size_t distance)
1315{
1316  /*values in encoded vector are those used by deflate:
1317  0-255: literal bytes
1318  256: end
1319  257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits)
1320  286-287: invalid*/
1321
1322  unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length);
1323  unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]);
1324  unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance);
1325  unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]);
1326
1327  uivector_push_back(values, length_code + FIRST_LENGTH_CODE_INDEX);
1328  uivector_push_back(values, extra_length);
1329  uivector_push_back(values, dist_code);
1330  uivector_push_back(values, extra_distance);
1331}
1332
1333static const unsigned HASH_BIT_MASK = 65535;
1334static const unsigned HASH_NUM_VALUES = 65536;
1335static const unsigned HASH_NUM_CHARACTERS = 3;
1336static const unsigned HASH_SHIFT = 2;
1337/*
1338The HASH_NUM_CHARACTERS value is used to make encoding faster by using longer
1339sequences to generate a hash value from the stream bytes. Setting it to 3
1340gives exactly the same compression as the brute force method, since deflate's
1341run length encoding starts with lengths of 3. Setting it to higher values,
1342like 6, can make the encoding faster (not always though!), but will cause the
1343encoding to miss any length between 3 and this value, so that the compression
1344may be worse (but this can vary too depending on the image, sometimes it is
1345even a bit better instead).
1346The HASH_NUM_VALUES is the amount of unique possible hash values that
1347combinations of bytes can give, the higher it is the more memory is needed, but
1348if it's too low the advantage of hashing is gone.
1349*/
1350
1351typedef struct Hash
1352{
1353  int* head; /*hash value to head circular pos*/
1354  int* val; /*circular pos to hash value*/
1355  /*circular pos to prev circular pos*/
1356  unsigned short* chain;
1357  unsigned short* zeros;
1358} Hash;
1359
1360static unsigned hash_init(Hash* hash, unsigned windowsize)
1361{
1362  unsigned i;
1363  hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES);
1364  hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize);
1365  hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize);
1366  hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize);
1367
1368  if(!hash->head || !hash->val || !hash->chain || !hash->zeros) return 83; /*alloc fail*/
1369
1370  /*initialize hash table*/
1371  for(i = 0; i < HASH_NUM_VALUES; i++) hash->head[i] = -1;
1372  for(i = 0; i < windowsize; i++) hash->val[i] = -1;
1373  for(i = 0; i < windowsize; i++) hash->chain[i] = i; /*same value as index indicates uninitialized*/
1374
1375  return 0;
1376}
1377
1378static void hash_cleanup(Hash* hash)
1379{
1380  lodepng_free(hash->head);
1381  lodepng_free(hash->val);
1382  lodepng_free(hash->chain);
1383  lodepng_free(hash->zeros);
1384}
1385
1386static unsigned getHash(const unsigned char* data, size_t size, size_t pos)
1387{
1388  unsigned result = 0;
1389  if (HASH_NUM_CHARACTERS == 3 && pos + 2 < size) {
1390    result ^= (data[pos + 0] << (0 * HASH_SHIFT));
1391    result ^= (data[pos + 1] << (1 * HASH_SHIFT));
1392    result ^= (data[pos + 2] << (2 * HASH_SHIFT));
1393  } else {
1394    size_t amount, i;
1395    if(pos >= size) return 0;
1396    amount = HASH_NUM_CHARACTERS;
1397    if(pos + amount >= size) amount = size - pos;
1398    for(i = 0; i < amount; i++) result ^= (data[pos + i] << (i * HASH_SHIFT));
1399  }
1400  return result & HASH_BIT_MASK;
1401}
1402
1403static unsigned countZeros(const unsigned char* data, size_t size, size_t pos)
1404{
1405  const unsigned char* start = data + pos;
1406  const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH;
1407  if(end > data + size) end = data + size;
1408  data = start;
1409  while (data != end && *data == 0) data++;
1410  /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/
1411  return (unsigned)(data - start);
1412}
1413
1414/*wpos = pos & (windowsize - 1)*/
1415static void updateHashChain(Hash* hash, size_t wpos, int hashval)
1416{
1417  hash->val[wpos] = hashval;
1418  if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval];
1419  hash->head[hashval] = wpos;
1420}
1421
1422/*
1423LZ77-encode the data. Return value is error code. The input are raw bytes, the output
1424is in the form of unsigned integers with codes representing for example literal bytes, or
1425length/distance pairs.
1426It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a
1427sliding window (of windowsize) is used, and all past bytes in that window can be used as
1428the "dictionary". A brute force search through all possible distances would be slow, and
1429this hash technique is one out of several ways to speed this up.
1430*/
1431static unsigned encodeLZ77(uivector* out, Hash* hash,
1432                           const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize,
1433                           unsigned minmatch, unsigned nicematch, unsigned lazymatching)
1434{
1435  unsigned pos, i, error = 0;
1436  /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/
1437  unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8;
1438  unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64;
1439
1440  unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/
1441  unsigned numzeros = 0;
1442
1443  unsigned offset; /*the offset represents the distance in LZ77 terminology*/
1444  unsigned length;
1445  unsigned lazy = 0;
1446  unsigned lazylength = 0, lazyoffset = 0;
1447  unsigned hashval;
1448  unsigned current_offset, current_length;
1449  const unsigned char *lastptr, *foreptr, *backptr;
1450  unsigned hashpos, prevpos;
1451
1452  if(windowsize <= 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/
1453  if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/
1454
1455  if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH;
1456
1457  for(pos = inpos; pos < insize; pos++)
1458  {
1459    size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/
1460    unsigned chainlength = 0;
1461
1462    hashval = getHash(in, insize, pos);
1463    updateHashChain(hash, wpos, hashval);
1464
1465    if(usezeros && hashval == 0)
1466    {
1467      if (numzeros == 0) numzeros = countZeros(in, insize, pos);
1468      else if (pos + numzeros >= insize || in[pos + numzeros - 1] != 0) numzeros--;
1469      hash->zeros[wpos] = numzeros;
1470    }
1471    else
1472    {
1473      numzeros = 0;
1474    }
1475
1476    /*the length and offset found for the current position*/
1477    length = 0;
1478    offset = 0;
1479
1480    prevpos = hash->head[hashval];
1481    hashpos = hash->chain[prevpos];
1482
1483    lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH];
1484
1485    /*search for the longest string*/
1486    for(;;)
1487    {
1488      /*stop when went completely around the circular buffer*/
1489      if(prevpos < wpos && hashpos > prevpos && hashpos <= wpos) break;
1490      if(prevpos > wpos && (hashpos <= wpos || hashpos > prevpos)) break;
1491      if(chainlength++ >= maxchainlength) break;
1492
1493      current_offset = hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize;
1494      if(current_offset > 0)
1495      {
1496        /*test the next characters*/
1497        foreptr = &in[pos];
1498        backptr = &in[pos - current_offset];
1499
1500        /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/
1501        if(usezeros && hashval == 0 && hash->val[hashpos] == 0 /*hashval[hashpos] may be out of date*/)
1502        {
1503          unsigned skip = hash->zeros[hashpos];
1504          if(skip > numzeros) skip = numzeros;
1505          backptr += skip;
1506          foreptr += skip;
1507        }
1508
1509        while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/
1510        {
1511          ++backptr;
1512          ++foreptr;
1513        }
1514        current_length = (unsigned)(foreptr - &in[pos]);
1515
1516        if(current_length > length)
1517        {
1518          length = current_length; /*the longest length*/
1519          offset = current_offset; /*the offset that is related to this longest length*/
1520          /*jump out once a length of max length is found (speed gain). This also jumps
1521          out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/
1522          if(current_length >= nicematch) break;
1523        }
1524      }
1525
1526      if(hashpos == hash->chain[hashpos]) break;
1527
1528      prevpos = hashpos;
1529      hashpos = hash->chain[hashpos];
1530    }
1531
1532    if(lazymatching)
1533    {
1534      if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH)
1535      {
1536        lazy = 1;
1537        lazylength = length;
1538        lazyoffset = offset;
1539        continue; /*try the next byte*/
1540      }
1541      if(lazy)
1542      {
1543        lazy = 0;
1544        if(pos == 0) ERROR_BREAK(81);
1545        if(length > lazylength + 1)
1546        {
1547          /*push the previous character as literal*/
1548          if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/);
1549        }
1550        else
1551        {
1552          length = lazylength;
1553          offset = lazyoffset;
1554          hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/
1555          pos--;
1556        }
1557      }
1558    }
1559    if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/);
1560
1561    /*encode it as length/distance pair or literal value*/
1562    if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/
1563    {
1564      if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/);
1565    }
1566    else if(length < minmatch || (length == 3 && offset > 4096))
1567    {
1568      /*compensate for the fact that longer offsets have more extra bits, a
1569      length of only 3 may be not worth it then*/
1570      if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/);
1571    }
1572    else
1573    {
1574      addLengthDistance(out, length, offset);
1575      for(i = 1; i < length; i++)
1576      {
1577        pos++;
1578        wpos = pos & (windowsize - 1);
1579        hashval = getHash(in, insize, pos);
1580        updateHashChain(hash, wpos, hashval);
1581        if(usezeros && hashval == 0)
1582        {
1583          if (numzeros == 0) numzeros = countZeros(in, insize, pos);
1584          else if (pos + numzeros >= insize || in[pos + numzeros - 1] != 0) numzeros--;
1585          hash->zeros[wpos] = numzeros;
1586        }
1587        else
1588        {
1589          numzeros = 0;
1590        }
1591      }
1592    }
1593  } /*end of the loop through each character of input*/
1594
1595  return error;
1596}
1597
1598/* /////////////////////////////////////////////////////////////////////////// */
1599
1600static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize)
1601{
1602  /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte,
1603  2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/
1604
1605  size_t i, j, numdeflateblocks = (datasize + 65534) / 65535;
1606  unsigned datapos = 0;
1607  for(i = 0; i < numdeflateblocks; i++)
1608  {
1609    unsigned BFINAL, BTYPE, LEN, NLEN;
1610    unsigned char firstbyte;
1611
1612    BFINAL = (i == numdeflateblocks - 1);
1613    BTYPE = 0;
1614
1615    firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1) << 1) + ((BTYPE & 2) << 1));
1616    ucvector_push_back(out, firstbyte);
1617
1618    LEN = 65535;
1619    if(datasize - datapos < 65535) LEN = (unsigned)datasize - datapos;
1620    NLEN = 65535 - LEN;
1621
1622    ucvector_push_back(out, (unsigned char)(LEN % 256));
1623    ucvector_push_back(out, (unsigned char)(LEN / 256));
1624    ucvector_push_back(out, (unsigned char)(NLEN % 256));
1625    ucvector_push_back(out, (unsigned char)(NLEN / 256));
1626
1627    /*Decompressed data*/
1628    for(j = 0; j < 65535 && datapos < datasize; j++)
1629    {
1630      ucvector_push_back(out, data[datapos++]);
1631    }
1632  }
1633
1634  return 0;
1635}
1636
1637/*
1638write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees.
1639tree_ll: the tree for lit and len codes.
1640tree_d: the tree for distance codes.
1641*/
1642static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encoded,
1643                          const HuffmanTree* tree_ll, const HuffmanTree* tree_d)
1644{
1645  size_t i = 0;
1646  for(i = 0; i < lz77_encoded->size; i++)
1647  {
1648    unsigned val = lz77_encoded->data[i];
1649    addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_ll, val), HuffmanTree_getLength(tree_ll, val));
1650    if(val > 256) /*for a length code, 3 more things have to be added*/
1651    {
1652      unsigned length_index = val - FIRST_LENGTH_CODE_INDEX;
1653      unsigned n_length_extra_bits = LENGTHEXTRA[length_index];
1654      unsigned length_extra_bits = lz77_encoded->data[++i];
1655
1656      unsigned distance_code = lz77_encoded->data[++i];
1657
1658      unsigned distance_index = distance_code;
1659      unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index];
1660      unsigned distance_extra_bits = lz77_encoded->data[++i];
1661
1662      addBitsToStream(bp, out, length_extra_bits, n_length_extra_bits);
1663      addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_d, distance_code),
1664                       HuffmanTree_getLength(tree_d, distance_code));
1665      addBitsToStream(bp, out, distance_extra_bits, n_distance_extra_bits);
1666    }
1667  }
1668}
1669
1670/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/
1671static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash,
1672                               const unsigned char* data, size_t datapos, size_t dataend,
1673                               const LodePNGCompressSettings* settings, int final)
1674{
1675  unsigned error = 0;
1676
1677  /*
1678  A block is compressed as follows: The PNG data is lz77 encoded, resulting in
1679  literal bytes and length/distance pairs. This is then huffman compressed with
1680  two huffman trees. One huffman tree is used for the lit and len values ("ll"),
1681  another huffman tree is used for the dist values ("d"). These two trees are
1682  stored using their code lengths, and to compress even more these code lengths
1683  are also run-length encoded and huffman compressed. This gives a huffman tree
1684  of code lengths "cl". The code lenghts used to describe this third tree are
1685  the code length code lengths ("clcl").
1686  */
1687
1688  /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/
1689  uivector lz77_encoded;
1690  HuffmanTree tree_ll; /*tree for lit,len values*/
1691  HuffmanTree tree_d; /*tree for distance codes*/
1692  HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/
1693  uivector frequencies_ll; /*frequency of lit,len codes*/
1694  uivector frequencies_d; /*frequency of dist codes*/
1695  uivector frequencies_cl; /*frequency of code length codes*/
1696  uivector bitlen_lld; /*lit,len,dist code lenghts (int bits), literally (without repeat codes).*/
1697  uivector bitlen_lld_e; /*bitlen_lld encoded with repeat codes (this is a rudemtary run length compression)*/
1698  /*bitlen_cl is the code length code lengths ("clcl"). The bit lengths of codes to represent tree_cl
1699  (these are written as is in the file, it would be crazy to compress these using yet another huffman
1700  tree that needs to be represented by yet another set of code lengths)*/
1701  uivector bitlen_cl;
1702  size_t datasize = dataend - datapos;
1703
1704  /*
1705  Due to the huffman compression of huffman tree representations ("two levels"), there are some anologies:
1706  bitlen_lld is to tree_cl what data is to tree_ll and tree_d.
1707  bitlen_lld_e is to bitlen_lld what lz77_encoded is to data.
1708  bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded.
1709  */
1710
1711  unsigned BFINAL = final;
1712  size_t numcodes_ll, numcodes_d, i;
1713  unsigned HLIT, HDIST, HCLEN;
1714
1715  uivector_init(&lz77_encoded);
1716  HuffmanTree_init(&tree_ll);
1717  HuffmanTree_init(&tree_d);
1718  HuffmanTree_init(&tree_cl);
1719  uivector_init(&frequencies_ll);
1720  uivector_init(&frequencies_d);
1721  uivector_init(&frequencies_cl);
1722  uivector_init(&bitlen_lld);
1723  uivector_init(&bitlen_lld_e);
1724  uivector_init(&bitlen_cl);
1725
1726  /*This while loop never loops due to a break at the end, it is here to
1727  allow breaking out of it to the cleanup phase on error conditions.*/
1728  while(!error)
1729  {
1730    if(settings->use_lz77)
1731    {
1732      error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize,
1733                         settings->minmatch, settings->nicematch, settings->lazymatching);
1734      if(error) break;
1735    }
1736    else
1737    {
1738      if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/);
1739      for(i = datapos; i < dataend; i++) lz77_encoded.data[i] = data[i]; /*no LZ77, but still will be Huffman compressed*/
1740    }
1741
1742    if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83 /*alloc fail*/);
1743    if(!uivector_resizev(&frequencies_d, 30, 0)) ERROR_BREAK(83 /*alloc fail*/);
1744
1745    /*Count the frequencies of lit, len and dist codes*/
1746    for(i = 0; i < lz77_encoded.size; i++)
1747    {
1748      unsigned symbol = lz77_encoded.data[i];
1749      frequencies_ll.data[symbol]++;
1750      if(symbol > 256)
1751      {
1752        unsigned dist = lz77_encoded.data[i + 2];
1753        frequencies_d.data[dist]++;
1754        i += 3;
1755      }
1756    }
1757    frequencies_ll.data[256] = 1; /*there will be exactly 1 end code, at the end of the block*/
1758
1759    /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/
1760    error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll.data, 257, frequencies_ll.size, 15);
1761    if(error) break;
1762    /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/
1763    error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d.data, 2, frequencies_d.size, 15);
1764    if(error) break;
1765
1766    numcodes_ll = tree_ll.numcodes; if(numcodes_ll > 286) numcodes_ll = 286;
1767    numcodes_d = tree_d.numcodes; if(numcodes_d > 30) numcodes_d = 30;
1768    /*store the code lengths of both generated trees in bitlen_lld*/
1769    for(i = 0; i < numcodes_ll; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i));
1770    for(i = 0; i < numcodes_d; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i));
1771
1772    /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times),
1773    17 (3-10 zeroes), 18 (11-138 zeroes)*/
1774    for(i = 0; i < (unsigned)bitlen_lld.size; i++)
1775    {
1776      unsigned j = 0; /*amount of repititions*/
1777      while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) j++;
1778
1779      if(bitlen_lld.data[i] == 0 && j >= 2) /*repeat code for zeroes*/
1780      {
1781        j++; /*include the first zero*/
1782        if(j <= 10) /*repeat code 17 supports max 10 zeroes*/
1783        {
1784          uivector_push_back(&bitlen_lld_e, 17);
1785          uivector_push_back(&bitlen_lld_e, j - 3);
1786        }
1787        else /*repeat code 18 supports max 138 zeroes*/
1788        {
1789          if(j > 138) j = 138;
1790          uivector_push_back(&bitlen_lld_e, 18);
1791          uivector_push_back(&bitlen_lld_e, j - 11);
1792        }
1793        i += (j - 1);
1794      }
1795      else if(j >= 3) /*repeat code for value other than zero*/
1796      {
1797        size_t k;
1798        unsigned num = j / 6, rest = j % 6;
1799        uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]);
1800        for(k = 0; k < num; k++)
1801        {
1802          uivector_push_back(&bitlen_lld_e, 16);
1803          uivector_push_back(&bitlen_lld_e, 6 - 3);
1804        }
1805        if(rest >= 3)
1806        {
1807          uivector_push_back(&bitlen_lld_e, 16);
1808          uivector_push_back(&bitlen_lld_e, rest - 3);
1809        }
1810        else j -= rest;
1811        i += j;
1812      }
1813      else /*too short to benefit from repeat code*/
1814      {
1815        uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]);
1816      }
1817    }
1818
1819    /*generate tree_cl, the huffmantree of huffmantrees*/
1820
1821    if(!uivector_resizev(&frequencies_cl, NUM_CODE_LENGTH_CODES, 0)) ERROR_BREAK(83 /*alloc fail*/);
1822    for(i = 0; i < bitlen_lld_e.size; i++)
1823    {
1824      frequencies_cl.data[bitlen_lld_e.data[i]]++;
1825      /*after a repeat code come the bits that specify the number of repetitions,
1826      those don't need to be in the frequencies_cl calculation*/
1827      if(bitlen_lld_e.data[i] >= 16) i++;
1828    }
1829
1830    error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl.data,
1831                                            frequencies_cl.size, frequencies_cl.size, 7);
1832    if(error) break;
1833
1834    if(!uivector_resize(&bitlen_cl, tree_cl.numcodes)) ERROR_BREAK(83 /*alloc fail*/);
1835    for(i = 0; i < tree_cl.numcodes; i++)
1836    {
1837      /*lenghts of code length tree is in the order as specified by deflate*/
1838      bitlen_cl.data[i] = HuffmanTree_getLength(&tree_cl, CLCL_ORDER[i]);
1839    }
1840    while(bitlen_cl.data[bitlen_cl.size - 1] == 0 && bitlen_cl.size > 4)
1841    {
1842      /*remove zeros at the end, but minimum size must be 4*/
1843      if(!uivector_resize(&bitlen_cl, bitlen_cl.size - 1)) ERROR_BREAK(83 /*alloc fail*/);
1844    }
1845    if(error) break;
1846
1847    /*
1848    Write everything into the output
1849
1850    After the BFINAL and BTYPE, the dynamic block consists out of the following:
1851    - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN
1852    - (HCLEN+4)*3 bits code lengths of code length alphabet
1853    - HLIT + 257 code lenghts of lit/length alphabet (encoded using the code length
1854      alphabet, + possible repetition codes 16, 17, 18)
1855    - HDIST + 1 code lengths of distance alphabet (encoded using the code length
1856      alphabet, + possible repetition codes 16, 17, 18)
1857    - compressed data
1858    - 256 (end code)
1859    */
1860
1861    /*Write block type*/
1862    addBitToStream(bp, out, BFINAL);
1863    addBitToStream(bp, out, 0); /*first bit of BTYPE "dynamic"*/
1864    addBitToStream(bp, out, 1); /*second bit of BTYPE "dynamic"*/
1865
1866    /*write the HLIT, HDIST and HCLEN values*/
1867    HLIT = (unsigned)(numcodes_ll - 257);
1868    HDIST = (unsigned)(numcodes_d - 1);
1869    HCLEN = (unsigned)bitlen_cl.size - 4;
1870    /*trim zeroes for HCLEN. HLIT and HDIST were already trimmed at tree creation*/
1871    while(!bitlen_cl.data[HCLEN + 4 - 1] && HCLEN > 0) HCLEN--;
1872    addBitsToStream(bp, out, HLIT, 5);
1873    addBitsToStream(bp, out, HDIST, 5);
1874    addBitsToStream(bp, out, HCLEN, 4);
1875
1876    /*write the code lenghts of the code length alphabet*/
1877    for(i = 0; i < HCLEN + 4; i++) addBitsToStream(bp, out, bitlen_cl.data[i], 3);
1878
1879    /*write the lenghts of the lit/len AND the dist alphabet*/
1880    for(i = 0; i < bitlen_lld_e.size; i++)
1881    {
1882      addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_cl, bitlen_lld_e.data[i]),
1883                       HuffmanTree_getLength(&tree_cl, bitlen_lld_e.data[i]));
1884      /*extra bits of repeat codes*/
1885      if(bitlen_lld_e.data[i] == 16) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 2);
1886      else if(bitlen_lld_e.data[i] == 17) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 3);
1887      else if(bitlen_lld_e.data[i] == 18) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 7);
1888    }
1889
1890    /*write the compressed data symbols*/
1891    writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d);
1892    /*error: the length of the end code 256 must be larger than 0*/
1893    if(HuffmanTree_getLength(&tree_ll, 256) == 0) ERROR_BREAK(64);
1894
1895    /*write the end code*/
1896    addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256));
1897
1898    break; /*end of error-while*/
1899  }
1900
1901  /*cleanup*/
1902  uivector_cleanup(&lz77_encoded);
1903  HuffmanTree_cleanup(&tree_ll);
1904  HuffmanTree_cleanup(&tree_d);
1905  HuffmanTree_cleanup(&tree_cl);
1906  uivector_cleanup(&frequencies_ll);
1907  uivector_cleanup(&frequencies_d);
1908  uivector_cleanup(&frequencies_cl);
1909  uivector_cleanup(&bitlen_lld_e);
1910  uivector_cleanup(&bitlen_lld);
1911  uivector_cleanup(&bitlen_cl);
1912
1913  return error;
1914}
1915
1916static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash,
1917                             const unsigned char* data,
1918                             size_t datapos, size_t dataend,
1919                             const LodePNGCompressSettings* settings, int final)
1920{
1921  HuffmanTree tree_ll; /*tree for literal values and length codes*/
1922  HuffmanTree tree_d; /*tree for distance codes*/
1923
1924  unsigned BFINAL = final;
1925  unsigned error = 0;
1926  size_t i;
1927
1928  HuffmanTree_init(&tree_ll);
1929  HuffmanTree_init(&tree_d);
1930
1931  generateFixedLitLenTree(&tree_ll);
1932  generateFixedDistanceTree(&tree_d);
1933
1934  addBitToStream(bp, out, BFINAL);
1935  addBitToStream(bp, out, 1); /*first bit of BTYPE*/
1936  addBitToStream(bp, out, 0); /*second bit of BTYPE*/
1937
1938  if(settings->use_lz77) /*LZ77 encoded*/
1939  {
1940    uivector lz77_encoded;
1941    uivector_init(&lz77_encoded);
1942    error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize,
1943                       settings->minmatch, settings->nicematch, settings->lazymatching);
1944    if(!error) writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d);
1945    uivector_cleanup(&lz77_encoded);
1946  }
1947  else /*no LZ77, but still will be Huffman compressed*/
1948  {
1949    for(i = datapos; i < dataend; i++)
1950    {
1951      addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, data[i]), HuffmanTree_getLength(&tree_ll, data[i]));
1952    }
1953  }
1954  /*add END code*/
1955  if(!error) addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256));
1956
1957  /*cleanup*/
1958  HuffmanTree_cleanup(&tree_ll);
1959  HuffmanTree_cleanup(&tree_d);
1960
1961  return error;
1962}
1963
1964static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize,
1965                                 const LodePNGCompressSettings* settings)
1966{
1967  unsigned error = 0;
1968  size_t i, blocksize, numdeflateblocks;
1969  size_t bp = 0; /*the bit pointer*/
1970  Hash hash;
1971
1972  if(settings->btype > 2) return 61;
1973  else if(settings->btype == 0) return deflateNoCompression(out, in, insize);
1974  else if(settings->btype == 1) blocksize = insize;
1975  else /*if(settings->btype == 2)*/
1976  {
1977    blocksize = insize / 8 + 8;
1978    if(blocksize < 65535) blocksize = 65535;
1979  }
1980
1981  numdeflateblocks = (insize + blocksize - 1) / blocksize;
1982  if(numdeflateblocks == 0) numdeflateblocks = 1;
1983
1984  error = hash_init(&hash, settings->windowsize);
1985  if(error) return error;
1986
1987  for(i = 0; i < numdeflateblocks && !error; i++)
1988  {
1989    int final = i == numdeflateblocks - 1;
1990    size_t start = i * blocksize;
1991    size_t end = start + blocksize;
1992    if(end > insize) end = insize;
1993
1994    if(settings->btype == 1) error = deflateFixed(out, &bp, &hash, in, start, end, settings, final);
1995    else if(settings->btype == 2) error = deflateDynamic(out, &bp, &hash, in, start, end, settings, final);
1996  }
1997
1998  hash_cleanup(&hash);
1999
2000  return error;
2001}
2002
2003unsigned lodepng_deflate(unsigned char** out, size_t* outsize,
2004                         const unsigned char* in, size_t insize,
2005                         const LodePNGCompressSettings* settings)
2006{
2007  unsigned error;
2008  ucvector v;
2009  ucvector_init_buffer(&v, *out, *outsize);
2010  error = lodepng_deflatev(&v, in, insize, settings);
2011  *out = v.data;
2012  *outsize = v.size;
2013  return error;
2014}
2015
2016static unsigned deflate(unsigned char** out, size_t* outsize,
2017                        const unsigned char* in, size_t insize,
2018                        const LodePNGCompressSettings* settings)
2019{
2020  if(settings->custom_deflate)
2021  {
2022    return settings->custom_deflate(out, outsize, in, insize, settings);
2023  }
2024  else
2025  {
2026    return lodepng_deflate(out, outsize, in, insize, settings);
2027  }
2028}
2029
2030#endif /*LODEPNG_COMPILE_DECODER*/
2031
2032/* ////////////////////////////////////////////////////////////////////////// */
2033/* / Adler32                                                                  */
2034/* ////////////////////////////////////////////////////////////////////////// */
2035
2036static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len)
2037{
2038   unsigned s1 = adler & 0xffff;
2039   unsigned s2 = (adler >> 16) & 0xffff;
2040
2041  while(len > 0)
2042  {
2043    /*at least 5550 sums can be done before the sums overflow, saving a lot of module divisions*/
2044    unsigned amount = len > 5550 ? 5550 : len;
2045    len -= amount;
2046    while(amount > 0)
2047    {
2048      s1 += (*data++);
2049      s2 += s1;
2050      amount--;
2051    }
2052    s1 %= 65521;
2053    s2 %= 65521;
2054  }
2055
2056  return (s2 << 16) | s1;
2057}
2058
2059/*Return the adler32 of the bytes data[0..len-1]*/
2060static unsigned adler32(const unsigned char* data, unsigned len)
2061{
2062  return update_adler32(1L, data, len);
2063}
2064
2065/* ////////////////////////////////////////////////////////////////////////// */
2066/* / Zlib                                                                   / */
2067/* ////////////////////////////////////////////////////////////////////////// */
2068
2069#ifdef LODEPNG_COMPILE_DECODER
2070
2071unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in,
2072                                 size_t insize, const LodePNGDecompressSettings* settings)
2073{
2074  unsigned error = 0;
2075  unsigned CM, CINFO, FDICT;
2076
2077  if(insize < 2) return 53; /*error, size of zlib data too small*/
2078  /*read information from zlib header*/
2079  if((in[0] * 256 + in[1]) % 31 != 0)
2080  {
2081    /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/
2082    return 24;
2083  }
2084
2085  CM = in[0] & 15;
2086  CINFO = (in[0] >> 4) & 15;
2087  /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/
2088  FDICT = (in[1] >> 5) & 1;
2089  /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/
2090
2091  if(CM != 8 || CINFO > 7)
2092  {
2093    /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/
2094    return 25;
2095  }
2096  if(FDICT != 0)
2097  {
2098    /*error: the specification of PNG says about the zlib stream:
2099      "The additional flags shall not specify a preset dictionary."*/
2100    return 26;
2101  }
2102
2103  error = inflate(out, outsize, in + 2, insize - 2, settings);
2104  if(error) return error;
2105
2106  if(!settings->ignore_adler32)
2107  {
2108    unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]);
2109    unsigned checksum = adler32(*out, (unsigned)(*outsize));
2110    if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/
2111  }
2112
2113  return 0; /*no error*/
2114}
2115
2116static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in,
2117                                size_t insize, const LodePNGDecompressSettings* settings)
2118{
2119  if(settings->custom_zlib)
2120  {
2121    return settings->custom_zlib(out, outsize, in, insize, settings);
2122  }
2123  else
2124  {
2125    return lodepng_zlib_decompress(out, outsize, in, insize, settings);
2126  }
2127}
2128
2129#endif /*LODEPNG_COMPILE_DECODER*/
2130
2131#ifdef LODEPNG_COMPILE_ENCODER
2132
2133unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in,
2134                               size_t insize, const LodePNGCompressSettings* settings)
2135{
2136  /*initially, *out must be NULL and outsize 0, if you just give some random *out
2137  that's pointing to a non allocated buffer, this'll crash*/
2138  ucvector outv;
2139  size_t i;
2140  unsigned error;
2141  unsigned char* deflatedata = 0;
2142  size_t deflatesize = 0;
2143
2144  unsigned ADLER32;
2145  /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/
2146  unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/
2147  unsigned FLEVEL = 0;
2148  unsigned FDICT = 0;
2149  unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64;
2150  unsigned FCHECK = 31 - CMFFLG % 31;
2151  CMFFLG += FCHECK;
2152
2153  /*ucvector-controlled version of the output buffer, for dynamic array*/
2154  ucvector_init_buffer(&outv, *out, *outsize);
2155
2156  ucvector_push_back(&outv, (unsigned char)(CMFFLG / 256));
2157  ucvector_push_back(&outv, (unsigned char)(CMFFLG % 256));
2158
2159  error = deflate(&deflatedata, &deflatesize, in, insize, settings);
2160
2161  if(!error)
2162  {
2163    ADLER32 = adler32(in, (unsigned)insize);
2164    for(i = 0; i < deflatesize; i++) ucvector_push_back(&outv, deflatedata[i]);
2165    lodepng_free(deflatedata);
2166    lodepng_add32bitInt(&outv, ADLER32);
2167  }
2168
2169  *out = outv.data;
2170  *outsize = outv.size;
2171
2172  return error;
2173}
2174
2175/* compress using the default or custom zlib function */
2176static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in,
2177                              size_t insize, const LodePNGCompressSettings* settings)
2178{
2179  if(settings->custom_zlib)
2180  {
2181    return settings->custom_zlib(out, outsize, in, insize, settings);
2182  }
2183  else
2184  {
2185    return lodepng_zlib_compress(out, outsize, in, insize, settings);
2186  }
2187}
2188
2189#endif /*LODEPNG_COMPILE_ENCODER*/
2190
2191#else /*no LODEPNG_COMPILE_ZLIB*/
2192
2193#ifdef LODEPNG_COMPILE_DECODER
2194static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in,
2195                                size_t insize, const LodePNGDecompressSettings* settings)
2196{
2197  if (!settings->custom_zlib) return 87; /*no custom zlib function provided */
2198  return settings->custom_zlib(out, outsize, in, insize, settings);
2199}
2200#endif /*LODEPNG_COMPILE_DECODER*/
2201#ifdef LODEPNG_COMPILE_ENCODER
2202static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in,
2203                              size_t insize, const LodePNGCompressSettings* settings)
2204{
2205  if (!settings->custom_zlib) return 87; /*no custom zlib function provided */
2206  return settings->custom_zlib(out, outsize, in, insize, settings);
2207}
2208#endif /*LODEPNG_COMPILE_ENCODER*/
2209
2210#endif /*LODEPNG_COMPILE_ZLIB*/
2211
2212/* ////////////////////////////////////////////////////////////////////////// */
2213
2214#ifdef LODEPNG_COMPILE_ENCODER
2215
2216/*this is a good tradeoff between speed and compression ratio*/
2217#define DEFAULT_WINDOWSIZE 2048
2218
2219void lodepng_compress_settings_init(LodePNGCompressSettings* settings)
2220{
2221  /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/
2222  settings->btype = 2;
2223  settings->use_lz77 = 1;
2224  settings->windowsize = DEFAULT_WINDOWSIZE;
2225  settings->minmatch = 3;
2226  settings->nicematch = 128;
2227  settings->lazymatching = 1;
2228
2229  settings->custom_zlib = 0;
2230  settings->custom_deflate = 0;
2231  settings->custom_context = 0;
2232}
2233
2234const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0};
2235
2236
2237#endif /*LODEPNG_COMPILE_ENCODER*/
2238
2239#ifdef LODEPNG_COMPILE_DECODER
2240
2241void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings)
2242{
2243  settings->ignore_adler32 = 0;
2244
2245  settings->custom_zlib = 0;
2246  settings->custom_inflate = 0;
2247  settings->custom_context = 0;
2248}
2249
2250const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0};
2251
2252#endif /*LODEPNG_COMPILE_DECODER*/
2253
2254/* ////////////////////////////////////////////////////////////////////////// */
2255/* ////////////////////////////////////////////////////////////////////////// */
2256/* // End of Zlib related code. Begin of PNG related code.                 // */
2257/* ////////////////////////////////////////////////////////////////////////// */
2258/* ////////////////////////////////////////////////////////////////////////// */
2259
2260#ifdef LODEPNG_COMPILE_PNG
2261
2262/* ////////////////////////////////////////////////////////////////////////// */
2263/* / CRC32                                                                  / */
2264/* ////////////////////////////////////////////////////////////////////////// */
2265
2266/* CRC polynomial: 0xedb88320 */
2267static unsigned lodepng_crc32_table[256] = {
2268           0u, 1996959894u, 3993919788u, 2567524794u,  124634137u, 1886057615u, 3915621685u, 2657392035u,
2269   249268274u, 2044508324u, 3772115230u, 2547177864u,  162941995u, 2125561021u, 3887607047u, 2428444049u,
2270   498536548u, 1789927666u, 4089016648u, 2227061214u,  450548861u, 1843258603u, 4107580753u, 2211677639u,
2271   325883990u, 1684777152u, 4251122042u, 2321926636u,  335633487u, 1661365465u, 4195302755u, 2366115317u,
2272   997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u,
2273   901097722u, 1119000684u, 3686517206u, 2898065728u,  853044451u, 1172266101u, 3705015759u, 2882616665u,
2274   651767980u, 1373503546u, 3369554304u, 3218104598u,  565507253u, 1454621731u, 3485111705u, 3099436303u,
2275   671266974u, 1594198024u, 3322730930u, 2970347812u,  795835527u, 1483230225u, 3244367275u, 3060149565u,
2276  1994146192u,   31158534u, 2563907772u, 4023717930u, 1907459465u,  112637215u, 2680153253u, 3904427059u,
2277  2013776290u,  251722036u, 2517215374u, 3775830040u, 2137656763u,  141376813u, 2439277719u, 3865271297u,
2278  1802195444u,  476864866u, 2238001368u, 4066508878u, 1812370925u,  453092731u, 2181625025u, 4111451223u,
2279  1706088902u,  314042704u, 2344532202u, 4240017532u, 1658658271u,  366619977u, 2362670323u, 4224994405u,
2280  1303535960u,  984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u,
2281  1131014506u,  879679996u, 2909243462u, 3663771856u, 1141124467u,  855842277u, 2852801631u, 3708648649u,
2282  1342533948u,  654459306u, 3188396048u, 3373015174u, 1466479909u,  544179635u, 3110523913u, 3462522015u,
2283  1591671054u,  702138776u, 2966460450u, 3352799412u, 1504918807u,  783551873u, 3082640443u, 3233442989u,
2284  3988292384u, 2596254646u,   62317068u, 1957810842u, 3939845945u, 2647816111u,   81470997u, 1943803523u,
2285  3814918930u, 2489596804u,  225274430u, 2053790376u, 3826175755u, 2466906013u,  167816743u, 2097651377u,
2286  4027552580u, 2265490386u,  503444072u, 1762050814u, 4150417245u, 2154129355u,  426522225u, 1852507879u,
2287  4275313526u, 2312317920u,  282753626u, 1742555852u, 4189708143u, 2394877945u,  397917763u, 1622183637u,
2288  3604390888u, 2714866558u,  953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u,
2289  3624741850u, 2936675148u,  906185462u, 1090812512u, 3747672003u, 2825379669u,  829329135u, 1181335161u,
2290  3412177804u, 3160834842u,  628085408u, 1382605366u, 3423369109u, 3138078467u,  570562233u, 1426400815u,
2291  3317316542u, 2998733608u,  733239954u, 1555261956u, 3268935591u, 3050360625u,  752459403u, 1541320221u,
2292  2607071920u, 3965973030u, 1969922972u,   40735498u, 2617837225u, 3943577151u, 1913087877u,   83908371u,
2293  2512341634u, 3803740692u, 2075208622u,  213261112u, 2463272603u, 3855990285u, 2094854071u,  198958881u,
2294  2262029012u, 4057260610u, 1759359992u,  534414190u, 2176718541u, 4139329115u, 1873836001u,  414664567u,
2295  2282248934u, 4279200368u, 1711684554u,  285281116u, 2405801727u, 4167216745u, 1634467795u,  376229701u,
2296  2685067896u, 3608007406u, 1308918612u,  956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u,
2297  2932959818u, 3654703836u, 1088359270u,  936918000u, 2847714899u, 3736837829u, 1202900863u,  817233897u,
2298  3183342108u, 3401237130u, 1404277552u,  615818150u, 3134207493u, 3453421203u, 1423857449u,  601450431u,
2299  3009837614u, 3294710456u, 1567103746u,  711928724u, 3020668471u, 3272380065u, 1510334235u,  755167117u
2300};
2301
2302/*Return the CRC of the bytes buf[0..len-1].*/
2303unsigned lodepng_crc32(const unsigned char* buf, size_t len)
2304{
2305  unsigned c = 0xffffffffL;
2306  size_t n;
2307
2308  for(n = 0; n < len; n++)
2309  {
2310    c = lodepng_crc32_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
2311  }
2312  return c ^ 0xffffffffL;
2313}
2314
2315/* ////////////////////////////////////////////////////////////////////////// */
2316/* / Reading and writing single bits and bytes from/to stream for LodePNG   / */
2317/* ////////////////////////////////////////////////////////////////////////// */
2318
2319static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream)
2320{
2321  unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1);
2322  (*bitpointer)++;
2323  return result;
2324}
2325
2326static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits)
2327{
2328  unsigned result = 0;
2329  size_t i;
2330  for(i = nbits - 1; i < nbits; i--)
2331  {
2332    result += (unsigned)readBitFromReversedStream(bitpointer, bitstream) << i;
2333  }
2334  return result;
2335}
2336
2337#ifdef LODEPNG_COMPILE_DECODER
2338static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream, unsigned char bit)
2339{
2340  /*the current bit in bitstream must be 0 for this to work*/
2341  if(bit)
2342  {
2343    /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/
2344    bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7)));
2345  }
2346  (*bitpointer)++;
2347}
2348#endif /*LODEPNG_COMPILE_DECODER*/
2349
2350static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit)
2351{
2352  /*the current bit in bitstream may be 0 or 1 for this to work*/
2353  if(bit == 0) bitstream[(*bitpointer) >> 3] &=  (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7))));
2354  else         bitstream[(*bitpointer) >> 3] |=  (1 << (7 - ((*bitpointer) & 0x7)));
2355  (*bitpointer)++;
2356}
2357
2358/* ////////////////////////////////////////////////////////////////////////// */
2359/* / PNG chunks                                                             / */
2360/* ////////////////////////////////////////////////////////////////////////// */
2361
2362unsigned lodepng_chunk_length(const unsigned char* chunk)
2363{
2364  return lodepng_read32bitInt(&chunk[0]);
2365}
2366
2367void lodepng_chunk_type(char type[5], const unsigned char* chunk)
2368{
2369  unsigned i;
2370  for(i = 0; i < 4; i++) type[i] = chunk[4 + i];
2371  type[4] = 0; /*null termination char*/
2372}
2373
2374unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type)
2375{
2376  if(strlen(type) != 4) return 0;
2377  return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]);
2378}
2379
2380unsigned char lodepng_chunk_ancillary(const unsigned char* chunk)
2381{
2382  return((chunk[4] & 32) != 0);
2383}
2384
2385unsigned char lodepng_chunk_private(const unsigned char* chunk)
2386{
2387  return((chunk[6] & 32) != 0);
2388}
2389
2390unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk)
2391{
2392  return((chunk[7] & 32) != 0);
2393}
2394
2395unsigned char* lodepng_chunk_data(unsigned char* chunk)
2396{
2397  return &chunk[8];
2398}
2399
2400const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk)
2401{
2402  return &chunk[8];
2403}
2404
2405unsigned lodepng_chunk_check_crc(const unsigned char* chunk)
2406{
2407  unsigned length = lodepng_chunk_length(chunk);
2408  unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]);
2409  /*the CRC is taken of the data and the 4 chunk type letters, not the length*/
2410  unsigned checksum = lodepng_crc32(&chunk[4], length + 4);
2411  if(CRC != checksum) return 1;
2412  else return 0;
2413}
2414
2415void lodepng_chunk_generate_crc(unsigned char* chunk)
2416{
2417  unsigned length = lodepng_chunk_length(chunk);
2418  unsigned CRC = lodepng_crc32(&chunk[4], length + 4);
2419  lodepng_set32bitInt(chunk + 8 + length, CRC);
2420}
2421
2422unsigned char* lodepng_chunk_next(unsigned char* chunk)
2423{
2424  unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12;
2425  return &chunk[total_chunk_length];
2426}
2427
2428const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk)
2429{
2430  unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12;
2431  return &chunk[total_chunk_length];
2432}
2433
2434unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk)
2435{
2436  unsigned i;
2437  unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12;
2438  unsigned char *chunk_start, *new_buffer;
2439  size_t new_length = (*outlength) + total_chunk_length;
2440  if(new_length < total_chunk_length || new_length < (*outlength)) return 77; /*integer overflow happened*/
2441
2442  new_buffer = (unsigned char*)lodepng_realloc(*out, new_length);
2443  if(!new_buffer) return 83; /*alloc fail*/
2444  (*out) = new_buffer;
2445  (*outlength) = new_length;
2446  chunk_start = &(*out)[new_length - total_chunk_length];
2447
2448  for(i = 0; i < total_chunk_length; i++) chunk_start[i] = chunk[i];
2449
2450  return 0;
2451}
2452
2453unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length,
2454                              const char* type, const unsigned char* data)
2455{
2456  unsigned i;
2457  unsigned char *chunk, *new_buffer;
2458  size_t new_length = (*outlength) + length + 12;
2459  if(new_length < length + 12 || new_length < (*outlength)) return 77; /*integer overflow happened*/
2460  new_buffer = (unsigned char*)lodepng_realloc(*out, new_length);
2461  if(!new_buffer) return 83; /*alloc fail*/
2462  (*out) = new_buffer;
2463  (*outlength) = new_length;
2464  chunk = &(*out)[(*outlength) - length - 12];
2465
2466  /*1: length*/
2467  lodepng_set32bitInt(chunk, (unsigned)length);
2468
2469  /*2: chunk name (4 letters)*/
2470  chunk[4] = type[0];
2471  chunk[5] = type[1];
2472  chunk[6] = type[2];
2473  chunk[7] = type[3];
2474
2475  /*3: the data*/
2476  for(i = 0; i < length; i++) chunk[8 + i] = data[i];
2477
2478  /*4: CRC (of the chunkname characters and the data)*/
2479  lodepng_chunk_generate_crc(chunk);
2480
2481  return 0;
2482}
2483
2484/* ////////////////////////////////////////////////////////////////////////// */
2485/* / Color types and such                                                   / */
2486/* ////////////////////////////////////////////////////////////////////////// */
2487
2488/*return type is a LodePNG error code*/
2489static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) /*bd = bitdepth*/
2490{
2491  switch(colortype)
2492  {
2493    case 0: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; /*grey*/
2494    case 2: if(!(                                 bd == 8 || bd == 16)) return 37; break; /*RGB*/
2495    case 3: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8            )) return 37; break; /*palette*/
2496    case 4: if(!(                                 bd == 8 || bd == 16)) return 37; break; /*grey + alpha*/
2497    case 6: if(!(                                 bd == 8 || bd == 16)) return 37; break; /*RGBA*/
2498    default: return 31;
2499  }
2500  return 0; /*allowed color type / bits combination*/
2501}
2502
2503static unsigned getNumColorChannels(LodePNGColorType colortype)
2504{
2505  switch(colortype)
2506  {
2507    case 0: return 1; /*grey*/
2508    case 2: return 3; /*RGB*/
2509    case 3: return 1; /*palette*/
2510    case 4: return 2; /*grey + alpha*/
2511    case 6: return 4; /*RGBA*/
2512  }
2513  return 0; /*unexisting color type*/
2514}
2515
2516static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth)
2517{
2518  /*bits per pixel is amount of channels * bits per channel*/
2519  return getNumColorChannels(colortype) * bitdepth;
2520}
2521
2522/* ////////////////////////////////////////////////////////////////////////// */
2523
2524void lodepng_color_mode_init(LodePNGColorMode* info)
2525{
2526  info->key_defined = 0;
2527  info->key_r = info->key_g = info->key_b = 0;
2528  info->colortype = LCT_RGBA;
2529  info->bitdepth = 8;
2530  info->palette = 0;
2531  info->palettesize = 0;
2532}
2533
2534void lodepng_color_mode_cleanup(LodePNGColorMode* info)
2535{
2536  lodepng_palette_clear(info);
2537}
2538
2539unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source)
2540{
2541  size_t i;
2542  lodepng_color_mode_cleanup(dest);
2543  *dest = *source;
2544  if(source->palette)
2545  {
2546    dest->palette = (unsigned char*)lodepng_malloc(1024);
2547    if(!dest->palette && source->palettesize) return 83; /*alloc fail*/
2548    for(i = 0; i < source->palettesize * 4; i++) dest->palette[i] = source->palette[i];
2549  }
2550  return 0;
2551}
2552
2553static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b)
2554{
2555  size_t i;
2556  if(a->colortype != b->colortype) return 0;
2557  if(a->bitdepth != b->bitdepth) return 0;
2558  if(a->key_defined != b->key_defined) return 0;
2559  if(a->key_defined)
2560  {
2561    if(a->key_r != b->key_r) return 0;
2562    if(a->key_g != b->key_g) return 0;
2563    if(a->key_b != b->key_b) return 0;
2564  }
2565  if(a->palettesize != b->palettesize) return 0;
2566  for(i = 0; i < a->palettesize * 4; i++)
2567  {
2568    if(a->palette[i] != b->palette[i]) return 0;
2569  }
2570  return 1;
2571}
2572
2573void lodepng_palette_clear(LodePNGColorMode* info)
2574{
2575  if(info->palette) lodepng_free(info->palette);
2576  info->palette = 0;
2577  info->palettesize = 0;
2578}
2579
2580unsigned lodepng_palette_add(LodePNGColorMode* info,
2581                             unsigned char r, unsigned char g, unsigned char b, unsigned char a)
2582{
2583  unsigned char* data;
2584  /*the same resize technique as C++ std::vectors is used, and here it's made so that for a palette with
2585  the max of 256 colors, it'll have the exact alloc size*/
2586  if(!info->palette) /*allocate palette if empty*/
2587  {
2588    /*room for 256 colors with 4 bytes each*/
2589    data = (unsigned char*)lodepng_realloc(info->palette, 1024);
2590    if(!data) return 83; /*alloc fail*/
2591    else info->palette = data;
2592  }
2593  info->palette[4 * info->palettesize + 0] = r;
2594  info->palette[4 * info->palettesize + 1] = g;
2595  info->palette[4 * info->palettesize + 2] = b;
2596  info->palette[4 * info->palettesize + 3] = a;
2597  info->palettesize++;
2598  return 0;
2599}
2600
2601unsigned lodepng_get_bpp(const LodePNGColorMode* info)
2602{
2603  /*calculate bits per pixel out of colortype and bitdepth*/
2604  return lodepng_get_bpp_lct(info->colortype, info->bitdepth);
2605}
2606
2607unsigned lodepng_get_channels(const LodePNGColorMode* info)
2608{
2609  return getNumColorChannels(info->colortype);
2610}
2611
2612unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info)
2613{
2614  return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA;
2615}
2616
2617unsigned lodepng_is_alpha_type(const LodePNGColorMode* info)
2618{
2619  return (info->colortype & 4) != 0; /*4 or 6*/
2620}
2621
2622unsigned lodepng_is_palette_type(const LodePNGColorMode* info)
2623{
2624  return info->colortype == LCT_PALETTE;
2625}
2626
2627unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info)
2628{
2629  size_t i;
2630  for(i = 0; i < info->palettesize; i++)
2631  {
2632    if(info->palette[i * 4 + 3] < 255) return 1;
2633  }
2634  return 0;
2635}
2636
2637unsigned lodepng_can_have_alpha(const LodePNGColorMode* info)
2638{
2639  return info->key_defined
2640      || lodepng_is_alpha_type(info)
2641      || lodepng_has_palette_alpha(info);
2642}
2643
2644size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color)
2645{
2646  return (w * h * lodepng_get_bpp(color) + 7) / 8;
2647}
2648
2649size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth)
2650{
2651  return (w * h * lodepng_get_bpp_lct(colortype, bitdepth) + 7) / 8;
2652}
2653
2654#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
2655
2656static void LodePNGUnknownChunks_init(LodePNGInfo* info)
2657{
2658  unsigned i;
2659  for(i = 0; i < 3; i++) info->unknown_chunks_data[i] = 0;
2660  for(i = 0; i < 3; i++) info->unknown_chunks_size[i] = 0;
2661}
2662
2663static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info)
2664{
2665  unsigned i;
2666  for(i = 0; i < 3; i++) lodepng_free(info->unknown_chunks_data[i]);
2667}
2668
2669static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src)
2670{
2671  unsigned i;
2672
2673  LodePNGUnknownChunks_cleanup(dest);
2674
2675  for(i = 0; i < 3; i++)
2676  {
2677    size_t j;
2678    dest->unknown_chunks_size[i] = src->unknown_chunks_size[i];
2679    dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]);
2680    if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/
2681    for(j = 0; j < src->unknown_chunks_size[i]; j++)
2682    {
2683      dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j];
2684    }
2685  }
2686
2687  return 0;
2688}
2689
2690/******************************************************************************/
2691
2692static void LodePNGText_init(LodePNGInfo* info)
2693{
2694  info->text_num = 0;
2695  info->text_keys = NULL;
2696  info->text_strings = NULL;
2697}
2698
2699static void LodePNGText_cleanup(LodePNGInfo* info)
2700{
2701  size_t i;
2702  for(i = 0; i < info->text_num; i++)
2703  {
2704    string_cleanup(&info->text_keys[i]);
2705    string_cleanup(&info->text_strings[i]);
2706  }
2707  lodepng_free(info->text_keys);
2708  lodepng_free(info->text_strings);
2709}
2710
2711static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source)
2712{
2713  size_t i = 0;
2714  dest->text_keys = 0;
2715  dest->text_strings = 0;
2716  dest->text_num = 0;
2717  for(i = 0; i < source->text_num; i++)
2718  {
2719    CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i]));
2720  }
2721  return 0;
2722}
2723
2724void lodepng_clear_text(LodePNGInfo* info)
2725{
2726  LodePNGText_cleanup(info);
2727}
2728
2729unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str)
2730{
2731  char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1)));
2732  char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1)));
2733  if(!new_keys || !new_strings)
2734  {
2735    lodepng_free(new_keys);
2736    lodepng_free(new_strings);
2737    return 83; /*alloc fail*/
2738  }
2739
2740  info->text_num++;
2741  info->text_keys = new_keys;
2742  info->text_strings = new_strings;
2743
2744  string_init(&info->text_keys[info->text_num - 1]);
2745  string_set(&info->text_keys[info->text_num - 1], key);
2746
2747  string_init(&info->text_strings[info->text_num - 1]);
2748  string_set(&info->text_strings[info->text_num - 1], str);
2749
2750  return 0;
2751}
2752
2753/******************************************************************************/
2754
2755static void LodePNGIText_init(LodePNGInfo* info)
2756{
2757  info->itext_num = 0;
2758  info->itext_keys = NULL;
2759  info->itext_langtags = NULL;
2760  info->itext_transkeys = NULL;
2761  info->itext_strings = NULL;
2762}
2763
2764static void LodePNGIText_cleanup(LodePNGInfo* info)
2765{
2766  size_t i;
2767  for(i = 0; i < info->itext_num; i++)
2768  {
2769    string_cleanup(&info->itext_keys[i]);
2770    string_cleanup(&info->itext_langtags[i]);
2771    string_cleanup(&info->itext_transkeys[i]);
2772    string_cleanup(&info->itext_strings[i]);
2773  }
2774  lodepng_free(info->itext_keys);
2775  lodepng_free(info->itext_langtags);
2776  lodepng_free(info->itext_transkeys);
2777  lodepng_free(info->itext_strings);
2778}
2779
2780static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source)
2781{
2782  size_t i = 0;
2783  dest->itext_keys = 0;
2784  dest->itext_langtags = 0;
2785  dest->itext_transkeys = 0;
2786  dest->itext_strings = 0;
2787  dest->itext_num = 0;
2788  for(i = 0; i < source->itext_num; i++)
2789  {
2790    CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i],
2791                                        source->itext_transkeys[i], source->itext_strings[i]));
2792  }
2793  return 0;
2794}
2795
2796void lodepng_clear_itext(LodePNGInfo* info)
2797{
2798  LodePNGIText_cleanup(info);
2799}
2800
2801unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag,
2802                           const char* transkey, const char* str)
2803{
2804  char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1)));
2805  char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1)));
2806  char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1)));
2807  char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1)));
2808  if(!new_keys || !new_langtags || !new_transkeys || !new_strings)
2809  {
2810    lodepng_free(new_keys);
2811    lodepng_free(new_langtags);
2812    lodepng_free(new_transkeys);
2813    lodepng_free(new_strings);
2814    return 83; /*alloc fail*/
2815  }
2816
2817  info->itext_num++;
2818  info->itext_keys = new_keys;
2819  info->itext_langtags = new_langtags;
2820  info->itext_transkeys = new_transkeys;
2821  info->itext_strings = new_strings;
2822
2823  string_init(&info->itext_keys[info->itext_num - 1]);
2824  string_set(&info->itext_keys[info->itext_num - 1], key);
2825
2826  string_init(&info->itext_langtags[info->itext_num - 1]);
2827  string_set(&info->itext_langtags[info->itext_num - 1], langtag);
2828
2829  string_init(&info->itext_transkeys[info->itext_num - 1]);
2830  string_set(&info->itext_transkeys[info->itext_num - 1], transkey);
2831
2832  string_init(&info->itext_strings[info->itext_num - 1]);
2833  string_set(&info->itext_strings[info->itext_num - 1], str);
2834
2835  return 0;
2836}
2837#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
2838
2839void lodepng_info_init(LodePNGInfo* info)
2840{
2841  lodepng_color_mode_init(&info->color);
2842  info->interlace_method = 0;
2843  info->compression_method = 0;
2844  info->filter_method = 0;
2845#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
2846  info->background_defined = 0;
2847  info->background_r = info->background_g = info->background_b = 0;
2848
2849  LodePNGText_init(info);
2850  LodePNGIText_init(info);
2851
2852  info->time_defined = 0;
2853  info->phys_defined = 0;
2854
2855  LodePNGUnknownChunks_init(info);
2856#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
2857}
2858
2859void lodepng_info_cleanup(LodePNGInfo* info)
2860{
2861  lodepng_color_mode_cleanup(&info->color);
2862#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
2863  LodePNGText_cleanup(info);
2864  LodePNGIText_cleanup(info);
2865
2866  LodePNGUnknownChunks_cleanup(info);
2867#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
2868}
2869
2870unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source)
2871{
2872  lodepng_info_cleanup(dest);
2873  *dest = *source;
2874  lodepng_color_mode_init(&dest->color);
2875  CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color));
2876
2877#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
2878  CERROR_TRY_RETURN(LodePNGText_copy(dest, source));
2879  CERROR_TRY_RETURN(LodePNGIText_copy(dest, source));
2880
2881  LodePNGUnknownChunks_init(dest);
2882  CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source));
2883#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
2884  return 0;
2885}
2886
2887void lodepng_info_swap(LodePNGInfo* a, LodePNGInfo* b)
2888{
2889  LodePNGInfo temp = *a;
2890  *a = *b;
2891  *b = temp;
2892}
2893
2894/* ////////////////////////////////////////////////////////////////////////// */
2895
2896/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/
2897static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in)
2898{
2899  unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/
2900  /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/
2901  unsigned p = index & m;
2902  in &= (1 << bits) - 1; /*filter out any other bits of the input value*/
2903  in = in << (bits * (m - p));
2904  if(p == 0) out[index * bits / 8] = in;
2905  else out[index * bits / 8] |= in;
2906}
2907
2908typedef struct ColorTree ColorTree;
2909
2910/*
2911One node of a color tree
2912This is the data structure used to count the number of unique colors and to get a palette
2913index for a color. It's like an octree, but because the alpha channel is used too, each
2914node has 16 instead of 8 children.
2915*/
2916struct ColorTree
2917{
2918  ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/
2919  int index; /*the payload. Only has a meaningful value if this is in the last level*/
2920};
2921
2922static void color_tree_init(ColorTree* tree)
2923{
2924  int i;
2925  for(i = 0; i < 16; i++) tree->children[i] = 0;
2926  tree->index = -1;
2927}
2928
2929static void color_tree_cleanup(ColorTree* tree)
2930{
2931  int i;
2932  for(i = 0; i < 16; i++)
2933  {
2934    if(tree->children[i])
2935    {
2936      color_tree_cleanup(tree->children[i]);
2937      lodepng_free(tree->children[i]);
2938    }
2939  }
2940}
2941
2942/*returns -1 if color not present, its index otherwise*/
2943static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
2944{
2945  int bit = 0;
2946  for(bit = 0; bit < 8; bit++)
2947  {
2948    int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1);
2949    if(!tree->children[i]) return -1;
2950    else tree = tree->children[i];
2951  }
2952  return tree ? tree->index : -1;
2953}
2954
2955#ifdef LODEPNG_COMPILE_ENCODER
2956static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
2957{
2958  return color_tree_get(tree, r, g, b, a) >= 0;
2959}
2960#endif /*LODEPNG_COMPILE_ENCODER*/
2961
2962/*color is not allowed to already exist.
2963Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/
2964static void color_tree_add(ColorTree* tree,
2965                           unsigned char r, unsigned char g, unsigned char b, unsigned char a, int index)
2966{
2967  int bit;
2968  for(bit = 0; bit < 8; bit++)
2969  {
2970    int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1);
2971    if(!tree->children[i])
2972    {
2973      tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree));
2974      color_tree_init(tree->children[i]);
2975    }
2976    tree = tree->children[i];
2977  }
2978  tree->index = index;
2979}
2980
2981/*put a pixel, given its RGBA color, into image of any color type*/
2982static unsigned rgba8ToPixel(unsigned char* out, size_t i,
2983                             const LodePNGColorMode* mode, ColorTree* tree /*for palette*/,
2984                             unsigned char r, unsigned char g, unsigned char b, unsigned char a)
2985{
2986  if(mode->colortype == LCT_GREY)
2987  {
2988    unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/;
2989    if(mode->bitdepth == 8) out[i] = grey;
2990    else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = grey;
2991    else
2992    {
2993      /*take the most significant bits of grey*/
2994      grey = (grey >> (8 - mode->bitdepth)) & ((1 << mode->bitdepth) - 1);
2995      addColorBits(out, i, mode->bitdepth, grey);
2996    }
2997  }
2998  else if(mode->colortype == LCT_RGB)
2999  {
3000    if(mode->bitdepth == 8)
3001    {
3002      out[i * 3 + 0] = r;
3003      out[i * 3 + 1] = g;
3004      out[i * 3 + 2] = b;
3005    }
3006    else
3007    {
3008      out[i * 6 + 0] = out[i * 6 + 1] = r;
3009      out[i * 6 + 2] = out[i * 6 + 3] = g;
3010      out[i * 6 + 4] = out[i * 6 + 5] = b;
3011    }
3012  }
3013  else if(mode->colortype == LCT_PALETTE)
3014  {
3015    int index = color_tree_get(tree, r, g, b, a);
3016    if(index < 0) return 82; /*color not in palette*/
3017    if(mode->bitdepth == 8) out[i] = index;
3018    else addColorBits(out, i, mode->bitdepth, index);
3019  }
3020  else if(mode->colortype == LCT_GREY_ALPHA)
3021  {
3022    unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/;
3023    if(mode->bitdepth == 8)
3024    {
3025      out[i * 2 + 0] = grey;
3026      out[i * 2 + 1] = a;
3027    }
3028    else if(mode->bitdepth == 16)
3029    {
3030      out[i * 4 + 0] = out[i * 4 + 1] = grey;
3031      out[i * 4 + 2] = out[i * 4 + 3] = a;
3032    }
3033  }
3034  else if(mode->colortype == LCT_RGBA)
3035  {
3036    if(mode->bitdepth == 8)
3037    {
3038      out[i * 4 + 0] = r;
3039      out[i * 4 + 1] = g;
3040      out[i * 4 + 2] = b;
3041      out[i * 4 + 3] = a;
3042    }
3043    else
3044    {
3045      out[i * 8 + 0] = out[i * 8 + 1] = r;
3046      out[i * 8 + 2] = out[i * 8 + 3] = g;
3047      out[i * 8 + 4] = out[i * 8 + 5] = b;
3048      out[i * 8 + 6] = out[i * 8 + 7] = a;
3049    }
3050  }
3051
3052  return 0; /*no error*/
3053}
3054
3055/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/
3056static unsigned rgba16ToPixel(unsigned char* out, size_t i,
3057                              const LodePNGColorMode* mode,
3058                              unsigned short r, unsigned short g, unsigned short b, unsigned short a)
3059{
3060  if(mode->bitdepth != 16) return 85; /*must be 16 for this function*/
3061  if(mode->colortype == LCT_GREY)
3062  {
3063    unsigned short grey = r; /*((unsigned)r + g + b) / 3*/;
3064    out[i * 2 + 0] = (grey >> 8) & 255;
3065    out[i * 2 + 1] = grey & 255;
3066  }
3067  else if(mode->colortype == LCT_RGB)
3068  {
3069    out[i * 6 + 0] = (r >> 8) & 255;
3070    out[i * 6 + 1] = r & 255;
3071    out[i * 6 + 2] = (g >> 8) & 255;
3072    out[i * 6 + 3] = g & 255;
3073    out[i * 6 + 4] = (b >> 8) & 255;
3074    out[i * 6 + 5] = b & 255;
3075  }
3076  else if(mode->colortype == LCT_GREY_ALPHA)
3077  {
3078    unsigned short grey = r; /*((unsigned)r + g + b) / 3*/;
3079    out[i * 4 + 0] = (grey >> 8) & 255;
3080    out[i * 4 + 1] = grey & 255;
3081    out[i * 4 + 2] = (a >> 8) & 255;
3082    out[i * 4 + 3] = a & 255;
3083  }
3084  else if(mode->colortype == LCT_RGBA)
3085  {
3086    out[i * 8 + 0] = (r >> 8) & 255;
3087    out[i * 8 + 1] = r & 255;
3088    out[i * 8 + 2] = (g >> 8) & 255;
3089    out[i * 8 + 3] = g & 255;
3090    out[i * 8 + 4] = (b >> 8) & 255;
3091    out[i * 8 + 5] = b & 255;
3092    out[i * 8 + 6] = (a >> 8) & 255;
3093    out[i * 8 + 7] = a & 255;
3094  }
3095
3096  return 0; /*no error*/
3097}
3098
3099/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/
3100static unsigned getPixelColorRGBA8(unsigned char* r, unsigned char* g,
3101                                   unsigned char* b, unsigned char* a,
3102                                   const unsigned char* in, size_t i,
3103                                   const LodePNGColorMode* mode,
3104                                   unsigned fix_png)
3105{
3106  if(mode->colortype == LCT_GREY)
3107  {
3108    if(mode->bitdepth == 8)
3109    {
3110      *r = *g = *b = in[i];
3111      if(mode->key_defined && *r == mode->key_r) *a = 0;
3112      else *a = 255;
3113    }
3114    else if(mode->bitdepth == 16)
3115    {
3116      *r = *g = *b = in[i * 2 + 0];
3117      if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0;
3118      else *a = 255;
3119    }
3120    else
3121    {
3122      unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/
3123      size_t j = i * mode->bitdepth;
3124      unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);
3125      *r = *g = *b = (value * 255) / highest;
3126      if(mode->key_defined && value == mode->key_r) *a = 0;
3127      else *a = 255;
3128    }
3129  }
3130  else if(mode->colortype == LCT_RGB)
3131  {
3132    if(mode->bitdepth == 8)
3133    {
3134      *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2];
3135      if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0;
3136      else *a = 255;
3137    }
3138    else
3139    {
3140      *r = in[i * 6 + 0];
3141      *g = in[i * 6 + 2];
3142      *b = in[i * 6 + 4];
3143      if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r
3144         && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g
3145         && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0;
3146      else *a = 255;
3147    }
3148  }
3149  else if(mode->colortype == LCT_PALETTE)
3150  {
3151    unsigned index;
3152    if(mode->bitdepth == 8) index = in[i];
3153    else
3154    {
3155      size_t j = i * mode->bitdepth;
3156      index = readBitsFromReversedStream(&j, in, mode->bitdepth);
3157    }
3158
3159    if(index >= mode->palettesize)
3160    {
3161      /*This is an error according to the PNG spec, but fix_png can ignore it*/
3162      if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/
3163      *r = *g = *b = 0;
3164      *a = 255;
3165    }
3166    else
3167    {
3168      *r = mode->palette[index * 4 + 0];
3169      *g = mode->palette[index * 4 + 1];
3170      *b = mode->palette[index * 4 + 2];
3171      *a = mode->palette[index * 4 + 3];
3172    }
3173  }
3174  else if(mode->colortype == LCT_GREY_ALPHA)
3175  {
3176    if(mode->bitdepth == 8)
3177    {
3178      *r = *g = *b = in[i * 2 + 0];
3179      *a = in[i * 2 + 1];
3180    }
3181    else
3182    {
3183      *r = *g = *b = in[i * 4 + 0];
3184      *a = in[i * 4 + 2];
3185    }
3186  }
3187  else if(mode->colortype == LCT_RGBA)
3188  {
3189    if(mode->bitdepth == 8)
3190    {
3191      *r = in[i * 4 + 0];
3192      *g = in[i * 4 + 1];
3193      *b = in[i * 4 + 2];
3194      *a = in[i * 4 + 3];
3195    }
3196    else
3197    {
3198      *r = in[i * 8 + 0];
3199      *g = in[i * 8 + 2];
3200      *b = in[i * 8 + 4];
3201      *a = in[i * 8 + 6];
3202    }
3203  }
3204
3205  return 0; /*no error*/
3206}
3207
3208/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color
3209mode test cases, optimized to convert the colors much faster, when converting
3210to RGBA or RGB with 8 bit per cannel. buffer must be RGBA or RGB output with
3211enough memory, if has_alpha is true the output is RGBA. mode has the color mode
3212of the input buffer.*/
3213static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels,
3214                                    unsigned has_alpha, const unsigned char* in,
3215                                    const LodePNGColorMode* mode,
3216                                    unsigned fix_png)
3217{
3218  unsigned num_channels = has_alpha ? 4 : 3;
3219  size_t i;
3220  if(mode->colortype == LCT_GREY)
3221  {
3222    if(mode->bitdepth == 8)
3223    {
3224      for(i = 0; i < numpixels; i++, buffer += num_channels)
3225      {
3226        buffer[0] = buffer[1] = buffer[2] = in[i];
3227        if(has_alpha) buffer[3] = mode->key_defined && in[i] == mode->key_r ? 0 : 255;
3228      }
3229    }
3230    else if(mode->bitdepth == 16)
3231    {
3232      for(i = 0; i < numpixels; i++, buffer += num_channels)
3233      {
3234        buffer[0] = buffer[1] = buffer[2] = in[i * 2];
3235        if(has_alpha) buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255;
3236      }
3237    }
3238    else
3239    {
3240      unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/
3241      size_t j = 0;
3242      for(i = 0; i < numpixels; i++, buffer += num_channels)
3243      {
3244        unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);
3245        buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest;
3246        if(has_alpha) buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255;
3247      }
3248    }
3249  }
3250  else if(mode->colortype == LCT_RGB)
3251  {
3252    if(mode->bitdepth == 8)
3253    {
3254      for(i = 0; i < numpixels; i++, buffer += num_channels)
3255      {
3256        buffer[0] = in[i * 3 + 0];
3257        buffer[1] = in[i * 3 + 1];
3258        buffer[2] = in[i * 3 + 2];
3259        if(has_alpha) buffer[3] = mode->key_defined && buffer[0] == mode->key_r
3260           && buffer[1]== mode->key_g && buffer[2] == mode->key_b ? 0 : 255;
3261      }
3262    }
3263    else
3264    {
3265      for(i = 0; i < numpixels; i++, buffer += num_channels)
3266      {
3267        buffer[0] = in[i * 6 + 0];
3268        buffer[1] = in[i * 6 + 2];
3269        buffer[2] = in[i * 6 + 4];
3270        if(has_alpha) buffer[3] = mode->key_defined
3271           && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r
3272           && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g
3273           && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255;
3274      }
3275    }
3276  }
3277  else if(mode->colortype == LCT_PALETTE)
3278  {
3279    unsigned index;
3280    size_t j = 0;
3281    for(i = 0; i < numpixels; i++, buffer += num_channels)
3282    {
3283      if(mode->bitdepth == 8) index = in[i];
3284      else index = readBitsFromReversedStream(&j, in, mode->bitdepth);
3285
3286      if(index >= mode->palettesize)
3287      {
3288        /*This is an error according to the PNG spec, but fix_png can ignore it*/
3289        if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/
3290        buffer[0] = buffer[1] = buffer[2] = 0;
3291        if(has_alpha) buffer[3] = 255;
3292      }
3293      else
3294      {
3295        buffer[0] = mode->palette[index * 4 + 0];
3296        buffer[1] = mode->palette[index * 4 + 1];
3297        buffer[2] = mode->palette[index * 4 + 2];
3298        if(has_alpha) buffer[3] = mode->palette[index * 4 + 3];
3299      }
3300    }
3301  }
3302  else if(mode->colortype == LCT_GREY_ALPHA)
3303  {
3304    if(mode->bitdepth == 8)
3305    {
3306      for(i = 0; i < numpixels; i++, buffer += num_channels)
3307      {
3308        buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0];
3309        if(has_alpha) buffer[3] = in[i * 2 + 1];
3310      }
3311    }
3312    else
3313    {
3314      for(i = 0; i < numpixels; i++, buffer += num_channels)
3315      {
3316        buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0];
3317        if(has_alpha) buffer[3] = in[i * 4 + 2];
3318      }
3319    }
3320  }
3321  else if(mode->colortype == LCT_RGBA)
3322  {
3323    if(mode->bitdepth == 8)
3324    {
3325      for(i = 0; i < numpixels; i++, buffer += num_channels)
3326      {
3327        buffer[0] = in[i * 4 + 0];
3328        buffer[1] = in[i * 4 + 1];
3329        buffer[2] = in[i * 4 + 2];
3330        if(has_alpha) buffer[3] = in[i * 4 + 3];
3331      }
3332    }
3333    else
3334    {
3335      for(i = 0; i < numpixels; i++, buffer += num_channels)
3336      {
3337        buffer[0] = in[i * 8 + 0];
3338        buffer[1] = in[i * 8 + 2];
3339        buffer[2] = in[i * 8 + 4];
3340        if(has_alpha) buffer[3] = in[i * 8 + 6];
3341      }
3342    }
3343  }
3344
3345  return 0; /*no error*/
3346}
3347
3348/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with
3349given color type, but the given color type must be 16-bit itself.*/
3350static unsigned getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a,
3351                                    const unsigned char* in, size_t i, const LodePNGColorMode* mode)
3352{
3353  if(mode->bitdepth != 16) return 85; /*error: this function only supports 16-bit input*/
3354
3355  if(mode->colortype == LCT_GREY)
3356  {
3357    *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1];
3358    if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0;
3359    else *a = 65535;
3360  }
3361  else if(mode->colortype == LCT_RGB)
3362  {
3363    *r = 256 * in[i * 6 + 0] + in[i * 6 + 1];
3364    *g = 256 * in[i * 6 + 2] + in[i * 6 + 3];
3365    *b = 256 * in[i * 6 + 4] + in[i * 6 + 5];
3366    if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r
3367       && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g
3368       && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0;
3369    else *a = 65535;
3370  }
3371  else if(mode->colortype == LCT_GREY_ALPHA)
3372  {
3373    *r = *g = *b = 256 * in[i * 4 + 0] + in[i * 4 + 1];
3374    *a = 256 * in[i * 4 + 2] + in[i * 4 + 3];
3375  }
3376  else if(mode->colortype == LCT_RGBA)
3377  {
3378    *r = 256 * in[i * 8 + 0] + in[i * 8 + 1];
3379    *g = 256 * in[i * 8 + 2] + in[i * 8 + 3];
3380    *b = 256 * in[i * 8 + 4] + in[i * 8 + 5];
3381    *a = 256 * in[i * 8 + 6] + in[i * 8 + 7];
3382  }
3383  else return 85; /*error: this function only supports 16-bit input, not palettes*/
3384
3385  return 0; /*no error*/
3386}
3387
3388/*
3389converts from any color type to 24-bit or 32-bit (later maybe more supported). return value = LodePNG error code
3390the out buffer must have (w * h * bpp + 7) / 8 bytes, where bpp is the bits per pixel of the output color type
3391(lodepng_get_bpp) for < 8 bpp images, there may _not_ be padding bits at the end of scanlines.
3392*/
3393unsigned lodepng_convert(unsigned char* out, const unsigned char* in,
3394                         LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in,
3395                         unsigned w, unsigned h, unsigned fix_png)
3396{
3397  unsigned error = 0;
3398  size_t i;
3399  ColorTree tree;
3400  size_t numpixels = w * h;
3401
3402  if(lodepng_color_mode_equal(mode_out, mode_in))
3403  {
3404    size_t numbytes = lodepng_get_raw_size(w, h, mode_in);
3405    for(i = 0; i < numbytes; i++) out[i] = in[i];
3406    return error;
3407  }
3408
3409  if(mode_out->colortype == LCT_PALETTE)
3410  {
3411    size_t palsize = 1 << mode_out->bitdepth;
3412    if(mode_out->palettesize < palsize) palsize = mode_out->palettesize;
3413    color_tree_init(&tree);
3414    for(i = 0; i < palsize; i++)
3415    {
3416      unsigned char* p = &mode_out->palette[i * 4];
3417      color_tree_add(&tree, p[0], p[1], p[2], p[3], i);
3418    }
3419  }
3420
3421  if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16)
3422  {
3423    for(i = 0; i < numpixels; i++)
3424    {
3425      unsigned short r = 0, g = 0, b = 0, a = 0;
3426      error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);
3427      if(error) break;
3428      error = rgba16ToPixel(out, i, mode_out, r, g, b, a);
3429      if(error) break;
3430    }
3431  }
3432  else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA)
3433  {
3434    error = getPixelColorsRGBA8(out, numpixels, 1, in, mode_in, fix_png);
3435  }
3436  else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB)
3437  {
3438    error = getPixelColorsRGBA8(out, numpixels, 0, in, mode_in, fix_png);
3439  }
3440  else
3441  {
3442    unsigned char r = 0, g = 0, b = 0, a = 0;
3443    for(i = 0; i < numpixels; i++)
3444    {
3445      error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in, fix_png);
3446      if(error) break;
3447      error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a);
3448      if(error) break;
3449    }
3450  }
3451
3452  if(mode_out->colortype == LCT_PALETTE)
3453  {
3454    color_tree_cleanup(&tree);
3455  }
3456
3457  return error;
3458}
3459
3460#ifdef LODEPNG_COMPILE_ENCODER
3461
3462typedef struct ColorProfile
3463{
3464  unsigned char sixteenbit; /*needs more than 8 bits per channel*/
3465  unsigned char sixteenbit_done;
3466
3467
3468  unsigned char colored; /*not greyscale*/
3469  unsigned char colored_done;
3470
3471  unsigned char key; /*a color key is required, or more*/
3472  unsigned short key_r; /*these values are always in 16-bit bitdepth in the profile*/
3473  unsigned short key_g;
3474  unsigned short key_b;
3475  unsigned char alpha; /*alpha channel, or alpha palette, required*/
3476  unsigned char alpha_done;
3477
3478  unsigned numcolors;
3479  ColorTree tree; /*for listing the counted colors, up to 256*/
3480  unsigned char* palette; /*size 1024. Remember up to the first 256 RGBA colors*/
3481  unsigned maxnumcolors; /*if more than that amount counted*/
3482  unsigned char numcolors_done;
3483
3484  unsigned greybits; /*amount of bits required for greyscale (1, 2, 4, 8). Does not take 16 bit into account.*/
3485  unsigned char greybits_done;
3486
3487} ColorProfile;
3488
3489static void color_profile_init(ColorProfile* profile, const LodePNGColorMode* mode)
3490{
3491  profile->sixteenbit = 0;
3492  profile->sixteenbit_done = mode->bitdepth == 16 ? 0 : 1;
3493
3494  profile->colored = 0;
3495  profile->colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0;
3496
3497  profile->key = 0;
3498  profile->alpha = 0;
3499  profile->alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1;
3500
3501  profile->numcolors = 0;
3502  color_tree_init(&profile->tree);
3503  profile->palette = (unsigned char*)lodepng_malloc(1024);
3504  profile->maxnumcolors = 257;
3505  if(lodepng_get_bpp(mode) <= 8)
3506  {
3507    int bpp = lodepng_get_bpp(mode);
3508    profile->maxnumcolors = bpp == 1 ? 2 : (bpp == 2 ? 4 : (bpp == 4 ? 16 : 256));
3509  }
3510  profile->numcolors_done = 0;
3511
3512  profile->greybits = 1;
3513  profile->greybits_done = lodepng_get_bpp(mode) == 1 ? 1 : 0;
3514}
3515
3516static void color_profile_cleanup(ColorProfile* profile)
3517{
3518  color_tree_cleanup(&profile->tree);
3519  lodepng_free(profile->palette);
3520}
3521
3522/*function used for debug purposes with C++*/
3523/*void printColorProfile(ColorProfile* p)
3524{
3525  std::cout << "sixteenbit: " << (int)p->sixteenbit << std::endl;
3526  std::cout << "sixteenbit_done: " << (int)p->sixteenbit_done << std::endl;
3527  std::cout << "colored: " << (int)p->colored << std::endl;
3528  std::cout << "colored_done: " << (int)p->colored_done << std::endl;
3529  std::cout << "key: " << (int)p->key << std::endl;
3530  std::cout << "key_r: " << (int)p->key_r << std::endl;
3531  std::cout << "key_g: " << (int)p->key_g << std::endl;
3532  std::cout << "key_b: " << (int)p->key_b << std::endl;
3533  std::cout << "alpha: " << (int)p->alpha << std::endl;
3534  std::cout << "alpha_done: " << (int)p->alpha_done << std::endl;
3535  std::cout << "numcolors: " << (int)p->numcolors << std::endl;
3536  std::cout << "maxnumcolors: " << (int)p->maxnumcolors << std::endl;
3537  std::cout << "numcolors_done: " << (int)p->numcolors_done << std::endl;
3538  std::cout << "greybits: " << (int)p->greybits << std::endl;
3539  std::cout << "greybits_done: " << (int)p->greybits_done << std::endl;
3540}*/
3541
3542/*Returns how many bits needed to represent given value (max 8 bit)*/
3543unsigned getValueRequiredBits(unsigned short value)
3544{
3545  if(value == 0 || value == 255) return 1;
3546  /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/
3547  if(value % 17 == 0) return value % 85 == 0 ? 2 : 4;
3548  return 8;
3549}
3550
3551/*profile must already have been inited with mode.
3552It's ok to set some parameters of profile to done already.*/
3553static unsigned get_color_profile(ColorProfile* profile,
3554                                  const unsigned char* in,
3555                                  size_t numpixels /*must be full image size, for certain filesize based choices*/,
3556                                  const LodePNGColorMode* mode,
3557                                  unsigned fix_png)
3558{
3559  unsigned error = 0;
3560  size_t i;
3561
3562  if(mode->bitdepth == 16)
3563  {
3564    for(i = 0; i < numpixels; i++)
3565    {
3566      unsigned short r, g, b, a;
3567      error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode);
3568      if(error) break;
3569
3570      /*a color is considered good for 8-bit if the first byte and the second byte are equal,
3571        (so if it's divisible through 257), NOT necessarily if the second byte is 0*/
3572      if(!profile->sixteenbit_done
3573          && (((r & 255) != ((r >> 8) & 255))
3574           || ((g & 255) != ((g >> 8) & 255))
3575           || ((b & 255) != ((b >> 8) & 255))))
3576      {
3577        profile->sixteenbit = 1;
3578        profile->sixteenbit_done = 1;
3579        profile->greybits_done = 1; /*greybits is not applicable anymore at 16-bit*/
3580        profile->numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/
3581      }
3582
3583      if(!profile->colored_done && (r != g || r != b))
3584      {
3585        profile->colored = 1;
3586        profile->colored_done = 1;
3587        profile->greybits_done = 1; /*greybits is not applicable anymore*/
3588      }
3589
3590      if(!profile->alpha_done && a != 65535)
3591      {
3592        /*only use color key if numpixels large enough to justify tRNS chunk size*/
3593        if(a == 0 && numpixels > 16 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b)))
3594        {
3595          if(!profile->alpha && !profile->key)
3596          {
3597            profile->key = 1;
3598            profile->key_r = r;
3599            profile->key_g = g;
3600            profile->key_b = b;
3601          }
3602        }
3603        else
3604        {
3605          profile->alpha = 1;
3606          profile->alpha_done = 1;
3607          profile->greybits_done = 1; /*greybits is not applicable anymore*/
3608        }
3609      }
3610
3611      /* Color key cannot be used if an opaque pixel also has that RGB color. */
3612      if(!profile->alpha_done && a == 65535 && profile->key
3613          && r == profile->key_r && g == profile->key_g && b == profile->key_b)
3614      {
3615          profile->alpha = 1;
3616          profile->alpha_done = 1;
3617          profile->greybits_done = 1; /*greybits is not applicable anymore*/
3618      }
3619
3620      if(!profile->greybits_done)
3621      {
3622        /*assuming 8-bit r, this test does not care about 16-bit*/
3623        unsigned bits = getValueRequiredBits(r);
3624        if(bits > profile->greybits) profile->greybits = bits;
3625        if(profile->greybits >= 8) profile->greybits_done = 1;
3626      }
3627
3628      if(!profile->numcolors_done)
3629      {
3630        /*assuming 8-bit rgba, this test does not care about 16-bit*/
3631        if(!color_tree_has(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a))
3632        {
3633          color_tree_add(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a,
3634            profile->numcolors);
3635          if(profile->numcolors < 256)
3636          {
3637            unsigned char* p = profile->palette;
3638            unsigned i = profile->numcolors;
3639            p[i * 4 + 0] = (unsigned char)r;
3640            p[i * 4 + 1] = (unsigned char)g;
3641            p[i * 4 + 2] = (unsigned char)b;
3642            p[i * 4 + 3] = (unsigned char)a;
3643          }
3644          profile->numcolors++;
3645          if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1;
3646        }
3647      }
3648
3649      if(profile->alpha_done && profile->numcolors_done
3650      && profile->colored_done && profile->sixteenbit_done && profile->greybits_done)
3651      {
3652        break;
3653      }
3654    };
3655  }
3656  else /* < 16-bit */
3657  {
3658    for(i = 0; i < numpixels; i++)
3659    {
3660      unsigned char r = 0, g = 0, b = 0, a = 0;
3661      error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode, fix_png);
3662      if(error) break;
3663
3664      if(!profile->colored_done && (r != g || r != b))
3665      {
3666        profile->colored = 1;
3667        profile->colored_done = 1;
3668        profile->greybits_done = 1; /*greybits is not applicable anymore*/
3669      }
3670
3671      if(!profile->alpha_done && a != 255)
3672      {
3673        if(a == 0 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b)))
3674        {
3675          if(!profile->key)
3676          {
3677            profile->key = 1;
3678            profile->key_r = r;
3679            profile->key_g = g;
3680            profile->key_b = b;
3681          }
3682        }
3683        else
3684        {
3685          profile->alpha = 1;
3686          profile->alpha_done = 1;
3687          profile->greybits_done = 1; /*greybits is not applicable anymore*/
3688        }
3689      }
3690
3691      /* Color key cannot be used if an opaque pixel also has that RGB color. */
3692      if(!profile->alpha_done && a == 255 && profile->key
3693          && r == profile->key_r && g == profile->key_g && b == profile->key_b)
3694      {
3695          profile->alpha = 1;
3696          profile->alpha_done = 1;
3697          profile->greybits_done = 1; /*greybits is not applicable anymore*/
3698      }
3699
3700      if(!profile->greybits_done)
3701      {
3702        unsigned bits = getValueRequiredBits(r);
3703        if(bits > profile->greybits) profile->greybits = bits;
3704        if(profile->greybits >= 8) profile->greybits_done = 1;
3705      }
3706
3707      if(!profile->numcolors_done)
3708      {
3709        if(!color_tree_has(&profile->tree, r, g, b, a))
3710        {
3711
3712          color_tree_add(&profile->tree, r, g, b, a, profile->numcolors);
3713          if(profile->numcolors < 256)
3714          {
3715            unsigned char* p = profile->palette;
3716            unsigned i = profile->numcolors;
3717            p[i * 4 + 0] = r;
3718            p[i * 4 + 1] = g;
3719            p[i * 4 + 2] = b;
3720            p[i * 4 + 3] = a;
3721          }
3722          profile->numcolors++;
3723          if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1;
3724        }
3725      }
3726
3727      if(profile->alpha_done && profile->numcolors_done && profile->colored_done && profile->greybits_done)
3728      {
3729        break;
3730      }
3731    };
3732  }
3733
3734  /*make the profile's key always 16-bit for consistency*/
3735  if(mode->bitdepth < 16)
3736  {
3737    /*repeat each byte twice*/
3738    profile->key_r *= 257;
3739    profile->key_g *= 257;
3740    profile->key_b *= 257;
3741  }
3742
3743  return error;
3744}
3745
3746static void setColorKeyFrom16bit(LodePNGColorMode* mode_out, unsigned r, unsigned g, unsigned b, unsigned bitdepth)
3747{
3748  unsigned mask = (1 << bitdepth) - 1;
3749  mode_out->key_defined = 1;
3750  mode_out->key_r = r & mask;
3751  mode_out->key_g = g & mask;
3752  mode_out->key_b = b & mask;
3753}
3754
3755/*updates values of mode with a potentially smaller color model. mode_out should
3756contain the user chosen color model, but will be overwritten with the new chosen one.*/
3757unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out,
3758                                   const unsigned char* image, unsigned w, unsigned h,
3759                                   const LodePNGColorMode* mode_in,
3760                                   LodePNGAutoConvert auto_convert)
3761{
3762  ColorProfile profile;
3763  unsigned error = 0;
3764  int no_nibbles = auto_convert == LAC_AUTO_NO_NIBBLES || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE;
3765  int no_palette = auto_convert == LAC_AUTO_NO_PALETTE || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE;
3766
3767  if(auto_convert == LAC_ALPHA)
3768  {
3769    if(mode_out->colortype != LCT_RGBA && mode_out->colortype != LCT_GREY_ALPHA) return 0;
3770  }
3771
3772  color_profile_init(&profile, mode_in);
3773  if(auto_convert == LAC_ALPHA)
3774  {
3775    profile.colored_done = 1;
3776    profile.greybits_done = 1;
3777    profile.numcolors_done = 1;
3778    profile.sixteenbit_done = 1;
3779  }
3780  error = get_color_profile(&profile, image, w * h, mode_in, 0 /*fix_png*/);
3781  if(!error && auto_convert == LAC_ALPHA)
3782  {
3783    if(!profile.alpha)
3784    {
3785      mode_out->colortype = (mode_out->colortype == LCT_RGBA ? LCT_RGB : LCT_GREY);
3786      if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth);
3787    }
3788  }
3789  else if(!error && auto_convert != LAC_ALPHA)
3790  {
3791    mode_out->key_defined = 0;
3792
3793    if(profile.sixteenbit)
3794    {
3795      mode_out->bitdepth = 16;
3796      if(profile.alpha)
3797      {
3798        mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA;
3799      }
3800      else
3801      {
3802        mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY;
3803        if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth);
3804      }
3805    }
3806    else /*less than 16 bits per channel*/
3807    {
3808      /*don't add palette overhead if image hasn't got a lot of pixels*/
3809      unsigned n = profile.numcolors;
3810      int palette_ok = !no_palette && n <= 256 && (n * 2 < w * h);
3811      unsigned palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8));
3812      int grey_ok = !profile.colored && !profile.alpha; /*grey without alpha, with potentially low bits*/
3813      if(palette_ok || grey_ok)
3814      {
3815        if(!palette_ok || (grey_ok && profile.greybits <= palettebits))
3816        {
3817          unsigned grey = profile.key_r;
3818          mode_out->colortype = LCT_GREY;
3819          mode_out->bitdepth = profile.greybits;
3820          if(profile.key) setColorKeyFrom16bit(mode_out, grey, grey, grey, mode_out->bitdepth);
3821        }
3822        else
3823        {
3824          /*fill in the palette*/
3825          unsigned i;
3826          unsigned char* p = profile.palette;
3827          /*remove potential earlier palette*/
3828          lodepng_palette_clear(mode_out);
3829          for(i = 0; i < profile.numcolors; i++)
3830          {
3831            error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]);
3832            if(error) break;
3833          }
3834
3835          mode_out->colortype = LCT_PALETTE;
3836          mode_out->bitdepth = palettebits;
3837        }
3838      }
3839      else /*8-bit per channel*/
3840      {
3841        mode_out->bitdepth = 8;
3842        if(profile.alpha)
3843        {
3844          mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA;
3845        }
3846        else
3847        {
3848          mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY /*LCT_GREY normally won't occur, already done earlier*/;
3849          if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth);
3850        }
3851      }
3852    }
3853  }
3854
3855  color_profile_cleanup(&profile);
3856
3857  if(mode_out->colortype == LCT_PALETTE && mode_in->palettesize == mode_out->palettesize)
3858  {
3859    /*In this case keep the palette order of the input, so that the user can choose an optimal one*/
3860    size_t i;
3861    for(i = 0; i < mode_in->palettesize * 4; i++)
3862    {
3863      mode_out->palette[i] = mode_in->palette[i];
3864    }
3865  }
3866
3867  if(no_nibbles && mode_out->bitdepth < 8)
3868  {
3869    /*palette can keep its small amount of colors, as long as no indices use it*/
3870    mode_out->bitdepth = 8;
3871  }
3872
3873  return error;
3874}
3875
3876#endif /* #ifdef LODEPNG_COMPILE_ENCODER */
3877
3878/*
3879Paeth predicter, used by PNG filter type 4
3880The parameters are of type short, but should come from unsigned chars, the shorts
3881are only needed to make the paeth calculation correct.
3882*/
3883static unsigned char paethPredictor(short a, short b, short c)
3884{
3885  short pa = abs(b - c);
3886  short pb = abs(a - c);
3887  short pc = abs(a + b - c - c);
3888
3889  if(pc < pa && pc < pb) return (unsigned char)c;
3890  else if(pb < pa) return (unsigned char)b;
3891  else return (unsigned char)a;
3892}
3893
3894/*shared values used by multiple Adam7 related functions*/
3895
3896static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/
3897static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/
3898static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/
3899static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/
3900
3901/*
3902Outputs various dimensions and positions in the image related to the Adam7 reduced images.
3903passw: output containing the width of the 7 passes
3904passh: output containing the height of the 7 passes
3905filter_passstart: output containing the index of the start and end of each
3906 reduced image with filter bytes
3907padded_passstart output containing the index of the start and end of each
3908 reduced image when without filter bytes but with padded scanlines
3909passstart: output containing the index of the start and end of each reduced
3910 image without padding between scanlines, but still padding between the images
3911w, h: width and height of non-interlaced image
3912bpp: bits per pixel
3913"padded" is only relevant if bpp is less than 8 and a scanline or image does not
3914 end at a full byte
3915*/
3916static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8],
3917                                size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp)
3918{
3919  /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/
3920  unsigned i;
3921
3922  /*calculate width and height in pixels of each pass*/
3923  for(i = 0; i < 7; i++)
3924  {
3925    passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i];
3926    passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i];
3927    if(passw[i] == 0) passh[i] = 0;
3928    if(passh[i] == 0) passw[i] = 0;
3929  }
3930
3931  filter_passstart[0] = padded_passstart[0] = passstart[0] = 0;
3932  for(i = 0; i < 7; i++)
3933  {
3934    /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/
3935    filter_passstart[i + 1] = filter_passstart[i]
3936                            + ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0);
3937    /*bits padded if needed to fill full byte at end of each scanline*/
3938    padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8);
3939    /*only padded at end of reduced image*/
3940    passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8;
3941  }
3942}
3943
3944#ifdef LODEPNG_COMPILE_DECODER
3945
3946/* ////////////////////////////////////////////////////////////////////////// */
3947/* / PNG Decoder                                                            / */
3948/* ////////////////////////////////////////////////////////////////////////// */
3949
3950/*read the information from the header and store it in the LodePNGInfo. return value is error*/
3951unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state,
3952                         const unsigned char* in, size_t insize)
3953{
3954  LodePNGInfo* info = &state->info_png;
3955  if(insize == 0 || in == 0)
3956  {
3957    CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/
3958  }
3959  if(insize < 29)
3960  {
3961    CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/
3962  }
3963
3964  /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/
3965  lodepng_info_cleanup(info);
3966  lodepng_info_init(info);
3967
3968  if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71
3969     || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10)
3970  {
3971    CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/
3972  }
3973  if(in[12] != 'I' || in[13] != 'H' || in[14] != 'D' || in[15] != 'R')
3974  {
3975    CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/
3976  }
3977
3978  /*read the values given in the header*/
3979  *w = lodepng_read32bitInt(&in[16]);
3980  *h = lodepng_read32bitInt(&in[20]);
3981  info->color.bitdepth = in[24];
3982  info->color.colortype = (LodePNGColorType)in[25];
3983  info->compression_method = in[26];
3984  info->filter_method = in[27];
3985  info->interlace_method = in[28];
3986
3987  if(!state->decoder.ignore_crc)
3988  {
3989    unsigned CRC = lodepng_read32bitInt(&in[29]);
3990    unsigned checksum = lodepng_crc32(&in[12], 17);
3991    if(CRC != checksum)
3992    {
3993      CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/
3994    }
3995  }
3996
3997  /*error: only compression method 0 is allowed in the specification*/
3998  if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32);
3999  /*error: only filter method 0 is allowed in the specification*/
4000  if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33);
4001  /*error: only interlace methods 0 and 1 exist in the specification*/
4002  if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34);
4003
4004  state->error = checkColorValidity(info->color.colortype, info->color.bitdepth);
4005  return state->error;
4006}
4007
4008static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon,
4009                                 size_t bytewidth, unsigned char filterType, size_t length)
4010{
4011  /*
4012  For PNG filter method 0
4013  unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte,
4014  the filter works byte per byte (bytewidth = 1)
4015  precon is the previous unfiltered scanline, recon the result, scanline the current one
4016  the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead
4017  recon and scanline MAY be the same memory address! precon must be disjoint.
4018  */
4019
4020  size_t i;
4021  switch(filterType)
4022  {
4023    case 0:
4024      for(i = 0; i < length; i++) recon[i] = scanline[i];
4025      break;
4026    case 1:
4027      for(i = 0; i < bytewidth; i++) recon[i] = scanline[i];
4028      for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth];
4029      break;
4030    case 2:
4031      if(precon)
4032      {
4033        for(i = 0; i < length; i++) recon[i] = scanline[i] + precon[i];
4034      }
4035      else
4036      {
4037        for(i = 0; i < length; i++) recon[i] = scanline[i];
4038      }
4039      break;
4040    case 3:
4041      if(precon)
4042      {
4043        for(i = 0; i < bytewidth; i++) recon[i] = scanline[i] + precon[i] / 2;
4044        for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) / 2);
4045      }
4046      else
4047      {
4048        for(i = 0; i < bytewidth; i++) recon[i] = scanline[i];
4049        for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth] / 2;
4050      }
4051      break;
4052    case 4:
4053      if(precon)
4054      {
4055        for(i = 0; i < bytewidth; i++)
4056        {
4057          recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/
4058        }
4059        for(i = bytewidth; i < length; i++)
4060        {
4061          recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth]));
4062        }
4063      }
4064      else
4065      {
4066        for(i = 0; i < bytewidth; i++)
4067        {
4068          recon[i] = scanline[i];
4069        }
4070        for(i = bytewidth; i < length; i++)
4071        {
4072          /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/
4073          recon[i] = (scanline[i] + recon[i - bytewidth]);
4074        }
4075      }
4076      break;
4077    default: return 36; /*error: unexisting filter type given*/
4078  }
4079  return 0;
4080}
4081
4082static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp)
4083{
4084  /*
4085  For PNG filter method 0
4086  this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times)
4087  out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline
4088  w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel
4089  in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes)
4090  */
4091
4092  unsigned y;
4093  unsigned char* prevline = 0;
4094
4095  /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/
4096  size_t bytewidth = (bpp + 7) / 8;
4097  size_t linebytes = (w * bpp + 7) / 8;
4098
4099  for(y = 0; y < h; y++)
4100  {
4101    size_t outindex = linebytes * y;
4102    size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/
4103    unsigned char filterType = in[inindex];
4104
4105    CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes));
4106
4107    prevline = &out[outindex];
4108  }
4109
4110  return 0;
4111}
4112
4113/*
4114in: Adam7 interlaced image, with no padding bits between scanlines, but between
4115 reduced images so that each reduced image starts at a byte.
4116out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h
4117bpp: bits per pixel
4118out has the following size in bits: w * h * bpp.
4119in is possibly bigger due to padding bits between reduced images.
4120out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation
4121(because that's likely a little bit faster)
4122NOTE: comments about padding bits are only relevant if bpp < 8
4123*/
4124static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp)
4125{
4126  unsigned passw[7], passh[7];
4127  size_t filter_passstart[8], padded_passstart[8], passstart[8];
4128  unsigned i;
4129
4130  Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
4131
4132  if(bpp >= 8)
4133  {
4134    for(i = 0; i < 7; i++)
4135    {
4136      unsigned x, y, b;
4137      size_t bytewidth = bpp / 8;
4138      for(y = 0; y < passh[i]; y++)
4139      for(x = 0; x < passw[i]; x++)
4140      {
4141        size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth;
4142        size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth;
4143        for(b = 0; b < bytewidth; b++)
4144        {
4145          out[pixeloutstart + b] = in[pixelinstart + b];
4146        }
4147      }
4148    }
4149  }
4150  else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/
4151  {
4152    for(i = 0; i < 7; i++)
4153    {
4154      unsigned x, y, b;
4155      unsigned ilinebits = bpp * passw[i];
4156      unsigned olinebits = bpp * w;
4157      size_t obp, ibp; /*bit pointers (for out and in buffer)*/
4158      for(y = 0; y < passh[i]; y++)
4159      for(x = 0; x < passw[i]; x++)
4160      {
4161        ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp);
4162        obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp;
4163        for(b = 0; b < bpp; b++)
4164        {
4165          unsigned char bit = readBitFromReversedStream(&ibp, in);
4166          /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/
4167          setBitOfReversedStream0(&obp, out, bit);
4168        }
4169      }
4170    }
4171  }
4172}
4173
4174static void removePaddingBits(unsigned char* out, const unsigned char* in,
4175                              size_t olinebits, size_t ilinebits, unsigned h)
4176{
4177  /*
4178  After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need
4179  to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers
4180  for the Adam7 code, the color convert code and the output to the user.
4181  in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must
4182  have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits
4183  also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7
4184  only useful if (ilinebits - olinebits) is a value in the range 1..7
4185  */
4186  unsigned y;
4187  size_t diff = ilinebits - olinebits;
4188  size_t ibp = 0, obp = 0; /*input and output bit pointers*/
4189  for(y = 0; y < h; y++)
4190  {
4191    size_t x;
4192    for(x = 0; x < olinebits; x++)
4193    {
4194      unsigned char bit = readBitFromReversedStream(&ibp, in);
4195      setBitOfReversedStream(&obp, out, bit);
4196    }
4197    ibp += diff;
4198  }
4199}
4200
4201/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from
4202the IDAT chunks (with filter index bytes and possible padding bits)
4203return value is error*/
4204static unsigned postProcessScanlines(unsigned char* out, unsigned char* in,
4205                                     unsigned w, unsigned h, const LodePNGInfo* info_png)
4206{
4207  /*
4208  This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype.
4209  Steps:
4210  *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8)
4211  *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace
4212  NOTE: the in buffer will be overwritten with intermediate data!
4213  */
4214  unsigned bpp = lodepng_get_bpp(&info_png->color);
4215  if(bpp == 0) return 31; /*error: invalid colortype*/
4216
4217  if(info_png->interlace_method == 0)
4218  {
4219    if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8)
4220    {
4221      CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp));
4222      removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h);
4223    }
4224    /*we can immediatly filter into the out buffer, no other steps needed*/
4225    else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp));
4226  }
4227  else /*interlace_method is 1 (Adam7)*/
4228  {
4229    unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
4230    unsigned i;
4231
4232    Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
4233
4234    for(i = 0; i < 7; i++)
4235    {
4236      CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp));
4237      /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline,
4238      move bytes instead of bits or move not at all*/
4239      if(bpp < 8)
4240      {
4241        /*remove padding bits in scanlines; after this there still may be padding
4242        bits between the different reduced images: each reduced image still starts nicely at a byte*/
4243        removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp,
4244                          ((passw[i] * bpp + 7) / 8) * 8, passh[i]);
4245      }
4246    }
4247
4248    Adam7_deinterlace(out, in, w, h, bpp);
4249  }
4250
4251  return 0;
4252}
4253
4254static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength)
4255{
4256  unsigned pos = 0, i;
4257  if(color->palette) lodepng_free(color->palette);
4258  color->palettesize = chunkLength / 3;
4259  color->palette = (unsigned char*)lodepng_malloc(4 * color->palettesize);
4260  if(!color->palette && color->palettesize)
4261  {
4262    color->palettesize = 0;
4263    return 83; /*alloc fail*/
4264  }
4265  if(color->palettesize > 256) return 38; /*error: palette too big*/
4266
4267  for(i = 0; i < color->palettesize; i++)
4268  {
4269    color->palette[4 * i + 0] = data[pos++]; /*R*/
4270    color->palette[4 * i + 1] = data[pos++]; /*G*/
4271    color->palette[4 * i + 2] = data[pos++]; /*B*/
4272    color->palette[4 * i + 3] = 255; /*alpha*/
4273  }
4274
4275  return 0; /* OK */
4276}
4277
4278static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength)
4279{
4280  unsigned i;
4281  if(color->colortype == LCT_PALETTE)
4282  {
4283    /*error: more alpha values given than there are palette entries*/
4284    if(chunkLength > color->palettesize) return 38;
4285
4286    for(i = 0; i < chunkLength; i++) color->palette[4 * i + 3] = data[i];
4287  }
4288  else if(color->colortype == LCT_GREY)
4289  {
4290    /*error: this chunk must be 2 bytes for greyscale image*/
4291    if(chunkLength != 2) return 30;
4292
4293    color->key_defined = 1;
4294    color->key_r = color->key_g = color->key_b = 256 * data[0] + data[1];
4295  }
4296  else if(color->colortype == LCT_RGB)
4297  {
4298    /*error: this chunk must be 6 bytes for RGB image*/
4299    if(chunkLength != 6) return 41;
4300
4301    color->key_defined = 1;
4302    color->key_r = 256 * data[0] + data[1];
4303    color->key_g = 256 * data[2] + data[3];
4304    color->key_b = 256 * data[4] + data[5];
4305  }
4306  else return 42; /*error: tRNS chunk not allowed for other color models*/
4307
4308  return 0; /* OK */
4309}
4310
4311
4312#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
4313/*background color chunk (bKGD)*/
4314static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength)
4315{
4316  if(info->color.colortype == LCT_PALETTE)
4317  {
4318    /*error: this chunk must be 1 byte for indexed color image*/
4319    if(chunkLength != 1) return 43;
4320
4321    info->background_defined = 1;
4322    info->background_r = info->background_g = info->background_b = data[0];
4323  }
4324  else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA)
4325  {
4326    /*error: this chunk must be 2 bytes for greyscale image*/
4327    if(chunkLength != 2) return 44;
4328
4329    info->background_defined = 1;
4330    info->background_r = info->background_g = info->background_b
4331                                 = 256 * data[0] + data[1];
4332  }
4333  else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA)
4334  {
4335    /*error: this chunk must be 6 bytes for greyscale image*/
4336    if(chunkLength != 6) return 45;
4337
4338    info->background_defined = 1;
4339    info->background_r = 256 * data[0] + data[1];
4340    info->background_g = 256 * data[2] + data[3];
4341    info->background_b = 256 * data[4] + data[5];
4342  }
4343
4344  return 0; /* OK */
4345}
4346
4347/*text chunk (tEXt)*/
4348static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength)
4349{
4350  unsigned error = 0;
4351  char *key = 0, *str = 0;
4352  unsigned i;
4353
4354  while(!error) /*not really a while loop, only used to break on error*/
4355  {
4356    unsigned length, string2_begin;
4357
4358    length = 0;
4359    while(length < chunkLength && data[length] != 0) length++;
4360    /*even though it's not allowed by the standard, no error is thrown if
4361    there's no null termination char, if the text is empty*/
4362    if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/
4363
4364    key = (char*)lodepng_malloc(length + 1);
4365    if(!key) CERROR_BREAK(error, 83); /*alloc fail*/
4366
4367    key[length] = 0;
4368    for(i = 0; i < length; i++) key[i] = data[i];
4369
4370    string2_begin = length + 1; /*skip keyword null terminator*/
4371
4372    length = chunkLength < string2_begin ? 0 : chunkLength - string2_begin;
4373    str = (char*)lodepng_malloc(length + 1);
4374    if(!str) CERROR_BREAK(error, 83); /*alloc fail*/
4375
4376    str[length] = 0;
4377    for(i = 0; i < length; i++) str[i] = data[string2_begin + i];
4378
4379    error = lodepng_add_text(info, key, str);
4380
4381    break;
4382  }
4383
4384  lodepng_free(key);
4385  lodepng_free(str);
4386
4387  return error;
4388}
4389
4390/*compressed text chunk (zTXt)*/
4391static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings,
4392                               const unsigned char* data, size_t chunkLength)
4393{
4394  unsigned error = 0;
4395  unsigned i;
4396
4397  unsigned length, string2_begin;
4398  char *key = 0;
4399  ucvector decoded;
4400
4401  ucvector_init(&decoded);
4402
4403  while(!error) /*not really a while loop, only used to break on error*/
4404  {
4405    for(length = 0; length < chunkLength && data[length] != 0; length++) ;
4406    if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/
4407    if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/
4408
4409    key = (char*)lodepng_malloc(length + 1);
4410    if(!key) CERROR_BREAK(error, 83); /*alloc fail*/
4411
4412    key[length] = 0;
4413    for(i = 0; i < length; i++) key[i] = data[i];
4414
4415    if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/
4416
4417    string2_begin = length + 2;
4418    if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/
4419
4420    length = chunkLength - string2_begin;
4421    /*will fail if zlib error, e.g. if length is too small*/
4422    error = zlib_decompress(&decoded.data, &decoded.size,
4423                            (unsigned char*)(&data[string2_begin]),
4424                            length, zlibsettings);
4425    if(error) break;
4426    ucvector_push_back(&decoded, 0);
4427
4428    error = lodepng_add_text(info, key, (char*)decoded.data);
4429
4430    break;
4431  }
4432
4433  lodepng_free(key);
4434  ucvector_cleanup(&decoded);
4435
4436  return error;
4437}
4438
4439/*international text chunk (iTXt)*/
4440static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings,
4441                               const unsigned char* data, size_t chunkLength)
4442{
4443  unsigned error = 0;
4444  unsigned i;
4445
4446  unsigned length, begin, compressed;
4447  char *key = 0, *langtag = 0, *transkey = 0;
4448  ucvector decoded;
4449  ucvector_init(&decoded);
4450
4451  while(!error) /*not really a while loop, only used to break on error*/
4452  {
4453    /*Quick check if the chunk length isn't too small. Even without check
4454    it'd still fail with other error checks below if it's too short. This just gives a different error code.*/
4455    if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/
4456
4457    /*read the key*/
4458    for(length = 0; length < chunkLength && data[length] != 0; length++) ;
4459    if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/
4460    if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/
4461
4462    key = (char*)lodepng_malloc(length + 1);
4463    if(!key) CERROR_BREAK(error, 83); /*alloc fail*/
4464
4465    key[length] = 0;
4466    for(i = 0; i < length; i++) key[i] = data[i];
4467
4468    /*read the compression method*/
4469    compressed = data[length + 1];
4470    if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/
4471
4472    /*even though it's not allowed by the standard, no error is thrown if
4473    there's no null termination char, if the text is empty for the next 3 texts*/
4474
4475    /*read the langtag*/
4476    begin = length + 3;
4477    length = 0;
4478    for(i = begin; i < chunkLength && data[i] != 0; i++) length++;
4479
4480    langtag = (char*)lodepng_malloc(length + 1);
4481    if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/
4482
4483    langtag[length] = 0;
4484    for(i = 0; i < length; i++) langtag[i] = data[begin + i];
4485
4486    /*read the transkey*/
4487    begin += length + 1;
4488    length = 0;
4489    for(i = begin; i < chunkLength && data[i] != 0; i++) length++;
4490
4491    transkey = (char*)lodepng_malloc(length + 1);
4492    if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/
4493
4494    transkey[length] = 0;
4495    for(i = 0; i < length; i++) transkey[i] = data[begin + i];
4496
4497    /*read the actual text*/
4498    begin += length + 1;
4499
4500    length = chunkLength < begin ? 0 : chunkLength - begin;
4501
4502    if(compressed)
4503    {
4504      /*will fail if zlib error, e.g. if length is too small*/
4505      error = zlib_decompress(&decoded.data, &decoded.size,
4506                              (unsigned char*)(&data[begin]),
4507                              length, zlibsettings);
4508      if(error) break;
4509      if(decoded.allocsize < decoded.size) decoded.allocsize = decoded.size;
4510      ucvector_push_back(&decoded, 0);
4511    }
4512    else
4513    {
4514      if(!ucvector_resize(&decoded, length + 1)) CERROR_BREAK(error, 83 /*alloc fail*/);
4515
4516      decoded.data[length] = 0;
4517      for(i = 0; i < length; i++) decoded.data[i] = data[begin + i];
4518    }
4519
4520    error = lodepng_add_itext(info, key, langtag, transkey, (char*)decoded.data);
4521
4522    break;
4523  }
4524
4525  lodepng_free(key);
4526  lodepng_free(langtag);
4527  lodepng_free(transkey);
4528  ucvector_cleanup(&decoded);
4529
4530  return error;
4531}
4532
4533static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength)
4534{
4535  if(chunkLength != 7) return 73; /*invalid tIME chunk size*/
4536
4537  info->time_defined = 1;
4538  info->time.year = 256 * data[0] + data[+ 1];
4539  info->time.month = data[2];
4540  info->time.day = data[3];
4541  info->time.hour = data[4];
4542  info->time.minute = data[5];
4543  info->time.second = data[6];
4544
4545  return 0; /* OK */
4546}
4547
4548static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength)
4549{
4550  if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/
4551
4552  info->phys_defined = 1;
4553  info->phys_x = 16777216 * data[0] + 65536 * data[1] + 256 * data[2] + data[3];
4554  info->phys_y = 16777216 * data[4] + 65536 * data[5] + 256 * data[6] + data[7];
4555  info->phys_unit = data[8];
4556
4557  return 0; /* OK */
4558}
4559#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
4560
4561/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/
4562static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h,
4563                          LodePNGState* state,
4564                          const unsigned char* in, size_t insize)
4565{
4566  unsigned char IEND = 0;
4567  const unsigned char* chunk;
4568  size_t i;
4569  ucvector idat; /*the data from idat chunks*/
4570  ucvector scanlines;
4571
4572  /*for unknown chunk order*/
4573  unsigned unknown = 0;
4574#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
4575  unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/
4576#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
4577
4578  /*provide some proper output values if error will happen*/
4579  *out = 0;
4580
4581  state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/
4582  if(state->error) return;
4583
4584  ucvector_init(&idat);
4585  chunk = &in[33]; /*first byte of the first chunk after the header*/
4586
4587  /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk.
4588  IDAT data is put at the start of the in buffer*/
4589  while(!IEND && !state->error)
4590  {
4591    unsigned chunkLength;
4592    const unsigned char* data; /*the data in the chunk*/
4593
4594    /*error: size of the in buffer too small to contain next chunk*/
4595    if((size_t)((chunk - in) + 12) > insize || chunk < in) CERROR_BREAK(state->error, 30);
4596
4597    /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/
4598    chunkLength = lodepng_chunk_length(chunk);
4599    /*error: chunk length larger than the max PNG chunk size*/
4600    if(chunkLength > 2147483647) CERROR_BREAK(state->error, 63);
4601
4602    if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in)
4603    {
4604      CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/
4605    }
4606
4607    data = lodepng_chunk_data_const(chunk);
4608
4609    /*IDAT chunk, containing compressed image data*/
4610    if(lodepng_chunk_type_equals(chunk, "IDAT"))
4611    {
4612      size_t oldsize = idat.size;
4613      if(!ucvector_resize(&idat, oldsize + chunkLength)) CERROR_BREAK(state->error, 83 /*alloc fail*/);
4614      for(i = 0; i < chunkLength; i++) idat.data[oldsize + i] = data[i];
4615#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
4616      critical_pos = 3;
4617#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
4618    }
4619    /*IEND chunk*/
4620    else if(lodepng_chunk_type_equals(chunk, "IEND"))
4621    {
4622      IEND = 1;
4623    }
4624    /*palette chunk (PLTE)*/
4625    else if(lodepng_chunk_type_equals(chunk, "PLTE"))
4626    {
4627      state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength);
4628      if(state->error) break;
4629#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
4630      critical_pos = 2;
4631#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
4632    }
4633    /*palette transparency chunk (tRNS)*/
4634    else if(lodepng_chunk_type_equals(chunk, "tRNS"))
4635    {
4636      state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength);
4637      if(state->error) break;
4638    }
4639#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
4640    /*background color chunk (bKGD)*/
4641    else if(lodepng_chunk_type_equals(chunk, "bKGD"))
4642    {
4643      state->error = readChunk_bKGD(&state->info_png, data, chunkLength);
4644      if(state->error) break;
4645    }
4646    /*text chunk (tEXt)*/
4647    else if(lodepng_chunk_type_equals(chunk, "tEXt"))
4648    {
4649      if(state->decoder.read_text_chunks)
4650      {
4651        state->error = readChunk_tEXt(&state->info_png, data, chunkLength);
4652        if(state->error) break;
4653      }
4654    }
4655    /*compressed text chunk (zTXt)*/
4656    else if(lodepng_chunk_type_equals(chunk, "zTXt"))
4657    {
4658      if(state->decoder.read_text_chunks)
4659      {
4660        state->error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength);
4661        if(state->error) break;
4662      }
4663    }
4664    /*international text chunk (iTXt)*/
4665    else if(lodepng_chunk_type_equals(chunk, "iTXt"))
4666    {
4667      if(state->decoder.read_text_chunks)
4668      {
4669        state->error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength);
4670        if(state->error) break;
4671      }
4672    }
4673    else if(lodepng_chunk_type_equals(chunk, "tIME"))
4674    {
4675      state->error = readChunk_tIME(&state->info_png, data, chunkLength);
4676      if(state->error) break;
4677    }
4678    else if(lodepng_chunk_type_equals(chunk, "pHYs"))
4679    {
4680      state->error = readChunk_pHYs(&state->info_png, data, chunkLength);
4681      if(state->error) break;
4682    }
4683#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
4684    else /*it's not an implemented chunk type, so ignore it: skip over the data*/
4685    {
4686      /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/
4687      if(!lodepng_chunk_ancillary(chunk)) CERROR_BREAK(state->error, 69);
4688
4689      unknown = 1;
4690#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
4691      if(state->decoder.remember_unknown_chunks)
4692      {
4693        state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1],
4694                                            &state->info_png.unknown_chunks_size[critical_pos - 1], chunk);
4695        if(state->error) break;
4696      }
4697#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
4698    }
4699
4700    if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/
4701    {
4702      if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/
4703    }
4704
4705    if(!IEND) chunk = lodepng_chunk_next_const(chunk);
4706  }
4707
4708  ucvector_init(&scanlines);
4709  if(!state->error)
4710  {
4711    /*maximum final image length is already reserved in the vector's length - this is not really necessary*/
4712    if(!ucvector_resize(&scanlines, lodepng_get_raw_size(*w, *h, &state->info_png.color) + *h))
4713    {
4714      state->error = 83; /*alloc fail*/
4715    }
4716  }
4717  if(!state->error)
4718  {
4719    /*decompress with the Zlib decompressor*/
4720    state->error = zlib_decompress(&scanlines.data, &scanlines.size, idat.data,
4721                                   idat.size, &state->decoder.zlibsettings);
4722  }
4723  ucvector_cleanup(&idat);
4724
4725  if(!state->error)
4726  {
4727    ucvector outv;
4728    ucvector_init(&outv);
4729    if(!ucvector_resizev(&outv,
4730        lodepng_get_raw_size(*w, *h, &state->info_png.color), 0)) state->error = 83; /*alloc fail*/
4731    if(!state->error) state->error = postProcessScanlines(outv.data, scanlines.data, *w, *h, &state->info_png);
4732    *out = outv.data;
4733  }
4734  ucvector_cleanup(&scanlines);
4735}
4736
4737unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h,
4738                        LodePNGState* state,
4739                        const unsigned char* in, size_t insize)
4740{
4741  *out = 0;
4742  decodeGeneric(out, w, h, state, in, insize);
4743  if(state->error) return state->error;
4744  if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color))
4745  {
4746    /*same color type, no copying or converting of data needed*/
4747    /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype
4748    the raw image has to the end user*/
4749    if(!state->decoder.color_convert)
4750    {
4751      state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color);
4752      if(state->error) return state->error;
4753    }
4754  }
4755  else
4756  {
4757    /*color conversion needed; sort of copy of the data*/
4758    unsigned char* data = *out;
4759    size_t outsize;
4760
4761    /*TODO: check if this works according to the statement in the documentation: "The converter can convert
4762    from greyscale input color type, to 8-bit greyscale or greyscale with alpha"*/
4763    if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA)
4764       && !(state->info_raw.bitdepth == 8))
4765    {
4766      return 56; /*unsupported color mode conversion*/
4767    }
4768
4769    outsize = lodepng_get_raw_size(*w, *h, &state->info_raw);
4770    *out = (unsigned char*)lodepng_malloc(outsize);
4771    if(!(*out))
4772    {
4773      state->error = 83; /*alloc fail*/
4774    }
4775    else state->error = lodepng_convert(*out, data, &state->info_raw, &state->info_png.color, *w, *h, state->decoder.fix_png);
4776    lodepng_free(data);
4777  }
4778  return state->error;
4779}
4780
4781unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in,
4782                               size_t insize, LodePNGColorType colortype, unsigned bitdepth)
4783{
4784  unsigned error;
4785  LodePNGState state;
4786  lodepng_state_init(&state);
4787  state.info_raw.colortype = colortype;
4788  state.info_raw.bitdepth = bitdepth;
4789  error = lodepng_decode(out, w, h, &state, in, insize);
4790  lodepng_state_cleanup(&state);
4791  return error;
4792}
4793
4794unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize)
4795{
4796  return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8);
4797}
4798
4799unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize)
4800{
4801  return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8);
4802}
4803
4804#ifdef LODEPNG_COMPILE_DISK
4805unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename,
4806                             LodePNGColorType colortype, unsigned bitdepth)
4807{
4808  unsigned char* buffer;
4809  size_t buffersize;
4810  unsigned error;
4811  error = lodepng_load_file(&buffer, &buffersize, filename);
4812  if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth);
4813  lodepng_free(buffer);
4814  return error;
4815}
4816
4817unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename)
4818{
4819  return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8);
4820}
4821
4822unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename)
4823{
4824  return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8);
4825}
4826#endif /*LODEPNG_COMPILE_DISK*/
4827
4828void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings)
4829{
4830  settings->color_convert = 1;
4831#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
4832  settings->read_text_chunks = 1;
4833  settings->remember_unknown_chunks = 0;
4834#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
4835  settings->ignore_crc = 0;
4836  settings->fix_png = 0;
4837  lodepng_decompress_settings_init(&settings->zlibsettings);
4838}
4839
4840#endif /*LODEPNG_COMPILE_DECODER*/
4841
4842#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER)
4843
4844void lodepng_state_init(LodePNGState* state)
4845{
4846#ifdef LODEPNG_COMPILE_DECODER
4847  lodepng_decoder_settings_init(&state->decoder);
4848#endif /*LODEPNG_COMPILE_DECODER*/
4849#ifdef LODEPNG_COMPILE_ENCODER
4850  lodepng_encoder_settings_init(&state->encoder);
4851#endif /*LODEPNG_COMPILE_ENCODER*/
4852  lodepng_color_mode_init(&state->info_raw);
4853  lodepng_info_init(&state->info_png);
4854  state->error = 1;
4855}
4856
4857void lodepng_state_cleanup(LodePNGState* state)
4858{
4859  lodepng_color_mode_cleanup(&state->info_raw);
4860  lodepng_info_cleanup(&state->info_png);
4861}
4862
4863void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source)
4864{
4865  lodepng_state_cleanup(dest);
4866  *dest = *source;
4867  lodepng_color_mode_init(&dest->info_raw);
4868  lodepng_info_init(&dest->info_png);
4869  dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return;
4870  dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return;
4871}
4872
4873#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */
4874
4875#ifdef LODEPNG_COMPILE_ENCODER
4876
4877/* ////////////////////////////////////////////////////////////////////////// */
4878/* / PNG Encoder                                                            / */
4879/* ////////////////////////////////////////////////////////////////////////// */
4880
4881/*chunkName must be string of 4 characters*/
4882static unsigned addChunk(ucvector* out, const char* chunkName, const unsigned char* data, size_t length)
4883{
4884  CERROR_TRY_RETURN(lodepng_chunk_create(&out->data, &out->size, (unsigned)length, chunkName, data));
4885  out->allocsize = out->size; /*fix the allocsize again*/
4886  return 0;
4887}
4888
4889static void writeSignature(ucvector* out)
4890{
4891  /*8 bytes PNG signature, aka the magic bytes*/
4892  ucvector_push_back(out, 137);
4893  ucvector_push_back(out, 80);
4894  ucvector_push_back(out, 78);
4895  ucvector_push_back(out, 71);
4896  ucvector_push_back(out, 13);
4897  ucvector_push_back(out, 10);
4898  ucvector_push_back(out, 26);
4899  ucvector_push_back(out, 10);
4900}
4901
4902static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h,
4903                              LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method)
4904{
4905  unsigned error = 0;
4906  ucvector header;
4907  ucvector_init(&header);
4908
4909  lodepng_add32bitInt(&header, w); /*width*/
4910  lodepng_add32bitInt(&header, h); /*height*/
4911  ucvector_push_back(&header, (unsigned char)bitdepth); /*bit depth*/
4912  ucvector_push_back(&header, (unsigned char)colortype); /*color type*/
4913  ucvector_push_back(&header, 0); /*compression method*/
4914  ucvector_push_back(&header, 0); /*filter method*/
4915  ucvector_push_back(&header, interlace_method); /*interlace method*/
4916
4917  error = addChunk(out, "IHDR", header.data, header.size);
4918  ucvector_cleanup(&header);
4919
4920  return error;
4921}
4922
4923static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info)
4924{
4925  unsigned error = 0;
4926  size_t i;
4927  ucvector PLTE;
4928  ucvector_init(&PLTE);
4929  for(i = 0; i < info->palettesize * 4; i++)
4930  {
4931    /*add all channels except alpha channel*/
4932    if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]);
4933  }
4934  error = addChunk(out, "PLTE", PLTE.data, PLTE.size);
4935  ucvector_cleanup(&PLTE);
4936
4937  return error;
4938}
4939
4940static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info)
4941{
4942  unsigned error = 0;
4943  size_t i;
4944  ucvector tRNS;
4945  ucvector_init(&tRNS);
4946  if(info->colortype == LCT_PALETTE)
4947  {
4948    size_t amount = info->palettesize;
4949    /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/
4950    for(i = info->palettesize; i > 0; i--)
4951    {
4952      if(info->palette[4 * (i - 1) + 3] == 255) amount--;
4953      else break;
4954    }
4955    /*add only alpha channel*/
4956    for(i = 0; i < amount; i++) ucvector_push_back(&tRNS, info->palette[4 * i + 3]);
4957  }
4958  else if(info->colortype == LCT_GREY)
4959  {
4960    if(info->key_defined)
4961    {
4962      ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256));
4963      ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256));
4964    }
4965  }
4966  else if(info->colortype == LCT_RGB)
4967  {
4968    if(info->key_defined)
4969    {
4970      ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256));
4971      ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256));
4972      ucvector_push_back(&tRNS, (unsigned char)(info->key_g / 256));
4973      ucvector_push_back(&tRNS, (unsigned char)(info->key_g % 256));
4974      ucvector_push_back(&tRNS, (unsigned char)(info->key_b / 256));
4975      ucvector_push_back(&tRNS, (unsigned char)(info->key_b % 256));
4976    }
4977  }
4978
4979  error = addChunk(out, "tRNS", tRNS.data, tRNS.size);
4980  ucvector_cleanup(&tRNS);
4981
4982  return error;
4983}
4984
4985static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize,
4986                              LodePNGCompressSettings* zlibsettings)
4987{
4988  ucvector zlibdata;
4989  unsigned error = 0;
4990
4991  /*compress with the Zlib compressor*/
4992  ucvector_init(&zlibdata);
4993  error = zlib_compress(&zlibdata.data, &zlibdata.size, data, datasize, zlibsettings);
4994  if(!error) error = addChunk(out, "IDAT", zlibdata.data, zlibdata.size);
4995  ucvector_cleanup(&zlibdata);
4996
4997  return error;
4998}
4999
5000static unsigned addChunk_IEND(ucvector* out)
5001{
5002  unsigned error = 0;
5003  error = addChunk(out, "IEND", 0, 0);
5004  return error;
5005}
5006
5007#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5008
5009static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring)
5010{
5011  unsigned error = 0;
5012  size_t i;
5013  ucvector text;
5014  ucvector_init(&text);
5015  for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&text, (unsigned char)keyword[i]);
5016  if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/
5017  ucvector_push_back(&text, 0); /*0 termination char*/
5018  for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&text, (unsigned char)textstring[i]);
5019  error = addChunk(out, "tEXt", text.data, text.size);
5020  ucvector_cleanup(&text);
5021
5022  return error;
5023}
5024
5025static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring,
5026                              LodePNGCompressSettings* zlibsettings)
5027{
5028  unsigned error = 0;
5029  ucvector data, compressed;
5030  size_t i, textsize = strlen(textstring);
5031
5032  ucvector_init(&data);
5033  ucvector_init(&compressed);
5034  for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]);
5035  if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/
5036  ucvector_push_back(&data, 0); /*0 termination char*/
5037  ucvector_push_back(&data, 0); /*compression method: 0*/
5038
5039  error = zlib_compress(&compressed.data, &compressed.size,
5040                        (unsigned char*)textstring, textsize, zlibsettings);
5041  if(!error)
5042  {
5043    for(i = 0; i < compressed.size; i++) ucvector_push_back(&data, compressed.data[i]);
5044    error = addChunk(out, "zTXt", data.data, data.size);
5045  }
5046
5047  ucvector_cleanup(&compressed);
5048  ucvector_cleanup(&data);
5049  return error;
5050}
5051
5052static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* keyword, const char* langtag,
5053                              const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings)
5054{
5055  unsigned error = 0;
5056  ucvector data;
5057  size_t i, textsize = strlen(textstring);
5058
5059  ucvector_init(&data);
5060
5061  for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]);
5062  if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/
5063  ucvector_push_back(&data, 0); /*null termination char*/
5064  ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/
5065  ucvector_push_back(&data, 0); /*compression method*/
5066  for(i = 0; langtag[i] != 0; i++) ucvector_push_back(&data, (unsigned char)langtag[i]);
5067  ucvector_push_back(&data, 0); /*null termination char*/
5068  for(i = 0; transkey[i] != 0; i++) ucvector_push_back(&data, (unsigned char)transkey[i]);
5069  ucvector_push_back(&data, 0); /*null termination char*/
5070
5071  if(compressed)
5072  {
5073    ucvector compressed_data;
5074    ucvector_init(&compressed_data);
5075    error = zlib_compress(&compressed_data.data, &compressed_data.size,
5076                          (unsigned char*)textstring, textsize, zlibsettings);
5077    if(!error)
5078    {
5079      for(i = 0; i < compressed_data.size; i++) ucvector_push_back(&data, compressed_data.data[i]);
5080    }
5081    ucvector_cleanup(&compressed_data);
5082  }
5083  else /*not compressed*/
5084  {
5085    for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&data, (unsigned char)textstring[i]);
5086  }
5087
5088  if(!error) error = addChunk(out, "iTXt", data.data, data.size);
5089  ucvector_cleanup(&data);
5090  return error;
5091}
5092
5093static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info)
5094{
5095  unsigned error = 0;
5096  ucvector bKGD;
5097  ucvector_init(&bKGD);
5098  if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA)
5099  {
5100    ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256));
5101    ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256));
5102  }
5103  else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA)
5104  {
5105    ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256));
5106    ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256));
5107    ucvector_push_back(&bKGD, (unsigned char)(info->background_g / 256));
5108    ucvector_push_back(&bKGD, (unsigned char)(info->background_g % 256));
5109    ucvector_push_back(&bKGD, (unsigned char)(info->background_b / 256));
5110    ucvector_push_back(&bKGD, (unsigned char)(info->background_b % 256));
5111  }
5112  else if(info->color.colortype == LCT_PALETTE)
5113  {
5114    ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); /*palette index*/
5115  }
5116
5117  error = addChunk(out, "bKGD", bKGD.data, bKGD.size);
5118  ucvector_cleanup(&bKGD);
5119
5120  return error;
5121}
5122
5123static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time)
5124{
5125  unsigned error = 0;
5126  unsigned char* data = (unsigned char*)lodepng_malloc(7);
5127  if(!data) return 83; /*alloc fail*/
5128  data[0] = (unsigned char)(time->year / 256);
5129  data[1] = (unsigned char)(time->year % 256);
5130  data[2] = time->month;
5131  data[3] = time->day;
5132  data[4] = time->hour;
5133  data[5] = time->minute;
5134  data[6] = time->second;
5135  error = addChunk(out, "tIME", data, 7);
5136  lodepng_free(data);
5137  return error;
5138}
5139
5140static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info)
5141{
5142  unsigned error = 0;
5143  ucvector data;
5144  ucvector_init(&data);
5145
5146  lodepng_add32bitInt(&data, info->phys_x);
5147  lodepng_add32bitInt(&data, info->phys_y);
5148  ucvector_push_back(&data, info->phys_unit);
5149
5150  error = addChunk(out, "pHYs", data.data, data.size);
5151  ucvector_cleanup(&data);
5152
5153  return error;
5154}
5155
5156#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5157
5158static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline,
5159                           size_t length, size_t bytewidth, unsigned char filterType)
5160{
5161  size_t i;
5162  switch(filterType)
5163  {
5164    case 0: /*None*/
5165      for(i = 0; i < length; i++) out[i] = scanline[i];
5166      break;
5167    case 1: /*Sub*/
5168      if(prevline)
5169      {
5170        for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
5171        for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth];
5172      }
5173      else
5174      {
5175        for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
5176        for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth];
5177      }
5178      break;
5179    case 2: /*Up*/
5180      if(prevline)
5181      {
5182        for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i];
5183      }
5184      else
5185      {
5186        for(i = 0; i < length; i++) out[i] = scanline[i];
5187      }
5188      break;
5189    case 3: /*Average*/
5190      if(prevline)
5191      {
5192        for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2;
5193        for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2);
5194      }
5195      else
5196      {
5197        for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
5198        for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2;
5199      }
5200      break;
5201    case 4: /*Paeth*/
5202      if(prevline)
5203      {
5204        /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/
5205        for(i = 0; i < bytewidth; i++) out[i] = (scanline[i] - prevline[i]);
5206        for(i = bytewidth; i < length; i++)
5207        {
5208          out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth]));
5209        }
5210      }
5211      else
5212      {
5213        for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
5214        /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/
5215        for(i = bytewidth; i < length; i++) out[i] = (scanline[i] - scanline[i - bytewidth]);
5216      }
5217      break;
5218    default: return; /*unexisting filter type given*/
5219  }
5220}
5221
5222/* log2 approximation. A slight bit faster than std::log. */
5223static float flog2(float f)
5224{
5225  float result = 0;
5226  while(f > 32) { result += 4; f /= 16; }
5227  while(f > 2) { result++; f /= 2; }
5228  return result + 1.442695f * (f * f * f / 3 - 3 * f * f / 2 + 3 * f - 1.83333f);
5229}
5230
5231static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h,
5232                       const LodePNGColorMode* info, const LodePNGEncoderSettings* settings)
5233{
5234  /*
5235  For PNG filter method 0
5236  out must be a buffer with as size: h + (w * h * bpp + 7) / 8, because there are
5237  the scanlines with 1 extra byte per scanline
5238  */
5239
5240  unsigned bpp = lodepng_get_bpp(info);
5241  /*the width of a scanline in bytes, not including the filter type*/
5242  size_t linebytes = (w * bpp + 7) / 8;
5243  /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/
5244  size_t bytewidth = (bpp + 7) / 8;
5245  const unsigned char* prevline = 0;
5246  unsigned x, y;
5247  unsigned error = 0;
5248  LodePNGFilterStrategy strategy = settings->filter_strategy;
5249
5250  /*
5251  There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard:
5252   *  If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e.
5253      use fixed filtering, with the filter None).
5254   * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is
5255     not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply
5256     all five filters and select the filter that produces the smallest sum of absolute values per row.
5257  This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true.
5258
5259  If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed,
5260  but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum
5261  heuristic is used.
5262  */
5263  if(settings->filter_palette_zero &&
5264     (info->colortype == LCT_PALETTE || info->bitdepth < 8)) strategy = LFS_ZERO;
5265
5266  if(bpp == 0) return 31; /*error: invalid color type*/
5267
5268  if(strategy == LFS_ZERO)
5269  {
5270    for(y = 0; y < h; y++)
5271    {
5272      size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/
5273      size_t inindex = linebytes * y;
5274      out[outindex] = 0; /*filter type byte*/
5275      filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, 0);
5276      prevline = &in[inindex];
5277    }
5278  }
5279  else if(strategy == LFS_MINSUM)
5280  {
5281    /*adaptive filtering*/
5282    size_t sum[5];
5283    ucvector attempt[5]; /*five filtering attempts, one for each filter type*/
5284    size_t smallest = 0;
5285    unsigned type, bestType = 0;
5286
5287    for(type = 0; type < 5; type++)
5288    {
5289      ucvector_init(&attempt[type]);
5290      if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/
5291    }
5292
5293    if(!error)
5294    {
5295      for(y = 0; y < h; y++)
5296      {
5297        /*try the 5 filter types*/
5298        for(type = 0; type < 5; type++)
5299        {
5300          filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type);
5301
5302          /*calculate the sum of the result*/
5303          sum[type] = 0;
5304          if(type == 0)
5305          {
5306            for(x = 0; x < linebytes; x++) sum[type] += (unsigned char)(attempt[type].data[x]);
5307          }
5308          else
5309          {
5310            for(x = 0; x < linebytes; x++)
5311            {
5312              /*For differences, each byte should be treated as signed, values above 127 are negative
5313              (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there.
5314              This means filtertype 0 is almost never chosen, but that is justified.*/
5315              signed char s = (signed char)(attempt[type].data[x]);
5316              sum[type] += s < 0 ? -s : s;
5317            }
5318          }
5319
5320          /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/
5321          if(type == 0 || sum[type] < smallest)
5322          {
5323            bestType = type;
5324            smallest = sum[type];
5325          }
5326        }
5327
5328        prevline = &in[y * linebytes];
5329
5330        /*now fill the out values*/
5331        out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/
5332        for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x];
5333      }
5334    }
5335
5336    for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]);
5337  }
5338  else if(strategy == LFS_ENTROPY)
5339  {
5340    float sum[5];
5341    ucvector attempt[5]; /*five filtering attempts, one for each filter type*/
5342    float smallest = 0;
5343    unsigned type, bestType = 0;
5344    unsigned count[256];
5345
5346    for(type = 0; type < 5; type++)
5347    {
5348      ucvector_init(&attempt[type]);
5349      if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/
5350    }
5351
5352    for(y = 0; y < h; y++)
5353    {
5354      /*try the 5 filter types*/
5355      for(type = 0; type < 5; type++)
5356      {
5357        filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type);
5358        for(x = 0; x < 256; x++) count[x] = 0;
5359        for(x = 0; x < linebytes; x++) count[attempt[type].data[x]]++;
5360        count[type]++; /*the filter type itself is part of the scanline*/
5361        sum[type] = 0;
5362        for(x = 0; x < 256; x++)
5363        {
5364          float p = count[x] / (float)(linebytes + 1);
5365          sum[type] += count[x] == 0 ? 0 : flog2(1 / p) * p;
5366        }
5367        /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/
5368        if(type == 0 || sum[type] < smallest)
5369        {
5370          bestType = type;
5371          smallest = sum[type];
5372        }
5373      }
5374
5375      prevline = &in[y * linebytes];
5376
5377      /*now fill the out values*/
5378      out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/
5379      for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x];
5380    }
5381
5382    for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]);
5383  }
5384  else if(strategy == LFS_PREDEFINED)
5385  {
5386    for(y = 0; y < h; y++)
5387    {
5388      size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/
5389      size_t inindex = linebytes * y;
5390      unsigned type = settings->predefined_filters[y];
5391      out[outindex] = type; /*filter type byte*/
5392      filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type);
5393      prevline = &in[inindex];
5394    }
5395  }
5396  else if(strategy == LFS_BRUTE_FORCE)
5397  {
5398    /*brute force filter chooser.
5399    deflate the scanline after every filter attempt to see which one deflates best.
5400    This is very slow and gives only slightly smaller, sometimes even larger, result*/
5401    size_t size[5];
5402    ucvector attempt[5]; /*five filtering attempts, one for each filter type*/
5403    size_t smallest = 0;
5404    unsigned type = 0, bestType = 0;
5405    unsigned char* dummy;
5406    LodePNGCompressSettings zlibsettings = settings->zlibsettings;
5407    /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose,
5408    to simulate the true case where the tree is the same for the whole image. Sometimes it gives
5409    better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare
5410    cases better compression. It does make this a bit less slow, so it's worth doing this.*/
5411    zlibsettings.btype = 1;
5412    /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG
5413    images only, so disable it*/
5414    zlibsettings.custom_zlib = 0;
5415    zlibsettings.custom_deflate = 0;
5416    for(type = 0; type < 5; type++)
5417    {
5418      ucvector_init(&attempt[type]);
5419      ucvector_resize(&attempt[type], linebytes); /*todo: give error if resize failed*/
5420    }
5421    for(y = 0; y < h; y++) /*try the 5 filter types*/
5422    {
5423      for(type = 0; type < 5; type++)
5424      {
5425        unsigned testsize = attempt[type].size;
5426        /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/
5427
5428        filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type);
5429        size[type] = 0;
5430        dummy = 0;
5431        zlib_compress(&dummy, &size[type], attempt[type].data, testsize, &zlibsettings);
5432        lodepng_free(dummy);
5433        /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/
5434        if(type == 0 || size[type] < smallest)
5435        {
5436          bestType = type;
5437          smallest = size[type];
5438        }
5439      }
5440      prevline = &in[y * linebytes];
5441      out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/
5442      for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x];
5443    }
5444    for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]);
5445  }
5446  else return 88; /* unknown filter strategy */
5447
5448  return error;
5449}
5450
5451static void addPaddingBits(unsigned char* out, const unsigned char* in,
5452                           size_t olinebits, size_t ilinebits, unsigned h)
5453{
5454  /*The opposite of the removePaddingBits function
5455  olinebits must be >= ilinebits*/
5456  unsigned y;
5457  size_t diff = olinebits - ilinebits;
5458  size_t obp = 0, ibp = 0; /*bit pointers*/
5459  for(y = 0; y < h; y++)
5460  {
5461    size_t x;
5462    for(x = 0; x < ilinebits; x++)
5463    {
5464      unsigned char bit = readBitFromReversedStream(&ibp, in);
5465      setBitOfReversedStream(&obp, out, bit);
5466    }
5467    /*obp += diff; --> no, fill in some value in the padding bits too, to avoid
5468    "Use of uninitialised value of size ###" warning from valgrind*/
5469    for(x = 0; x < diff; x++) setBitOfReversedStream(&obp, out, 0);
5470  }
5471}
5472
5473/*
5474in: non-interlaced image with size w*h
5475out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with
5476 no padding bits between scanlines, but between reduced images so that each
5477 reduced image starts at a byte.
5478bpp: bits per pixel
5479there are no padding bits, not between scanlines, not between reduced images
5480in has the following size in bits: w * h * bpp.
5481out is possibly bigger due to padding bits between reduced images
5482NOTE: comments about padding bits are only relevant if bpp < 8
5483*/
5484static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp)
5485{
5486  unsigned passw[7], passh[7];
5487  size_t filter_passstart[8], padded_passstart[8], passstart[8];
5488  unsigned i;
5489
5490  Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
5491
5492  if(bpp >= 8)
5493  {
5494    for(i = 0; i < 7; i++)
5495    {
5496      unsigned x, y, b;
5497      size_t bytewidth = bpp / 8;
5498      for(y = 0; y < passh[i]; y++)
5499      for(x = 0; x < passw[i]; x++)
5500      {
5501        size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth;
5502        size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth;
5503        for(b = 0; b < bytewidth; b++)
5504        {
5505          out[pixeloutstart + b] = in[pixelinstart + b];
5506        }
5507      }
5508    }
5509  }
5510  else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/
5511  {
5512    for(i = 0; i < 7; i++)
5513    {
5514      unsigned x, y, b;
5515      unsigned ilinebits = bpp * passw[i];
5516      unsigned olinebits = bpp * w;
5517      size_t obp, ibp; /*bit pointers (for out and in buffer)*/
5518      for(y = 0; y < passh[i]; y++)
5519      for(x = 0; x < passw[i]; x++)
5520      {
5521        ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp;
5522        obp = (8 * passstart[i]) + (y * ilinebits + x * bpp);
5523        for(b = 0; b < bpp; b++)
5524        {
5525          unsigned char bit = readBitFromReversedStream(&ibp, in);
5526          setBitOfReversedStream(&obp, out, bit);
5527        }
5528      }
5529    }
5530  }
5531}
5532
5533/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image.
5534return value is error**/
5535static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in,
5536                                    unsigned w, unsigned h,
5537                                    const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings)
5538{
5539  /*
5540  This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps:
5541  *) if no Adam7: 1) add padding bits (= posible extra bits per scanline if bpp < 8) 2) filter
5542  *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter
5543  */
5544  unsigned bpp = lodepng_get_bpp(&info_png->color);
5545  unsigned error = 0;
5546
5547  if(info_png->interlace_method == 0)
5548  {
5549    *outsize = h + (h * ((w * bpp + 7) / 8)); /*image size plus an extra byte per scanline + possible padding bits*/
5550    *out = (unsigned char*)lodepng_malloc(*outsize);
5551    if(!(*out) && (*outsize)) error = 83; /*alloc fail*/
5552
5553    if(!error)
5554    {
5555      /*non multiple of 8 bits per scanline, padding bits needed per scanline*/
5556      if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8)
5557      {
5558        unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7) / 8));
5559        if(!padded) error = 83; /*alloc fail*/
5560        if(!error)
5561        {
5562          addPaddingBits(padded, in, ((w * bpp + 7) / 8) * 8, w * bpp, h);
5563          error = filter(*out, padded, w, h, &info_png->color, settings);
5564        }
5565        lodepng_free(padded);
5566      }
5567      else
5568      {
5569        /*we can immediatly filter into the out buffer, no other steps needed*/
5570        error = filter(*out, in, w, h, &info_png->color, settings);
5571      }
5572    }
5573  }
5574  else /*interlace_method is 1 (Adam7)*/
5575  {
5576    unsigned passw[7], passh[7];
5577    size_t filter_passstart[8], padded_passstart[8], passstart[8];
5578    unsigned char* adam7;
5579
5580    Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
5581
5582    *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/
5583    *out = (unsigned char*)lodepng_malloc(*outsize);
5584    if(!(*out)) error = 83; /*alloc fail*/
5585
5586    adam7 = (unsigned char*)lodepng_malloc(passstart[7]);
5587    if(!adam7 && passstart[7]) error = 83; /*alloc fail*/
5588
5589    if(!error)
5590    {
5591      unsigned i;
5592
5593      Adam7_interlace(adam7, in, w, h, bpp);
5594      for(i = 0; i < 7; i++)
5595      {
5596        if(bpp < 8)
5597        {
5598          unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]);
5599          if(!padded) ERROR_BREAK(83); /*alloc fail*/
5600          addPaddingBits(padded, &adam7[passstart[i]],
5601                         ((passw[i] * bpp + 7) / 8) * 8, passw[i] * bpp, passh[i]);
5602          error = filter(&(*out)[filter_passstart[i]], padded,
5603                         passw[i], passh[i], &info_png->color, settings);
5604          lodepng_free(padded);
5605        }
5606        else
5607        {
5608          error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]],
5609                         passw[i], passh[i], &info_png->color, settings);
5610        }
5611
5612        if(error) break;
5613      }
5614    }
5615
5616    lodepng_free(adam7);
5617  }
5618
5619  return error;
5620}
5621
5622/*
5623palette must have 4 * palettesize bytes allocated, and given in format RGBARGBARGBARGBA...
5624returns 0 if the palette is opaque,
5625returns 1 if the palette has a single color with alpha 0 ==> color key
5626returns 2 if the palette is semi-translucent.
5627*/
5628static unsigned getPaletteTranslucency(const unsigned char* palette, size_t palettesize)
5629{
5630  size_t i, key = 0;
5631  unsigned r = 0, g = 0, b = 0; /*the value of the color with alpha 0, so long as color keying is possible*/
5632  for(i = 0; i < palettesize; i++)
5633  {
5634    if(!key && palette[4 * i + 3] == 0)
5635    {
5636      r = palette[4 * i + 0]; g = palette[4 * i + 1]; b = palette[4 * i + 2];
5637      key = 1;
5638      i = (size_t)(-1); /*restart from beginning, to detect earlier opaque colors with key's value*/
5639    }
5640    else if(palette[4 * i + 3] != 255) return 2;
5641    /*when key, no opaque RGB may have key's RGB*/
5642    else if(key && r == palette[i * 4 + 0] && g == palette[i * 4 + 1] && b == palette[i * 4 + 2]) return 2;
5643  }
5644  return key;
5645}
5646
5647#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5648static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize)
5649{
5650  unsigned char* inchunk = data;
5651  while((size_t)(inchunk - data) < datasize)
5652  {
5653    CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk));
5654    out->allocsize = out->size; /*fix the allocsize again*/
5655    inchunk = lodepng_chunk_next(inchunk);
5656  }
5657  return 0;
5658}
5659#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5660
5661unsigned lodepng_encode(unsigned char** out, size_t* outsize,
5662                        const unsigned char* image, unsigned w, unsigned h,
5663                        LodePNGState* state)
5664{
5665  LodePNGInfo info;
5666  ucvector outv;
5667  unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/
5668  size_t datasize = 0;
5669
5670  /*provide some proper output values if error will happen*/
5671  *out = 0;
5672  *outsize = 0;
5673  state->error = 0;
5674
5675  lodepng_info_init(&info);
5676  lodepng_info_copy(&info, &state->info_png);
5677
5678  if((info.color.colortype == LCT_PALETTE || state->encoder.force_palette)
5679      && (info.color.palettesize == 0 || info.color.palettesize > 256))
5680  {
5681    state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/
5682    return state->error;
5683  }
5684
5685  if(state->encoder.auto_convert != LAC_NO)
5686  {
5687    state->error = lodepng_auto_choose_color(&info.color, image, w, h, &state->info_raw,
5688                                             state->encoder.auto_convert);
5689  }
5690  if(state->error) return state->error;
5691
5692  if(state->encoder.zlibsettings.btype > 2)
5693  {
5694    CERROR_RETURN_ERROR(state->error, 61); /*error: unexisting btype*/
5695  }
5696  if(state->info_png.interlace_method > 1)
5697  {
5698    CERROR_RETURN_ERROR(state->error, 71); /*error: unexisting interlace mode*/
5699  }
5700
5701  state->error = checkColorValidity(info.color.colortype, info.color.bitdepth);
5702  if(state->error) return state->error; /*error: unexisting color type given*/
5703  state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth);
5704  if(state->error) return state->error; /*error: unexisting color type given*/
5705
5706  if(!lodepng_color_mode_equal(&state->info_raw, &info.color))
5707  {
5708    unsigned char* converted;
5709    size_t size = (w * h * lodepng_get_bpp(&info.color) + 7) / 8;
5710
5711    converted = (unsigned char*)lodepng_malloc(size);
5712    if(!converted && size) state->error = 83; /*alloc fail*/
5713    if(!state->error)
5714    {
5715      state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h, 0 /*fix_png*/);
5716    }
5717    if(!state->error) preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder);
5718    lodepng_free(converted);
5719  }
5720  else preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder);
5721
5722  ucvector_init(&outv);
5723  while(!state->error) /*while only executed once, to break on error*/
5724  {
5725#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5726    size_t i;
5727#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5728    /*write signature and chunks*/
5729    writeSignature(&outv);
5730    /*IHDR*/
5731    addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method);
5732#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5733    /*unknown chunks between IHDR and PLTE*/
5734    if(info.unknown_chunks_data[0])
5735    {
5736      state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]);
5737      if(state->error) break;
5738    }
5739#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5740    /*PLTE*/
5741    if(info.color.colortype == LCT_PALETTE)
5742    {
5743      addChunk_PLTE(&outv, &info.color);
5744    }
5745    if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA))
5746    {
5747      addChunk_PLTE(&outv, &info.color);
5748    }
5749    /*tRNS*/
5750    if(info.color.colortype == LCT_PALETTE && getPaletteTranslucency(info.color.palette, info.color.palettesize) != 0)
5751    {
5752      addChunk_tRNS(&outv, &info.color);
5753    }
5754    if((info.color.colortype == LCT_GREY || info.color.colortype == LCT_RGB) && info.color.key_defined)
5755    {
5756      addChunk_tRNS(&outv, &info.color);
5757    }
5758#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5759    /*bKGD (must come between PLTE and the IDAt chunks*/
5760    if(info.background_defined) addChunk_bKGD(&outv, &info);
5761    /*pHYs (must come before the IDAT chunks)*/
5762    if(info.phys_defined) addChunk_pHYs(&outv, &info);
5763
5764    /*unknown chunks between PLTE and IDAT*/
5765    if(info.unknown_chunks_data[1])
5766    {
5767      state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]);
5768      if(state->error) break;
5769    }
5770#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5771    /*IDAT (multiple IDAT chunks must be consecutive)*/
5772    state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings);
5773    if(state->error) break;
5774#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5775    /*tIME*/
5776    if(info.time_defined) addChunk_tIME(&outv, &info.time);
5777    /*tEXt and/or zTXt*/
5778    for(i = 0; i < info.text_num; i++)
5779    {
5780      if(strlen(info.text_keys[i]) > 79)
5781      {
5782        state->error = 66; /*text chunk too large*/
5783        break;
5784      }
5785      if(strlen(info.text_keys[i]) < 1)
5786      {
5787        state->error = 67; /*text chunk too small*/
5788        break;
5789      }
5790      if(state->encoder.text_compression)
5791      {
5792        addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings);
5793      }
5794      else
5795      {
5796        addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]);
5797      }
5798    }
5799    /*LodePNG version id in text chunk*/
5800    if(state->encoder.add_id)
5801    {
5802      unsigned alread_added_id_text = 0;
5803      for(i = 0; i < info.text_num; i++)
5804      {
5805        if(!strcmp(info.text_keys[i], "LodePNG"))
5806        {
5807          alread_added_id_text = 1;
5808          break;
5809        }
5810      }
5811      if(alread_added_id_text == 0)
5812      {
5813        addChunk_tEXt(&outv, "LodePNG", VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/
5814      }
5815    }
5816    /*iTXt*/
5817    for(i = 0; i < info.itext_num; i++)
5818    {
5819      if(strlen(info.itext_keys[i]) > 79)
5820      {
5821        state->error = 66; /*text chunk too large*/
5822        break;
5823      }
5824      if(strlen(info.itext_keys[i]) < 1)
5825      {
5826        state->error = 67; /*text chunk too small*/
5827        break;
5828      }
5829      addChunk_iTXt(&outv, state->encoder.text_compression,
5830                    info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i],
5831                    &state->encoder.zlibsettings);
5832    }
5833
5834    /*unknown chunks between IDAT and IEND*/
5835    if(info.unknown_chunks_data[2])
5836    {
5837      state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]);
5838      if(state->error) break;
5839    }
5840#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5841    addChunk_IEND(&outv);
5842
5843    break; /*this isn't really a while loop; no error happened so break out now!*/
5844  }
5845
5846  lodepng_info_cleanup(&info);
5847  lodepng_free(data);
5848  /*instead of cleaning the vector up, give it to the output*/
5849  *out = outv.data;
5850  *outsize = outv.size;
5851
5852  return state->error;
5853}
5854
5855unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image,
5856                               unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth)
5857{
5858  unsigned error;
5859  LodePNGState state;
5860  lodepng_state_init(&state);
5861  state.info_raw.colortype = colortype;
5862  state.info_raw.bitdepth = bitdepth;
5863  state.info_png.color.colortype = colortype;
5864  state.info_png.color.bitdepth = bitdepth;
5865  lodepng_encode(out, outsize, image, w, h, &state);
5866  error = state.error;
5867  lodepng_state_cleanup(&state);
5868  return error;
5869}
5870
5871unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h)
5872{
5873  return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8);
5874}
5875
5876unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h)
5877{
5878  return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8);
5879}
5880
5881#ifdef LODEPNG_COMPILE_DISK
5882unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h,
5883                             LodePNGColorType colortype, unsigned bitdepth)
5884{
5885  unsigned char* buffer;
5886  size_t buffersize;
5887  unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth);
5888  if(!error) error = lodepng_save_file(buffer, buffersize, filename);
5889  lodepng_free(buffer);
5890  return error;
5891}
5892
5893unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h)
5894{
5895  return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8);
5896}
5897
5898unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h)
5899{
5900  return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8);
5901}
5902#endif /*LODEPNG_COMPILE_DISK*/
5903
5904void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings)
5905{
5906  lodepng_compress_settings_init(&settings->zlibsettings);
5907  settings->filter_palette_zero = 1;
5908  settings->filter_strategy = LFS_MINSUM;
5909  settings->auto_convert = LAC_AUTO;
5910  settings->force_palette = 0;
5911  settings->predefined_filters = 0;
5912#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5913  settings->add_id = 0;
5914  settings->text_compression = 1;
5915#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5916}
5917
5918#endif /*LODEPNG_COMPILE_ENCODER*/
5919#endif /*LODEPNG_COMPILE_PNG*/
5920
5921#ifdef LODEPNG_COMPILE_ERROR_TEXT
5922/*
5923This returns the description of a numerical error code in English. This is also
5924the documentation of all the error codes.
5925*/
5926const char* lodepng_error_text(unsigned code)
5927{
5928  switch(code)
5929  {
5930    case 0: return "no error, everything went ok";
5931    case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/
5932    case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/
5933    case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/
5934    case 13: return "problem while processing dynamic deflate block";
5935    case 14: return "problem while processing dynamic deflate block";
5936    case 15: return "problem while processing dynamic deflate block";
5937    case 16: return "unexisting code while processing dynamic deflate block";
5938    case 17: return "end of out buffer memory reached while inflating";
5939    case 18: return "invalid distance code while inflating";
5940    case 19: return "end of out buffer memory reached while inflating";
5941    case 20: return "invalid deflate block BTYPE encountered while decoding";
5942    case 21: return "NLEN is not ones complement of LEN in a deflate block";
5943     /*end of out buffer memory reached while inflating:
5944     This can happen if the inflated deflate data is longer than the amount of bytes required to fill up
5945     all the pixels of the image, given the color depth and image dimensions. Something that doesn't
5946     happen in a normal, well encoded, PNG image.*/
5947    case 22: return "end of out buffer memory reached while inflating";
5948    case 23: return "end of in buffer memory reached while inflating";
5949    case 24: return "invalid FCHECK in zlib header";
5950    case 25: return "invalid compression method in zlib header";
5951    case 26: return "FDICT encountered in zlib header while it's not used for PNG";
5952    case 27: return "PNG file is smaller than a PNG header";
5953    /*Checks the magic file header, the first 8 bytes of the PNG file*/
5954    case 28: return "incorrect PNG signature, it's no PNG or corrupted";
5955    case 29: return "first chunk is not the header chunk";
5956    case 30: return "chunk length too large, chunk broken off at end of file";
5957    case 31: return "illegal PNG color type or bpp";
5958    case 32: return "illegal PNG compression method";
5959    case 33: return "illegal PNG filter method";
5960    case 34: return "illegal PNG interlace method";
5961    case 35: return "chunk length of a chunk is too large or the chunk too small";
5962    case 36: return "illegal PNG filter type encountered";
5963    case 37: return "illegal bit depth for this color type given";
5964    case 38: return "the palette is too big"; /*more than 256 colors*/
5965    case 39: return "more palette alpha values given in tRNS chunk than there are colors in the palette";
5966    case 40: return "tRNS chunk has wrong size for greyscale image";
5967    case 41: return "tRNS chunk has wrong size for RGB image";
5968    case 42: return "tRNS chunk appeared while it was not allowed for this color type";
5969    case 43: return "bKGD chunk has wrong size for palette image";
5970    case 44: return "bKGD chunk has wrong size for greyscale image";
5971    case 45: return "bKGD chunk has wrong size for RGB image";
5972    /*Is the palette too small?*/
5973    case 46: return "a value in indexed image is larger than the palette size (bitdepth = 8)";
5974    /*Is the palette too small?*/
5975    case 47: return "a value in indexed image is larger than the palette size (bitdepth < 8)";
5976    /*the input data is empty, maybe a PNG file doesn't exist or is in the wrong path*/
5977    case 48: return "empty input or file doesn't exist";
5978    case 49: return "jumped past memory while generating dynamic huffman tree";
5979    case 50: return "jumped past memory while generating dynamic huffman tree";
5980    case 51: return "jumped past memory while inflating huffman block";
5981    case 52: return "jumped past memory while inflating";
5982    case 53: return "size of zlib data too small";
5983    case 54: return "repeat symbol in tree while there was no value symbol yet";
5984    /*jumped past tree while generating huffman tree, this could be when the
5985    tree will have more leaves than symbols after generating it out of the
5986    given lenghts. They call this an oversubscribed dynamic bit lengths tree in zlib.*/
5987    case 55: return "jumped past tree while generating huffman tree";
5988    case 56: return "given output image colortype or bitdepth not supported for color conversion";
5989    case 57: return "invalid CRC encountered (checking CRC can be disabled)";
5990    case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)";
5991    case 59: return "requested color conversion not supported";
5992    case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)";
5993    case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)";
5994    /*LodePNG leaves the choice of RGB to greyscale conversion formula to the user.*/
5995    case 62: return "conversion from color to greyscale not supported";
5996    case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; /*(2^31-1)*/
5997    /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/
5998    case 64: return "the length of the END symbol 256 in the Huffman tree is 0";
5999    case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes";
6000    case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte";
6001    case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors";
6002    case 69: return "unknown chunk type with 'critical' flag encountered by the decoder";
6003    case 71: return "unexisting interlace mode given to encoder (must be 0 or 1)";
6004    case 72: return "while decoding, unexisting compression method encountering in zTXt or iTXt chunk (it must be 0)";
6005    case 73: return "invalid tIME chunk size";
6006    case 74: return "invalid pHYs chunk size";
6007    /*length could be wrong, or data chopped off*/
6008    case 75: return "no null termination char found while decoding text chunk";
6009    case 76: return "iTXt chunk too short to contain required bytes";
6010    case 77: return "integer overflow in buffer size";
6011    case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/
6012    case 79: return "failed to open file for writing";
6013    case 80: return "tried creating a tree of 0 symbols";
6014    case 81: return "lazy matching at pos 0 is impossible";
6015    case 82: return "color conversion to palette requested while a color isn't in palette";
6016    case 83: return "memory allocation failed";
6017    case 84: return "given image too small to contain all pixels to be encoded";
6018    case 85: return "internal color conversion bug";
6019    case 86: return "impossible offset in lz77 encoding (internal bug)";
6020    case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined";
6021    case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy";
6022    case 89: return "text chunk keyword too short or long: must have size 1-79";
6023    /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/
6024    case 90: return "windowsize must be a power of two";
6025  }
6026  return "unknown error code";
6027}
6028#endif /*LODEPNG_COMPILE_ERROR_TEXT*/
6029
6030/* ////////////////////////////////////////////////////////////////////////// */
6031/* ////////////////////////////////////////////////////////////////////////// */
6032/* // C++ Wrapper                                                          // */
6033/* ////////////////////////////////////////////////////////////////////////// */
6034/* ////////////////////////////////////////////////////////////////////////// */
6035
6036#ifdef LODEPNG_COMPILE_CPP
6037namespace lodepng
6038{
6039
6040#ifdef LODEPNG_COMPILE_DISK
6041void load_file(std::vector<unsigned char>& buffer, const std::string& filename)
6042{
6043  std::ifstream file(filename.c_str(), std::ios::in|std::ios::binary|std::ios::ate);
6044
6045  /*get filesize*/
6046  std::streamsize size = 0;
6047  if(file.seekg(0, std::ios::end).good()) size = file.tellg();
6048  if(file.seekg(0, std::ios::beg).good()) size -= file.tellg();
6049
6050  /*read contents of the file into the vector*/
6051  buffer.resize(size_t(size));
6052  if(size > 0) file.read((char*)(&buffer[0]), size);
6053}
6054
6055/*write given buffer to the file, overwriting the file, it doesn't append to it.*/
6056void save_file(const std::vector<unsigned char>& buffer, const std::string& filename)
6057{
6058  std::ofstream file(filename.c_str(), std::ios::out|std::ios::binary);
6059  file.write(buffer.empty() ? 0 : (char*)&buffer[0], std::streamsize(buffer.size()));
6060}
6061#endif //LODEPNG_COMPILE_DISK
6062
6063#ifdef LODEPNG_COMPILE_ZLIB
6064#ifdef LODEPNG_COMPILE_DECODER
6065unsigned decompress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,
6066                    const LodePNGDecompressSettings& settings)
6067{
6068  unsigned char* buffer = 0;
6069  size_t buffersize = 0;
6070  unsigned error = zlib_decompress(&buffer, &buffersize, in, insize, &settings);
6071  if(buffer)
6072  {
6073    out.insert(out.end(), &buffer[0], &buffer[buffersize]);
6074    lodepng_free(buffer);
6075  }
6076  return error;
6077}
6078
6079unsigned decompress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,
6080                    const LodePNGDecompressSettings& settings)
6081{
6082  return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings);
6083}
6084#endif //LODEPNG_COMPILE_DECODER
6085
6086#ifdef LODEPNG_COMPILE_ENCODER
6087unsigned compress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,
6088                  const LodePNGCompressSettings& settings)
6089{
6090  unsigned char* buffer = 0;
6091  size_t buffersize = 0;
6092  unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings);
6093  if(buffer)
6094  {
6095    out.insert(out.end(), &buffer[0], &buffer[buffersize]);
6096    lodepng_free(buffer);
6097  }
6098  return error;
6099}
6100
6101unsigned compress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,
6102                  const LodePNGCompressSettings& settings)
6103{
6104  return compress(out, in.empty() ? 0 : &in[0], in.size(), settings);
6105}
6106#endif //LODEPNG_COMPILE_ENCODER
6107#endif //LODEPNG_COMPILE_ZLIB
6108
6109
6110#ifdef LODEPNG_COMPILE_PNG
6111
6112State::State()
6113{
6114  lodepng_state_init(this);
6115}
6116
6117State::State(const State& other)
6118{
6119  lodepng_state_init(this);
6120  lodepng_state_copy(this, &other);
6121}
6122
6123State::~State()
6124{
6125  lodepng_state_cleanup(this);
6126}
6127
6128State& State::operator=(const State& other)
6129{
6130  lodepng_state_copy(this, &other);
6131  return *this;
6132}
6133
6134#ifdef LODEPNG_COMPILE_DECODER
6135
6136unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const unsigned char* in,
6137                size_t insize, LodePNGColorType colortype, unsigned bitdepth)
6138{
6139  unsigned char* buffer;
6140  unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth);
6141  if(buffer && !error)
6142  {
6143    State state;
6144    state.info_raw.colortype = colortype;
6145    state.info_raw.bitdepth = bitdepth;
6146    size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);
6147    out.insert(out.end(), &buffer[0], &buffer[buffersize]);
6148    lodepng_free(buffer);
6149  }
6150  return error;
6151}
6152
6153unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
6154                const std::vector<unsigned char>& in, LodePNGColorType colortype, unsigned bitdepth)
6155{
6156  return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth);
6157}
6158
6159unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
6160                State& state,
6161                const unsigned char* in, size_t insize)
6162{
6163  unsigned char* buffer = NULL;
6164  unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize);
6165  if(buffer && !error)
6166  {
6167    size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);
6168    out.insert(out.end(), &buffer[0], &buffer[buffersize]);
6169  }
6170  lodepng_free(buffer);
6171  return error;
6172}
6173
6174unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
6175                State& state,
6176                const std::vector<unsigned char>& in)
6177{
6178  return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size());
6179}
6180
6181#ifdef LODEPNG_COMPILE_DISK
6182unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const std::string& filename,
6183                LodePNGColorType colortype, unsigned bitdepth)
6184{
6185  std::vector<unsigned char> buffer;
6186  load_file(buffer, filename);
6187  return decode(out, w, h, buffer, colortype, bitdepth);
6188}
6189#endif //LODEPNG_COMPILE_DECODER
6190#endif //LODEPNG_COMPILE_DISK
6191
6192#ifdef LODEPNG_COMPILE_ENCODER
6193unsigned encode(std::vector<unsigned char>& out, const unsigned char* in, unsigned w, unsigned h,
6194                LodePNGColorType colortype, unsigned bitdepth)
6195{
6196  unsigned char* buffer;
6197  size_t buffersize;
6198  unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth);
6199  if(buffer)
6200  {
6201    out.insert(out.end(), &buffer[0], &buffer[buffersize]);
6202    lodepng_free(buffer);
6203  }
6204  return error;
6205}
6206
6207unsigned encode(std::vector<unsigned char>& out,
6208                const std::vector<unsigned char>& in, unsigned w, unsigned h,
6209                LodePNGColorType colortype, unsigned bitdepth)
6210{
6211  if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84;
6212  return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth);
6213}
6214
6215unsigned encode(std::vector<unsigned char>& out,
6216                const unsigned char* in, unsigned w, unsigned h,
6217                State& state)
6218{
6219  unsigned char* buffer;
6220  size_t buffersize;
6221  unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state);
6222  if(buffer)
6223  {
6224    out.insert(out.end(), &buffer[0], &buffer[buffersize]);
6225    lodepng_free(buffer);
6226  }
6227  return error;
6228}
6229
6230unsigned encode(std::vector<unsigned char>& out,
6231                const std::vector<unsigned char>& in, unsigned w, unsigned h,
6232                State& state)
6233{
6234  if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84;
6235  return encode(out, in.empty() ? 0 : &in[0], w, h, state);
6236}
6237
6238#ifdef LODEPNG_COMPILE_DISK
6239unsigned encode(const std::string& filename,
6240                const unsigned char* in, unsigned w, unsigned h,
6241                LodePNGColorType colortype, unsigned bitdepth)
6242{
6243  std::vector<unsigned char> buffer;
6244  unsigned error = encode(buffer, in, w, h, colortype, bitdepth);
6245  if(!error) save_file(buffer, filename);
6246  return error;
6247}
6248
6249unsigned encode(const std::string& filename,
6250                const std::vector<unsigned char>& in, unsigned w, unsigned h,
6251                LodePNGColorType colortype, unsigned bitdepth)
6252{
6253  if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84;
6254  return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth);
6255}
6256#endif //LODEPNG_COMPILE_DISK
6257#endif //LODEPNG_COMPILE_ENCODER
6258#endif //LODEPNG_COMPILE_PNG
6259} //namespace lodepng
6260#endif /*LODEPNG_COMPILE_CPP*/
6261