• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 LodePNG version 20131222
3 
4 Copyright (c) 2005-2013 Lode Vandevenne
5 
6 This software is provided 'as-is', without any express or implied
7 warranty. In no event will the authors be held liable for any damages
8 arising from the use of this software.
9 
10 Permission is granted to anyone to use this software for any purpose,
11 including commercial applications, and to alter it and redistribute it
12 freely, 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 /*
27 The manual and changelog are in the header file "lodepng.h"
28 Rename 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 /*
43 This source file is built up in the following large parts. The code sections
44 with 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
52 of the name, so that you can easily change them to others related to your
53 platform 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
56 define them in your own project's source files without needing to change
57 lodepng source code. Don't forget to remove "static" if you copypaste them
58 from here.*/
59 
60 #ifdef LODEPNG_COMPILE_ALLOCATORS
lodepng_malloc(size_t size)61 static void* lodepng_malloc(size_t size)
62 {
63   return malloc(size);
64 }
65 
lodepng_realloc(void * ptr,size_t new_size)66 static void* lodepng_realloc(void* ptr, size_t new_size)
67 {
68   return realloc(ptr, new_size);
69 }
70 
lodepng_free(void * ptr)71 static void lodepng_free(void* ptr)
72 {
73   free(ptr);
74 }
75 #else /*LODEPNG_COMPILE_ALLOCATORS*/
76 void* lodepng_malloc(size_t size);
77 void* lodepng_realloc(void* ptr, size_t new_size);
78 void 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 /*
88 Often in case of an error a value is assigned to a variable and then it breaks
89 out of a loop (to go to the cleanup phase of a function). This macro does that.
90 It makes the error handling code shorter and more readable.
91 
92 Example: 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 /*
118 About 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*/
128 typedef 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 
uivector_cleanup(void * p)135 static 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*/
uivector_resize(uivector * p,size_t size)143 static 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*/
uivector_resizev(uivector * p,size_t size,unsigned value)162 static 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 
uivector_init(uivector * p)170 static 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*/
uivector_push_back(uivector * p,unsigned c)178 static 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*/
uivector_copy(uivector * p,const uivector * q)186 static 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*/
199 typedef 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*/
ucvector_resize(ucvector * p,size_t size)207 static 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 
ucvector_cleanup(void * p)227 static 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 
ucvector_init(ucvector * p)234 static 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*/
ucvector_resizev(ucvector * p,size_t size,unsigned char value)242 static 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
254 init_buffer to take over a buffer and size, it is not needed to use cleanup*/
ucvector_init_buffer(ucvector * p,unsigned char * buffer,size_t size)255 static 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*/
ucvector_push_back(ucvector * p,unsigned char c)264 static 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*/
string_resize(char ** out,size_t size)278 static 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*/
string_init(char ** out)290 static void string_init(char** out)
291 {
292   *out = NULL;
293   string_resize(out, 0);
294 }
295 
296 /*free the above pair again*/
string_cleanup(char ** out)297 static void string_cleanup(char** out)
298 {
299   lodepng_free(*out);
300   *out = NULL;
301 }
302 
string_set(char ** out,const char * in)303 static 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 
lodepng_read32bitInt(const unsigned char * buffer)319 unsigned 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*/
lodepng_set32bitInt(unsigned char * buffer,unsigned value)326 static 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
lodepng_add32bitInt(ucvector * buffer,unsigned value)336 static 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 
lodepng_load_file(unsigned char ** out,size_t * outsize,const char * filename)349 unsigned 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.*/
lodepng_save_file(const unsigned char * buffer,size_t buffersize,const char * filename)377 unsigned 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 
addBitsToStream(size_t * bitpointer,ucvector * bitstream,unsigned value,size_t nbits)407 static 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 
addBitsToStreamReversed(size_t * bitpointer,ucvector * bitstream,unsigned value,size_t nbits)413 static 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 
readBitFromStream(size_t * bitpointer,const unsigned char * bitstream)424 static 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 
readBitsFromStream(size_t * bitpointer,const unsigned char * bitstream,size_t nbits)431 static 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*/
457 static 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)*/
462 static 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)*/
467 static 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)*/
472 static 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
477 the huffman tree of the dynamic huffman tree lengths is generated*/
478 static 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 /*
484 Huffman tree struct, containing multiple representations of the tree
485 */
486 typedef 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 /*
497 static 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 
HuffmanTree_init(HuffmanTree * tree)508 static void HuffmanTree_init(HuffmanTree* tree)
509 {
510   tree->tree2d = 0;
511   tree->tree1d = 0;
512   tree->lengths = 0;
513 }
514 
HuffmanTree_cleanup(HuffmanTree * tree)515 static 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*/
HuffmanTree_make2DTree(HuffmanTree * tree)523 static 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 /*
583 Second step for the ...makeFromLengths and ...makeFromFrequencies functions.
584 numcodes, lengths and maxbitlen must already be filled in correctly. return
585 value is error.
586 */
HuffmanTree_makeFromLengths2(HuffmanTree * tree)587 static 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 /*
627 given the code lengths (as stored in the PNG file), generate the tree as defined
628 by Deflate. maxbitlen is the maximum bits that a code in the tree can have.
629 return value is error.
630 */
HuffmanTree_makeFromLengths(HuffmanTree * tree,const unsigned * bitlen,size_t numcodes,unsigned maxbitlen)631 static 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 /*
646 A coin, this is the terminology used for the package-merge algorithm and the
647 coin collector's problem. This is used to generate the huffman tree.
648 A coin can be multiple coins (when they're merged)
649 */
650 typedef struct Coin
651 {
652   uivector symbols;
653   float weight; /*the sum of all weights in this coin*/
654 } Coin;
655 
coin_init(Coin * c)656 static 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*/
coin_cleanup(void * c)662 static void coin_cleanup(void* c)
663 {
664   uivector_cleanup(&((Coin*)c)->symbols);
665 }
666 
coin_copy(Coin * c1,const Coin * c2)667 static void coin_copy(Coin* c1, const Coin* c2)
668 {
669   c1->weight = c2->weight;
670   uivector_copy(&c1->symbols, &c2->symbols);
671 }
672 
add_coins(Coin * c1,const Coin * c2)673 static 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 
init_coins(Coin * coins,size_t num)680 static 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 
cleanup_coins(Coin * coins,size_t num)686 static 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 
coin_compare(const void * a,const void * b)692 static 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 
append_symbol_coins(Coin * coins,const unsigned * frequencies,unsigned numcodes,size_t sum)698 static 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 
lodepng_huffman_code_lengths(unsigned * lengths,const unsigned * frequencies,size_t numcodes,unsigned maxbitlen)714 unsigned 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*/
HuffmanTree_makeFromFrequencies(HuffmanTree * tree,const unsigned * frequencies,size_t mincodes,size_t numcodes,unsigned maxbitlen)834 static 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 
HuffmanTree_getCode(const HuffmanTree * tree,unsigned index)851 static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index)
852 {
853   return tree->tree1d[index];
854 }
855 
HuffmanTree_getLength(const HuffmanTree * tree,unsigned index)856 static 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*/
generateFixedLitLenTree(HuffmanTree * tree)863 static 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*/
generateFixedDistanceTree(HuffmanTree * tree)882 static 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 /*
899 returns the code, or (unsigned)(-1) if error happened
900 inbitlength is the length of the complete buffer, in bits (so its byte length times 8)
901 */
huffmanDecodeSymbol(const unsigned char * in,size_t * bp,const HuffmanTree * codetree,size_t inbitlength)902 static 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*/
getTreeInflateFixed(HuffmanTree * tree_ll,HuffmanTree * tree_d)930 static 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*/
getTreeInflateDynamic(HuffmanTree * tree_ll,HuffmanTree * tree_d,const unsigned char * in,size_t * bp,size_t inlength)938 static 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*/
inflateHuffmanBlock(ucvector * out,const unsigned char * in,size_t * bp,size_t * pos,size_t inlength,unsigned btype)1086 static 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 
inflateNoCompression(ucvector * out,const unsigned char * in,size_t * bp,size_t * pos,size_t inlength)1186 static 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 
lodepng_inflatev(ucvector * out,const unsigned char * in,size_t insize,const LodePNGDecompressSettings * settings)1216 static 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 
lodepng_inflate(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGDecompressSettings * settings)1250 unsigned 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 
inflate(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGDecompressSettings * settings)1263 static 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 
1285 static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258;
1286 
1287 /*bitlen is the size in bits of the code*/
addHuffmanSymbol(size_t * bp,ucvector * compressed,unsigned code,unsigned bitlen)1288 static 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,
1294 given array must be sorted (if no value is smaller, it returns the size of the given array)*/
searchCodeIndex(const unsigned * array,size_t array_size,size_t value)1295 static 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 
addLengthDistance(uivector * values,size_t length,size_t distance)1314 static 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 
1333 static const unsigned HASH_BIT_MASK = 65535;
1334 static const unsigned HASH_NUM_VALUES = 65536;
1335 static const unsigned HASH_NUM_CHARACTERS = 3;
1336 static const unsigned HASH_SHIFT = 2;
1337 /*
1338 The HASH_NUM_CHARACTERS value is used to make encoding faster by using longer
1339 sequences to generate a hash value from the stream bytes. Setting it to 3
1340 gives exactly the same compression as the brute force method, since deflate's
1341 run length encoding starts with lengths of 3. Setting it to higher values,
1342 like 6, can make the encoding faster (not always though!), but will cause the
1343 encoding to miss any length between 3 and this value, so that the compression
1344 may be worse (but this can vary too depending on the image, sometimes it is
1345 even a bit better instead).
1346 The HASH_NUM_VALUES is the amount of unique possible hash values that
1347 combinations of bytes can give, the higher it is the more memory is needed, but
1348 if it's too low the advantage of hashing is gone.
1349 */
1350 
1351 typedef 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 
hash_init(Hash * hash,unsigned windowsize)1360 static 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 
hash_cleanup(Hash * hash)1378 static 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 
getHash(const unsigned char * data,size_t size,size_t pos)1386 static 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 
countZeros(const unsigned char * data,size_t size,size_t pos)1403 static 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)*/
updateHashChain(Hash * hash,size_t wpos,int hashval)1415 static 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 /*
1423 LZ77-encode the data. Return value is error code. The input are raw bytes, the output
1424 is in the form of unsigned integers with codes representing for example literal bytes, or
1425 length/distance pairs.
1426 It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a
1427 sliding window (of windowsize) is used, and all past bytes in that window can be used as
1428 the "dictionary". A brute force search through all possible distances would be slow, and
1429 this hash technique is one out of several ways to speed this up.
1430 */
encodeLZ77(uivector * out,Hash * hash,const unsigned char * in,size_t inpos,size_t insize,unsigned windowsize,unsigned minmatch,unsigned nicematch,unsigned lazymatching)1431 static 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 
deflateNoCompression(ucvector * out,const unsigned char * data,size_t datasize)1600 static 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 /*
1638 write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees.
1639 tree_ll: the tree for lit and len codes.
1640 tree_d: the tree for distance codes.
1641 */
writeLZ77data(size_t * bp,ucvector * out,const uivector * lz77_encoded,const HuffmanTree * tree_ll,const HuffmanTree * tree_d)1642 static 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*/
deflateDynamic(ucvector * out,size_t * bp,Hash * hash,const unsigned char * data,size_t datapos,size_t dataend,const LodePNGCompressSettings * settings,int final)1671 static 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 
deflateFixed(ucvector * out,size_t * bp,Hash * hash,const unsigned char * data,size_t datapos,size_t dataend,const LodePNGCompressSettings * settings,int final)1916 static 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 
lodepng_deflatev(ucvector * out,const unsigned char * in,size_t insize,const LodePNGCompressSettings * settings)1964 static 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 
lodepng_deflate(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGCompressSettings * settings)2003 unsigned 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 
deflate(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGCompressSettings * settings)2016 static 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 
update_adler32(unsigned adler,const unsigned char * data,unsigned len)2036 static 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]*/
adler32(const unsigned char * data,unsigned len)2060 static 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 
lodepng_zlib_decompress(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGDecompressSettings * settings)2071 unsigned 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 
zlib_decompress(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGDecompressSettings * settings)2116 static 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 
lodepng_zlib_compress(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGCompressSettings * settings)2133 unsigned 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 */
zlib_compress(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGCompressSettings * settings)2176 static 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
zlib_decompress(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGDecompressSettings * settings)2194 static 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
zlib_compress(unsigned char ** out,size_t * outsize,const unsigned char * in,size_t insize,const LodePNGCompressSettings * settings)2202 static 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 
lodepng_compress_settings_init(LodePNGCompressSettings * settings)2219 void 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 
2234 const 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 
lodepng_decompress_settings_init(LodePNGDecompressSettings * settings)2241 void 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 
2250 const 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 */
2267 static 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].*/
lodepng_crc32(const unsigned char * buf,size_t len)2303 unsigned 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 
readBitFromReversedStream(size_t * bitpointer,const unsigned char * bitstream)2319 static 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 
readBitsFromReversedStream(size_t * bitpointer,const unsigned char * bitstream,size_t nbits)2326 static 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
setBitOfReversedStream0(size_t * bitpointer,unsigned char * bitstream,unsigned char bit)2338 static 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 
setBitOfReversedStream(size_t * bitpointer,unsigned char * bitstream,unsigned char bit)2350 static 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 
lodepng_chunk_length(const unsigned char * chunk)2362 unsigned lodepng_chunk_length(const unsigned char* chunk)
2363 {
2364   return lodepng_read32bitInt(&chunk[0]);
2365 }
2366 
lodepng_chunk_type(char type[5],const unsigned char * chunk)2367 void 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 
lodepng_chunk_type_equals(const unsigned char * chunk,const char * type)2374 unsigned 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 
lodepng_chunk_ancillary(const unsigned char * chunk)2380 unsigned char lodepng_chunk_ancillary(const unsigned char* chunk)
2381 {
2382   return((chunk[4] & 32) != 0);
2383 }
2384 
lodepng_chunk_private(const unsigned char * chunk)2385 unsigned char lodepng_chunk_private(const unsigned char* chunk)
2386 {
2387   return((chunk[6] & 32) != 0);
2388 }
2389 
lodepng_chunk_safetocopy(const unsigned char * chunk)2390 unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk)
2391 {
2392   return((chunk[7] & 32) != 0);
2393 }
2394 
lodepng_chunk_data(unsigned char * chunk)2395 unsigned char* lodepng_chunk_data(unsigned char* chunk)
2396 {
2397   return &chunk[8];
2398 }
2399 
lodepng_chunk_data_const(const unsigned char * chunk)2400 const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk)
2401 {
2402   return &chunk[8];
2403 }
2404 
lodepng_chunk_check_crc(const unsigned char * chunk)2405 unsigned 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 
lodepng_chunk_generate_crc(unsigned char * chunk)2415 void 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 
lodepng_chunk_next(unsigned char * chunk)2422 unsigned 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 
lodepng_chunk_next_const(const unsigned char * chunk)2428 const 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 
lodepng_chunk_append(unsigned char ** out,size_t * outlength,const unsigned char * chunk)2434 unsigned 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 
lodepng_chunk_create(unsigned char ** out,size_t * outlength,unsigned length,const char * type,const unsigned char * data)2453 unsigned 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*/
checkColorValidity(LodePNGColorType colortype,unsigned bd)2489 static 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 
getNumColorChannels(LodePNGColorType colortype)2503 static 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 
lodepng_get_bpp_lct(LodePNGColorType colortype,unsigned bitdepth)2516 static 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 
lodepng_color_mode_init(LodePNGColorMode * info)2524 void 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 
lodepng_color_mode_cleanup(LodePNGColorMode * info)2534 void lodepng_color_mode_cleanup(LodePNGColorMode* info)
2535 {
2536   lodepng_palette_clear(info);
2537 }
2538 
lodepng_color_mode_copy(LodePNGColorMode * dest,const LodePNGColorMode * source)2539 unsigned 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 
lodepng_color_mode_equal(const LodePNGColorMode * a,const LodePNGColorMode * b)2553 static 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 
lodepng_palette_clear(LodePNGColorMode * info)2573 void lodepng_palette_clear(LodePNGColorMode* info)
2574 {
2575   if(info->palette) lodepng_free(info->palette);
2576   info->palette = 0;
2577   info->palettesize = 0;
2578 }
2579 
lodepng_palette_add(LodePNGColorMode * info,unsigned char r,unsigned char g,unsigned char b,unsigned char a)2580 unsigned 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 
lodepng_get_bpp(const LodePNGColorMode * info)2601 unsigned 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 
lodepng_get_channels(const LodePNGColorMode * info)2607 unsigned lodepng_get_channels(const LodePNGColorMode* info)
2608 {
2609   return getNumColorChannels(info->colortype);
2610 }
2611 
lodepng_is_greyscale_type(const LodePNGColorMode * info)2612 unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info)
2613 {
2614   return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA;
2615 }
2616 
lodepng_is_alpha_type(const LodePNGColorMode * info)2617 unsigned lodepng_is_alpha_type(const LodePNGColorMode* info)
2618 {
2619   return (info->colortype & 4) != 0; /*4 or 6*/
2620 }
2621 
lodepng_is_palette_type(const LodePNGColorMode * info)2622 unsigned lodepng_is_palette_type(const LodePNGColorMode* info)
2623 {
2624   return info->colortype == LCT_PALETTE;
2625 }
2626 
lodepng_has_palette_alpha(const LodePNGColorMode * info)2627 unsigned 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 
lodepng_can_have_alpha(const LodePNGColorMode * info)2637 unsigned 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 
lodepng_get_raw_size(unsigned w,unsigned h,const LodePNGColorMode * color)2644 size_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 
lodepng_get_raw_size_lct(unsigned w,unsigned h,LodePNGColorType colortype,unsigned bitdepth)2649 size_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 
LodePNGUnknownChunks_init(LodePNGInfo * info)2656 static 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 
LodePNGUnknownChunks_cleanup(LodePNGInfo * info)2663 static 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 
LodePNGUnknownChunks_copy(LodePNGInfo * dest,const LodePNGInfo * src)2669 static 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 
LodePNGText_init(LodePNGInfo * info)2692 static void LodePNGText_init(LodePNGInfo* info)
2693 {
2694   info->text_num = 0;
2695   info->text_keys = NULL;
2696   info->text_strings = NULL;
2697 }
2698 
LodePNGText_cleanup(LodePNGInfo * info)2699 static 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 
LodePNGText_copy(LodePNGInfo * dest,const LodePNGInfo * source)2711 static 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 
lodepng_clear_text(LodePNGInfo * info)2724 void lodepng_clear_text(LodePNGInfo* info)
2725 {
2726   LodePNGText_cleanup(info);
2727 }
2728 
lodepng_add_text(LodePNGInfo * info,const char * key,const char * str)2729 unsigned 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 
LodePNGIText_init(LodePNGInfo * info)2755 static 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 
LodePNGIText_cleanup(LodePNGInfo * info)2764 static 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 
LodePNGIText_copy(LodePNGInfo * dest,const LodePNGInfo * source)2780 static 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 
lodepng_clear_itext(LodePNGInfo * info)2796 void lodepng_clear_itext(LodePNGInfo* info)
2797 {
2798   LodePNGIText_cleanup(info);
2799 }
2800 
lodepng_add_itext(LodePNGInfo * info,const char * key,const char * langtag,const char * transkey,const char * str)2801 unsigned 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 
lodepng_info_init(LodePNGInfo * info)2839 void 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 
lodepng_info_cleanup(LodePNGInfo * info)2859 void 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 
lodepng_info_copy(LodePNGInfo * dest,const LodePNGInfo * source)2870 unsigned 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 
lodepng_info_swap(LodePNGInfo * a,LodePNGInfo * b)2887 void 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*/
addColorBits(unsigned char * out,size_t index,unsigned bits,unsigned in)2897 static 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 
2908 typedef struct ColorTree ColorTree;
2909 
2910 /*
2911 One node of a color tree
2912 This is the data structure used to count the number of unique colors and to get a palette
2913 index for a color. It's like an octree, but because the alpha channel is used too, each
2914 node has 16 instead of 8 children.
2915 */
2916 struct 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 
color_tree_init(ColorTree * tree)2922 static 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 
color_tree_cleanup(ColorTree * tree)2929 static 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*/
color_tree_get(ColorTree * tree,unsigned char r,unsigned char g,unsigned char b,unsigned char a)2943 static 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
color_tree_has(ColorTree * tree,unsigned char r,unsigned char g,unsigned char b,unsigned char a)2956 static 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.
2963 Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/
color_tree_add(ColorTree * tree,unsigned char r,unsigned char g,unsigned char b,unsigned char a,int index)2964 static 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*/
rgba8ToPixel(unsigned char * out,size_t i,const LodePNGColorMode * mode,ColorTree * tree,unsigned char r,unsigned char g,unsigned char b,unsigned char a)2982 static 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*/
rgba16ToPixel(unsigned char * out,size_t i,const LodePNGColorMode * mode,unsigned short r,unsigned short g,unsigned short b,unsigned short a)3056 static 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.*/
getPixelColorRGBA8(unsigned char * r,unsigned char * g,unsigned char * b,unsigned char * a,const unsigned char * in,size_t i,const LodePNGColorMode * mode,unsigned fix_png)3100 static 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
3209 mode test cases, optimized to convert the colors much faster, when converting
3210 to RGBA or RGB with 8 bit per cannel. buffer must be RGBA or RGB output with
3211 enough memory, if has_alpha is true the output is RGBA. mode has the color mode
3212 of the input buffer.*/
getPixelColorsRGBA8(unsigned char * buffer,size_t numpixels,unsigned has_alpha,const unsigned char * in,const LodePNGColorMode * mode,unsigned fix_png)3213 static 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
3349 given color type, but the given color type must be 16-bit itself.*/
getPixelColorRGBA16(unsigned short * r,unsigned short * g,unsigned short * b,unsigned short * a,const unsigned char * in,size_t i,const LodePNGColorMode * mode)3350 static 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 /*
3389 converts from any color type to 24-bit or 32-bit (later maybe more supported). return value = LodePNG error code
3390 the 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 */
lodepng_convert(unsigned char * out,const unsigned char * in,LodePNGColorMode * mode_out,const LodePNGColorMode * mode_in,unsigned w,unsigned h,unsigned fix_png)3393 unsigned 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 
3462 typedef 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 
color_profile_init(ColorProfile * profile,const LodePNGColorMode * mode)3489 static 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 
color_profile_cleanup(ColorProfile * profile)3516 static 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)*/
getValueRequiredBits(unsigned short value)3543 unsigned 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.
3552 It's ok to set some parameters of profile to done already.*/
get_color_profile(ColorProfile * profile,const unsigned char * in,size_t numpixels,const LodePNGColorMode * mode,unsigned fix_png)3553 static 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 
setColorKeyFrom16bit(LodePNGColorMode * mode_out,unsigned r,unsigned g,unsigned b,unsigned bitdepth)3746 static 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
3756 contain the user chosen color model, but will be overwritten with the new chosen one.*/
lodepng_auto_choose_color(LodePNGColorMode * mode_out,const unsigned char * image,unsigned w,unsigned h,const LodePNGColorMode * mode_in,LodePNGAutoConvert auto_convert)3757 unsigned 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 /*
3879 Paeth predicter, used by PNG filter type 4
3880 The parameters are of type short, but should come from unsigned chars, the shorts
3881 are only needed to make the paeth calculation correct.
3882 */
paethPredictor(short a,short b,short c)3883 static 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 
3896 static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/
3897 static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/
3898 static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/
3899 static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/
3900 
3901 /*
3902 Outputs various dimensions and positions in the image related to the Adam7 reduced images.
3903 passw: output containing the width of the 7 passes
3904 passh: output containing the height of the 7 passes
3905 filter_passstart: output containing the index of the start and end of each
3906  reduced image with filter bytes
3907 padded_passstart output containing the index of the start and end of each
3908  reduced image when without filter bytes but with padded scanlines
3909 passstart: output containing the index of the start and end of each reduced
3910  image without padding between scanlines, but still padding between the images
3911 w, h: width and height of non-interlaced image
3912 bpp: 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 */
Adam7_getpassvalues(unsigned passw[7],unsigned passh[7],size_t filter_passstart[8],size_t padded_passstart[8],size_t passstart[8],unsigned w,unsigned h,unsigned bpp)3916 static 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*/
lodepng_inspect(unsigned * w,unsigned * h,LodePNGState * state,const unsigned char * in,size_t insize)3951 unsigned 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 
unfilterScanline(unsigned char * recon,const unsigned char * scanline,const unsigned char * precon,size_t bytewidth,unsigned char filterType,size_t length)4008 static 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 
unfilter(unsigned char * out,const unsigned char * in,unsigned w,unsigned h,unsigned bpp)4082 static 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 /*
4114 in: Adam7 interlaced image, with no padding bits between scanlines, but between
4115  reduced images so that each reduced image starts at a byte.
4116 out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h
4117 bpp: bits per pixel
4118 out has the following size in bits: w * h * bpp.
4119 in is possibly bigger due to padding bits between reduced images.
4120 out 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)
4122 NOTE: comments about padding bits are only relevant if bpp < 8
4123 */
Adam7_deinterlace(unsigned char * out,const unsigned char * in,unsigned w,unsigned h,unsigned bpp)4124 static 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 
removePaddingBits(unsigned char * out,const unsigned char * in,size_t olinebits,size_t ilinebits,unsigned h)4174 static 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
4202 the IDAT chunks (with filter index bytes and possible padding bits)
4203 return value is error*/
postProcessScanlines(unsigned char * out,unsigned char * in,unsigned w,unsigned h,const LodePNGInfo * info_png)4204 static 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 
readChunk_PLTE(LodePNGColorMode * color,const unsigned char * data,size_t chunkLength)4254 static 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 
readChunk_tRNS(LodePNGColorMode * color,const unsigned char * data,size_t chunkLength)4278 static 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)*/
readChunk_bKGD(LodePNGInfo * info,const unsigned char * data,size_t chunkLength)4314 static 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)*/
readChunk_tEXt(LodePNGInfo * info,const unsigned char * data,size_t chunkLength)4348 static 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)*/
readChunk_zTXt(LodePNGInfo * info,const LodePNGDecompressSettings * zlibsettings,const unsigned char * data,size_t chunkLength)4391 static 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)*/
readChunk_iTXt(LodePNGInfo * info,const LodePNGDecompressSettings * zlibsettings,const unsigned char * data,size_t chunkLength)4440 static 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 
readChunk_tIME(LodePNGInfo * info,const unsigned char * data,size_t chunkLength)4533 static 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 
readChunk_pHYs(LodePNGInfo * info,const unsigned char * data,size_t chunkLength)4548 static 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")*/
decodeGeneric(unsigned char ** out,unsigned * w,unsigned * h,LodePNGState * state,const unsigned char * in,size_t insize)4562 static 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 
lodepng_decode(unsigned char ** out,unsigned * w,unsigned * h,LodePNGState * state,const unsigned char * in,size_t insize)4737 unsigned 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 
lodepng_decode_memory(unsigned char ** out,unsigned * w,unsigned * h,const unsigned char * in,size_t insize,LodePNGColorType colortype,unsigned bitdepth)4781 unsigned 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 
lodepng_decode32(unsigned char ** out,unsigned * w,unsigned * h,const unsigned char * in,size_t insize)4794 unsigned 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 
lodepng_decode24(unsigned char ** out,unsigned * w,unsigned * h,const unsigned char * in,size_t insize)4799 unsigned 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
lodepng_decode_file(unsigned char ** out,unsigned * w,unsigned * h,const char * filename,LodePNGColorType colortype,unsigned bitdepth)4805 unsigned 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 
lodepng_decode32_file(unsigned char ** out,unsigned * w,unsigned * h,const char * filename)4817 unsigned 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 
lodepng_decode24_file(unsigned char ** out,unsigned * w,unsigned * h,const char * filename)4822 unsigned 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 
lodepng_decoder_settings_init(LodePNGDecoderSettings * settings)4828 void 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 
lodepng_state_init(LodePNGState * state)4844 void 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 
lodepng_state_cleanup(LodePNGState * state)4857 void lodepng_state_cleanup(LodePNGState* state)
4858 {
4859   lodepng_color_mode_cleanup(&state->info_raw);
4860   lodepng_info_cleanup(&state->info_png);
4861 }
4862 
lodepng_state_copy(LodePNGState * dest,const LodePNGState * source)4863 void 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*/
addChunk(ucvector * out,const char * chunkName,const unsigned char * data,size_t length)4882 static 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 
writeSignature(ucvector * out)4889 static 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 
addChunk_IHDR(ucvector * out,unsigned w,unsigned h,LodePNGColorType colortype,unsigned bitdepth,unsigned interlace_method)4902 static 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 
addChunk_PLTE(ucvector * out,const LodePNGColorMode * info)4923 static 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 
addChunk_tRNS(ucvector * out,const LodePNGColorMode * info)4940 static 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 
addChunk_IDAT(ucvector * out,const unsigned char * data,size_t datasize,LodePNGCompressSettings * zlibsettings)4985 static 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 
addChunk_IEND(ucvector * out)5000 static 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 
addChunk_tEXt(ucvector * out,const char * keyword,const char * textstring)5009 static 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 
addChunk_zTXt(ucvector * out,const char * keyword,const char * textstring,LodePNGCompressSettings * zlibsettings)5025 static 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 
addChunk_iTXt(ucvector * out,unsigned compressed,const char * keyword,const char * langtag,const char * transkey,const char * textstring,LodePNGCompressSettings * zlibsettings)5052 static 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 
addChunk_bKGD(ucvector * out,const LodePNGInfo * info)5093 static 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 
addChunk_tIME(ucvector * out,const LodePNGTime * time)5123 static 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 
addChunk_pHYs(ucvector * out,const LodePNGInfo * info)5140 static 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 
filterScanline(unsigned char * out,const unsigned char * scanline,const unsigned char * prevline,size_t length,size_t bytewidth,unsigned char filterType)5158 static 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. */
flog2(float f)5223 static 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 
filter(unsigned char * out,const unsigned char * in,unsigned w,unsigned h,const LodePNGColorMode * info,const LodePNGEncoderSettings * settings)5231 static 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 
addPaddingBits(unsigned char * out,const unsigned char * in,size_t olinebits,size_t ilinebits,unsigned h)5451 static 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 /*
5474 in: non-interlaced image with size w*h
5475 out: 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.
5478 bpp: bits per pixel
5479 there are no padding bits, not between scanlines, not between reduced images
5480 in has the following size in bits: w * h * bpp.
5481 out is possibly bigger due to padding bits between reduced images
5482 NOTE: comments about padding bits are only relevant if bpp < 8
5483 */
Adam7_interlace(unsigned char * out,const unsigned char * in,unsigned w,unsigned h,unsigned bpp)5484 static 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.
5534 return value is error**/
preProcessScanlines(unsigned char ** out,size_t * outsize,const unsigned char * in,unsigned w,unsigned h,const LodePNGInfo * info_png,const LodePNGEncoderSettings * settings)5535 static 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 /*
5623 palette must have 4 * palettesize bytes allocated, and given in format RGBARGBARGBARGBA...
5624 returns 0 if the palette is opaque,
5625 returns 1 if the palette has a single color with alpha 0 ==> color key
5626 returns 2 if the palette is semi-translucent.
5627 */
getPaletteTranslucency(const unsigned char * palette,size_t palettesize)5628 static 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
addUnknownChunks(ucvector * out,unsigned char * data,size_t datasize)5648 static 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 
lodepng_encode(unsigned char ** out,size_t * outsize,const unsigned char * image,unsigned w,unsigned h,LodePNGState * state)5661 unsigned 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 
lodepng_encode_memory(unsigned char ** out,size_t * outsize,const unsigned char * image,unsigned w,unsigned h,LodePNGColorType colortype,unsigned bitdepth)5855 unsigned 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 
lodepng_encode32(unsigned char ** out,size_t * outsize,const unsigned char * image,unsigned w,unsigned h)5871 unsigned 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 
lodepng_encode24(unsigned char ** out,size_t * outsize,const unsigned char * image,unsigned w,unsigned h)5876 unsigned 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
lodepng_encode_file(const char * filename,const unsigned char * image,unsigned w,unsigned h,LodePNGColorType colortype,unsigned bitdepth)5882 unsigned 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 
lodepng_encode32_file(const char * filename,const unsigned char * image,unsigned w,unsigned h)5893 unsigned 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 
lodepng_encode24_file(const char * filename,const unsigned char * image,unsigned w,unsigned h)5898 unsigned 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 
lodepng_encoder_settings_init(LodePNGEncoderSettings * settings)5904 void 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 /*
5923 This returns the description of a numerical error code in English. This is also
5924 the documentation of all the error codes.
5925 */
lodepng_error_text(unsigned code)5926 const 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
6037 namespace lodepng
6038 {
6039 
6040 #ifdef LODEPNG_COMPILE_DISK
load_file(std::vector<unsigned char> & buffer,const std::string & filename)6041 void 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.*/
save_file(const std::vector<unsigned char> & buffer,const std::string & filename)6056 void 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
decompress(std::vector<unsigned char> & out,const unsigned char * in,size_t insize,const LodePNGDecompressSettings & settings)6065 unsigned 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 
decompress(std::vector<unsigned char> & out,const std::vector<unsigned char> & in,const LodePNGDecompressSettings & settings)6079 unsigned 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
compress(std::vector<unsigned char> & out,const unsigned char * in,size_t insize,const LodePNGCompressSettings & settings)6087 unsigned 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 
compress(std::vector<unsigned char> & out,const std::vector<unsigned char> & in,const LodePNGCompressSettings & settings)6101 unsigned 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 
State()6112 State::State()
6113 {
6114   lodepng_state_init(this);
6115 }
6116 
State(const State & other)6117 State::State(const State& other)
6118 {
6119   lodepng_state_init(this);
6120   lodepng_state_copy(this, &other);
6121 }
6122 
~State()6123 State::~State()
6124 {
6125   lodepng_state_cleanup(this);
6126 }
6127 
operator =(const State & other)6128 State& State::operator=(const State& other)
6129 {
6130   lodepng_state_copy(this, &other);
6131   return *this;
6132 }
6133 
6134 #ifdef LODEPNG_COMPILE_DECODER
6135 
decode(std::vector<unsigned char> & out,unsigned & w,unsigned & h,const unsigned char * in,size_t insize,LodePNGColorType colortype,unsigned bitdepth)6136 unsigned 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 
decode(std::vector<unsigned char> & out,unsigned & w,unsigned & h,const std::vector<unsigned char> & in,LodePNGColorType colortype,unsigned bitdepth)6153 unsigned 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 
decode(std::vector<unsigned char> & out,unsigned & w,unsigned & h,State & state,const unsigned char * in,size_t insize)6159 unsigned 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 
decode(std::vector<unsigned char> & out,unsigned & w,unsigned & h,State & state,const std::vector<unsigned char> & in)6174 unsigned 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
decode(std::vector<unsigned char> & out,unsigned & w,unsigned & h,const std::string & filename,LodePNGColorType colortype,unsigned bitdepth)6182 unsigned 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
encode(std::vector<unsigned char> & out,const unsigned char * in,unsigned w,unsigned h,LodePNGColorType colortype,unsigned bitdepth)6193 unsigned 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 
encode(std::vector<unsigned char> & out,const std::vector<unsigned char> & in,unsigned w,unsigned h,LodePNGColorType colortype,unsigned bitdepth)6207 unsigned 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 
encode(std::vector<unsigned char> & out,const unsigned char * in,unsigned w,unsigned h,State & state)6215 unsigned 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 
encode(std::vector<unsigned char> & out,const std::vector<unsigned char> & in,unsigned w,unsigned h,State & state)6230 unsigned 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
encode(const std::string & filename,const unsigned char * in,unsigned w,unsigned h,LodePNGColorType colortype,unsigned bitdepth)6239 unsigned 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 
encode(const std::string & filename,const std::vector<unsigned char> & in,unsigned w,unsigned h,LodePNGColorType colortype,unsigned bitdepth)6249 unsigned 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