git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

gbdk-support/png2asset/lodepng.cpp

      1 /*
      2 LodePNG version 20260119
      3 
      4 Copyright (c) 2005-2026 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 #ifdef LODEPNG_COMPILE_DISK
     34 #include <limits.h> /* LONG_MAX */
     35 #include <stdio.h> /* file handling */
     36 #endif /* LODEPNG_COMPILE_DISK */
     37 
     38 #ifdef LODEPNG_COMPILE_ALLOCATORS
     39 #include <stdlib.h> /* allocations */
     40 #endif /* LODEPNG_COMPILE_ALLOCATORS */
     41 
     42 #if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/
     43 #pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/
     44 #pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/
     45 #endif /*_MSC_VER */
     46 
     47 const char* LODEPNG_VERSION_STRING = "20260119";
     48 
     49 /*
     50 This source file is divided into the following large parts. The code sections
     51 with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way.
     52 -Tools for C and common code for PNG and Zlib
     53 -C Code for Zlib (huffman, deflate, ...)
     54 -C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...)
     55 -The C++ wrapper around all of the above
     56 */
     57 
     58 /* ////////////////////////////////////////////////////////////////////////// */
     59 /* ////////////////////////////////////////////////////////////////////////// */
     60 /* // Tools for C, and common code for PNG and Zlib.                       // */
     61 /* ////////////////////////////////////////////////////////////////////////// */
     62 /* ////////////////////////////////////////////////////////////////////////// */
     63 
     64 /*The malloc, realloc and free functions defined here with "lodepng_" in front
     65 of the name, so that you can easily change them to others related to your
     66 platform if needed. Everything else in the code calls these. Pass
     67 -DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out
     68 #define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and
     69 define them in your own project's source files without needing to change
     70 lodepng source code. Don't forget to remove "static" if you copypaste them
     71 from here.*/
     72 
     73 #ifdef LODEPNG_COMPILE_ALLOCATORS
     74 static void* lodepng_malloc(size_t size) {
     75 #ifdef LODEPNG_MAX_ALLOC
     76   if(size > LODEPNG_MAX_ALLOC) return 0;
     77 #endif
     78   return malloc(size);
     79 }
     80 
     81 /* NOTE: when realloc returns NULL, it leaves the original memory untouched */
     82 static void* lodepng_realloc(void* ptr, size_t new_size) {
     83 #ifdef LODEPNG_MAX_ALLOC
     84   if(new_size > LODEPNG_MAX_ALLOC) return 0;
     85 #endif
     86   return realloc(ptr, new_size);
     87 }
     88 
     89 static void lodepng_free(void* ptr) {
     90   free(ptr);
     91 }
     92 #else /*LODEPNG_COMPILE_ALLOCATORS*/
     93 /* TODO: support giving additional void* payload to the custom allocators */
     94 void* lodepng_malloc(size_t size);
     95 void* lodepng_realloc(void* ptr, size_t new_size);
     96 void lodepng_free(void* ptr);
     97 #endif /*LODEPNG_COMPILE_ALLOCATORS*/
     98 
     99 /* convince the compiler to inline a function, for use when this measurably improves performance */
    100 /* inline is not available in C90, but use it when supported by the compiler */
    101 #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || (defined(__cplusplus) && (__cplusplus >= 199711L))
    102 #define LODEPNG_INLINE inline
    103 #else
    104 #define LODEPNG_INLINE /* not available */
    105 #endif
    106 
    107 /* restrict is not available in C90, but use it when supported by the compiler */
    108 #if (defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) ||\
    109     (defined(_MSC_VER) && (_MSC_VER >= 1400)) || \
    110     (defined(__WATCOMC__) && (__WATCOMC__ >= 1250) && !defined(__cplusplus))
    111 #define LODEPNG_RESTRICT __restrict
    112 #else
    113 #define LODEPNG_RESTRICT /* not available */
    114 #endif
    115 
    116 /* Replacements for C library functions such as memcpy and strlen, to support platforms
    117 where a full C library is not available. The compiler can recognize them and compile
    118 to something as fast. */
    119 
    120 static void lodepng_memcpy(void* LODEPNG_RESTRICT dst,
    121                            const void* LODEPNG_RESTRICT src, size_t size) {
    122   size_t i;
    123   for(i = 0; i < size; i++) ((char*)dst)[i] = ((const char*)src)[i];
    124 }
    125 
    126 static void lodepng_memset(void* LODEPNG_RESTRICT dst,
    127                            int value, size_t num) {
    128   size_t i;
    129   for(i = 0; i < num; i++) ((char*)dst)[i] = (char)value;
    130 }
    131 
    132 /* does not check memory out of bounds, do not use on untrusted data */
    133 static size_t lodepng_strlen(const char* a) {
    134   const char* orig = a;
    135   /* avoid warning about unused function in case of disabled COMPILE... macros */
    136   (void)(&lodepng_strlen);
    137   while(*a) a++;
    138   return (size_t)(a - orig);
    139 }
    140 
    141 #define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b))
    142 #define LODEPNG_MIN(a, b) (((a) < (b)) ? (a) : (b))
    143 
    144 #if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)
    145 /* Safely check if adding two integers will overflow (no undefined
    146 behavior, compiler removing the code, etc...) and output result. */
    147 static int lodepng_addofl(size_t a, size_t b, size_t* result) {
    148   *result = a + b; /* Unsigned addition is well defined and safe in C90 */
    149   return *result < a;
    150 }
    151 #endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)*/
    152 
    153 #ifdef LODEPNG_COMPILE_DECODER
    154 /* Safely check if multiplying two integers will overflow (no undefined
    155 behavior, compiler removing the code, etc...) and output result. */
    156 static int lodepng_mulofl(size_t a, size_t b, size_t* result) {
    157   *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */
    158   return (a != 0 && *result / a != b);
    159 }
    160 
    161 #ifdef LODEPNG_COMPILE_ZLIB
    162 /* Safely check if a + b > c, even if overflow could happen. */
    163 static int lodepng_gtofl(size_t a, size_t b, size_t c) {
    164   size_t d;
    165   if(lodepng_addofl(a, b, &d)) return 1;
    166   return d > c;
    167 }
    168 #endif /*LODEPNG_COMPILE_ZLIB*/
    169 #endif /*LODEPNG_COMPILE_DECODER*/
    170 
    171 
    172 /*
    173 Often in case of an error a value is assigned to a variable and then it breaks
    174 out of a loop (to go to the cleanup phase of a function). This macro does that.
    175 It makes the error handling code shorter and more readable.
    176 
    177 Example: if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83);
    178 */
    179 #define CERROR_BREAK(errorvar, code){\
    180   errorvar = code;\
    181   break;\
    182 }
    183 
    184 /*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/
    185 #define ERROR_BREAK(code) CERROR_BREAK(error, code)
    186 
    187 /*Set error var to the error code, and return it.*/
    188 #define CERROR_RETURN_ERROR(errorvar, code){\
    189   errorvar = code;\
    190   return code;\
    191 }
    192 
    193 /*Try the code, if it returns error, also return the error.*/
    194 #define CERROR_TRY_RETURN(call){\
    195   unsigned error_ = call;\
    196   if(error_) return error_;\
    197 }
    198 
    199 /*Set error var to the error code, and return from the void function.*/
    200 #define CERROR_RETURN(errorvar, code){\
    201   errorvar = code;\
    202   return;\
    203 }
    204 
    205 /*
    206 About uivector, ucvector and string:
    207 -All of them wrap dynamic arrays or text strings in a similar way.
    208 -LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version.
    209 -The string tools are made to avoid problems with compilers that declare things like strncat as deprecated.
    210 -They're not used in the interface, only internally in this file as static functions.
    211 -As with many other structs in this file, the init and cleanup functions serve as ctor and dtor.
    212 */
    213 
    214 #ifdef LODEPNG_COMPILE_ZLIB
    215 #ifdef LODEPNG_COMPILE_ENCODER
    216 /*dynamic vector of unsigned ints*/
    217 typedef struct uivector {
    218   unsigned* data;
    219   size_t size; /*size in number of unsigned longs*/
    220   size_t allocsize; /*allocated size in bytes*/
    221 } uivector;
    222 
    223 static void uivector_cleanup(void* p) {
    224   ((uivector*)p)->size = ((uivector*)p)->allocsize = 0;
    225   lodepng_free(((uivector*)p)->data);
    226   ((uivector*)p)->data = NULL;
    227 }
    228 
    229 /*returns 1 if success, 0 if failure ==> nothing done*/
    230 static unsigned uivector_resize(uivector* p, size_t size) {
    231   size_t allocsize = size * sizeof(unsigned);
    232   if(allocsize > p->allocsize) {
    233     size_t newsize = allocsize + (p->allocsize >> 1u);
    234     void* data = lodepng_realloc(p->data, newsize);
    235     if(data) {
    236       p->allocsize = newsize;
    237       p->data = (unsigned*)data;
    238     }
    239     else return 0; /*error: not enough memory*/
    240   }
    241   p->size = size;
    242   return 1; /*success*/
    243 }
    244 
    245 static void uivector_init(uivector* p) {
    246   p->data = NULL;
    247   p->size = p->allocsize = 0;
    248 }
    249 
    250 /*returns 1 if success, 0 if failure ==> nothing done*/
    251 static unsigned uivector_push_back(uivector* p, unsigned c) {
    252   if(!uivector_resize(p, p->size + 1)) return 0;
    253   p->data[p->size - 1] = c;
    254   return 1;
    255 }
    256 #endif /*LODEPNG_COMPILE_ENCODER*/
    257 #endif /*LODEPNG_COMPILE_ZLIB*/
    258 
    259 /* /////////////////////////////////////////////////////////////////////////// */
    260 
    261 /*dynamic vector of unsigned chars*/
    262 typedef struct ucvector {
    263   unsigned char* data;
    264   size_t size; /*used size*/
    265   size_t allocsize; /*allocated size*/
    266 } ucvector;
    267 
    268 /*returns 1 if success, 0 if failure ==> nothing done*/
    269 static unsigned ucvector_reserve(ucvector* p, size_t size) {
    270   if(size > p->allocsize) {
    271     size_t newsize = size + (p->allocsize >> 1u);
    272     void* data = lodepng_realloc(p->data, newsize);
    273     if(data) {
    274       p->allocsize = newsize;
    275       p->data = (unsigned char*)data;
    276     }
    277     else return 0; /*error: not enough memory*/
    278   }
    279   return 1; /*success*/
    280 }
    281 
    282 /*returns 1 if success, 0 if failure ==> nothing done*/
    283 static unsigned ucvector_resize(ucvector* p, size_t size) {
    284   p->size = size;
    285   return ucvector_reserve(p, size);
    286 }
    287 
    288 static ucvector ucvector_init(unsigned char* buffer, size_t size) {
    289   ucvector v;
    290   v.data = buffer;
    291   v.allocsize = v.size = size;
    292   return v;
    293 }
    294 
    295 /* ////////////////////////////////////////////////////////////////////////// */
    296 
    297 #ifdef LODEPNG_COMPILE_PNG
    298 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
    299 
    300 /*also appends null termination character*/
    301 static char* alloc_string_sized(const char* in, size_t insize) {
    302   char* out = (char*)lodepng_malloc(insize + 1);
    303   if(out) {
    304     lodepng_memcpy(out, in, insize);
    305     out[insize] = 0;
    306   }
    307   return out;
    308 }
    309 
    310 /* dynamically allocates a new string with a copy of the null terminated input text */
    311 static char* alloc_string(const char* in) {
    312   return alloc_string_sized(in, lodepng_strlen(in));
    313 }
    314 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
    315 #endif /*LODEPNG_COMPILE_PNG*/
    316 
    317 /* ////////////////////////////////////////////////////////////////////////// */
    318 
    319 #if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)
    320 static unsigned lodepng_read32bitInt(const unsigned char* buffer) {
    321   return (((unsigned)buffer[0] << 24u) | ((unsigned)buffer[1] << 16u) |
    322          ((unsigned)buffer[2] << 8u) | (unsigned)buffer[3]);
    323 }
    324 #endif /*defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)*/
    325 
    326 #if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)
    327 /*buffer must have at least 4 allocated bytes available*/
    328 static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) {
    329   buffer[0] = (unsigned char)((value >> 24) & 0xff);
    330   buffer[1] = (unsigned char)((value >> 16) & 0xff);
    331   buffer[2] = (unsigned char)((value >>  8) & 0xff);
    332   buffer[3] = (unsigned char)((value      ) & 0xff);
    333 }
    334 #endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/
    335 
    336 /* ////////////////////////////////////////////////////////////////////////// */
    337 /* / File IO                                                                / */
    338 /* ////////////////////////////////////////////////////////////////////////// */
    339 
    340 #ifdef LODEPNG_COMPILE_DISK
    341 
    342 /* returns negative value on error. This should be pure C compatible, so no fstat. */
    343 static long lodepng_filesize(FILE* file) {
    344   long size;
    345   if(fseek(file, 0, SEEK_END) != 0) return -1;
    346   size = ftell(file);
    347   /* It may give LONG_MAX as directory size, this is invalid for us. */
    348   if(size == LONG_MAX) return -1;
    349   if(fseek(file, 0, SEEK_SET) != 0) return -1;
    350   return size;
    351 }
    352 
    353 /* Allocates the output buffer to the file size and reads the file into it. Returns error code.*/
    354 static unsigned lodepng_load_file_(unsigned char** out, size_t* outsize, FILE* file) {
    355   long size = lodepng_filesize(file);
    356   if(size < 0) return 78;
    357   *outsize = (size_t)size;
    358   *out = (unsigned char*)lodepng_malloc((size_t)size);
    359   if(!(*out) && size > 0) return 83; /*the above malloc failed*/
    360   if(fread(*out, 1, *outsize, file) != *outsize) return 78;
    361   return 0; /*ok*/
    362 }
    363 
    364 unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) {
    365   unsigned error;
    366   FILE* file = fopen(filename, "rb");
    367   if(!file) return 78;
    368   error = lodepng_load_file_(out, outsize, file);
    369   fclose(file);
    370   return error;
    371 }
    372 
    373 /*write given buffer to the file, overwriting the file, it doesn't append to it.*/
    374 unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) {
    375   FILE* file = fopen(filename, "wb" );
    376   if(!file) return 79;
    377   fwrite(buffer, 1, buffersize, file);
    378   fclose(file);
    379   return 0;
    380 }
    381 
    382 #endif /*LODEPNG_COMPILE_DISK*/
    383 
    384 /* ////////////////////////////////////////////////////////////////////////// */
    385 /* ////////////////////////////////////////////////////////////////////////// */
    386 /* // End of common code and tools. Begin of Zlib related code.            // */
    387 /* ////////////////////////////////////////////////////////////////////////// */
    388 /* ////////////////////////////////////////////////////////////////////////// */
    389 
    390 #ifdef LODEPNG_COMPILE_ZLIB
    391 #ifdef LODEPNG_COMPILE_ENCODER
    392 
    393 typedef struct {
    394   ucvector* data;
    395   unsigned char bp; /*ok to overflow, indicates bit pos inside byte*/
    396 } LodePNGBitWriter;
    397 
    398 static void LodePNGBitWriter_init(LodePNGBitWriter* writer, ucvector* data) {
    399   writer->data = data;
    400   writer->bp = 0;
    401 }
    402 
    403 /*TODO: this ignores potential out of memory errors*/
    404 #define WRITEBIT(writer, bit){\
    405   /* append new byte */\
    406   if(((writer->bp) & 7u) == 0) {\
    407     if(!ucvector_resize(writer->data, writer->data->size + 1)) return;\
    408     writer->data->data[writer->data->size - 1] = 0;\
    409   }\
    410   (writer->data->data[writer->data->size - 1]) |= (bit << ((writer->bp) & 7u));\
    411   ++writer->bp;\
    412 }
    413 
    414 /* LSB of value is written first, and LSB of bytes is used first */
    415 static void writeBits(LodePNGBitWriter* writer, unsigned value, size_t nbits) {
    416   if(nbits == 1) { /* compiler should statically compile this case if nbits == 1 */
    417     WRITEBIT(writer, value);
    418   } else {
    419     /* TODO: increase output size only once here rather than in each WRITEBIT */
    420     size_t i;
    421     for(i = 0; i != nbits; ++i) {
    422       WRITEBIT(writer, (unsigned char)((value >> i) & 1));
    423     }
    424   }
    425 }
    426 
    427 /* This one is to use for adding huffman symbol, the value bits are written MSB first */
    428 static void writeBitsReversed(LodePNGBitWriter* writer, unsigned value, size_t nbits) {
    429   size_t i;
    430   for(i = 0; i != nbits; ++i) {
    431     /* TODO: increase output size only once here rather than in each WRITEBIT */
    432     WRITEBIT(writer, (unsigned char)((value >> (nbits - 1u - i)) & 1u));
    433   }
    434 }
    435 #endif /*LODEPNG_COMPILE_ENCODER*/
    436 
    437 #ifdef LODEPNG_COMPILE_DECODER
    438 
    439 typedef struct {
    440   const unsigned char* data;
    441   size_t size; /*size of data in bytes*/
    442   size_t bitsize; /*size of data in bits, end of valid bp values, should be 8*size*/
    443   size_t bp;
    444   unsigned buffer; /*buffer for reading bits. NOTE: 'unsigned' must support at least 32 bits*/
    445 } LodePNGBitReader;
    446 
    447 /* data size argument is in bytes. Returns error if size too large causing overflow */
    448 static unsigned LodePNGBitReader_init(LodePNGBitReader* reader, const unsigned char* data, size_t size) {
    449   size_t temp;
    450   reader->data = data;
    451   reader->size = size;
    452   /* size in bits, return error if overflow (if size_t is 32 bit this supports up to 500MB)  */
    453   if(lodepng_mulofl(size, 8u, &reader->bitsize)) return 105;
    454   /*ensure incremented bp can be compared to bitsize without overflow even when it would be incremented 32 too much and
    455   trying to ensure 32 more bits*/
    456   if(lodepng_addofl(reader->bitsize, 64u, &temp)) return 105;
    457   reader->bp = 0;
    458   reader->buffer = 0;
    459   return 0; /*ok*/
    460 }
    461 
    462 /*
    463 ensureBits functions:
    464 Ensures the reader can at least read nbits bits in one or more readBits calls,
    465 safely even if not enough bits are available.
    466 The nbits parameter is unused but is given for documentation purposes, error
    467 checking for amount of bits must be done beforehand.
    468 */
    469 
    470 /*See ensureBits documentation above. This one ensures up to 9 bits */
    471 static LODEPNG_INLINE void ensureBits9(LodePNGBitReader* reader, size_t nbits) {
    472   size_t start = reader->bp >> 3u;
    473   size_t size = reader->size;
    474   if(start + 1u < size) {
    475     reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u);
    476     reader->buffer >>= (reader->bp & 7u);
    477   } else {
    478     reader->buffer = 0;
    479     if(start + 0u < size) reader->buffer = reader->data[start + 0];
    480     reader->buffer >>= (reader->bp & 7u);
    481   }
    482   (void)nbits;
    483 }
    484 
    485 /*See ensureBits documentation above. This one ensures up to 17 bits */
    486 static LODEPNG_INLINE void ensureBits17(LodePNGBitReader* reader, size_t nbits) {
    487   size_t start = reader->bp >> 3u;
    488   size_t size = reader->size;
    489   if(start + 2u < size) {
    490     reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) |
    491                      ((unsigned)reader->data[start + 2] << 16u);
    492     reader->buffer >>= (reader->bp & 7u);
    493   } else {
    494     reader->buffer = 0;
    495     if(start + 0u < size) reader->buffer |= reader->data[start + 0];
    496     if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u);
    497     reader->buffer >>= (reader->bp & 7u);
    498   }
    499   (void)nbits;
    500 }
    501 
    502 /*See ensureBits documentation above. This one ensures up to 25 bits */
    503 static LODEPNG_INLINE void ensureBits25(LodePNGBitReader* reader, size_t nbits) {
    504   size_t start = reader->bp >> 3u;
    505   size_t size = reader->size;
    506   if(start + 3u < size) {
    507     reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) |
    508                      ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u);
    509     reader->buffer >>= (reader->bp & 7u);
    510   } else {
    511     reader->buffer = 0;
    512     if(start + 0u < size) reader->buffer |= reader->data[start + 0];
    513     if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u);
    514     if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u);
    515     reader->buffer >>= (reader->bp & 7u);
    516   }
    517   (void)nbits;
    518 }
    519 
    520 /*See ensureBits documentation above. This one ensures up to 32 bits */
    521 static LODEPNG_INLINE void ensureBits32(LodePNGBitReader* reader, size_t nbits) {
    522   size_t start = reader->bp >> 3u;
    523   size_t size = reader->size;
    524   if(start + 4u < size) {
    525     reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) |
    526                      ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u);
    527     reader->buffer >>= (reader->bp & 7u);
    528     reader->buffer |= (((unsigned)reader->data[start + 4] << 24u) << (8u - (reader->bp & 7u)));
    529   } else {
    530     reader->buffer = 0;
    531     if(start + 0u < size) reader->buffer |= reader->data[start + 0];
    532     if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u);
    533     if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u);
    534     if(start + 3u < size) reader->buffer |= ((unsigned)reader->data[start + 3] << 24u);
    535     reader->buffer >>= (reader->bp & 7u);
    536   }
    537   (void)nbits;
    538 }
    539 
    540 /* Get bits without advancing the bit pointer. Must have enough bits available with ensureBits. Max nbits is 31. */
    541 static LODEPNG_INLINE unsigned peekBits(LodePNGBitReader* reader, size_t nbits) {
    542   /* The shift allows nbits to be only up to 31. */
    543   return reader->buffer & ((1u << nbits) - 1u);
    544 }
    545 
    546 /* Must have enough bits available with ensureBits */
    547 static LODEPNG_INLINE void advanceBits(LodePNGBitReader* reader, size_t nbits) {
    548   reader->buffer >>= nbits;
    549   reader->bp += nbits;
    550 }
    551 
    552 /* Must have enough bits available with ensureBits */
    553 static LODEPNG_INLINE unsigned readBits(LodePNGBitReader* reader, size_t nbits) {
    554   unsigned result = peekBits(reader, nbits);
    555   advanceBits(reader, nbits);
    556   return result;
    557 }
    558 #endif /*LODEPNG_COMPILE_DECODER*/
    559 
    560 static unsigned reverseBits(unsigned bits, unsigned num) {
    561   /*TODO: implement faster lookup table based version when needed*/
    562   unsigned i, result = 0;
    563   for(i = 0; i < num; i++) result |= ((bits >> (num - i - 1u)) & 1u) << i;
    564   return result;
    565 }
    566 
    567 /* ////////////////////////////////////////////////////////////////////////// */
    568 /* / Deflate - Huffman                                                      / */
    569 /* ////////////////////////////////////////////////////////////////////////// */
    570 
    571 #define FIRST_LENGTH_CODE_INDEX 257
    572 #define LAST_LENGTH_CODE_INDEX 285
    573 /*256 literals, the end code, some length codes, and 2 unused codes*/
    574 #define NUM_DEFLATE_CODE_SYMBOLS 288
    575 /*the distance codes have their own symbols, 30 used, 2 unused*/
    576 #define NUM_DISTANCE_SYMBOLS 32
    577 /*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/
    578 #define NUM_CODE_LENGTH_CODES 19
    579 
    580 /*the base lengths represented by codes 257-285*/
    581 static const unsigned LENGTHBASE[29]
    582   = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59,
    583      67, 83, 99, 115, 131, 163, 195, 227, 258};
    584 
    585 /*the extra bits used by codes 257-285 (added to base length)*/
    586 static const unsigned LENGTHEXTRA[29]
    587   = {0, 0, 0, 0, 0, 0, 0,  0,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,
    588       4,  4,  4,   4,   5,   5,   5,   5,   0};
    589 
    590 /*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/
    591 static const unsigned DISTANCEBASE[30]
    592   = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513,
    593      769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577};
    594 
    595 /*the extra bits of backwards distances (added to base)*/
    596 static const unsigned DISTANCEEXTRA[30]
    597   = {0, 0, 0, 0, 1, 1, 2,  2,  3,  3,  4,  4,  5,  5,   6,   6,   7,   7,   8,
    598        8,    9,    9,   10,   10,   11,   11,   12,    12,    13,    13};
    599 
    600 /*the order in which "code length alphabet code lengths" are stored as specified by deflate, out of this the huffman
    601 tree of the dynamic huffman tree lengths is generated*/
    602 static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES]
    603   = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
    604 
    605 /* ////////////////////////////////////////////////////////////////////////// */
    606 
    607 /*
    608 Huffman tree struct, containing multiple representations of the tree
    609 */
    610 typedef struct HuffmanTree {
    611   unsigned* codes; /*the huffman codes (bit patterns representing the symbols)*/
    612   unsigned* lengths; /*the lengths of the huffman codes*/
    613   unsigned maxbitlen; /*maximum number of bits a single code can get*/
    614   unsigned numcodes; /*number of symbols in the alphabet = number of codes*/
    615   /* for reading only */
    616   unsigned char* table_len; /*length of symbol from lookup table, or max length if secondary lookup needed*/
    617   unsigned short* table_value; /*value of symbol from lookup table, or pointer to secondary table if needed*/
    618 } HuffmanTree;
    619 
    620 static void HuffmanTree_init(HuffmanTree* tree) {
    621   tree->codes = 0;
    622   tree->lengths = 0;
    623   tree->table_len = 0;
    624   tree->table_value = 0;
    625 }
    626 
    627 static void HuffmanTree_cleanup(HuffmanTree* tree) {
    628   lodepng_free(tree->codes);
    629   lodepng_free(tree->lengths);
    630   lodepng_free(tree->table_len);
    631   lodepng_free(tree->table_value);
    632 }
    633 
    634 /* amount of bits for first huffman table lookup (aka root bits), see HuffmanTree_makeTable and huffmanDecodeSymbol.*/
    635 /* values 8u and 9u work the fastest */
    636 #define FIRSTBITS 9u
    637 
    638 /* a symbol value too big to represent any valid symbol, to indicate reading disallowed huffman bits combination,
    639 which is possible in case of only 0 or 1 present symbols. */
    640 #define INVALIDSYMBOL 65535u
    641 
    642 /* make table for huffman decoding */
    643 static unsigned HuffmanTree_makeTable(HuffmanTree* tree) {
    644   static const unsigned headsize = 1u << FIRSTBITS; /*size of the first table*/
    645   static const unsigned mask = (1u << FIRSTBITS) /*headsize*/ - 1u;
    646   size_t i, numpresent, pointer, size; /*total table size*/
    647   unsigned* maxlens = (unsigned*)lodepng_malloc(headsize * sizeof(unsigned));
    648   if(!maxlens) return 83; /*alloc fail*/
    649 
    650   /* compute maxlens: max total bit length of symbols sharing prefix in the first table*/
    651   lodepng_memset(maxlens, 0, headsize * sizeof(*maxlens));
    652   for(i = 0; i < tree->numcodes; i++) {
    653     unsigned symbol = tree->codes[i];
    654     unsigned l = tree->lengths[i];
    655     unsigned index;
    656     if(l <= FIRSTBITS) continue; /*symbols that fit in first table don't increase secondary table size*/
    657     /*get the FIRSTBITS MSBs, the MSBs of the symbol are encoded first. See later comment about the reversing*/
    658     index = reverseBits(symbol >> (l - FIRSTBITS), FIRSTBITS);
    659     maxlens[index] = LODEPNG_MAX(maxlens[index], l);
    660   }
    661   /* compute total table size: size of first table plus all secondary tables for symbols longer than FIRSTBITS */
    662   size = headsize;
    663   for(i = 0; i < headsize; ++i) {
    664     unsigned l = maxlens[i];
    665     if(l > FIRSTBITS) size += (((size_t)1) << (l - FIRSTBITS));
    666   }
    667   tree->table_len = (unsigned char*)lodepng_malloc(size * sizeof(*tree->table_len));
    668   tree->table_value = (unsigned short*)lodepng_malloc(size * sizeof(*tree->table_value));
    669   if(!tree->table_len || !tree->table_value) {
    670     lodepng_free(maxlens);
    671     /* freeing tree->table values is done at a higher scope */
    672     return 83; /*alloc fail*/
    673   }
    674   /*initialize with an invalid length to indicate unused entries*/
    675   for(i = 0; i < size; ++i) tree->table_len[i] = 16;
    676 
    677   /*fill in the first table for long symbols: max prefix size and pointer to secondary tables*/
    678   pointer = headsize;
    679   for(i = 0; i < headsize; ++i) {
    680     unsigned l = maxlens[i];
    681     if(l <= FIRSTBITS) continue;
    682     tree->table_len[i] = l;
    683     tree->table_value[i] = (unsigned short)pointer;
    684     pointer += (((size_t)1) << (l - FIRSTBITS));
    685   }
    686   lodepng_free(maxlens);
    687 
    688   /*fill in the first table for short symbols, or secondary table for long symbols*/
    689   numpresent = 0;
    690   for(i = 0; i < tree->numcodes; ++i) {
    691     unsigned l = tree->lengths[i];
    692     unsigned symbol, reverse;
    693     if(l == 0) continue;
    694     symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/
    695     /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/
    696     reverse = reverseBits(symbol, l);
    697     numpresent++;
    698 
    699     if(l <= FIRSTBITS) {
    700       /*short symbol, fully in first table, replicated num times if l < FIRSTBITS*/
    701       unsigned num = 1u << (FIRSTBITS - l);
    702       unsigned j;
    703       for(j = 0; j < num; ++j) {
    704         /*bit reader will read the l bits of symbol first, the remaining FIRSTBITS - l bits go to the MSB's*/
    705         unsigned index = reverse | (j << l);
    706         if(tree->table_len[index] != 16) return 55; /*invalid tree: long symbol shares prefix with short symbol*/
    707         tree->table_len[index] = l;
    708         tree->table_value[index] = (unsigned short)i;
    709       }
    710     } else {
    711       /*long symbol, shares prefix with other long symbols in first lookup table, needs second lookup*/
    712       /*the FIRSTBITS MSBs of the symbol are the first table index*/
    713       unsigned index = reverse & mask;
    714       unsigned maxlen = tree->table_len[index];
    715       /*log2 of secondary table length, should be >= l - FIRSTBITS*/
    716       unsigned tablelen = maxlen - FIRSTBITS;
    717       unsigned start = tree->table_value[index]; /*starting index in secondary table*/
    718       unsigned num = 1u << (tablelen - (l - FIRSTBITS)); /*amount of entries of this symbol in secondary table*/
    719       unsigned j;
    720       if(maxlen < l) return 55; /*invalid tree: long symbol shares prefix with short symbol*/
    721       for(j = 0; j < num; ++j) {
    722         unsigned reverse2 = reverse >> FIRSTBITS; /* l - FIRSTBITS bits */
    723         unsigned index2 = start + (reverse2 | (j << (l - FIRSTBITS)));
    724         tree->table_len[index2] = l;
    725         tree->table_value[index2] = (unsigned short)i;
    726       }
    727     }
    728   }
    729 
    730   if(numpresent < 2) {
    731     /* In case of exactly 1 symbol, in theory the huffman symbol needs 0 bits,
    732     but deflate uses 1 bit instead. In case of 0 symbols, no symbols can
    733     appear at all, but such huffman tree could still exist (e.g. if distance
    734     codes are never used). In both cases, not all symbols of the table will be
    735     filled in. Fill them in with an invalid symbol value so returning them from
    736     huffmanDecodeSymbol will cause error. */
    737     for(i = 0; i < size; ++i) {
    738       if(tree->table_len[i] == 16) {
    739         /* As length, use a value smaller than FIRSTBITS for the head table,
    740         and a value larger than FIRSTBITS for the secondary table, to ensure
    741         valid behavior for advanceBits when reading this symbol. */
    742         tree->table_len[i] = (i < headsize) ? 1 : (FIRSTBITS + 1);
    743         tree->table_value[i] = INVALIDSYMBOL;
    744       }
    745     }
    746   } else {
    747     /* A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes.
    748     If that is not the case (due to too long length codes), the table will not
    749     have been fully used, and this is an error (not all bit combinations can be
    750     decoded): an oversubscribed huffman tree, indicated by error 55. */
    751     for(i = 0; i < size; ++i) {
    752       if(tree->table_len[i] == 16) return 55;
    753     }
    754   }
    755 
    756   return 0;
    757 }
    758 
    759 /*
    760 Second step for the ...makeFromLengths and ...makeFromFrequencies functions.
    761 numcodes, lengths and maxbitlen must already be filled in correctly. return
    762 value is error.
    763 */
    764 static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) {
    765   unsigned* blcount;
    766   unsigned* nextcode;
    767   unsigned error = 0;
    768   unsigned bits, n;
    769 
    770   tree->codes = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned));
    771   blcount = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned));
    772   nextcode = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned));
    773   if(!tree->codes || !blcount || !nextcode) error = 83; /*alloc fail*/
    774 
    775   if(!error) {
    776     for(n = 0; n != tree->maxbitlen + 1; n++) blcount[n] = nextcode[n] = 0;
    777     /*step 1: count number of instances of each code length*/
    778     for(bits = 0; bits != tree->numcodes; ++bits) ++blcount[tree->lengths[bits]];
    779     /*step 2: generate the nextcode values*/
    780     for(bits = 1; bits <= tree->maxbitlen; ++bits) {
    781       nextcode[bits] = (nextcode[bits - 1] + blcount[bits - 1]) << 1u;
    782     }
    783     /*step 3: generate all the codes*/
    784     for(n = 0; n != tree->numcodes; ++n) {
    785       if(tree->lengths[n] != 0) {
    786         tree->codes[n] = nextcode[tree->lengths[n]]++;
    787         /*remove superfluous bits from the code*/
    788         tree->codes[n] &= ((1u << tree->lengths[n]) - 1u);
    789       }
    790     }
    791   }
    792 
    793   lodepng_free(blcount);
    794   lodepng_free(nextcode);
    795 
    796   if(!error) error = HuffmanTree_makeTable(tree);
    797   return error;
    798 }
    799 
    800 /*
    801 given the code lengths (as stored in the PNG file), generate the tree as defined
    802 by Deflate. maxbitlen is the maximum bits that a code in the tree can have.
    803 return value is error.
    804 */
    805 static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen,
    806                                             size_t numcodes, unsigned maxbitlen) {
    807   unsigned i;
    808   tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned));
    809   if(!tree->lengths) return 83; /*alloc fail*/
    810   for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i];
    811   tree->numcodes = (unsigned)numcodes; /*number of symbols*/
    812   tree->maxbitlen = maxbitlen;
    813   return HuffmanTree_makeFromLengths2(tree);
    814 }
    815 
    816 #ifdef LODEPNG_COMPILE_ENCODER
    817 
    818 /*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding",
    819 Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/
    820 
    821 /*chain node for boundary package merge*/
    822 typedef struct BPMNode {
    823   int weight; /*the sum of all weights in this chain*/
    824   unsigned index; /*index of this leaf node (called "count" in the paper)*/
    825   struct BPMNode* tail; /*the next nodes in this chain (null if last)*/
    826   int in_use;
    827 } BPMNode;
    828 
    829 /*lists of chains*/
    830 typedef struct BPMLists {
    831   /*memory pool*/
    832   unsigned memsize;
    833   BPMNode* memory;
    834   unsigned numfree;
    835   unsigned nextfree;
    836   BPMNode** freelist;
    837   /*two heads of lookahead chains per list*/
    838   unsigned listsize;
    839   BPMNode** chains0;
    840   BPMNode** chains1;
    841 } BPMLists;
    842 
    843 /*creates a new chain node with the given parameters, from the memory in the lists */
    844 static BPMNode* bpmnode_create(BPMLists* lists, int weight, unsigned index, BPMNode* tail) {
    845   unsigned i;
    846   BPMNode* result;
    847 
    848   /*memory full, so garbage collect*/
    849   if(lists->nextfree >= lists->numfree) {
    850     /*mark only those that are in use*/
    851     for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0;
    852     for(i = 0; i != lists->listsize; ++i) {
    853       BPMNode* node;
    854       for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1;
    855       for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1;
    856     }
    857     /*collect those that are free*/
    858     lists->numfree = 0;
    859     for(i = 0; i != lists->memsize; ++i) {
    860       if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i];
    861     }
    862     lists->nextfree = 0;
    863   }
    864 
    865   result = lists->freelist[lists->nextfree++];
    866   result->weight = weight;
    867   result->index = index;
    868   result->tail = tail;
    869   return result;
    870 }
    871 
    872 /*sort the leaves with stable mergesort*/
    873 static void bpmnode_sort(BPMNode* leaves, size_t num) {
    874   BPMNode* mem = (BPMNode*)lodepng_malloc(sizeof(*leaves) * num);
    875   size_t width, counter = 0;
    876   for(width = 1; width < num; width *= 2) {
    877     BPMNode* a = (counter & 1) ? mem : leaves;
    878     BPMNode* b = (counter & 1) ? leaves : mem;
    879     size_t p;
    880     for(p = 0; p < num; p += 2 * width) {
    881       size_t q = (p + width > num) ? num : (p + width);
    882       size_t r = (p + 2 * width > num) ? num : (p + 2 * width);
    883       size_t i = p, j = q, k;
    884       for(k = p; k < r; k++) {
    885         if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++];
    886         else b[k] = a[j++];
    887       }
    888     }
    889     counter++;
    890   }
    891   if(counter & 1) lodepng_memcpy(leaves, mem, sizeof(*leaves) * num);
    892   lodepng_free(mem);
    893 }
    894 
    895 /*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/
    896 static void boundaryPM(BPMLists* lists, BPMNode* leaves, size_t numpresent, int c, int num) {
    897   unsigned lastindex = lists->chains1[c]->index;
    898 
    899   if(c == 0) {
    900     if(lastindex >= numpresent) return;
    901     lists->chains0[c] = lists->chains1[c];
    902     lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0);
    903   } else {
    904     /*sum of the weights of the head nodes of the previous lookahead chains.*/
    905     int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight;
    906     lists->chains0[c] = lists->chains1[c];
    907     if(lastindex < numpresent && sum > leaves[lastindex].weight) {
    908       lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail);
    909       return;
    910     }
    911     lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]);
    912     /*in the end we are only interested in the chain of the last list, so no
    913     need to recurse if we're at the last one (this gives measurable speedup)*/
    914     if(num + 1 < (int)(2 * numpresent - 2)) {
    915       boundaryPM(lists, leaves, numpresent, c - 1, num);
    916       boundaryPM(lists, leaves, numpresent, c - 1, num);
    917     }
    918   }
    919 }
    920 
    921 unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies,
    922                                       size_t numcodes, unsigned maxbitlen) {
    923   unsigned error = 0;
    924   unsigned i;
    925   size_t numpresent = 0; /*number of symbols with non-zero frequency*/
    926   BPMNode* leaves; /*the symbols, only those with > 0 frequency*/
    927 
    928   if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/
    929   if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/
    930 
    931   leaves = (BPMNode*)lodepng_malloc(numcodes * sizeof(*leaves));
    932   if(!leaves) return 83; /*alloc fail*/
    933 
    934   for(i = 0; i != numcodes; ++i) {
    935     if(frequencies[i] > 0) {
    936       leaves[numpresent].weight = (int)frequencies[i];
    937       leaves[numpresent].index = i;
    938       ++numpresent;
    939     }
    940   }
    941 
    942   lodepng_memset(lengths, 0, numcodes * sizeof(*lengths));
    943 
    944   /*ensure at least two present symbols. There should be at least one symbol
    945   according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To
    946   make these work as well ensure there are at least two symbols. The
    947   Package-Merge code below also doesn't work correctly if there's only one
    948   symbol, it'd give it the theoretical 0 bits but in practice zlib wants 1 bit*/
    949   if(numpresent == 0) {
    950     lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/
    951   } else if(numpresent == 1) {
    952     lengths[leaves[0].index] = 1;
    953     lengths[leaves[0].index == 0 ? 1 : 0] = 1;
    954   } else {
    955     BPMLists lists;
    956     BPMNode* node;
    957 
    958     bpmnode_sort(leaves, numpresent);
    959 
    960     lists.listsize = maxbitlen;
    961     lists.memsize = 2 * maxbitlen * (maxbitlen + 1);
    962     lists.nextfree = 0;
    963     lists.numfree = lists.memsize;
    964     lists.memory = (BPMNode*)lodepng_malloc(lists.memsize * sizeof(*lists.memory));
    965     lists.freelist = (BPMNode**)lodepng_malloc(lists.memsize * sizeof(BPMNode*));
    966     lists.chains0 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*));
    967     lists.chains1 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*));
    968     if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/
    969 
    970     if(!error) {
    971       for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i];
    972 
    973       bpmnode_create(&lists, leaves[0].weight, 1, 0);
    974       bpmnode_create(&lists, leaves[1].weight, 2, 0);
    975 
    976       for(i = 0; i != lists.listsize; ++i) {
    977         lists.chains0[i] = &lists.memory[0];
    978         lists.chains1[i] = &lists.memory[1];
    979       }
    980 
    981       /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/
    982       for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i);
    983 
    984       for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) {
    985         for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index];
    986       }
    987     }
    988 
    989     lodepng_free(lists.memory);
    990     lodepng_free(lists.freelist);
    991     lodepng_free(lists.chains0);
    992     lodepng_free(lists.chains1);
    993   }
    994 
    995   lodepng_free(leaves);
    996   return error;
    997 }
    998 
    999 /*Create the Huffman tree given the symbol frequencies*/
   1000 static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies,
   1001                                                 size_t mincodes, size_t numcodes, unsigned maxbitlen) {
   1002   unsigned error = 0;
   1003   while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/
   1004   tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned));
   1005   if(!tree->lengths) return 83; /*alloc fail*/
   1006   tree->maxbitlen = maxbitlen;
   1007   tree->numcodes = (unsigned)numcodes; /*number of symbols*/
   1008 
   1009   error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen);
   1010   if(!error) error = HuffmanTree_makeFromLengths2(tree);
   1011   return error;
   1012 }
   1013 #endif /*LODEPNG_COMPILE_ENCODER*/
   1014 
   1015 /*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/
   1016 static unsigned generateFixedLitLenTree(HuffmanTree* tree) {
   1017   unsigned i, error = 0;
   1018   unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned));
   1019   if(!bitlen) return 83; /*alloc fail*/
   1020 
   1021   /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/
   1022   for(i =   0; i <= 143; ++i) bitlen[i] = 8;
   1023   for(i = 144; i <= 255; ++i) bitlen[i] = 9;
   1024   for(i = 256; i <= 279; ++i) bitlen[i] = 7;
   1025   for(i = 280; i <= 287; ++i) bitlen[i] = 8;
   1026 
   1027   error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15);
   1028 
   1029   lodepng_free(bitlen);
   1030   return error;
   1031 }
   1032 
   1033 /*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/
   1034 static unsigned generateFixedDistanceTree(HuffmanTree* tree) {
   1035   unsigned i, error = 0;
   1036   unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned));
   1037   if(!bitlen) return 83; /*alloc fail*/
   1038 
   1039   /*there are 32 distance codes, but 30-31 are unused*/
   1040   for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5;
   1041   error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15);
   1042 
   1043   lodepng_free(bitlen);
   1044   return error;
   1045 }
   1046 
   1047 #ifdef LODEPNG_COMPILE_DECODER
   1048 
   1049 /*
   1050 returns the code. The bit reader must already have been ensured at least 15 bits
   1051 */
   1052 static unsigned huffmanDecodeSymbol(LodePNGBitReader* reader, const HuffmanTree* codetree) {
   1053   unsigned short code = peekBits(reader, FIRSTBITS);
   1054   unsigned short l = codetree->table_len[code];
   1055   unsigned short value = codetree->table_value[code];
   1056   if(l <= FIRSTBITS) {
   1057     advanceBits(reader, l);
   1058     return value;
   1059   } else {
   1060     advanceBits(reader, FIRSTBITS);
   1061     value += peekBits(reader, l - FIRSTBITS);
   1062     advanceBits(reader, codetree->table_len[value] - FIRSTBITS);
   1063     return codetree->table_value[value];
   1064   }
   1065 }
   1066 #endif /*LODEPNG_COMPILE_DECODER*/
   1067 
   1068 #ifdef LODEPNG_COMPILE_DECODER
   1069 
   1070 /* ////////////////////////////////////////////////////////////////////////// */
   1071 /* / Inflator (Decompressor)                                                / */
   1072 /* ////////////////////////////////////////////////////////////////////////// */
   1073 
   1074 /*get the tree of a deflated block with fixed tree, as specified in the deflate specification
   1075 Returns error code.*/
   1076 static unsigned getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) {
   1077   unsigned error = generateFixedLitLenTree(tree_ll);
   1078   if(error) return error;
   1079   return generateFixedDistanceTree(tree_d);
   1080 }
   1081 
   1082 /*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/
   1083 static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d,
   1084                                       LodePNGBitReader* reader) {
   1085   /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/
   1086   unsigned error = 0;
   1087   unsigned n, HLIT, HDIST, HCLEN, i;
   1088 
   1089   /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/
   1090   unsigned* bitlen_ll = 0; /*lit,len code lengths*/
   1091   unsigned* bitlen_d = 0; /*dist code lengths*/
   1092   /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/
   1093   unsigned* bitlen_cl = 0;
   1094   HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/
   1095 
   1096   if(reader->bitsize - reader->bp < 14) return 49; /*error: the bit pointer is or will go past the memory*/
   1097   ensureBits17(reader, 14);
   1098 
   1099   /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/
   1100   HLIT =  readBits(reader, 5) + 257;
   1101   /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/
   1102   HDIST = readBits(reader, 5) + 1;
   1103   /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/
   1104   HCLEN = readBits(reader, 4) + 4;
   1105 
   1106   bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned));
   1107   if(!bitlen_cl) return 83 /*alloc fail*/;
   1108 
   1109   HuffmanTree_init(&tree_cl);
   1110 
   1111   while(!error) {
   1112     /*read the code length codes out of 3 * (amount of code length codes) bits*/
   1113     if(lodepng_gtofl(reader->bp, HCLEN * 3, reader->bitsize)) {
   1114       ERROR_BREAK(50); /*error: the bit pointer is or will go past the memory*/
   1115     }
   1116     for(i = 0; i != HCLEN; ++i) {
   1117       ensureBits9(reader, 3); /*out of bounds already checked above */
   1118       bitlen_cl[CLCL_ORDER[i]] = readBits(reader, 3);
   1119     }
   1120     for(i = HCLEN; i != NUM_CODE_LENGTH_CODES; ++i) {
   1121       bitlen_cl[CLCL_ORDER[i]] = 0;
   1122     }
   1123 
   1124     error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7);
   1125     if(error) break;
   1126 
   1127     /*now we can use this tree to read the lengths for the tree that this function will return*/
   1128     bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned));
   1129     bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned));
   1130     if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/);
   1131     lodepng_memset(bitlen_ll, 0, NUM_DEFLATE_CODE_SYMBOLS * sizeof(*bitlen_ll));
   1132     lodepng_memset(bitlen_d, 0, NUM_DISTANCE_SYMBOLS * sizeof(*bitlen_d));
   1133 
   1134     /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/
   1135     i = 0;
   1136     while(i < HLIT + HDIST) {
   1137       unsigned code;
   1138       ensureBits25(reader, 22); /* up to 15 bits for huffman code, up to 7 extra bits below*/
   1139       code = huffmanDecodeSymbol(reader, &tree_cl);
   1140       if(code <= 15) /*a length code*/ {
   1141         if(i < HLIT) bitlen_ll[i] = code;
   1142         else bitlen_d[i - HLIT] = code;
   1143         ++i;
   1144       } else if(code == 16) /*repeat previous*/ {
   1145         unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/
   1146         unsigned value; /*set value to the previous code*/
   1147 
   1148         if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/
   1149 
   1150         replength += readBits(reader, 2);
   1151 
   1152         if(i < HLIT + 1) value = bitlen_ll[i - 1];
   1153         else value = bitlen_d[i - HLIT - 1];
   1154         /*repeat this value in the next lengths*/
   1155         for(n = 0; n < replength; ++n) {
   1156           if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/
   1157           if(i < HLIT) bitlen_ll[i] = value;
   1158           else bitlen_d[i - HLIT] = value;
   1159           ++i;
   1160         }
   1161       } else if(code == 17) /*repeat "0" 3-10 times*/ {
   1162         unsigned replength = 3; /*read in the bits that indicate repeat length*/
   1163         replength += readBits(reader, 3);
   1164 
   1165         /*repeat this value in the next lengths*/
   1166         for(n = 0; n < replength; ++n) {
   1167           if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/
   1168 
   1169           if(i < HLIT) bitlen_ll[i] = 0;
   1170           else bitlen_d[i - HLIT] = 0;
   1171           ++i;
   1172         }
   1173       } else if(code == 18) /*repeat "0" 11-138 times*/ {
   1174         unsigned replength = 11; /*read in the bits that indicate repeat length*/
   1175         replength += readBits(reader, 7);
   1176 
   1177         /*repeat this value in the next lengths*/
   1178         for(n = 0; n < replength; ++n) {
   1179           if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/
   1180 
   1181           if(i < HLIT) bitlen_ll[i] = 0;
   1182           else bitlen_d[i - HLIT] = 0;
   1183           ++i;
   1184         }
   1185       } else /*if(code == INVALIDSYMBOL)*/ {
   1186         ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/
   1187       }
   1188       /*check if any of the ensureBits above went out of bounds*/
   1189       if(reader->bp > reader->bitsize) {
   1190         /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol
   1191         (10=no endcode, 11=wrong jump outside of tree)*/
   1192         /* TODO: revise error codes 10,11,50: the above comment is no longer valid */
   1193         ERROR_BREAK(50); /*error, bit pointer jumps past memory*/
   1194       }
   1195     }
   1196     if(error) break;
   1197 
   1198     if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/
   1199 
   1200     /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/
   1201     error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15);
   1202     if(error) break;
   1203     error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15);
   1204 
   1205     break; /*end of error-while*/
   1206   }
   1207 
   1208   lodepng_free(bitlen_cl);
   1209   lodepng_free(bitlen_ll);
   1210   lodepng_free(bitlen_d);
   1211   HuffmanTree_cleanup(&tree_cl);
   1212 
   1213   return error;
   1214 }
   1215 
   1216 /*inflate a block with dynamic of fixed Huffman tree. btype must be 1 or 2.*/
   1217 static unsigned inflateHuffmanBlock(ucvector* out, LodePNGBitReader* reader,
   1218                                     unsigned btype, size_t max_output_size) {
   1219   unsigned error = 0;
   1220   HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/
   1221   HuffmanTree tree_d; /*the huffman tree for distance codes*/
   1222   const size_t reserved_size = 260; /* must be at least 258 for max length, and a few extra for adding a few extra literals */
   1223   int done = 0;
   1224 
   1225   if(!ucvector_reserve(out, out->size + reserved_size)) return 83; /*alloc fail*/
   1226 
   1227   HuffmanTree_init(&tree_ll);
   1228   HuffmanTree_init(&tree_d);
   1229 
   1230   if(btype == 1) error = getTreeInflateFixed(&tree_ll, &tree_d);
   1231   else /*if(btype == 2)*/ error = getTreeInflateDynamic(&tree_ll, &tree_d, reader);
   1232 
   1233 
   1234   while(!error && !done) /*decode all symbols until end reached, breaks at end code*/ {
   1235     /*code_ll is literal, length or end code*/
   1236     unsigned code_ll;
   1237     /* ensure enough bits for 2 huffman code reads (15 bits each): if the first is a literal, a second literal is read at once. This
   1238     appears to be slightly faster, than ensuring 20 bits here for 1 huffman symbol and the potential 5 extra bits for the length symbol.*/
   1239     ensureBits32(reader, 30);
   1240     code_ll = huffmanDecodeSymbol(reader, &tree_ll);
   1241     if(code_ll <= 255) {
   1242       /*slightly faster code path if multiple literals in a row*/
   1243       out->data[out->size++] = (unsigned char)code_ll;
   1244       code_ll = huffmanDecodeSymbol(reader, &tree_ll);
   1245     }
   1246     if(code_ll <= 255) /*literal symbol*/ {
   1247       out->data[out->size++] = (unsigned char)code_ll;
   1248     } else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ {
   1249       unsigned code_d, distance;
   1250       unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/
   1251       size_t start, backward, length;
   1252 
   1253       /*part 1: get length base*/
   1254       length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX];
   1255 
   1256       /*part 2: get extra bits and add the value of that to length*/
   1257       numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX];
   1258       if(numextrabits_l != 0) {
   1259         /* bits already ensured above */
   1260         ensureBits25(reader, 5);
   1261         length += readBits(reader, numextrabits_l);
   1262       }
   1263 
   1264       /*part 3: get distance code*/
   1265       ensureBits32(reader, 28); /* up to 15 for the huffman symbol, up to 13 for the extra bits */
   1266       code_d = huffmanDecodeSymbol(reader, &tree_d);
   1267       if(code_d > 29) {
   1268         if(code_d <= 31) {
   1269           ERROR_BREAK(18); /*error: invalid distance code (30-31 are never used)*/
   1270         } else /* if(code_d == INVALIDSYMBOL) */{
   1271           ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/
   1272         }
   1273       }
   1274       distance = DISTANCEBASE[code_d];
   1275 
   1276       /*part 4: get extra bits from distance*/
   1277       numextrabits_d = DISTANCEEXTRA[code_d];
   1278       if(numextrabits_d != 0) {
   1279         /* bits already ensured above */
   1280         distance += readBits(reader, numextrabits_d);
   1281       }
   1282 
   1283       /*part 5: fill in all the out[n] values based on the length and dist*/
   1284       start = out->size;
   1285       if(distance > start) ERROR_BREAK(52); /*too long backward distance*/
   1286       backward = start - distance;
   1287 
   1288       out->size += length;
   1289       if(distance < length) {
   1290         size_t forward;
   1291         lodepng_memcpy(out->data + start, out->data + backward, distance);
   1292         start += distance;
   1293         for(forward = distance; forward < length; ++forward) {
   1294           out->data[start++] = out->data[backward++];
   1295         }
   1296       } else {
   1297         lodepng_memcpy(out->data + start, out->data + backward, length);
   1298       }
   1299     } else if(code_ll == 256) {
   1300       done = 1; /*end code, finish the loop*/
   1301     } else /*if(code_ll == INVALIDSYMBOL)*/ {
   1302       ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/
   1303     }
   1304     if(out->allocsize - out->size < reserved_size) {
   1305       if(!ucvector_reserve(out, out->size + reserved_size)) ERROR_BREAK(83); /*alloc fail*/
   1306     }
   1307     /*check if any of the ensureBits above went out of bounds*/
   1308     if(reader->bp > reader->bitsize) {
   1309       /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol
   1310       (10=no endcode, 11=wrong jump outside of tree)*/
   1311       /* TODO: revise error codes 10,11,50: the above comment is no longer valid */
   1312       ERROR_BREAK(51); /*error, bit pointer jumps past memory*/
   1313     }
   1314     if(max_output_size && out->size > max_output_size) {
   1315       ERROR_BREAK(109); /*error, larger than max size*/
   1316     }
   1317   }
   1318 
   1319   HuffmanTree_cleanup(&tree_ll);
   1320   HuffmanTree_cleanup(&tree_d);
   1321 
   1322   return error;
   1323 }
   1324 
   1325 static unsigned inflateNoCompression(ucvector* out, LodePNGBitReader* reader,
   1326                                      const LodePNGDecompressSettings* settings) {
   1327   size_t bytepos;
   1328   size_t size = reader->size;
   1329   unsigned LEN, NLEN, error = 0;
   1330 
   1331   /*go to first boundary of byte*/
   1332   bytepos = (reader->bp + 7u) >> 3u;
   1333 
   1334   /*read LEN (2 bytes) and NLEN (2 bytes)*/
   1335   if(bytepos + 4 >= size) return 52; /*error, bit pointer will jump past memory*/
   1336   LEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2;
   1337   NLEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2;
   1338 
   1339   /*check if 16-bit NLEN is really the one's complement of LEN*/
   1340   if(!settings->ignore_nlen && LEN + NLEN != 65535) {
   1341     return 21; /*error: NLEN is not one's complement of LEN*/
   1342   }
   1343 
   1344   if(!ucvector_resize(out, out->size + LEN)) return 83; /*alloc fail*/
   1345 
   1346   /*read the literal data: LEN bytes are now stored in the out buffer*/
   1347   if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/
   1348 
   1349   /*out->data can be NULL (when LEN is zero), and arithmetic on NULL ptr is undefined*/
   1350   if (LEN) {
   1351     lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN);
   1352     bytepos += LEN;
   1353   }
   1354 
   1355   reader->bp = bytepos << 3u;
   1356 
   1357   return error;
   1358 }
   1359 
   1360 static unsigned lodepng_inflatev(ucvector* out,
   1361                                  const unsigned char* in, size_t insize,
   1362                                  const LodePNGDecompressSettings* settings) {
   1363   unsigned BFINAL = 0;
   1364   LodePNGBitReader reader;
   1365   unsigned error = LodePNGBitReader_init(&reader, in, insize);
   1366 
   1367   if(error) return error;
   1368 
   1369   while(!BFINAL) {
   1370     unsigned BTYPE;
   1371     if(reader.bitsize - reader.bp < 3) return 52; /*error, bit pointer will jump past memory*/
   1372     ensureBits9(&reader, 3);
   1373     BFINAL = readBits(&reader, 1);
   1374     BTYPE = readBits(&reader, 2);
   1375 
   1376     if(BTYPE == 3) return 20; /*error: invalid BTYPE*/
   1377     else if(BTYPE == 0) error = inflateNoCompression(out, &reader, settings); /*no compression*/
   1378     else error = inflateHuffmanBlock(out, &reader, BTYPE, settings->max_output_size); /*compression, BTYPE 01 or 10*/
   1379     if(!error && settings->max_output_size && out->size > settings->max_output_size) error = 109;
   1380     if(error) break;
   1381   }
   1382 
   1383   return error;
   1384 }
   1385 
   1386 unsigned lodepng_inflate(unsigned char** out, size_t* outsize,
   1387                          const unsigned char* in, size_t insize,
   1388                          const LodePNGDecompressSettings* settings) {
   1389   ucvector v = ucvector_init(*out, *outsize);
   1390   unsigned error = lodepng_inflatev(&v, in, insize, settings);
   1391   *out = v.data;
   1392   *outsize = v.size;
   1393   return error;
   1394 }
   1395 
   1396 static unsigned inflatev(ucvector* out, const unsigned char* in, size_t insize,
   1397                         const LodePNGDecompressSettings* settings) {
   1398   if(settings->custom_inflate) {
   1399     unsigned error = settings->custom_inflate(&out->data, &out->size, in, insize, settings);
   1400     out->allocsize = out->size;
   1401     if(error) {
   1402       /*the custom inflate is allowed to have its own error codes, however, we translate it to code 110*/
   1403       error = 110;
   1404       /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/
   1405       if(settings->max_output_size && out->size > settings->max_output_size) error = 109;
   1406     }
   1407     return error;
   1408   } else {
   1409     return lodepng_inflatev(out, in, insize, settings);
   1410   }
   1411 }
   1412 
   1413 #endif /*LODEPNG_COMPILE_DECODER*/
   1414 
   1415 #ifdef LODEPNG_COMPILE_ENCODER
   1416 
   1417 /* ////////////////////////////////////////////////////////////////////////// */
   1418 /* / Deflator (Compressor)                                                  / */
   1419 /* ////////////////////////////////////////////////////////////////////////// */
   1420 
   1421 static const unsigned MAX_SUPPORTED_DEFLATE_LENGTH = 258;
   1422 
   1423 /*search the index in the array, that has the largest value smaller than or equal to the given value,
   1424 given array must be sorted (if no value is smaller, it returns the size of the given array)*/
   1425 static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) {
   1426   /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/
   1427   size_t left = 1;
   1428   size_t right = array_size - 1;
   1429 
   1430   while(left <= right) {
   1431     size_t mid = (left + right) >> 1;
   1432     if(array[mid] >= value) right = mid - 1;
   1433     else left = mid + 1;
   1434   }
   1435   if(left >= array_size || array[left] > value) left--;
   1436   return left;
   1437 }
   1438 
   1439 static void addLengthDistance(uivector* values, size_t length, size_t distance) {
   1440   /*values in encoded vector are those used by deflate:
   1441   0-255: literal bytes
   1442   256: end
   1443   257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits)
   1444   286-287: invalid*/
   1445 
   1446   unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length);
   1447   unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]);
   1448   unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance);
   1449   unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]);
   1450 
   1451   size_t pos = values->size;
   1452   /*TODO: return error when this fails (out of memory)*/
   1453   unsigned ok = uivector_resize(values, values->size + 4);
   1454   if(ok) {
   1455     values->data[pos + 0] = length_code + FIRST_LENGTH_CODE_INDEX;
   1456     values->data[pos + 1] = extra_length;
   1457     values->data[pos + 2] = dist_code;
   1458     values->data[pos + 3] = extra_distance;
   1459   }
   1460 }
   1461 
   1462 /*3 bytes of data get encoded into two bytes. The hash cannot use more than 3
   1463 bytes as input because 3 is the minimum match length for deflate*/
   1464 static const unsigned HASH_NUM_VALUES = 65536;
   1465 static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/
   1466 
   1467 typedef struct Hash {
   1468   int* head; /*hash value to head circular pos - can be outdated if went around window*/
   1469   /*circular pos to prev circular pos*/
   1470   unsigned short* chain;
   1471   int* val; /*circular pos to hash value*/
   1472 
   1473   /*TODO: do this not only for zeros but for any repeated byte. However for PNG
   1474   it's always going to be the zeros that dominate, so not important for PNG*/
   1475   int* headz; /*similar to head, but for chainz*/
   1476   unsigned short* chainz; /*those with same amount of zeros*/
   1477   unsigned short* zeros; /*length of zeros streak, used as a second hash chain*/
   1478 } Hash;
   1479 
   1480 static unsigned hash_init(Hash* hash, unsigned windowsize) {
   1481   unsigned i;
   1482   hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES);
   1483   hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize);
   1484   hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize);
   1485 
   1486   hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize);
   1487   hash->headz = (int*)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1));
   1488   hash->chainz = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize);
   1489 
   1490   if(!hash->head || !hash->chain || !hash->val  || !hash->headz|| !hash->chainz || !hash->zeros) {
   1491     return 83; /*alloc fail*/
   1492   }
   1493 
   1494   /*initialize hash table*/
   1495   for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1;
   1496   for(i = 0; i != windowsize; ++i) hash->val[i] = -1;
   1497   for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/
   1498 
   1499   for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1;
   1500   for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/
   1501 
   1502   return 0;
   1503 }
   1504 
   1505 static void hash_cleanup(Hash* hash) {
   1506   lodepng_free(hash->head);
   1507   lodepng_free(hash->val);
   1508   lodepng_free(hash->chain);
   1509 
   1510   lodepng_free(hash->zeros);
   1511   lodepng_free(hash->headz);
   1512   lodepng_free(hash->chainz);
   1513 }
   1514 
   1515 
   1516 
   1517 static unsigned getHash(const unsigned char* data, size_t size, size_t pos) {
   1518   unsigned result = 0;
   1519   if(pos + 2 < size) {
   1520     /*A simple shift and xor hash is used. Since the data of PNGs is dominated
   1521     by zeroes due to the filters, a better hash does not have a significant
   1522     effect on speed in traversing the chain, and causes more time spend on
   1523     calculating the hash.*/
   1524     result ^= ((unsigned)data[pos + 0] << 0u);
   1525     result ^= ((unsigned)data[pos + 1] << 4u);
   1526     result ^= ((unsigned)data[pos + 2] << 8u);
   1527   } else {
   1528     size_t amount, i;
   1529     if(pos >= size) return 0;
   1530     amount = size - pos;
   1531     for(i = 0; i != amount; ++i) result ^= ((unsigned)data[pos + i] << (i * 8u));
   1532   }
   1533   return result & HASH_BIT_MASK;
   1534 }
   1535 
   1536 static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) {
   1537   const unsigned char* start = data + pos;
   1538   const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH;
   1539   if(end > data + size) end = data + size;
   1540   data = start;
   1541   while(data != end && *data == 0) ++data;
   1542   /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/
   1543   return (unsigned)(data - start);
   1544 }
   1545 
   1546 /*wpos = pos & (windowsize - 1)*/
   1547 static void updateHashChain(Hash* hash, size_t wpos, unsigned hashval, unsigned short numzeros) {
   1548   hash->val[wpos] = (int)hashval;
   1549   if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval];
   1550   hash->head[hashval] = (int)wpos;
   1551 
   1552   hash->zeros[wpos] = numzeros;
   1553   if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros];
   1554   hash->headz[numzeros] = (int)wpos;
   1555 }
   1556 
   1557 /*
   1558 LZ77-encode the data. Return value is error code. The input are raw bytes, the output
   1559 is in the form of unsigned integers with codes representing for example literal bytes, or
   1560 length/distance pairs.
   1561 It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a
   1562 sliding window (of windowsize) is used, and all past bytes in that window can be used as
   1563 the "dictionary". A brute force search through all possible distances would be slow, and
   1564 this hash technique is one out of several ways to speed this up.
   1565 */
   1566 static unsigned encodeLZ77(uivector* out, Hash* hash,
   1567                            const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize,
   1568                            unsigned minmatch, unsigned nicematch, unsigned lazymatching) {
   1569   size_t pos;
   1570   unsigned i, error = 0;
   1571   /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/
   1572   unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8u;
   1573   unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64;
   1574 
   1575   unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/
   1576   unsigned numzeros = 0;
   1577 
   1578   unsigned offset; /*the offset represents the distance in LZ77 terminology*/
   1579   unsigned length;
   1580   unsigned lazy = 0;
   1581   unsigned lazylength = 0, lazyoffset = 0;
   1582   unsigned hashval;
   1583   unsigned current_offset, current_length;
   1584   unsigned prev_offset;
   1585   const unsigned char *lastptr, *foreptr, *backptr;
   1586   unsigned hashpos;
   1587 
   1588   if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/
   1589   if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/
   1590 
   1591   if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH;
   1592 
   1593   for(pos = inpos; pos < insize; ++pos) {
   1594     size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/
   1595     unsigned chainlength = 0;
   1596 
   1597     hashval = getHash(in, insize, pos);
   1598 
   1599     if(usezeros && hashval == 0) {
   1600       if(numzeros == 0) numzeros = countZeros(in, insize, pos);
   1601       else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros;
   1602     } else {
   1603       numzeros = 0;
   1604     }
   1605 
   1606     updateHashChain(hash, wpos, hashval, numzeros);
   1607 
   1608     /*the length and offset found for the current position*/
   1609     length = 0;
   1610     offset = 0;
   1611 
   1612     hashpos = hash->chain[wpos];
   1613 
   1614     lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH];
   1615 
   1616     /*search for the longest string*/
   1617     prev_offset = 0;
   1618     for(;;) {
   1619       if(chainlength++ >= maxchainlength) break;
   1620       current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize);
   1621 
   1622       if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/
   1623       prev_offset = current_offset;
   1624       if(current_offset > 0) {
   1625         /*test the next characters*/
   1626         foreptr = &in[pos];
   1627         backptr = &in[pos - current_offset];
   1628 
   1629         /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/
   1630         if(numzeros >= 3) {
   1631           unsigned skip = hash->zeros[hashpos];
   1632           if(skip > numzeros) skip = numzeros;
   1633           backptr += skip;
   1634           foreptr += skip;
   1635         }
   1636 
   1637         while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ {
   1638           ++backptr;
   1639           ++foreptr;
   1640         }
   1641         current_length = (unsigned)(foreptr - &in[pos]);
   1642 
   1643         if(current_length > length) {
   1644           length = current_length; /*the longest length*/
   1645           offset = current_offset; /*the offset that is related to this longest length*/
   1646           /*jump out once a length of max length is found (speed gain). This also jumps
   1647           out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/
   1648           if(current_length >= nicematch) break;
   1649         }
   1650       }
   1651 
   1652       if(hashpos == hash->chain[hashpos]) break;
   1653 
   1654       if(numzeros >= 3 && length > numzeros) {
   1655         hashpos = hash->chainz[hashpos];
   1656         if(hash->zeros[hashpos] != numzeros) break;
   1657       } else {
   1658         hashpos = hash->chain[hashpos];
   1659         /*outdated hash value, happens if particular value was not encountered in whole last window*/
   1660         if(hash->val[hashpos] != (int)hashval) break;
   1661       }
   1662     }
   1663 
   1664     if(lazymatching) {
   1665       if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) {
   1666         lazy = 1;
   1667         lazylength = length;
   1668         lazyoffset = offset;
   1669         continue; /*try the next byte*/
   1670       }
   1671       if(lazy) {
   1672         lazy = 0;
   1673         if(pos == 0) ERROR_BREAK(81);
   1674         if(length > lazylength + 1) {
   1675           /*push the previous character as literal*/
   1676           if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/);
   1677         } else {
   1678           length = lazylength;
   1679           offset = lazyoffset;
   1680           hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/
   1681           hash->headz[numzeros] = -1; /*idem*/
   1682           --pos;
   1683         }
   1684       }
   1685     }
   1686     if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/);
   1687 
   1688     /*encode it as length/distance pair or literal value*/
   1689     if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ {
   1690       if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/);
   1691     } else if(length < minmatch || (length == 3 && offset > 4096)) {
   1692       /*compensate for the fact that longer offsets have more extra bits, a
   1693       length of only 3 may be not worth it then*/
   1694       if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/);
   1695     } else {
   1696       addLengthDistance(out, length, offset);
   1697       for(i = 1; i < length; ++i) {
   1698         ++pos;
   1699         wpos = pos & (windowsize - 1);
   1700         hashval = getHash(in, insize, pos);
   1701         if(usezeros && hashval == 0) {
   1702           if(numzeros == 0) numzeros = countZeros(in, insize, pos);
   1703           else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros;
   1704         } else {
   1705           numzeros = 0;
   1706         }
   1707         updateHashChain(hash, wpos, hashval, numzeros);
   1708       }
   1709     }
   1710   } /*end of the loop through each character of input*/
   1711 
   1712   return error;
   1713 }
   1714 
   1715 /* /////////////////////////////////////////////////////////////////////////// */
   1716 
   1717 static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) {
   1718   /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte,
   1719   2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/
   1720 
   1721   size_t i, numdeflateblocks = (datasize + 65534u) / 65535u;
   1722   size_t datapos = 0;
   1723   for(i = 0; i != numdeflateblocks; ++i) {
   1724     unsigned BFINAL, BTYPE, LEN, NLEN;
   1725     unsigned char firstbyte;
   1726     size_t pos = out->size;
   1727 
   1728     BFINAL = (i == numdeflateblocks - 1);
   1729     BTYPE = 0;
   1730 
   1731     LEN = 65535;
   1732     if(datasize - datapos < 65535u) LEN = (unsigned)datasize - (unsigned)datapos;
   1733     NLEN = 65535 - LEN;
   1734 
   1735     if(!ucvector_resize(out, out->size + LEN + 5)) return 83; /*alloc fail*/
   1736 
   1737     firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1u) << 1u) + ((BTYPE & 2u) << 1u));
   1738     out->data[pos + 0] = firstbyte;
   1739     out->data[pos + 1] = (unsigned char)(LEN & 255);
   1740     out->data[pos + 2] = (unsigned char)(LEN >> 8u);
   1741     out->data[pos + 3] = (unsigned char)(NLEN & 255);
   1742     out->data[pos + 4] = (unsigned char)(NLEN >> 8u);
   1743     lodepng_memcpy(out->data + pos + 5, data + datapos, LEN);
   1744     datapos += LEN;
   1745   }
   1746 
   1747   return 0;
   1748 }
   1749 
   1750 /*
   1751 write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees.
   1752 tree_ll: the tree for lit and len codes.
   1753 tree_d: the tree for distance codes.
   1754 */
   1755 static void writeLZ77data(LodePNGBitWriter* writer, const uivector* lz77_encoded,
   1756                           const HuffmanTree* tree_ll, const HuffmanTree* tree_d) {
   1757   size_t i = 0;
   1758   for(i = 0; i != lz77_encoded->size; ++i) {
   1759     unsigned val = lz77_encoded->data[i];
   1760     writeBitsReversed(writer, tree_ll->codes[val], tree_ll->lengths[val]);
   1761     if(val > 256) /*for a length code, 3 more things have to be added*/ {
   1762       unsigned length_index = val - FIRST_LENGTH_CODE_INDEX;
   1763       unsigned n_length_extra_bits = LENGTHEXTRA[length_index];
   1764       unsigned length_extra_bits = lz77_encoded->data[++i];
   1765 
   1766       unsigned distance_code = lz77_encoded->data[++i];
   1767 
   1768       unsigned distance_index = distance_code;
   1769       unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index];
   1770       unsigned distance_extra_bits = lz77_encoded->data[++i];
   1771 
   1772       writeBits(writer, length_extra_bits, n_length_extra_bits);
   1773       writeBitsReversed(writer, tree_d->codes[distance_code], tree_d->lengths[distance_code]);
   1774       writeBits(writer, distance_extra_bits, n_distance_extra_bits);
   1775     }
   1776   }
   1777 }
   1778 
   1779 /*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/
   1780 static unsigned deflateDynamic(LodePNGBitWriter* writer, Hash* hash,
   1781                                const unsigned char* data, size_t datapos, size_t dataend,
   1782                                const LodePNGCompressSettings* settings, unsigned final) {
   1783   unsigned error = 0;
   1784 
   1785   /*
   1786   A block is compressed as follows: The PNG data is lz77 encoded, resulting in
   1787   literal bytes and length/distance pairs. This is then huffman compressed with
   1788   two huffman trees. One huffman tree is used for the lit and len values ("ll"),
   1789   another huffman tree is used for the dist values ("d"). These two trees are
   1790   stored using their code lengths, and to compress even more these code lengths
   1791   are also run-length encoded and huffman compressed. This gives a huffman tree
   1792   of code lengths "cl". The code lengths used to describe this third tree are
   1793   the code length code lengths ("clcl").
   1794   */
   1795 
   1796   /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/
   1797   uivector lz77_encoded;
   1798   HuffmanTree tree_ll; /*tree for lit,len values*/
   1799   HuffmanTree tree_d; /*tree for distance codes*/
   1800   HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/
   1801   unsigned* frequencies_ll = 0; /*frequency of lit,len codes*/
   1802   unsigned* frequencies_d = 0; /*frequency of dist codes*/
   1803   unsigned* frequencies_cl = 0; /*frequency of code length codes*/
   1804   unsigned* bitlen_lld = 0; /*lit,len,dist code lengths (int bits), literally (without repeat codes).*/
   1805   unsigned* bitlen_lld_e = 0; /*bitlen_lld encoded with repeat codes (this is a rudimentary run length compression)*/
   1806   size_t datasize = dataend - datapos;
   1807 
   1808   /*
   1809   If we could call "bitlen_cl" the the code length code lengths ("clcl"), that is the bit lengths of codes to represent
   1810   tree_cl in CLCL_ORDER, then due to the huffman compression of huffman tree representations ("two levels"), there are
   1811   some analogies:
   1812   bitlen_lld is to tree_cl what data is to tree_ll and tree_d.
   1813   bitlen_lld_e is to bitlen_lld what lz77_encoded is to data.
   1814   bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded.
   1815   */
   1816 
   1817   unsigned BFINAL = final;
   1818   size_t i;
   1819   size_t numcodes_ll, numcodes_d, numcodes_lld, numcodes_lld_e, numcodes_cl;
   1820   unsigned HLIT, HDIST, HCLEN;
   1821 
   1822   uivector_init(&lz77_encoded);
   1823   HuffmanTree_init(&tree_ll);
   1824   HuffmanTree_init(&tree_d);
   1825   HuffmanTree_init(&tree_cl);
   1826   /* could fit on stack, but >1KB is on the larger side so allocate instead */
   1827   frequencies_ll = (unsigned*)lodepng_malloc(286 * sizeof(*frequencies_ll));
   1828   frequencies_d = (unsigned*)lodepng_malloc(30 * sizeof(*frequencies_d));
   1829   frequencies_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl));
   1830 
   1831   if(!frequencies_ll || !frequencies_d || !frequencies_cl) error = 83; /*alloc fail*/
   1832 
   1833   /*This while loop never loops due to a break at the end, it is here to
   1834   allow breaking out of it to the cleanup phase on error conditions.*/
   1835   while(!error) {
   1836     lodepng_memset(frequencies_ll, 0, 286 * sizeof(*frequencies_ll));
   1837     lodepng_memset(frequencies_d, 0, 30 * sizeof(*frequencies_d));
   1838     lodepng_memset(frequencies_cl, 0, NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl));
   1839 
   1840     if(settings->use_lz77) {
   1841       error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize,
   1842                          settings->minmatch, settings->nicematch, settings->lazymatching);
   1843       if(error) break;
   1844     } else {
   1845       if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/);
   1846       for(i = datapos; i < dataend; ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/
   1847     }
   1848 
   1849     /*Count the frequencies of lit, len and dist codes*/
   1850     for(i = 0; i != lz77_encoded.size; ++i) {
   1851       unsigned symbol = lz77_encoded.data[i];
   1852       ++frequencies_ll[symbol];
   1853       if(symbol > 256) {
   1854         unsigned dist = lz77_encoded.data[i + 2];
   1855         ++frequencies_d[dist];
   1856         i += 3;
   1857       }
   1858     }
   1859     frequencies_ll[256] = 1; /*there will be exactly 1 end code, at the end of the block*/
   1860 
   1861     /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/
   1862     error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll, 257, 286, 15);
   1863     if(error) break;
   1864     /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/
   1865     error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d, 2, 30, 15);
   1866     if(error) break;
   1867 
   1868     numcodes_ll = LODEPNG_MIN(tree_ll.numcodes, 286);
   1869     numcodes_d = LODEPNG_MIN(tree_d.numcodes, 30);
   1870     /*store the code lengths of both generated trees in bitlen_lld*/
   1871     numcodes_lld = numcodes_ll + numcodes_d;
   1872     bitlen_lld = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld));
   1873     /*numcodes_lld_e never needs more size than bitlen_lld*/
   1874     bitlen_lld_e = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld_e));
   1875     if(!bitlen_lld || !bitlen_lld_e) ERROR_BREAK(83); /*alloc fail*/
   1876     numcodes_lld_e = 0;
   1877 
   1878     for(i = 0; i != numcodes_ll; ++i) bitlen_lld[i] = tree_ll.lengths[i];
   1879     for(i = 0; i != numcodes_d; ++i) bitlen_lld[numcodes_ll + i] = tree_d.lengths[i];
   1880 
   1881     /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times),
   1882     17 (3-10 zeroes), 18 (11-138 zeroes)*/
   1883     for(i = 0; i != numcodes_lld; ++i) {
   1884       unsigned j = 0; /*amount of repetitions*/
   1885       while(i + j + 1 < numcodes_lld && bitlen_lld[i + j + 1] == bitlen_lld[i]) ++j;
   1886 
   1887       if(bitlen_lld[i] == 0 && j >= 2) /*repeat code for zeroes*/ {
   1888         ++j; /*include the first zero*/
   1889         if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ {
   1890           bitlen_lld_e[numcodes_lld_e++] = 17;
   1891           bitlen_lld_e[numcodes_lld_e++] = j - 3;
   1892         } else /*repeat code 18 supports max 138 zeroes*/ {
   1893           if(j > 138) j = 138;
   1894           bitlen_lld_e[numcodes_lld_e++] = 18;
   1895           bitlen_lld_e[numcodes_lld_e++] = j - 11;
   1896         }
   1897         i += (j - 1);
   1898       } else if(j >= 3) /*repeat code for value other than zero*/ {
   1899         size_t k;
   1900         unsigned num = j / 6u, rest = j % 6u;
   1901         bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i];
   1902         for(k = 0; k < num; ++k) {
   1903           bitlen_lld_e[numcodes_lld_e++] = 16;
   1904           bitlen_lld_e[numcodes_lld_e++] = 6 - 3;
   1905         }
   1906         if(rest >= 3) {
   1907           bitlen_lld_e[numcodes_lld_e++] = 16;
   1908           bitlen_lld_e[numcodes_lld_e++] = rest - 3;
   1909         }
   1910         else j -= rest;
   1911         i += j;
   1912       } else /*too short to benefit from repeat code*/ {
   1913         bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i];
   1914       }
   1915     }
   1916 
   1917     /*generate tree_cl, the huffmantree of huffmantrees*/
   1918     for(i = 0; i != numcodes_lld_e; ++i) {
   1919       ++frequencies_cl[bitlen_lld_e[i]];
   1920       /*after a repeat code come the bits that specify the number of repetitions,
   1921       those don't need to be in the frequencies_cl calculation*/
   1922       if(bitlen_lld_e[i] >= 16) ++i;
   1923     }
   1924 
   1925     error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl,
   1926                                             NUM_CODE_LENGTH_CODES, NUM_CODE_LENGTH_CODES, 7);
   1927     if(error) break;
   1928 
   1929     /*compute amount of code-length-code-lengths to output*/
   1930     numcodes_cl = NUM_CODE_LENGTH_CODES;
   1931     /*trim zeros at the end (using CLCL_ORDER), but minimum size must be 4 (see HCLEN below)*/
   1932     while(numcodes_cl > 4u && tree_cl.lengths[CLCL_ORDER[numcodes_cl - 1u]] == 0) {
   1933       numcodes_cl--;
   1934     }
   1935 
   1936     /*
   1937     Write everything into the output
   1938 
   1939     After the BFINAL and BTYPE, the dynamic block consists out of the following:
   1940     - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN
   1941     - (HCLEN+4)*3 bits code lengths of code length alphabet
   1942     - HLIT + 257 code lengths of lit/length alphabet (encoded using the code length
   1943       alphabet, + possible repetition codes 16, 17, 18)
   1944     - HDIST + 1 code lengths of distance alphabet (encoded using the code length
   1945       alphabet, + possible repetition codes 16, 17, 18)
   1946     - compressed data
   1947     - 256 (end code)
   1948     */
   1949 
   1950     /*Write block type*/
   1951     writeBits(writer, BFINAL, 1);
   1952     writeBits(writer, 0, 1); /*first bit of BTYPE "dynamic"*/
   1953     writeBits(writer, 1, 1); /*second bit of BTYPE "dynamic"*/
   1954 
   1955     /*write the HLIT, HDIST and HCLEN values*/
   1956     /*all three sizes take trimmed ending zeroes into account, done either by HuffmanTree_makeFromFrequencies
   1957     or in the loop for numcodes_cl above, which saves space. */
   1958     HLIT = (unsigned)(numcodes_ll - 257);
   1959     HDIST = (unsigned)(numcodes_d - 1);
   1960     HCLEN = (unsigned)(numcodes_cl - 4);
   1961     writeBits(writer, HLIT, 5);
   1962     writeBits(writer, HDIST, 5);
   1963     writeBits(writer, HCLEN, 4);
   1964 
   1965     /*write the code lengths of the code length alphabet ("bitlen_cl")*/
   1966     for(i = 0; i != numcodes_cl; ++i) writeBits(writer, tree_cl.lengths[CLCL_ORDER[i]], 3);
   1967 
   1968     /*write the lengths of the lit/len AND the dist alphabet*/
   1969     for(i = 0; i != numcodes_lld_e; ++i) {
   1970       writeBitsReversed(writer, tree_cl.codes[bitlen_lld_e[i]], tree_cl.lengths[bitlen_lld_e[i]]);
   1971       /*extra bits of repeat codes*/
   1972       if(bitlen_lld_e[i] == 16) writeBits(writer, bitlen_lld_e[++i], 2);
   1973       else if(bitlen_lld_e[i] == 17) writeBits(writer, bitlen_lld_e[++i], 3);
   1974       else if(bitlen_lld_e[i] == 18) writeBits(writer, bitlen_lld_e[++i], 7);
   1975     }
   1976 
   1977     /*write the compressed data symbols*/
   1978     writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d);
   1979     /*error: the length of the end code 256 must be larger than 0*/
   1980     if(tree_ll.lengths[256] == 0) ERROR_BREAK(64);
   1981 
   1982     /*write the end code*/
   1983     writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]);
   1984 
   1985     break; /*end of error-while*/
   1986   }
   1987 
   1988   /*cleanup*/
   1989   uivector_cleanup(&lz77_encoded);
   1990   HuffmanTree_cleanup(&tree_ll);
   1991   HuffmanTree_cleanup(&tree_d);
   1992   HuffmanTree_cleanup(&tree_cl);
   1993   lodepng_free(frequencies_ll);
   1994   lodepng_free(frequencies_d);
   1995   lodepng_free(frequencies_cl);
   1996   lodepng_free(bitlen_lld);
   1997   lodepng_free(bitlen_lld_e);
   1998 
   1999   return error;
   2000 }
   2001 
   2002 static unsigned deflateFixed(LodePNGBitWriter* writer, Hash* hash,
   2003                              const unsigned char* data,
   2004                              size_t datapos, size_t dataend,
   2005                              const LodePNGCompressSettings* settings, unsigned final) {
   2006   HuffmanTree tree_ll; /*tree for literal values and length codes*/
   2007   HuffmanTree tree_d; /*tree for distance codes*/
   2008 
   2009   unsigned BFINAL = final;
   2010   unsigned error = 0;
   2011   size_t i;
   2012 
   2013   HuffmanTree_init(&tree_ll);
   2014   HuffmanTree_init(&tree_d);
   2015 
   2016   error = generateFixedLitLenTree(&tree_ll);
   2017   if(!error) error = generateFixedDistanceTree(&tree_d);
   2018 
   2019   if(!error) {
   2020     writeBits(writer, BFINAL, 1);
   2021     writeBits(writer, 1, 1); /*first bit of BTYPE*/
   2022     writeBits(writer, 0, 1); /*second bit of BTYPE*/
   2023 
   2024     if(settings->use_lz77) /*LZ77 encoded*/ {
   2025       uivector lz77_encoded;
   2026       uivector_init(&lz77_encoded);
   2027       error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize,
   2028                          settings->minmatch, settings->nicematch, settings->lazymatching);
   2029       if(!error) writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d);
   2030       uivector_cleanup(&lz77_encoded);
   2031     } else /*no LZ77, but still will be Huffman compressed*/ {
   2032       for(i = datapos; i < dataend; ++i) {
   2033         writeBitsReversed(writer, tree_ll.codes[data[i]], tree_ll.lengths[data[i]]);
   2034       }
   2035     }
   2036     /*add END code*/
   2037     if(!error) writeBitsReversed(writer,tree_ll.codes[256], tree_ll.lengths[256]);
   2038   }
   2039 
   2040   /*cleanup*/
   2041   HuffmanTree_cleanup(&tree_ll);
   2042   HuffmanTree_cleanup(&tree_d);
   2043 
   2044   return error;
   2045 }
   2046 
   2047 static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize,
   2048                                  const LodePNGCompressSettings* settings) {
   2049   unsigned error = 0;
   2050   size_t i, blocksize, numdeflateblocks;
   2051   Hash hash;
   2052   LodePNGBitWriter writer;
   2053 
   2054   LodePNGBitWriter_init(&writer, out);
   2055 
   2056   if(settings->btype > 2) return 61;
   2057   else if(settings->btype == 0) return deflateNoCompression(out, in, insize);
   2058   else if(settings->btype == 1) blocksize = insize;
   2059   else /*if(settings->btype == 2)*/ {
   2060     /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/
   2061     blocksize = insize / 8u + 8;
   2062     if(blocksize < 65536) blocksize = 65536;
   2063     if(blocksize > 262144) blocksize = 262144;
   2064   }
   2065 
   2066   numdeflateblocks = (insize + blocksize - 1) / blocksize;
   2067   if(numdeflateblocks == 0) numdeflateblocks = 1;
   2068 
   2069   error = hash_init(&hash, settings->windowsize);
   2070 
   2071   if(!error) {
   2072     for(i = 0; i != numdeflateblocks && !error; ++i) {
   2073       unsigned final = (i == numdeflateblocks - 1);
   2074       size_t start = i * blocksize;
   2075       size_t end = start + blocksize;
   2076       if(end > insize) end = insize;
   2077 
   2078       if(settings->btype == 1) error = deflateFixed(&writer, &hash, in, start, end, settings, final);
   2079       else if(settings->btype == 2) error = deflateDynamic(&writer, &hash, in, start, end, settings, final);
   2080     }
   2081   }
   2082 
   2083   hash_cleanup(&hash);
   2084 
   2085   return error;
   2086 }
   2087 
   2088 unsigned lodepng_deflate(unsigned char** out, size_t* outsize,
   2089                          const unsigned char* in, size_t insize,
   2090                          const LodePNGCompressSettings* settings) {
   2091   ucvector v = ucvector_init(*out, *outsize);
   2092   unsigned error = lodepng_deflatev(&v, in, insize, settings);
   2093   *out = v.data;
   2094   *outsize = v.size;
   2095   return error;
   2096 }
   2097 
   2098 static unsigned deflate(unsigned char** out, size_t* outsize,
   2099                         const unsigned char* in, size_t insize,
   2100                         const LodePNGCompressSettings* settings) {
   2101   if(settings->custom_deflate) {
   2102     unsigned error = settings->custom_deflate(out, outsize, in, insize, settings);
   2103     /*the custom deflate is allowed to have its own error codes, however, we translate it to code 111*/
   2104     return error ? 111 : 0;
   2105   } else {
   2106     return lodepng_deflate(out, outsize, in, insize, settings);
   2107   }
   2108 }
   2109 
   2110 #endif /*LODEPNG_COMPILE_DECODER*/
   2111 
   2112 /* ////////////////////////////////////////////////////////////////////////// */
   2113 /* / Adler32                                                                / */
   2114 /* ////////////////////////////////////////////////////////////////////////// */
   2115 
   2116 static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) {
   2117   unsigned s1 = adler & 0xffffu;
   2118   unsigned s2 = (adler >> 16u) & 0xffffu;
   2119 
   2120   while(len != 0u) {
   2121     unsigned i;
   2122     /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/
   2123     unsigned amount = len > 5552u ? 5552u : len;
   2124     len -= amount;
   2125     for(i = 0; i != amount; ++i) {
   2126       s1 += (*data++);
   2127       s2 += s1;
   2128     }
   2129     s1 %= 65521u;
   2130     s2 %= 65521u;
   2131   }
   2132 
   2133   return (s2 << 16u) | s1;
   2134 }
   2135 
   2136 /*Return the adler32 of the bytes data[0..len-1]*/
   2137 static unsigned adler32(const unsigned char* data, unsigned len) {
   2138   return update_adler32(1u, data, len);
   2139 }
   2140 
   2141 /* ////////////////////////////////////////////////////////////////////////// */
   2142 /* / Zlib                                                                   / */
   2143 /* ////////////////////////////////////////////////////////////////////////// */
   2144 
   2145 #ifdef LODEPNG_COMPILE_DECODER
   2146 
   2147 static unsigned lodepng_zlib_decompressv(ucvector* out,
   2148                                          const unsigned char* in, size_t insize,
   2149                                          const LodePNGDecompressSettings* settings) {
   2150   unsigned error = 0;
   2151   unsigned CM, CINFO, FDICT;
   2152 
   2153   if(insize < 2) return 53; /*error, size of zlib data too small*/
   2154   /*read information from zlib header*/
   2155   if((in[0] * 256 + in[1]) % 31 != 0) {
   2156     /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/
   2157     return 24;
   2158   }
   2159 
   2160   CM = in[0] & 15;
   2161   CINFO = (in[0] >> 4) & 15;
   2162   /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/
   2163   FDICT = (in[1] >> 5) & 1;
   2164   /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/
   2165 
   2166   if(CM != 8 || CINFO > 7) {
   2167     /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/
   2168     return 25;
   2169   }
   2170   if(FDICT != 0) {
   2171     /*error: the specification of PNG says about the zlib stream:
   2172       "The additional flags shall not specify a preset dictionary."*/
   2173     return 26;
   2174   }
   2175 
   2176   error = inflatev(out, in + 2, insize - 2, settings);
   2177   if(error) return error;
   2178 
   2179   if(!settings->ignore_adler32) {
   2180     unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]);
   2181     unsigned checksum = adler32(out->data, (unsigned)(out->size));
   2182     if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/
   2183   }
   2184 
   2185   return 0; /*no error*/
   2186 }
   2187 
   2188 
   2189 unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in,
   2190                                  size_t insize, const LodePNGDecompressSettings* settings) {
   2191   ucvector v = ucvector_init(*out, *outsize);
   2192   unsigned error = lodepng_zlib_decompressv(&v, in, insize, settings);
   2193   *out = v.data;
   2194   *outsize = v.size;
   2195   return error;
   2196 }
   2197 
   2198 /*expected_size is expected output size, to avoid intermediate allocations. Set to 0 if not known. */
   2199 static unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size,
   2200                                 const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) {
   2201   unsigned error;
   2202   if(settings->custom_zlib) {
   2203     error = settings->custom_zlib(out, outsize, in, insize, settings);
   2204     if(error) {
   2205       /*the custom zlib is allowed to have its own error codes, however, we translate it to code 110*/
   2206       error = 110;
   2207       /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/
   2208       if(settings->max_output_size && *outsize > settings->max_output_size) error = 109;
   2209     }
   2210   } else {
   2211     ucvector v = ucvector_init(*out, *outsize);
   2212     if(expected_size) {
   2213       /*reserve the memory to avoid intermediate reallocations*/
   2214       ucvector_resize(&v, *outsize + expected_size);
   2215       v.size = *outsize;
   2216     }
   2217     error = lodepng_zlib_decompressv(&v, in, insize, settings);
   2218     *out = v.data;
   2219     *outsize = v.size;
   2220   }
   2221   return error;
   2222 }
   2223 
   2224 #endif /*LODEPNG_COMPILE_DECODER*/
   2225 
   2226 #ifdef LODEPNG_COMPILE_ENCODER
   2227 
   2228 unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in,
   2229                                size_t insize, const LodePNGCompressSettings* settings) {
   2230   size_t i;
   2231   unsigned error;
   2232   unsigned char* deflatedata = 0;
   2233   size_t deflatesize = 0;
   2234 
   2235   error = deflate(&deflatedata, &deflatesize, in, insize, settings);
   2236 
   2237   *out = NULL;
   2238   *outsize = 0;
   2239   if(!error) {
   2240     *outsize = deflatesize + 6;
   2241     *out = (unsigned char*)lodepng_malloc(*outsize);
   2242     if(!*out) error = 83; /*alloc fail*/
   2243   }
   2244 
   2245   if(!error) {
   2246     unsigned ADLER32 = adler32(in, (unsigned)insize);
   2247     /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/
   2248     unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/
   2249     unsigned FLEVEL = 0;
   2250     unsigned FDICT = 0;
   2251     unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64;
   2252     unsigned FCHECK = 31 - CMFFLG % 31;
   2253     CMFFLG += FCHECK;
   2254 
   2255     (*out)[0] = (unsigned char)(CMFFLG >> 8);
   2256     (*out)[1] = (unsigned char)(CMFFLG & 255);
   2257     for(i = 0; i != deflatesize; ++i) (*out)[i + 2] = deflatedata[i];
   2258     lodepng_set32bitInt(&(*out)[*outsize - 4], ADLER32);
   2259   }
   2260 
   2261   lodepng_free(deflatedata);
   2262   return error;
   2263 }
   2264 
   2265 /* compress using the default or custom zlib function */
   2266 static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in,
   2267                               size_t insize, const LodePNGCompressSettings* settings) {
   2268   if(settings->custom_zlib) {
   2269     unsigned error = settings->custom_zlib(out, outsize, in, insize, settings);
   2270     /*the custom zlib is allowed to have its own error codes, however, we translate it to code 111*/
   2271     return error ? 111 : 0;
   2272   } else {
   2273     return lodepng_zlib_compress(out, outsize, in, insize, settings);
   2274   }
   2275 }
   2276 
   2277 #endif /*LODEPNG_COMPILE_ENCODER*/
   2278 
   2279 #else /*no LODEPNG_COMPILE_ZLIB*/
   2280 
   2281 #ifdef LODEPNG_COMPILE_DECODER
   2282 static unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size,
   2283                                 const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) {
   2284   if(!settings->custom_zlib) return 87; /*no custom zlib function provided */
   2285   (void)expected_size;
   2286   return settings->custom_zlib(out, outsize, in, insize, settings);
   2287 }
   2288 #endif /*LODEPNG_COMPILE_DECODER*/
   2289 #ifdef LODEPNG_COMPILE_ENCODER
   2290 static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in,
   2291                               size_t insize, const LodePNGCompressSettings* settings) {
   2292   if(!settings->custom_zlib) return 87; /*no custom zlib function provided */
   2293   return settings->custom_zlib(out, outsize, in, insize, settings);
   2294 }
   2295 #endif /*LODEPNG_COMPILE_ENCODER*/
   2296 
   2297 #endif /*LODEPNG_COMPILE_ZLIB*/
   2298 
   2299 /* ////////////////////////////////////////////////////////////////////////// */
   2300 
   2301 #ifdef LODEPNG_COMPILE_ENCODER
   2302 
   2303 /*this is a good tradeoff between speed and compression ratio*/
   2304 #define DEFAULT_WINDOWSIZE 2048
   2305 
   2306 void lodepng_compress_settings_init(LodePNGCompressSettings* settings) {
   2307   /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/
   2308   settings->btype = 2;
   2309   settings->use_lz77 = 1;
   2310   settings->windowsize = DEFAULT_WINDOWSIZE;
   2311   settings->minmatch = 3;
   2312   settings->nicematch = 128;
   2313   settings->lazymatching = 1;
   2314 
   2315   settings->custom_zlib = 0;
   2316   settings->custom_deflate = 0;
   2317   settings->custom_context = 0;
   2318 }
   2319 
   2320 const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0};
   2321 
   2322 
   2323 #endif /*LODEPNG_COMPILE_ENCODER*/
   2324 
   2325 #ifdef LODEPNG_COMPILE_DECODER
   2326 
   2327 void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) {
   2328   settings->ignore_adler32 = 0;
   2329   settings->ignore_nlen = 0;
   2330   settings->max_output_size = 0;
   2331 
   2332   settings->custom_zlib = 0;
   2333   settings->custom_inflate = 0;
   2334   settings->custom_context = 0;
   2335 }
   2336 
   2337 const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0, 0, 0};
   2338 
   2339 #endif /*LODEPNG_COMPILE_DECODER*/
   2340 
   2341 /* ////////////////////////////////////////////////////////////////////////// */
   2342 /* ////////////////////////////////////////////////////////////////////////// */
   2343 /* // End of Zlib related code. Begin of PNG related code.                 // */
   2344 /* ////////////////////////////////////////////////////////////////////////// */
   2345 /* ////////////////////////////////////////////////////////////////////////// */
   2346 
   2347 #ifdef LODEPNG_COMPILE_PNG
   2348 
   2349 /* ////////////////////////////////////////////////////////////////////////// */
   2350 /* / CRC32                                                                  / */
   2351 /* ////////////////////////////////////////////////////////////////////////// */
   2352 
   2353 
   2354 #ifdef LODEPNG_COMPILE_CRC
   2355 
   2356 static const unsigned lodepng_crc32_table0[256] = {
   2357   0x00000000u, 0x77073096u, 0xee0e612cu, 0x990951bau, 0x076dc419u, 0x706af48fu, 0xe963a535u, 0x9e6495a3u,
   2358   0x0edb8832u, 0x79dcb8a4u, 0xe0d5e91eu, 0x97d2d988u, 0x09b64c2bu, 0x7eb17cbdu, 0xe7b82d07u, 0x90bf1d91u,
   2359   0x1db71064u, 0x6ab020f2u, 0xf3b97148u, 0x84be41deu, 0x1adad47du, 0x6ddde4ebu, 0xf4d4b551u, 0x83d385c7u,
   2360   0x136c9856u, 0x646ba8c0u, 0xfd62f97au, 0x8a65c9ecu, 0x14015c4fu, 0x63066cd9u, 0xfa0f3d63u, 0x8d080df5u,
   2361   0x3b6e20c8u, 0x4c69105eu, 0xd56041e4u, 0xa2677172u, 0x3c03e4d1u, 0x4b04d447u, 0xd20d85fdu, 0xa50ab56bu,
   2362   0x35b5a8fau, 0x42b2986cu, 0xdbbbc9d6u, 0xacbcf940u, 0x32d86ce3u, 0x45df5c75u, 0xdcd60dcfu, 0xabd13d59u,
   2363   0x26d930acu, 0x51de003au, 0xc8d75180u, 0xbfd06116u, 0x21b4f4b5u, 0x56b3c423u, 0xcfba9599u, 0xb8bda50fu,
   2364   0x2802b89eu, 0x5f058808u, 0xc60cd9b2u, 0xb10be924u, 0x2f6f7c87u, 0x58684c11u, 0xc1611dabu, 0xb6662d3du,
   2365   0x76dc4190u, 0x01db7106u, 0x98d220bcu, 0xefd5102au, 0x71b18589u, 0x06b6b51fu, 0x9fbfe4a5u, 0xe8b8d433u,
   2366   0x7807c9a2u, 0x0f00f934u, 0x9609a88eu, 0xe10e9818u, 0x7f6a0dbbu, 0x086d3d2du, 0x91646c97u, 0xe6635c01u,
   2367   0x6b6b51f4u, 0x1c6c6162u, 0x856530d8u, 0xf262004eu, 0x6c0695edu, 0x1b01a57bu, 0x8208f4c1u, 0xf50fc457u,
   2368   0x65b0d9c6u, 0x12b7e950u, 0x8bbeb8eau, 0xfcb9887cu, 0x62dd1ddfu, 0x15da2d49u, 0x8cd37cf3u, 0xfbd44c65u,
   2369   0x4db26158u, 0x3ab551ceu, 0xa3bc0074u, 0xd4bb30e2u, 0x4adfa541u, 0x3dd895d7u, 0xa4d1c46du, 0xd3d6f4fbu,
   2370   0x4369e96au, 0x346ed9fcu, 0xad678846u, 0xda60b8d0u, 0x44042d73u, 0x33031de5u, 0xaa0a4c5fu, 0xdd0d7cc9u,
   2371   0x5005713cu, 0x270241aau, 0xbe0b1010u, 0xc90c2086u, 0x5768b525u, 0x206f85b3u, 0xb966d409u, 0xce61e49fu,
   2372   0x5edef90eu, 0x29d9c998u, 0xb0d09822u, 0xc7d7a8b4u, 0x59b33d17u, 0x2eb40d81u, 0xb7bd5c3bu, 0xc0ba6cadu,
   2373   0xedb88320u, 0x9abfb3b6u, 0x03b6e20cu, 0x74b1d29au, 0xead54739u, 0x9dd277afu, 0x04db2615u, 0x73dc1683u,
   2374   0xe3630b12u, 0x94643b84u, 0x0d6d6a3eu, 0x7a6a5aa8u, 0xe40ecf0bu, 0x9309ff9du, 0x0a00ae27u, 0x7d079eb1u,
   2375   0xf00f9344u, 0x8708a3d2u, 0x1e01f268u, 0x6906c2feu, 0xf762575du, 0x806567cbu, 0x196c3671u, 0x6e6b06e7u,
   2376   0xfed41b76u, 0x89d32be0u, 0x10da7a5au, 0x67dd4accu, 0xf9b9df6fu, 0x8ebeeff9u, 0x17b7be43u, 0x60b08ed5u,
   2377   0xd6d6a3e8u, 0xa1d1937eu, 0x38d8c2c4u, 0x4fdff252u, 0xd1bb67f1u, 0xa6bc5767u, 0x3fb506ddu, 0x48b2364bu,
   2378   0xd80d2bdau, 0xaf0a1b4cu, 0x36034af6u, 0x41047a60u, 0xdf60efc3u, 0xa867df55u, 0x316e8eefu, 0x4669be79u,
   2379   0xcb61b38cu, 0xbc66831au, 0x256fd2a0u, 0x5268e236u, 0xcc0c7795u, 0xbb0b4703u, 0x220216b9u, 0x5505262fu,
   2380   0xc5ba3bbeu, 0xb2bd0b28u, 0x2bb45a92u, 0x5cb36a04u, 0xc2d7ffa7u, 0xb5d0cf31u, 0x2cd99e8bu, 0x5bdeae1du,
   2381   0x9b64c2b0u, 0xec63f226u, 0x756aa39cu, 0x026d930au, 0x9c0906a9u, 0xeb0e363fu, 0x72076785u, 0x05005713u,
   2382   0x95bf4a82u, 0xe2b87a14u, 0x7bb12baeu, 0x0cb61b38u, 0x92d28e9bu, 0xe5d5be0du, 0x7cdcefb7u, 0x0bdbdf21u,
   2383   0x86d3d2d4u, 0xf1d4e242u, 0x68ddb3f8u, 0x1fda836eu, 0x81be16cdu, 0xf6b9265bu, 0x6fb077e1u, 0x18b74777u,
   2384   0x88085ae6u, 0xff0f6a70u, 0x66063bcau, 0x11010b5cu, 0x8f659effu, 0xf862ae69u, 0x616bffd3u, 0x166ccf45u,
   2385   0xa00ae278u, 0xd70dd2eeu, 0x4e048354u, 0x3903b3c2u, 0xa7672661u, 0xd06016f7u, 0x4969474du, 0x3e6e77dbu,
   2386   0xaed16a4au, 0xd9d65adcu, 0x40df0b66u, 0x37d83bf0u, 0xa9bcae53u, 0xdebb9ec5u, 0x47b2cf7fu, 0x30b5ffe9u,
   2387   0xbdbdf21cu, 0xcabac28au, 0x53b39330u, 0x24b4a3a6u, 0xbad03605u, 0xcdd70693u, 0x54de5729u, 0x23d967bfu,
   2388   0xb3667a2eu, 0xc4614ab8u, 0x5d681b02u, 0x2a6f2b94u, 0xb40bbe37u, 0xc30c8ea1u, 0x5a05df1bu, 0x2d02ef8du
   2389 };
   2390 
   2391 static const unsigned lodepng_crc32_table1[256] = {
   2392   0x00000000u, 0x191b3141u, 0x32366282u, 0x2b2d53c3u, 0x646cc504u, 0x7d77f445u, 0x565aa786u, 0x4f4196c7u,
   2393   0xc8d98a08u, 0xd1c2bb49u, 0xfaefe88au, 0xe3f4d9cbu, 0xacb54f0cu, 0xb5ae7e4du, 0x9e832d8eu, 0x87981ccfu,
   2394   0x4ac21251u, 0x53d92310u, 0x78f470d3u, 0x61ef4192u, 0x2eaed755u, 0x37b5e614u, 0x1c98b5d7u, 0x05838496u,
   2395   0x821b9859u, 0x9b00a918u, 0xb02dfadbu, 0xa936cb9au, 0xe6775d5du, 0xff6c6c1cu, 0xd4413fdfu, 0xcd5a0e9eu,
   2396   0x958424a2u, 0x8c9f15e3u, 0xa7b24620u, 0xbea97761u, 0xf1e8e1a6u, 0xe8f3d0e7u, 0xc3de8324u, 0xdac5b265u,
   2397   0x5d5daeaau, 0x44469febu, 0x6f6bcc28u, 0x7670fd69u, 0x39316baeu, 0x202a5aefu, 0x0b07092cu, 0x121c386du,
   2398   0xdf4636f3u, 0xc65d07b2u, 0xed705471u, 0xf46b6530u, 0xbb2af3f7u, 0xa231c2b6u, 0x891c9175u, 0x9007a034u,
   2399   0x179fbcfbu, 0x0e848dbau, 0x25a9de79u, 0x3cb2ef38u, 0x73f379ffu, 0x6ae848beu, 0x41c51b7du, 0x58de2a3cu,
   2400   0xf0794f05u, 0xe9627e44u, 0xc24f2d87u, 0xdb541cc6u, 0x94158a01u, 0x8d0ebb40u, 0xa623e883u, 0xbf38d9c2u,
   2401   0x38a0c50du, 0x21bbf44cu, 0x0a96a78fu, 0x138d96ceu, 0x5ccc0009u, 0x45d73148u, 0x6efa628bu, 0x77e153cau,
   2402   0xbabb5d54u, 0xa3a06c15u, 0x888d3fd6u, 0x91960e97u, 0xded79850u, 0xc7cca911u, 0xece1fad2u, 0xf5facb93u,
   2403   0x7262d75cu, 0x6b79e61du, 0x4054b5deu, 0x594f849fu, 0x160e1258u, 0x0f152319u, 0x243870dau, 0x3d23419bu,
   2404   0x65fd6ba7u, 0x7ce65ae6u, 0x57cb0925u, 0x4ed03864u, 0x0191aea3u, 0x188a9fe2u, 0x33a7cc21u, 0x2abcfd60u,
   2405   0xad24e1afu, 0xb43fd0eeu, 0x9f12832du, 0x8609b26cu, 0xc94824abu, 0xd05315eau, 0xfb7e4629u, 0xe2657768u,
   2406   0x2f3f79f6u, 0x362448b7u, 0x1d091b74u, 0x04122a35u, 0x4b53bcf2u, 0x52488db3u, 0x7965de70u, 0x607eef31u,
   2407   0xe7e6f3feu, 0xfefdc2bfu, 0xd5d0917cu, 0xcccba03du, 0x838a36fau, 0x9a9107bbu, 0xb1bc5478u, 0xa8a76539u,
   2408   0x3b83984bu, 0x2298a90au, 0x09b5fac9u, 0x10aecb88u, 0x5fef5d4fu, 0x46f46c0eu, 0x6dd93fcdu, 0x74c20e8cu,
   2409   0xf35a1243u, 0xea412302u, 0xc16c70c1u, 0xd8774180u, 0x9736d747u, 0x8e2de606u, 0xa500b5c5u, 0xbc1b8484u,
   2410   0x71418a1au, 0x685abb5bu, 0x4377e898u, 0x5a6cd9d9u, 0x152d4f1eu, 0x0c367e5fu, 0x271b2d9cu, 0x3e001cddu,
   2411   0xb9980012u, 0xa0833153u, 0x8bae6290u, 0x92b553d1u, 0xddf4c516u, 0xc4eff457u, 0xefc2a794u, 0xf6d996d5u,
   2412   0xae07bce9u, 0xb71c8da8u, 0x9c31de6bu, 0x852aef2au, 0xca6b79edu, 0xd37048acu, 0xf85d1b6fu, 0xe1462a2eu,
   2413   0x66de36e1u, 0x7fc507a0u, 0x54e85463u, 0x4df36522u, 0x02b2f3e5u, 0x1ba9c2a4u, 0x30849167u, 0x299fa026u,
   2414   0xe4c5aeb8u, 0xfdde9ff9u, 0xd6f3cc3au, 0xcfe8fd7bu, 0x80a96bbcu, 0x99b25afdu, 0xb29f093eu, 0xab84387fu,
   2415   0x2c1c24b0u, 0x350715f1u, 0x1e2a4632u, 0x07317773u, 0x4870e1b4u, 0x516bd0f5u, 0x7a468336u, 0x635db277u,
   2416   0xcbfad74eu, 0xd2e1e60fu, 0xf9ccb5ccu, 0xe0d7848du, 0xaf96124au, 0xb68d230bu, 0x9da070c8u, 0x84bb4189u,
   2417   0x03235d46u, 0x1a386c07u, 0x31153fc4u, 0x280e0e85u, 0x674f9842u, 0x7e54a903u, 0x5579fac0u, 0x4c62cb81u,
   2418   0x8138c51fu, 0x9823f45eu, 0xb30ea79du, 0xaa1596dcu, 0xe554001bu, 0xfc4f315au, 0xd7626299u, 0xce7953d8u,
   2419   0x49e14f17u, 0x50fa7e56u, 0x7bd72d95u, 0x62cc1cd4u, 0x2d8d8a13u, 0x3496bb52u, 0x1fbbe891u, 0x06a0d9d0u,
   2420   0x5e7ef3ecu, 0x4765c2adu, 0x6c48916eu, 0x7553a02fu, 0x3a1236e8u, 0x230907a9u, 0x0824546au, 0x113f652bu,
   2421   0x96a779e4u, 0x8fbc48a5u, 0xa4911b66u, 0xbd8a2a27u, 0xf2cbbce0u, 0xebd08da1u, 0xc0fdde62u, 0xd9e6ef23u,
   2422   0x14bce1bdu, 0x0da7d0fcu, 0x268a833fu, 0x3f91b27eu, 0x70d024b9u, 0x69cb15f8u, 0x42e6463bu, 0x5bfd777au,
   2423   0xdc656bb5u, 0xc57e5af4u, 0xee530937u, 0xf7483876u, 0xb809aeb1u, 0xa1129ff0u, 0x8a3fcc33u, 0x9324fd72u
   2424 };
   2425 
   2426 static const unsigned lodepng_crc32_table2[256] = {
   2427   0x00000000u, 0x01c26a37u, 0x0384d46eu, 0x0246be59u, 0x0709a8dcu, 0x06cbc2ebu, 0x048d7cb2u, 0x054f1685u,
   2428   0x0e1351b8u, 0x0fd13b8fu, 0x0d9785d6u, 0x0c55efe1u, 0x091af964u, 0x08d89353u, 0x0a9e2d0au, 0x0b5c473du,
   2429   0x1c26a370u, 0x1de4c947u, 0x1fa2771eu, 0x1e601d29u, 0x1b2f0bacu, 0x1aed619bu, 0x18abdfc2u, 0x1969b5f5u,
   2430   0x1235f2c8u, 0x13f798ffu, 0x11b126a6u, 0x10734c91u, 0x153c5a14u, 0x14fe3023u, 0x16b88e7au, 0x177ae44du,
   2431   0x384d46e0u, 0x398f2cd7u, 0x3bc9928eu, 0x3a0bf8b9u, 0x3f44ee3cu, 0x3e86840bu, 0x3cc03a52u, 0x3d025065u,
   2432   0x365e1758u, 0x379c7d6fu, 0x35dac336u, 0x3418a901u, 0x3157bf84u, 0x3095d5b3u, 0x32d36beau, 0x331101ddu,
   2433   0x246be590u, 0x25a98fa7u, 0x27ef31feu, 0x262d5bc9u, 0x23624d4cu, 0x22a0277bu, 0x20e69922u, 0x2124f315u,
   2434   0x2a78b428u, 0x2bbade1fu, 0x29fc6046u, 0x283e0a71u, 0x2d711cf4u, 0x2cb376c3u, 0x2ef5c89au, 0x2f37a2adu,
   2435   0x709a8dc0u, 0x7158e7f7u, 0x731e59aeu, 0x72dc3399u, 0x7793251cu, 0x76514f2bu, 0x7417f172u, 0x75d59b45u,
   2436   0x7e89dc78u, 0x7f4bb64fu, 0x7d0d0816u, 0x7ccf6221u, 0x798074a4u, 0x78421e93u, 0x7a04a0cau, 0x7bc6cafdu,
   2437   0x6cbc2eb0u, 0x6d7e4487u, 0x6f38fadeu, 0x6efa90e9u, 0x6bb5866cu, 0x6a77ec5bu, 0x68315202u, 0x69f33835u,
   2438   0x62af7f08u, 0x636d153fu, 0x612bab66u, 0x60e9c151u, 0x65a6d7d4u, 0x6464bde3u, 0x662203bau, 0x67e0698du,
   2439   0x48d7cb20u, 0x4915a117u, 0x4b531f4eu, 0x4a917579u, 0x4fde63fcu, 0x4e1c09cbu, 0x4c5ab792u, 0x4d98dda5u,
   2440   0x46c49a98u, 0x4706f0afu, 0x45404ef6u, 0x448224c1u, 0x41cd3244u, 0x400f5873u, 0x4249e62au, 0x438b8c1du,
   2441   0x54f16850u, 0x55330267u, 0x5775bc3eu, 0x56b7d609u, 0x53f8c08cu, 0x523aaabbu, 0x507c14e2u, 0x51be7ed5u,
   2442   0x5ae239e8u, 0x5b2053dfu, 0x5966ed86u, 0x58a487b1u, 0x5deb9134u, 0x5c29fb03u, 0x5e6f455au, 0x5fad2f6du,
   2443   0xe1351b80u, 0xe0f771b7u, 0xe2b1cfeeu, 0xe373a5d9u, 0xe63cb35cu, 0xe7fed96bu, 0xe5b86732u, 0xe47a0d05u,
   2444   0xef264a38u, 0xeee4200fu, 0xeca29e56u, 0xed60f461u, 0xe82fe2e4u, 0xe9ed88d3u, 0xebab368au, 0xea695cbdu,
   2445   0xfd13b8f0u, 0xfcd1d2c7u, 0xfe976c9eu, 0xff5506a9u, 0xfa1a102cu, 0xfbd87a1bu, 0xf99ec442u, 0xf85cae75u,
   2446   0xf300e948u, 0xf2c2837fu, 0xf0843d26u, 0xf1465711u, 0xf4094194u, 0xf5cb2ba3u, 0xf78d95fau, 0xf64fffcdu,
   2447   0xd9785d60u, 0xd8ba3757u, 0xdafc890eu, 0xdb3ee339u, 0xde71f5bcu, 0xdfb39f8bu, 0xddf521d2u, 0xdc374be5u,
   2448   0xd76b0cd8u, 0xd6a966efu, 0xd4efd8b6u, 0xd52db281u, 0xd062a404u, 0xd1a0ce33u, 0xd3e6706au, 0xd2241a5du,
   2449   0xc55efe10u, 0xc49c9427u, 0xc6da2a7eu, 0xc7184049u, 0xc25756ccu, 0xc3953cfbu, 0xc1d382a2u, 0xc011e895u,
   2450   0xcb4dafa8u, 0xca8fc59fu, 0xc8c97bc6u, 0xc90b11f1u, 0xcc440774u, 0xcd866d43u, 0xcfc0d31au, 0xce02b92du,
   2451   0x91af9640u, 0x906dfc77u, 0x922b422eu, 0x93e92819u, 0x96a63e9cu, 0x976454abu, 0x9522eaf2u, 0x94e080c5u,
   2452   0x9fbcc7f8u, 0x9e7eadcfu, 0x9c381396u, 0x9dfa79a1u, 0x98b56f24u, 0x99770513u, 0x9b31bb4au, 0x9af3d17du,
   2453   0x8d893530u, 0x8c4b5f07u, 0x8e0de15eu, 0x8fcf8b69u, 0x8a809decu, 0x8b42f7dbu, 0x89044982u, 0x88c623b5u,
   2454   0x839a6488u, 0x82580ebfu, 0x801eb0e6u, 0x81dcdad1u, 0x8493cc54u, 0x8551a663u, 0x8717183au, 0x86d5720du,
   2455   0xa9e2d0a0u, 0xa820ba97u, 0xaa6604ceu, 0xaba46ef9u, 0xaeeb787cu, 0xaf29124bu, 0xad6fac12u, 0xacadc625u,
   2456   0xa7f18118u, 0xa633eb2fu, 0xa4755576u, 0xa5b73f41u, 0xa0f829c4u, 0xa13a43f3u, 0xa37cfdaau, 0xa2be979du,
   2457   0xb5c473d0u, 0xb40619e7u, 0xb640a7beu, 0xb782cd89u, 0xb2cddb0cu, 0xb30fb13bu, 0xb1490f62u, 0xb08b6555u,
   2458   0xbbd72268u, 0xba15485fu, 0xb853f606u, 0xb9919c31u, 0xbcde8ab4u, 0xbd1ce083u, 0xbf5a5edau, 0xbe9834edu
   2459 };
   2460 
   2461 static const unsigned lodepng_crc32_table3[256] = {
   2462   0x00000000u, 0xb8bc6765u, 0xaa09c88bu, 0x12b5afeeu, 0x8f629757u, 0x37def032u, 0x256b5fdcu, 0x9dd738b9u,
   2463   0xc5b428efu, 0x7d084f8au, 0x6fbde064u, 0xd7018701u, 0x4ad6bfb8u, 0xf26ad8ddu, 0xe0df7733u, 0x58631056u,
   2464   0x5019579fu, 0xe8a530fau, 0xfa109f14u, 0x42acf871u, 0xdf7bc0c8u, 0x67c7a7adu, 0x75720843u, 0xcdce6f26u,
   2465   0x95ad7f70u, 0x2d111815u, 0x3fa4b7fbu, 0x8718d09eu, 0x1acfe827u, 0xa2738f42u, 0xb0c620acu, 0x087a47c9u,
   2466   0xa032af3eu, 0x188ec85bu, 0x0a3b67b5u, 0xb28700d0u, 0x2f503869u, 0x97ec5f0cu, 0x8559f0e2u, 0x3de59787u,
   2467   0x658687d1u, 0xdd3ae0b4u, 0xcf8f4f5au, 0x7733283fu, 0xeae41086u, 0x525877e3u, 0x40edd80du, 0xf851bf68u,
   2468   0xf02bf8a1u, 0x48979fc4u, 0x5a22302au, 0xe29e574fu, 0x7f496ff6u, 0xc7f50893u, 0xd540a77du, 0x6dfcc018u,
   2469   0x359fd04eu, 0x8d23b72bu, 0x9f9618c5u, 0x272a7fa0u, 0xbafd4719u, 0x0241207cu, 0x10f48f92u, 0xa848e8f7u,
   2470   0x9b14583du, 0x23a83f58u, 0x311d90b6u, 0x89a1f7d3u, 0x1476cf6au, 0xaccaa80fu, 0xbe7f07e1u, 0x06c36084u,
   2471   0x5ea070d2u, 0xe61c17b7u, 0xf4a9b859u, 0x4c15df3cu, 0xd1c2e785u, 0x697e80e0u, 0x7bcb2f0eu, 0xc377486bu,
   2472   0xcb0d0fa2u, 0x73b168c7u, 0x6104c729u, 0xd9b8a04cu, 0x446f98f5u, 0xfcd3ff90u, 0xee66507eu, 0x56da371bu,
   2473   0x0eb9274du, 0xb6054028u, 0xa4b0efc6u, 0x1c0c88a3u, 0x81dbb01au, 0x3967d77fu, 0x2bd27891u, 0x936e1ff4u,
   2474   0x3b26f703u, 0x839a9066u, 0x912f3f88u, 0x299358edu, 0xb4446054u, 0x0cf80731u, 0x1e4da8dfu, 0xa6f1cfbau,
   2475   0xfe92dfecu, 0x462eb889u, 0x549b1767u, 0xec277002u, 0x71f048bbu, 0xc94c2fdeu, 0xdbf98030u, 0x6345e755u,
   2476   0x6b3fa09cu, 0xd383c7f9u, 0xc1366817u, 0x798a0f72u, 0xe45d37cbu, 0x5ce150aeu, 0x4e54ff40u, 0xf6e89825u,
   2477   0xae8b8873u, 0x1637ef16u, 0x048240f8u, 0xbc3e279du, 0x21e91f24u, 0x99557841u, 0x8be0d7afu, 0x335cb0cau,
   2478   0xed59b63bu, 0x55e5d15eu, 0x47507eb0u, 0xffec19d5u, 0x623b216cu, 0xda874609u, 0xc832e9e7u, 0x708e8e82u,
   2479   0x28ed9ed4u, 0x9051f9b1u, 0x82e4565fu, 0x3a58313au, 0xa78f0983u, 0x1f336ee6u, 0x0d86c108u, 0xb53aa66du,
   2480   0xbd40e1a4u, 0x05fc86c1u, 0x1749292fu, 0xaff54e4au, 0x322276f3u, 0x8a9e1196u, 0x982bbe78u, 0x2097d91du,
   2481   0x78f4c94bu, 0xc048ae2eu, 0xd2fd01c0u, 0x6a4166a5u, 0xf7965e1cu, 0x4f2a3979u, 0x5d9f9697u, 0xe523f1f2u,
   2482   0x4d6b1905u, 0xf5d77e60u, 0xe762d18eu, 0x5fdeb6ebu, 0xc2098e52u, 0x7ab5e937u, 0x680046d9u, 0xd0bc21bcu,
   2483   0x88df31eau, 0x3063568fu, 0x22d6f961u, 0x9a6a9e04u, 0x07bda6bdu, 0xbf01c1d8u, 0xadb46e36u, 0x15080953u,
   2484   0x1d724e9au, 0xa5ce29ffu, 0xb77b8611u, 0x0fc7e174u, 0x9210d9cdu, 0x2aacbea8u, 0x38191146u, 0x80a57623u,
   2485   0xd8c66675u, 0x607a0110u, 0x72cfaefeu, 0xca73c99bu, 0x57a4f122u, 0xef189647u, 0xfdad39a9u, 0x45115eccu,
   2486   0x764dee06u, 0xcef18963u, 0xdc44268du, 0x64f841e8u, 0xf92f7951u, 0x41931e34u, 0x5326b1dau, 0xeb9ad6bfu,
   2487   0xb3f9c6e9u, 0x0b45a18cu, 0x19f00e62u, 0xa14c6907u, 0x3c9b51beu, 0x842736dbu, 0x96929935u, 0x2e2efe50u,
   2488   0x2654b999u, 0x9ee8defcu, 0x8c5d7112u, 0x34e11677u, 0xa9362eceu, 0x118a49abu, 0x033fe645u, 0xbb838120u,
   2489   0xe3e09176u, 0x5b5cf613u, 0x49e959fdu, 0xf1553e98u, 0x6c820621u, 0xd43e6144u, 0xc68bceaau, 0x7e37a9cfu,
   2490   0xd67f4138u, 0x6ec3265du, 0x7c7689b3u, 0xc4caeed6u, 0x591dd66fu, 0xe1a1b10au, 0xf3141ee4u, 0x4ba87981u,
   2491   0x13cb69d7u, 0xab770eb2u, 0xb9c2a15cu, 0x017ec639u, 0x9ca9fe80u, 0x241599e5u, 0x36a0360bu, 0x8e1c516eu,
   2492   0x866616a7u, 0x3eda71c2u, 0x2c6fde2cu, 0x94d3b949u, 0x090481f0u, 0xb1b8e695u, 0xa30d497bu, 0x1bb12e1eu,
   2493   0x43d23e48u, 0xfb6e592du, 0xe9dbf6c3u, 0x516791a6u, 0xccb0a91fu, 0x740cce7au, 0x66b96194u, 0xde0506f1u
   2494 };
   2495 
   2496 static const unsigned lodepng_crc32_table4[256] = {
   2497   0x00000000u, 0x3d6029b0u, 0x7ac05360u, 0x47a07ad0u, 0xf580a6c0u, 0xc8e08f70u, 0x8f40f5a0u, 0xb220dc10u,
   2498   0x30704bc1u, 0x0d106271u, 0x4ab018a1u, 0x77d03111u, 0xc5f0ed01u, 0xf890c4b1u, 0xbf30be61u, 0x825097d1u,
   2499   0x60e09782u, 0x5d80be32u, 0x1a20c4e2u, 0x2740ed52u, 0x95603142u, 0xa80018f2u, 0xefa06222u, 0xd2c04b92u,
   2500   0x5090dc43u, 0x6df0f5f3u, 0x2a508f23u, 0x1730a693u, 0xa5107a83u, 0x98705333u, 0xdfd029e3u, 0xe2b00053u,
   2501   0xc1c12f04u, 0xfca106b4u, 0xbb017c64u, 0x866155d4u, 0x344189c4u, 0x0921a074u, 0x4e81daa4u, 0x73e1f314u,
   2502   0xf1b164c5u, 0xccd14d75u, 0x8b7137a5u, 0xb6111e15u, 0x0431c205u, 0x3951ebb5u, 0x7ef19165u, 0x4391b8d5u,
   2503   0xa121b886u, 0x9c419136u, 0xdbe1ebe6u, 0xe681c256u, 0x54a11e46u, 0x69c137f6u, 0x2e614d26u, 0x13016496u,
   2504   0x9151f347u, 0xac31daf7u, 0xeb91a027u, 0xd6f18997u, 0x64d15587u, 0x59b17c37u, 0x1e1106e7u, 0x23712f57u,
   2505   0x58f35849u, 0x659371f9u, 0x22330b29u, 0x1f532299u, 0xad73fe89u, 0x9013d739u, 0xd7b3ade9u, 0xead38459u,
   2506   0x68831388u, 0x55e33a38u, 0x124340e8u, 0x2f236958u, 0x9d03b548u, 0xa0639cf8u, 0xe7c3e628u, 0xdaa3cf98u,
   2507   0x3813cfcbu, 0x0573e67bu, 0x42d39cabu, 0x7fb3b51bu, 0xcd93690bu, 0xf0f340bbu, 0xb7533a6bu, 0x8a3313dbu,
   2508   0x0863840au, 0x3503adbau, 0x72a3d76au, 0x4fc3fedau, 0xfde322cau, 0xc0830b7au, 0x872371aau, 0xba43581au,
   2509   0x9932774du, 0xa4525efdu, 0xe3f2242du, 0xde920d9du, 0x6cb2d18du, 0x51d2f83du, 0x167282edu, 0x2b12ab5du,
   2510   0xa9423c8cu, 0x9422153cu, 0xd3826fecu, 0xeee2465cu, 0x5cc29a4cu, 0x61a2b3fcu, 0x2602c92cu, 0x1b62e09cu,
   2511   0xf9d2e0cfu, 0xc4b2c97fu, 0x8312b3afu, 0xbe729a1fu, 0x0c52460fu, 0x31326fbfu, 0x7692156fu, 0x4bf23cdfu,
   2512   0xc9a2ab0eu, 0xf4c282beu, 0xb362f86eu, 0x8e02d1deu, 0x3c220dceu, 0x0142247eu, 0x46e25eaeu, 0x7b82771eu,
   2513   0xb1e6b092u, 0x8c869922u, 0xcb26e3f2u, 0xf646ca42u, 0x44661652u, 0x79063fe2u, 0x3ea64532u, 0x03c66c82u,
   2514   0x8196fb53u, 0xbcf6d2e3u, 0xfb56a833u, 0xc6368183u, 0x74165d93u, 0x49767423u, 0x0ed60ef3u, 0x33b62743u,
   2515   0xd1062710u, 0xec660ea0u, 0xabc67470u, 0x96a65dc0u, 0x248681d0u, 0x19e6a860u, 0x5e46d2b0u, 0x6326fb00u,
   2516   0xe1766cd1u, 0xdc164561u, 0x9bb63fb1u, 0xa6d61601u, 0x14f6ca11u, 0x2996e3a1u, 0x6e369971u, 0x5356b0c1u,
   2517   0x70279f96u, 0x4d47b626u, 0x0ae7ccf6u, 0x3787e546u, 0x85a73956u, 0xb8c710e6u, 0xff676a36u, 0xc2074386u,
   2518   0x4057d457u, 0x7d37fde7u, 0x3a978737u, 0x07f7ae87u, 0xb5d77297u, 0x88b75b27u, 0xcf1721f7u, 0xf2770847u,
   2519   0x10c70814u, 0x2da721a4u, 0x6a075b74u, 0x576772c4u, 0xe547aed4u, 0xd8278764u, 0x9f87fdb4u, 0xa2e7d404u,
   2520   0x20b743d5u, 0x1dd76a65u, 0x5a7710b5u, 0x67173905u, 0xd537e515u, 0xe857cca5u, 0xaff7b675u, 0x92979fc5u,
   2521   0xe915e8dbu, 0xd475c16bu, 0x93d5bbbbu, 0xaeb5920bu, 0x1c954e1bu, 0x21f567abu, 0x66551d7bu, 0x5b3534cbu,
   2522   0xd965a31au, 0xe4058aaau, 0xa3a5f07au, 0x9ec5d9cau, 0x2ce505dau, 0x11852c6au, 0x562556bau, 0x6b457f0au,
   2523   0x89f57f59u, 0xb49556e9u, 0xf3352c39u, 0xce550589u, 0x7c75d999u, 0x4115f029u, 0x06b58af9u, 0x3bd5a349u,
   2524   0xb9853498u, 0x84e51d28u, 0xc34567f8u, 0xfe254e48u, 0x4c059258u, 0x7165bbe8u, 0x36c5c138u, 0x0ba5e888u,
   2525   0x28d4c7dfu, 0x15b4ee6fu, 0x521494bfu, 0x6f74bd0fu, 0xdd54611fu, 0xe03448afu, 0xa794327fu, 0x9af41bcfu,
   2526   0x18a48c1eu, 0x25c4a5aeu, 0x6264df7eu, 0x5f04f6ceu, 0xed242adeu, 0xd044036eu, 0x97e479beu, 0xaa84500eu,
   2527   0x4834505du, 0x755479edu, 0x32f4033du, 0x0f942a8du, 0xbdb4f69du, 0x80d4df2du, 0xc774a5fdu, 0xfa148c4du,
   2528   0x78441b9cu, 0x4524322cu, 0x028448fcu, 0x3fe4614cu, 0x8dc4bd5cu, 0xb0a494ecu, 0xf704ee3cu, 0xca64c78cu
   2529 };
   2530 
   2531 static const unsigned lodepng_crc32_table5[256] = {
   2532   0x00000000u, 0xcb5cd3a5u, 0x4dc8a10bu, 0x869472aeu, 0x9b914216u, 0x50cd91b3u, 0xd659e31du, 0x1d0530b8u,
   2533   0xec53826du, 0x270f51c8u, 0xa19b2366u, 0x6ac7f0c3u, 0x77c2c07bu, 0xbc9e13deu, 0x3a0a6170u, 0xf156b2d5u,
   2534   0x03d6029bu, 0xc88ad13eu, 0x4e1ea390u, 0x85427035u, 0x9847408du, 0x531b9328u, 0xd58fe186u, 0x1ed33223u,
   2535   0xef8580f6u, 0x24d95353u, 0xa24d21fdu, 0x6911f258u, 0x7414c2e0u, 0xbf481145u, 0x39dc63ebu, 0xf280b04eu,
   2536   0x07ac0536u, 0xccf0d693u, 0x4a64a43du, 0x81387798u, 0x9c3d4720u, 0x57619485u, 0xd1f5e62bu, 0x1aa9358eu,
   2537   0xebff875bu, 0x20a354feu, 0xa6372650u, 0x6d6bf5f5u, 0x706ec54du, 0xbb3216e8u, 0x3da66446u, 0xf6fab7e3u,
   2538   0x047a07adu, 0xcf26d408u, 0x49b2a6a6u, 0x82ee7503u, 0x9feb45bbu, 0x54b7961eu, 0xd223e4b0u, 0x197f3715u,
   2539   0xe82985c0u, 0x23755665u, 0xa5e124cbu, 0x6ebdf76eu, 0x73b8c7d6u, 0xb8e41473u, 0x3e7066ddu, 0xf52cb578u,
   2540   0x0f580a6cu, 0xc404d9c9u, 0x4290ab67u, 0x89cc78c2u, 0x94c9487au, 0x5f959bdfu, 0xd901e971u, 0x125d3ad4u,
   2541   0xe30b8801u, 0x28575ba4u, 0xaec3290au, 0x659ffaafu, 0x789aca17u, 0xb3c619b2u, 0x35526b1cu, 0xfe0eb8b9u,
   2542   0x0c8e08f7u, 0xc7d2db52u, 0x4146a9fcu, 0x8a1a7a59u, 0x971f4ae1u, 0x5c439944u, 0xdad7ebeau, 0x118b384fu,
   2543   0xe0dd8a9au, 0x2b81593fu, 0xad152b91u, 0x6649f834u, 0x7b4cc88cu, 0xb0101b29u, 0x36846987u, 0xfdd8ba22u,
   2544   0x08f40f5au, 0xc3a8dcffu, 0x453cae51u, 0x8e607df4u, 0x93654d4cu, 0x58399ee9u, 0xdeadec47u, 0x15f13fe2u,
   2545   0xe4a78d37u, 0x2ffb5e92u, 0xa96f2c3cu, 0x6233ff99u, 0x7f36cf21u, 0xb46a1c84u, 0x32fe6e2au, 0xf9a2bd8fu,
   2546   0x0b220dc1u, 0xc07ede64u, 0x46eaaccau, 0x8db67f6fu, 0x90b34fd7u, 0x5bef9c72u, 0xdd7beedcu, 0x16273d79u,
   2547   0xe7718facu, 0x2c2d5c09u, 0xaab92ea7u, 0x61e5fd02u, 0x7ce0cdbau, 0xb7bc1e1fu, 0x31286cb1u, 0xfa74bf14u,
   2548   0x1eb014d8u, 0xd5ecc77du, 0x5378b5d3u, 0x98246676u, 0x852156ceu, 0x4e7d856bu, 0xc8e9f7c5u, 0x03b52460u,
   2549   0xf2e396b5u, 0x39bf4510u, 0xbf2b37beu, 0x7477e41bu, 0x6972d4a3u, 0xa22e0706u, 0x24ba75a8u, 0xefe6a60du,
   2550   0x1d661643u, 0xd63ac5e6u, 0x50aeb748u, 0x9bf264edu, 0x86f75455u, 0x4dab87f0u, 0xcb3ff55eu, 0x006326fbu,
   2551   0xf135942eu, 0x3a69478bu, 0xbcfd3525u, 0x77a1e680u, 0x6aa4d638u, 0xa1f8059du, 0x276c7733u, 0xec30a496u,
   2552   0x191c11eeu, 0xd240c24bu, 0x54d4b0e5u, 0x9f886340u, 0x828d53f8u, 0x49d1805du, 0xcf45f2f3u, 0x04192156u,
   2553   0xf54f9383u, 0x3e134026u, 0xb8873288u, 0x73dbe12du, 0x6eded195u, 0xa5820230u, 0x2316709eu, 0xe84aa33bu,
   2554   0x1aca1375u, 0xd196c0d0u, 0x5702b27eu, 0x9c5e61dbu, 0x815b5163u, 0x4a0782c6u, 0xcc93f068u, 0x07cf23cdu,
   2555   0xf6999118u, 0x3dc542bdu, 0xbb513013u, 0x700de3b6u, 0x6d08d30eu, 0xa65400abu, 0x20c07205u, 0xeb9ca1a0u,
   2556   0x11e81eb4u, 0xdab4cd11u, 0x5c20bfbfu, 0x977c6c1au, 0x8a795ca2u, 0x41258f07u, 0xc7b1fda9u, 0x0ced2e0cu,
   2557   0xfdbb9cd9u, 0x36e74f7cu, 0xb0733dd2u, 0x7b2fee77u, 0x662adecfu, 0xad760d6au, 0x2be27fc4u, 0xe0beac61u,
   2558   0x123e1c2fu, 0xd962cf8au, 0x5ff6bd24u, 0x94aa6e81u, 0x89af5e39u, 0x42f38d9cu, 0xc467ff32u, 0x0f3b2c97u,
   2559   0xfe6d9e42u, 0x35314de7u, 0xb3a53f49u, 0x78f9ececu, 0x65fcdc54u, 0xaea00ff1u, 0x28347d5fu, 0xe368aefau,
   2560   0x16441b82u, 0xdd18c827u, 0x5b8cba89u, 0x90d0692cu, 0x8dd55994u, 0x46898a31u, 0xc01df89fu, 0x0b412b3au,
   2561   0xfa1799efu, 0x314b4a4au, 0xb7df38e4u, 0x7c83eb41u, 0x6186dbf9u, 0xaada085cu, 0x2c4e7af2u, 0xe712a957u,
   2562   0x15921919u, 0xdececabcu, 0x585ab812u, 0x93066bb7u, 0x8e035b0fu, 0x455f88aau, 0xc3cbfa04u, 0x089729a1u,
   2563   0xf9c19b74u, 0x329d48d1u, 0xb4093a7fu, 0x7f55e9dau, 0x6250d962u, 0xa90c0ac7u, 0x2f987869u, 0xe4c4abccu
   2564 };
   2565 
   2566 static const unsigned lodepng_crc32_table6[256] = {
   2567   0x00000000u, 0xa6770bb4u, 0x979f1129u, 0x31e81a9du, 0xf44f2413u, 0x52382fa7u, 0x63d0353au, 0xc5a73e8eu,
   2568   0x33ef4e67u, 0x959845d3u, 0xa4705f4eu, 0x020754fau, 0xc7a06a74u, 0x61d761c0u, 0x503f7b5du, 0xf64870e9u,
   2569   0x67de9cceu, 0xc1a9977au, 0xf0418de7u, 0x56368653u, 0x9391b8ddu, 0x35e6b369u, 0x040ea9f4u, 0xa279a240u,
   2570   0x5431d2a9u, 0xf246d91du, 0xc3aec380u, 0x65d9c834u, 0xa07ef6bau, 0x0609fd0eu, 0x37e1e793u, 0x9196ec27u,
   2571   0xcfbd399cu, 0x69ca3228u, 0x582228b5u, 0xfe552301u, 0x3bf21d8fu, 0x9d85163bu, 0xac6d0ca6u, 0x0a1a0712u,
   2572   0xfc5277fbu, 0x5a257c4fu, 0x6bcd66d2u, 0xcdba6d66u, 0x081d53e8u, 0xae6a585cu, 0x9f8242c1u, 0x39f54975u,
   2573   0xa863a552u, 0x0e14aee6u, 0x3ffcb47bu, 0x998bbfcfu, 0x5c2c8141u, 0xfa5b8af5u, 0xcbb39068u, 0x6dc49bdcu,
   2574   0x9b8ceb35u, 0x3dfbe081u, 0x0c13fa1cu, 0xaa64f1a8u, 0x6fc3cf26u, 0xc9b4c492u, 0xf85cde0fu, 0x5e2bd5bbu,
   2575   0x440b7579u, 0xe27c7ecdu, 0xd3946450u, 0x75e36fe4u, 0xb044516au, 0x16335adeu, 0x27db4043u, 0x81ac4bf7u,
   2576   0x77e43b1eu, 0xd19330aau, 0xe07b2a37u, 0x460c2183u, 0x83ab1f0du, 0x25dc14b9u, 0x14340e24u, 0xb2430590u,
   2577   0x23d5e9b7u, 0x85a2e203u, 0xb44af89eu, 0x123df32au, 0xd79acda4u, 0x71edc610u, 0x4005dc8du, 0xe672d739u,
   2578   0x103aa7d0u, 0xb64dac64u, 0x87a5b6f9u, 0x21d2bd4du, 0xe47583c3u, 0x42028877u, 0x73ea92eau, 0xd59d995eu,
   2579   0x8bb64ce5u, 0x2dc14751u, 0x1c295dccu, 0xba5e5678u, 0x7ff968f6u, 0xd98e6342u, 0xe86679dfu, 0x4e11726bu,
   2580   0xb8590282u, 0x1e2e0936u, 0x2fc613abu, 0x89b1181fu, 0x4c162691u, 0xea612d25u, 0xdb8937b8u, 0x7dfe3c0cu,
   2581   0xec68d02bu, 0x4a1fdb9fu, 0x7bf7c102u, 0xdd80cab6u, 0x1827f438u, 0xbe50ff8cu, 0x8fb8e511u, 0x29cfeea5u,
   2582   0xdf879e4cu, 0x79f095f8u, 0x48188f65u, 0xee6f84d1u, 0x2bc8ba5fu, 0x8dbfb1ebu, 0xbc57ab76u, 0x1a20a0c2u,
   2583   0x8816eaf2u, 0x2e61e146u, 0x1f89fbdbu, 0xb9fef06fu, 0x7c59cee1u, 0xda2ec555u, 0xebc6dfc8u, 0x4db1d47cu,
   2584   0xbbf9a495u, 0x1d8eaf21u, 0x2c66b5bcu, 0x8a11be08u, 0x4fb68086u, 0xe9c18b32u, 0xd82991afu, 0x7e5e9a1bu,
   2585   0xefc8763cu, 0x49bf7d88u, 0x78576715u, 0xde206ca1u, 0x1b87522fu, 0xbdf0599bu, 0x8c184306u, 0x2a6f48b2u,
   2586   0xdc27385bu, 0x7a5033efu, 0x4bb82972u, 0xedcf22c6u, 0x28681c48u, 0x8e1f17fcu, 0xbff70d61u, 0x198006d5u,
   2587   0x47abd36eu, 0xe1dcd8dau, 0xd034c247u, 0x7643c9f3u, 0xb3e4f77du, 0x1593fcc9u, 0x247be654u, 0x820cede0u,
   2588   0x74449d09u, 0xd23396bdu, 0xe3db8c20u, 0x45ac8794u, 0x800bb91au, 0x267cb2aeu, 0x1794a833u, 0xb1e3a387u,
   2589   0x20754fa0u, 0x86024414u, 0xb7ea5e89u, 0x119d553du, 0xd43a6bb3u, 0x724d6007u, 0x43a57a9au, 0xe5d2712eu,
   2590   0x139a01c7u, 0xb5ed0a73u, 0x840510eeu, 0x22721b5au, 0xe7d525d4u, 0x41a22e60u, 0x704a34fdu, 0xd63d3f49u,
   2591   0xcc1d9f8bu, 0x6a6a943fu, 0x5b828ea2u, 0xfdf58516u, 0x3852bb98u, 0x9e25b02cu, 0xafcdaab1u, 0x09baa105u,
   2592   0xfff2d1ecu, 0x5985da58u, 0x686dc0c5u, 0xce1acb71u, 0x0bbdf5ffu, 0xadcafe4bu, 0x9c22e4d6u, 0x3a55ef62u,
   2593   0xabc30345u, 0x0db408f1u, 0x3c5c126cu, 0x9a2b19d8u, 0x5f8c2756u, 0xf9fb2ce2u, 0xc813367fu, 0x6e643dcbu,
   2594   0x982c4d22u, 0x3e5b4696u, 0x0fb35c0bu, 0xa9c457bfu, 0x6c636931u, 0xca146285u, 0xfbfc7818u, 0x5d8b73acu,
   2595   0x03a0a617u, 0xa5d7ada3u, 0x943fb73eu, 0x3248bc8au, 0xf7ef8204u, 0x519889b0u, 0x6070932du, 0xc6079899u,
   2596   0x304fe870u, 0x9638e3c4u, 0xa7d0f959u, 0x01a7f2edu, 0xc400cc63u, 0x6277c7d7u, 0x539fdd4au, 0xf5e8d6feu,
   2597   0x647e3ad9u, 0xc209316du, 0xf3e12bf0u, 0x55962044u, 0x90311ecau, 0x3646157eu, 0x07ae0fe3u, 0xa1d90457u,
   2598   0x579174beu, 0xf1e67f0au, 0xc00e6597u, 0x66796e23u, 0xa3de50adu, 0x05a95b19u, 0x34414184u, 0x92364a30u
   2599 };
   2600 
   2601 static const unsigned lodepng_crc32_table7[256] = {
   2602   0x00000000u, 0xccaa009eu, 0x4225077du, 0x8e8f07e3u, 0x844a0efau, 0x48e00e64u, 0xc66f0987u, 0x0ac50919u,
   2603   0xd3e51bb5u, 0x1f4f1b2bu, 0x91c01cc8u, 0x5d6a1c56u, 0x57af154fu, 0x9b0515d1u, 0x158a1232u, 0xd92012acu,
   2604   0x7cbb312bu, 0xb01131b5u, 0x3e9e3656u, 0xf23436c8u, 0xf8f13fd1u, 0x345b3f4fu, 0xbad438acu, 0x767e3832u,
   2605   0xaf5e2a9eu, 0x63f42a00u, 0xed7b2de3u, 0x21d12d7du, 0x2b142464u, 0xe7be24fau, 0x69312319u, 0xa59b2387u,
   2606   0xf9766256u, 0x35dc62c8u, 0xbb53652bu, 0x77f965b5u, 0x7d3c6cacu, 0xb1966c32u, 0x3f196bd1u, 0xf3b36b4fu,
   2607   0x2a9379e3u, 0xe639797du, 0x68b67e9eu, 0xa41c7e00u, 0xaed97719u, 0x62737787u, 0xecfc7064u, 0x205670fau,
   2608   0x85cd537du, 0x496753e3u, 0xc7e85400u, 0x0b42549eu, 0x01875d87u, 0xcd2d5d19u, 0x43a25afau, 0x8f085a64u,
   2609   0x562848c8u, 0x9a824856u, 0x140d4fb5u, 0xd8a74f2bu, 0xd2624632u, 0x1ec846acu, 0x9047414fu, 0x5ced41d1u,
   2610   0x299dc2edu, 0xe537c273u, 0x6bb8c590u, 0xa712c50eu, 0xadd7cc17u, 0x617dcc89u, 0xeff2cb6au, 0x2358cbf4u,
   2611   0xfa78d958u, 0x36d2d9c6u, 0xb85dde25u, 0x74f7debbu, 0x7e32d7a2u, 0xb298d73cu, 0x3c17d0dfu, 0xf0bdd041u,
   2612   0x5526f3c6u, 0x998cf358u, 0x1703f4bbu, 0xdba9f425u, 0xd16cfd3cu, 0x1dc6fda2u, 0x9349fa41u, 0x5fe3fadfu,
   2613   0x86c3e873u, 0x4a69e8edu, 0xc4e6ef0eu, 0x084cef90u, 0x0289e689u, 0xce23e617u, 0x40ace1f4u, 0x8c06e16au,
   2614   0xd0eba0bbu, 0x1c41a025u, 0x92cea7c6u, 0x5e64a758u, 0x54a1ae41u, 0x980baedfu, 0x1684a93cu, 0xda2ea9a2u,
   2615   0x030ebb0eu, 0xcfa4bb90u, 0x412bbc73u, 0x8d81bcedu, 0x8744b5f4u, 0x4beeb56au, 0xc561b289u, 0x09cbb217u,
   2616   0xac509190u, 0x60fa910eu, 0xee7596edu, 0x22df9673u, 0x281a9f6au, 0xe4b09ff4u, 0x6a3f9817u, 0xa6959889u,
   2617   0x7fb58a25u, 0xb31f8abbu, 0x3d908d58u, 0xf13a8dc6u, 0xfbff84dfu, 0x37558441u, 0xb9da83a2u, 0x7570833cu,
   2618   0x533b85dau, 0x9f918544u, 0x111e82a7u, 0xddb48239u, 0xd7718b20u, 0x1bdb8bbeu, 0x95548c5du, 0x59fe8cc3u,
   2619   0x80de9e6fu, 0x4c749ef1u, 0xc2fb9912u, 0x0e51998cu, 0x04949095u, 0xc83e900bu, 0x46b197e8u, 0x8a1b9776u,
   2620   0x2f80b4f1u, 0xe32ab46fu, 0x6da5b38cu, 0xa10fb312u, 0xabcaba0bu, 0x6760ba95u, 0xe9efbd76u, 0x2545bde8u,
   2621   0xfc65af44u, 0x30cfafdau, 0xbe40a839u, 0x72eaa8a7u, 0x782fa1beu, 0xb485a120u, 0x3a0aa6c3u, 0xf6a0a65du,
   2622   0xaa4de78cu, 0x66e7e712u, 0xe868e0f1u, 0x24c2e06fu, 0x2e07e976u, 0xe2ade9e8u, 0x6c22ee0bu, 0xa088ee95u,
   2623   0x79a8fc39u, 0xb502fca7u, 0x3b8dfb44u, 0xf727fbdau, 0xfde2f2c3u, 0x3148f25du, 0xbfc7f5beu, 0x736df520u,
   2624   0xd6f6d6a7u, 0x1a5cd639u, 0x94d3d1dau, 0x5879d144u, 0x52bcd85du, 0x9e16d8c3u, 0x1099df20u, 0xdc33dfbeu,
   2625   0x0513cd12u, 0xc9b9cd8cu, 0x4736ca6fu, 0x8b9ccaf1u, 0x8159c3e8u, 0x4df3c376u, 0xc37cc495u, 0x0fd6c40bu,
   2626   0x7aa64737u, 0xb60c47a9u, 0x3883404au, 0xf42940d4u, 0xfeec49cdu, 0x32464953u, 0xbcc94eb0u, 0x70634e2eu,
   2627   0xa9435c82u, 0x65e95c1cu, 0xeb665bffu, 0x27cc5b61u, 0x2d095278u, 0xe1a352e6u, 0x6f2c5505u, 0xa386559bu,
   2628   0x061d761cu, 0xcab77682u, 0x44387161u, 0x889271ffu, 0x825778e6u, 0x4efd7878u, 0xc0727f9bu, 0x0cd87f05u,
   2629   0xd5f86da9u, 0x19526d37u, 0x97dd6ad4u, 0x5b776a4au, 0x51b26353u, 0x9d1863cdu, 0x1397642eu, 0xdf3d64b0u,
   2630   0x83d02561u, 0x4f7a25ffu, 0xc1f5221cu, 0x0d5f2282u, 0x079a2b9bu, 0xcb302b05u, 0x45bf2ce6u, 0x89152c78u,
   2631   0x50353ed4u, 0x9c9f3e4au, 0x121039a9u, 0xdeba3937u, 0xd47f302eu, 0x18d530b0u, 0x965a3753u, 0x5af037cdu,
   2632   0xff6b144au, 0x33c114d4u, 0xbd4e1337u, 0x71e413a9u, 0x7b211ab0u, 0xb78b1a2eu, 0x39041dcdu, 0xf5ae1d53u,
   2633   0x2c8e0fffu, 0xe0240f61u, 0x6eab0882u, 0xa201081cu, 0xa8c40105u, 0x646e019bu, 0xeae10678u, 0x264b06e6u
   2634 };
   2635 
   2636 /* Computes the cyclic redundancy check as used by PNG chunks*/
   2637 unsigned lodepng_crc32(const unsigned char* data, size_t length) {
   2638   /*Using the Slicing by Eight algorithm*/
   2639   unsigned r = 0xffffffffu;
   2640   while(length >= 8) {
   2641     r = lodepng_crc32_table7[(data[0] ^ (r & 0xffu))] ^
   2642         lodepng_crc32_table6[(data[1] ^ ((r >> 8) & 0xffu))] ^
   2643         lodepng_crc32_table5[(data[2] ^ ((r >> 16) & 0xffu))] ^
   2644         lodepng_crc32_table4[(data[3] ^ ((r >> 24) & 0xffu))] ^
   2645         lodepng_crc32_table3[data[4]] ^
   2646         lodepng_crc32_table2[data[5]] ^
   2647         lodepng_crc32_table1[data[6]] ^
   2648         lodepng_crc32_table0[data[7]];
   2649     data += 8;
   2650     length -= 8;
   2651   }
   2652   while(length--) {
   2653     r = lodepng_crc32_table0[(r ^ *data++) & 0xffu] ^ (r >> 8);
   2654   }
   2655   return r ^ 0xffffffffu;
   2656 }
   2657 #else /* LODEPNG_COMPILE_CRC */
   2658 /*in this case, the function is only declared here, and must be defined externally
   2659 so that it will be linked in.
   2660 
   2661 Example implementation that uses a much smaller lookup table for memory constrained cases:
   2662 
   2663 unsigned lodepng_crc32(const unsigned char* data, size_t length) {
   2664   unsigned r = 0xffffffffu;
   2665   static const unsigned table[16] = {
   2666     0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
   2667     0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
   2668   };
   2669   while(length--) {
   2670     r = table[(r ^ *data) & 0xf] ^ (r >> 4);
   2671     r = table[(r ^ (*data >> 4)) & 0xf] ^ (r >> 4);
   2672     data++;
   2673   }
   2674   return r ^ 0xffffffffu;
   2675 }
   2676 */
   2677 unsigned lodepng_crc32(const unsigned char* data, size_t length);
   2678 #endif /* LODEPNG_COMPILE_CRC */
   2679 
   2680 /* ////////////////////////////////////////////////////////////////////////// */
   2681 /* / Reading and writing PNG color channel bits                             / */
   2682 /* ////////////////////////////////////////////////////////////////////////// */
   2683 
   2684 /* The color channel bits of less-than-8-bit pixels are read with the MSB of bytes first,
   2685 so LodePNGBitWriter and LodePNGBitReader can't be used for those. */
   2686 
   2687 static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) {
   2688   unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1);
   2689   ++(*bitpointer);
   2690   return result;
   2691 }
   2692 
   2693 /* TODO: make this faster */
   2694 static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) {
   2695   unsigned result = 0;
   2696   size_t i;
   2697   for(i = 0 ; i < nbits; ++i) {
   2698     result <<= 1u;
   2699     result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream);
   2700   }
   2701   return result;
   2702 }
   2703 
   2704 static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) {
   2705   /*the current bit in bitstream may be 0 or 1 for this to work*/
   2706   if(bit == 0) bitstream[(*bitpointer) >> 3u] &=  (unsigned char)(~(1u << (7u - ((*bitpointer) & 7u))));
   2707   else         bitstream[(*bitpointer) >> 3u] |=  (1u << (7u - ((*bitpointer) & 7u)));
   2708   ++(*bitpointer);
   2709 }
   2710 
   2711 /* ////////////////////////////////////////////////////////////////////////// */
   2712 /* / PNG chunks                                                             / */
   2713 /* ////////////////////////////////////////////////////////////////////////// */
   2714 
   2715 unsigned lodepng_chunk_length(const unsigned char* chunk) {
   2716   return lodepng_read32bitInt(chunk);
   2717 }
   2718 
   2719 void lodepng_chunk_type(char type[5], const unsigned char* chunk) {
   2720   unsigned i;
   2721   for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i];
   2722   type[4] = 0; /*null termination char*/
   2723 }
   2724 
   2725 unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) {
   2726   if(lodepng_strlen(type) != 4) return 0;
   2727   return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]);
   2728 }
   2729 
   2730 /* chunk type name must exist only out of alphabetic characters a-z or A-Z */
   2731 static unsigned char lodepng_chunk_type_name_valid(const unsigned char* chunk) {
   2732   unsigned i;
   2733   for(i = 0; i != 4; ++i) {
   2734     char c = (char)chunk[4 + i];
   2735     if(!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {
   2736       return 0; /* not valid */
   2737     }
   2738   }
   2739   return 1; /* valid */
   2740 }
   2741 
   2742 unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) {
   2743   return((chunk[4] & 32) != 0);
   2744 }
   2745 
   2746 unsigned char lodepng_chunk_private(const unsigned char* chunk) {
   2747   return((chunk[5] & 32) != 0);
   2748 }
   2749 
   2750 /* this is an error if it is reserved: the third character must be uppercase in the PNG standard,
   2751 lowercasing this character is reserved for possible future extension by the spec*/
   2752 static unsigned char lodepng_chunk_reserved(const unsigned char* chunk) {
   2753   return((chunk[6] & 32) != 0);
   2754 }
   2755 
   2756 unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) {
   2757   return((chunk[7] & 32) != 0);
   2758 }
   2759 
   2760 unsigned char* lodepng_chunk_data(unsigned char* chunk) {
   2761   return &chunk[8];
   2762 }
   2763 
   2764 const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) {
   2765   return &chunk[8];
   2766 }
   2767 
   2768 unsigned lodepng_chunk_check_crc(const unsigned char* chunk) {
   2769   unsigned length = lodepng_chunk_length(chunk);
   2770   unsigned crc = lodepng_read32bitInt(&chunk[length + 8]);
   2771   /*the CRC is taken of the data and the 4 chunk type letters, not the length*/
   2772   unsigned checksum = lodepng_crc32(&chunk[4], length + 4);
   2773   if(crc != checksum) return 1;
   2774   else return 0;
   2775 }
   2776 
   2777 void lodepng_chunk_generate_crc(unsigned char* chunk) {
   2778   unsigned length = lodepng_chunk_length(chunk);
   2779   unsigned crc = lodepng_crc32(&chunk[4], length + 4);
   2780   lodepng_set32bitInt(chunk + 8 + length, crc);
   2781 }
   2782 
   2783 unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end) {
   2784   size_t available_size = (size_t)(end - chunk);
   2785   if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/
   2786   if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47
   2787     && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) {
   2788     /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */
   2789     return chunk + 8;
   2790   } else {
   2791     size_t total_chunk_length;
   2792     if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end;
   2793     if(total_chunk_length > available_size) return end; /*outside of range*/
   2794     return chunk + total_chunk_length;
   2795   }
   2796 }
   2797 
   2798 const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end) {
   2799   size_t available_size = (size_t)(end - chunk);
   2800   if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/
   2801   if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47
   2802     && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) {
   2803     /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */
   2804     return chunk + 8;
   2805   } else {
   2806     size_t total_chunk_length;
   2807     if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end;
   2808     if(total_chunk_length > available_size) return end; /*outside of range*/
   2809     return chunk + total_chunk_length;
   2810   }
   2811 }
   2812 
   2813 unsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]) {
   2814   for(;;) {
   2815     if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */
   2816     if(lodepng_chunk_type_equals(chunk, type)) return chunk;
   2817     chunk = lodepng_chunk_next(chunk, end);
   2818   }
   2819 }
   2820 
   2821 const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]) {
   2822   for(;;) {
   2823     if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */
   2824     if(lodepng_chunk_type_equals(chunk, type)) return chunk;
   2825     chunk = lodepng_chunk_next_const(chunk, end);
   2826   }
   2827 }
   2828 
   2829 unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk) {
   2830   unsigned i;
   2831   size_t total_chunk_length, new_length;
   2832   unsigned char *chunk_start, *new_buffer;
   2833 
   2834   if(!lodepng_chunk_type_name_valid(chunk)) {
   2835     return 121; /* invalid chunk type name */
   2836   }
   2837   if(lodepng_chunk_reserved(chunk)) {
   2838     return 122; /* invalid third lowercase character */
   2839   }
   2840 
   2841   if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return 77;
   2842   if(lodepng_addofl(*outsize, total_chunk_length, &new_length)) return 77;
   2843 
   2844   new_buffer = (unsigned char*)lodepng_realloc(*out, new_length);
   2845   if(!new_buffer) return 83; /*alloc fail*/
   2846   (*out) = new_buffer;
   2847   (*outsize) = new_length;
   2848   chunk_start = &(*out)[new_length - total_chunk_length];
   2849 
   2850   for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i];
   2851 
   2852   return 0;
   2853 }
   2854 
   2855 /*Sets length and name and allocates the space for data and crc but does not
   2856 set data or crc yet. Returns the start of the chunk in chunk. The start of
   2857 the data is at chunk + 8. To finalize chunk, add the data, then use
   2858 lodepng_chunk_generate_crc */
   2859 static unsigned lodepng_chunk_init(unsigned char** chunk,
   2860                                    ucvector* out,
   2861                                    size_t length, const char* type) {
   2862   size_t new_length = out->size;
   2863   if(lodepng_addofl(new_length, length, &new_length)) return 77;
   2864   if(lodepng_addofl(new_length, 12, &new_length)) return 77;
   2865   if(!ucvector_resize(out, new_length)) return 83; /*alloc fail*/
   2866   *chunk = out->data + new_length - length - 12u;
   2867 
   2868   /*1: length*/
   2869   lodepng_set32bitInt(*chunk, (unsigned)length);
   2870 
   2871   /*2: chunk name (4 letters)*/
   2872   lodepng_memcpy(*chunk + 4, type, 4);
   2873 
   2874   return 0;
   2875 }
   2876 
   2877 /* like lodepng_chunk_create but with custom allocsize */
   2878 static unsigned lodepng_chunk_createv(ucvector* out,
   2879                                       size_t length, const char* type, const unsigned char* data) {
   2880   unsigned char* chunk;
   2881   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, length, type));
   2882 
   2883   /*3: the data*/
   2884   lodepng_memcpy(chunk + 8, data, length);
   2885 
   2886   /*4: CRC (of the chunkname characters and the data)*/
   2887   lodepng_chunk_generate_crc(chunk);
   2888 
   2889   return 0;
   2890 }
   2891 
   2892 unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize,
   2893                               size_t length, const char* type, const unsigned char* data) {
   2894   ucvector v = ucvector_init(*out, *outsize);
   2895   unsigned error = lodepng_chunk_createv(&v, length, type, data);
   2896   *out = v.data;
   2897   *outsize = v.size;
   2898   return error;
   2899 }
   2900 
   2901 /* ////////////////////////////////////////////////////////////////////////// */
   2902 /* / Color types, channels, bits                                            / */
   2903 /* ////////////////////////////////////////////////////////////////////////// */
   2904 
   2905 /*checks if the colortype is valid and the bitdepth bd is allowed for this colortype.
   2906 Return value is a LodePNG error code.*/
   2907 static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) {
   2908   switch(colortype) {
   2909     case LCT_GREY:       if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break;
   2910     case LCT_RGB:        if(!(                                 bd == 8 || bd == 16)) return 37; break;
   2911     case LCT_PALETTE:    if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8            )) return 37; break;
   2912     case LCT_GREY_ALPHA: if(!(                                 bd == 8 || bd == 16)) return 37; break;
   2913     case LCT_RGBA:       if(!(                                 bd == 8 || bd == 16)) return 37; break;
   2914     case LCT_MAX_OCTET_VALUE: return 31; /* invalid color type */
   2915     default: return 31; /* invalid color type */
   2916   }
   2917   return 0; /*allowed color type / bits combination*/
   2918 }
   2919 
   2920 static unsigned getNumColorChannels(LodePNGColorType colortype) {
   2921   switch(colortype) {
   2922     case LCT_GREY: return 1;
   2923     case LCT_RGB: return 3;
   2924     case LCT_PALETTE: return 1;
   2925     case LCT_GREY_ALPHA: return 2;
   2926     case LCT_RGBA: return 4;
   2927     case LCT_MAX_OCTET_VALUE: return 0; /* invalid color type */
   2928     default: return 0; /*invalid color type*/
   2929   }
   2930 }
   2931 
   2932 static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) {
   2933   /*bits per pixel is amount of channels * bits per channel*/
   2934   return getNumColorChannels(colortype) * bitdepth;
   2935 }
   2936 
   2937 /* ////////////////////////////////////////////////////////////////////////// */
   2938 
   2939 void lodepng_color_mode_init(LodePNGColorMode* info) {
   2940   info->key_defined = 0;
   2941   info->key_r = info->key_g = info->key_b = 0;
   2942   info->colortype = LCT_RGBA;
   2943   info->bitdepth = 8;
   2944   info->palette = 0;
   2945   info->palettesize = 0;
   2946 }
   2947 
   2948 /*allocates palette memory if needed, and initializes all colors to black*/
   2949 static void lodepng_color_mode_alloc_palette(LodePNGColorMode* info) {
   2950   size_t i;
   2951   /*if the palette is already allocated, it will have size 1024 so no reallocation needed in that case*/
   2952   /*the palette must have room for up to 256 colors with 4 bytes each.*/
   2953   if(!info->palette) info->palette = (unsigned char*)lodepng_malloc(1024);
   2954   if(!info->palette) return; /*alloc fail*/
   2955   for(i = 0; i != 256; ++i) {
   2956     /*Initialize all unused colors with black, the value used for invalid palette indices.
   2957     This is an error according to the PNG spec, but common PNG decoders make it black instead.
   2958     That makes color conversion slightly faster due to no error handling needed.*/
   2959     info->palette[i * 4 + 0] = 0;
   2960     info->palette[i * 4 + 1] = 0;
   2961     info->palette[i * 4 + 2] = 0;
   2962     info->palette[i * 4 + 3] = 255;
   2963   }
   2964 }
   2965 
   2966 void lodepng_color_mode_cleanup(LodePNGColorMode* info) {
   2967   lodepng_palette_clear(info);
   2968 }
   2969 
   2970 unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) {
   2971   lodepng_color_mode_cleanup(dest);
   2972   lodepng_memcpy(dest, source, sizeof(LodePNGColorMode));
   2973   if(source->palette) {
   2974     dest->palette = (unsigned char*)lodepng_malloc(1024);
   2975     if(!dest->palette && source->palettesize) return 83; /*alloc fail*/
   2976     lodepng_memcpy(dest->palette, source->palette, source->palettesize * 4);
   2977   }
   2978   return 0;
   2979 }
   2980 
   2981 LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth) {
   2982   LodePNGColorMode result;
   2983   lodepng_color_mode_init(&result);
   2984   result.colortype = colortype;
   2985   result.bitdepth = bitdepth;
   2986   return result;
   2987 }
   2988 
   2989 static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) {
   2990   size_t i;
   2991   if(a->colortype != b->colortype) return 0;
   2992   if(a->bitdepth != b->bitdepth) return 0;
   2993   if(a->key_defined != b->key_defined) return 0;
   2994   if(a->key_defined) {
   2995     if(a->key_r != b->key_r) return 0;
   2996     if(a->key_g != b->key_g) return 0;
   2997     if(a->key_b != b->key_b) return 0;
   2998   }
   2999   if(a->palettesize != b->palettesize) return 0;
   3000   for(i = 0; i != a->palettesize * 4; ++i) {
   3001     if(a->palette[i] != b->palette[i]) return 0;
   3002   }
   3003   return 1;
   3004 }
   3005 
   3006 void lodepng_palette_clear(LodePNGColorMode* info) {
   3007   if(info->palette) lodepng_free(info->palette);
   3008   info->palette = 0;
   3009   info->palettesize = 0;
   3010 }
   3011 
   3012 unsigned lodepng_palette_add(LodePNGColorMode* info,
   3013                              unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
   3014   if(!info->palette) /*allocate palette if empty*/ {
   3015     lodepng_color_mode_alloc_palette(info);
   3016     if(!info->palette) return 83; /*alloc fail*/
   3017   }
   3018   if(info->palettesize >= 256) {
   3019     return 108; /*too many palette values*/
   3020   }
   3021   info->palette[4 * info->palettesize + 0] = r;
   3022   info->palette[4 * info->palettesize + 1] = g;
   3023   info->palette[4 * info->palettesize + 2] = b;
   3024   info->palette[4 * info->palettesize + 3] = a;
   3025   ++info->palettesize;
   3026   return 0;
   3027 }
   3028 
   3029 /*calculate bits per pixel out of colortype and bitdepth*/
   3030 unsigned lodepng_get_bpp(const LodePNGColorMode* info) {
   3031   return lodepng_get_bpp_lct(info->colortype, info->bitdepth);
   3032 }
   3033 
   3034 unsigned lodepng_get_channels(const LodePNGColorMode* info) {
   3035   return getNumColorChannels(info->colortype);
   3036 }
   3037 
   3038 unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) {
   3039   return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA;
   3040 }
   3041 
   3042 unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) {
   3043   return (info->colortype & 4) != 0; /*4 or 6*/
   3044 }
   3045 
   3046 unsigned lodepng_is_palette_type(const LodePNGColorMode* info) {
   3047   return info->colortype == LCT_PALETTE;
   3048 }
   3049 
   3050 unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) {
   3051   size_t i;
   3052   for(i = 0; i != info->palettesize; ++i) {
   3053     if(info->palette[i * 4 + 3] < 255) return 1;
   3054   }
   3055   return 0;
   3056 }
   3057 
   3058 unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) {
   3059   return info->key_defined
   3060       || lodepng_is_alpha_type(info)
   3061       || lodepng_has_palette_alpha(info);
   3062 }
   3063 
   3064 static size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) {
   3065   size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth);
   3066   size_t n = (size_t)w * (size_t)h;
   3067   return ((n / 8u) * bpp) + ((n & 7u) * bpp + 7u) / 8u;
   3068 }
   3069 
   3070 size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) {
   3071   return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth);
   3072 }
   3073 
   3074 
   3075 #ifdef LODEPNG_COMPILE_PNG
   3076 
   3077 /*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer,
   3078 and in addition has one extra byte per line: the filter byte. So this gives a larger
   3079 result than lodepng_get_raw_size. Set h to 1 to get the size of 1 row including filter byte. */
   3080 static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, unsigned bpp) {
   3081   /* + 1 for the filter byte, and possibly plus padding bits per line. */
   3082   /* Ignoring casts, the expression is equal to (w * bpp + 7) / 8 + 1, but avoids overflow of w * bpp */
   3083   size_t line = ((size_t)(w / 8u) * bpp) + 1u + ((w & 7u) * bpp + 7u) / 8u;
   3084   return (size_t)h * line;
   3085 }
   3086 
   3087 #ifdef LODEPNG_COMPILE_DECODER
   3088 /*Safely checks whether size_t overflow can be caused due to amount of pixels.
   3089 This check is overcautious rather than precise. If this check indicates no overflow,
   3090 you can safely compute in a size_t (but not an unsigned):
   3091 -(size_t)w * (size_t)h * 8
   3092 -amount of bytes in IDAT (including filter, padding and Adam7 bytes)
   3093 -amount of bytes in raw color model
   3094 Returns 1 if overflow possible, 0 if not.
   3095 */
   3096 static int lodepng_pixel_overflow(unsigned w, unsigned h,
   3097                                   const LodePNGColorMode* pngcolor, const LodePNGColorMode* rawcolor) {
   3098   size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor));
   3099   size_t numpixels, total;
   3100   size_t line; /* bytes per line in worst case */
   3101 
   3102   if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1;
   3103   if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */
   3104 
   3105   /* Bytes per scanline with the expression "(w / 8u) * bpp) + ((w & 7u) * bpp + 7u) / 8u" */
   3106   if(lodepng_mulofl((size_t)(w / 8u), bpp, &line)) return 1;
   3107   if(lodepng_addofl(line, ((w & 7u) * bpp + 7u) / 8u, &line)) return 1;
   3108 
   3109   if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */
   3110   if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */
   3111 
   3112   return 0; /* no overflow */
   3113 }
   3114 #endif /*LODEPNG_COMPILE_DECODER*/
   3115 #endif /*LODEPNG_COMPILE_PNG*/
   3116 
   3117 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   3118 
   3119 static void LodePNGUnknownChunks_init(LodePNGInfo* info) {
   3120   unsigned i;
   3121   for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0;
   3122   for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0;
   3123 }
   3124 
   3125 static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) {
   3126   unsigned i;
   3127   for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]);
   3128 }
   3129 
   3130 static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) {
   3131   unsigned i;
   3132 
   3133   LodePNGUnknownChunks_cleanup(dest);
   3134 
   3135   for(i = 0; i != 3; ++i) {
   3136     size_t j;
   3137     dest->unknown_chunks_size[i] = src->unknown_chunks_size[i];
   3138     dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]);
   3139     if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/
   3140     for(j = 0; j < src->unknown_chunks_size[i]; ++j) {
   3141       dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j];
   3142     }
   3143   }
   3144 
   3145   return 0;
   3146 }
   3147 
   3148 /******************************************************************************/
   3149 
   3150 static void LodePNGText_init(LodePNGInfo* info) {
   3151   info->text_num = 0;
   3152   info->text_keys = NULL;
   3153   info->text_strings = NULL;
   3154 }
   3155 
   3156 static void LodePNGText_cleanup(LodePNGInfo* info) {
   3157   size_t i;
   3158   for(i = 0; i != info->text_num; ++i) {
   3159     lodepng_free(info->text_keys[i]);
   3160     lodepng_free(info->text_strings[i]);
   3161   }
   3162   lodepng_free(info->text_keys);
   3163   lodepng_free(info->text_strings);
   3164 }
   3165 
   3166 static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) {
   3167   size_t i = 0;
   3168   dest->text_keys = NULL;
   3169   dest->text_strings = NULL;
   3170   dest->text_num = 0;
   3171   for(i = 0; i != source->text_num; ++i) {
   3172     CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i]));
   3173   }
   3174   return 0;
   3175 }
   3176 
   3177 static unsigned lodepng_add_text_sized(LodePNGInfo* info, const char* key, const char* str, size_t size) {
   3178   char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1)));
   3179   char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1)));
   3180 
   3181   if(new_keys) info->text_keys = new_keys;
   3182   if(new_strings) info->text_strings = new_strings;
   3183 
   3184   if(!new_keys || !new_strings) return 83; /*alloc fail*/
   3185 
   3186   ++info->text_num;
   3187   info->text_keys[info->text_num - 1] = alloc_string(key);
   3188   info->text_strings[info->text_num - 1] = alloc_string_sized(str, size);
   3189   if(!info->text_keys[info->text_num - 1] || !info->text_strings[info->text_num - 1]) return 83; /*alloc fail*/
   3190 
   3191   return 0;
   3192 }
   3193 
   3194 unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) {
   3195   return lodepng_add_text_sized(info, key, str, lodepng_strlen(str));
   3196 }
   3197 
   3198 void lodepng_clear_text(LodePNGInfo* info) {
   3199   LodePNGText_cleanup(info);
   3200   /*cleanup only deconstructs, need to init again to set appropriate pointers to NULL*/
   3201   LodePNGText_init(info);
   3202 }
   3203 
   3204 /******************************************************************************/
   3205 
   3206 static void LodePNGIText_init(LodePNGInfo* info) {
   3207   info->itext_num = 0;
   3208   info->itext_keys = NULL;
   3209   info->itext_langtags = NULL;
   3210   info->itext_transkeys = NULL;
   3211   info->itext_strings = NULL;
   3212 }
   3213 
   3214 static void LodePNGIText_cleanup(LodePNGInfo* info) {
   3215   size_t i;
   3216   for(i = 0; i != info->itext_num; ++i) {
   3217     lodepng_free(info->itext_keys[i]);
   3218     lodepng_free(info->itext_langtags[i]);
   3219     lodepng_free(info->itext_transkeys[i]);
   3220     lodepng_free(info->itext_strings[i]);
   3221   }
   3222   lodepng_free(info->itext_keys);
   3223   lodepng_free(info->itext_langtags);
   3224   lodepng_free(info->itext_transkeys);
   3225   lodepng_free(info->itext_strings);
   3226 }
   3227 
   3228 static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) {
   3229   size_t i = 0;
   3230   dest->itext_keys = NULL;
   3231   dest->itext_langtags = NULL;
   3232   dest->itext_transkeys = NULL;
   3233   dest->itext_strings = NULL;
   3234   dest->itext_num = 0;
   3235   for(i = 0; i != source->itext_num; ++i) {
   3236     CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i],
   3237                                         source->itext_transkeys[i], source->itext_strings[i]));
   3238   }
   3239   return 0;
   3240 }
   3241 
   3242 void lodepng_clear_itext(LodePNGInfo* info) {
   3243   LodePNGIText_cleanup(info);
   3244   /*cleanup only deconstructs, need to init again to set appropriate pointers to NULL*/
   3245   LodePNGIText_init(info);
   3246 }
   3247 
   3248 static unsigned lodepng_add_itext_sized(LodePNGInfo* info, const char* key, const char* langtag,
   3249                                         const char* transkey, const char* str, size_t size) {
   3250   char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1)));
   3251   char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1)));
   3252   char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1)));
   3253   char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1)));
   3254 
   3255   if(new_keys) info->itext_keys = new_keys;
   3256   if(new_langtags) info->itext_langtags = new_langtags;
   3257   if(new_transkeys) info->itext_transkeys = new_transkeys;
   3258   if(new_strings) info->itext_strings = new_strings;
   3259 
   3260   if(!new_keys || !new_langtags || !new_transkeys || !new_strings) return 83; /*alloc fail*/
   3261 
   3262   ++info->itext_num;
   3263 
   3264   info->itext_keys[info->itext_num - 1] = alloc_string(key);
   3265   info->itext_langtags[info->itext_num - 1] = alloc_string(langtag);
   3266   info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey);
   3267   info->itext_strings[info->itext_num - 1] = alloc_string_sized(str, size);
   3268 
   3269   return 0;
   3270 }
   3271 
   3272 unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag,
   3273                            const char* transkey, const char* str) {
   3274   return lodepng_add_itext_sized(info, key, langtag, transkey, str, lodepng_strlen(str));
   3275 }
   3276 
   3277 unsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) {
   3278   if(info->iccp_defined) lodepng_clear_icc(info);
   3279 
   3280   if(profile_size == 0) return 123; /*invalid ICC profile size*/
   3281 
   3282   info->iccp_name = alloc_string(name);
   3283   if(!info->iccp_name) return 83; /*alloc fail*/
   3284 
   3285   info->iccp_profile = (unsigned char*)lodepng_malloc(profile_size);
   3286   if(!info->iccp_profile) {
   3287     lodepng_free(info->iccp_name);
   3288     return 83; /*alloc fail*/
   3289   }
   3290 
   3291   lodepng_memcpy(info->iccp_profile, profile, profile_size);
   3292   info->iccp_profile_size = profile_size;
   3293   info->iccp_defined = 1;
   3294 
   3295   return 0; /*ok*/
   3296 }
   3297 
   3298 static void lodepng_init_icc(LodePNGInfo* info) {
   3299   info->iccp_defined = 0;
   3300   info->iccp_name = NULL;
   3301   info->iccp_profile = NULL;
   3302   info->iccp_profile_size = 0;
   3303 }
   3304 
   3305 void lodepng_clear_icc(LodePNGInfo* info) {
   3306   lodepng_free(info->iccp_name);
   3307   lodepng_free(info->iccp_profile);
   3308   lodepng_init_icc(info);
   3309 }
   3310 
   3311 unsigned lodepng_set_exif(LodePNGInfo* info, const unsigned char* exif, unsigned exif_size) {
   3312   if(info->exif_defined) lodepng_clear_exif(info);
   3313   info->exif = (unsigned char*)lodepng_malloc(exif_size);
   3314 
   3315   if(!info->exif) return 83; /*alloc fail*/
   3316 
   3317   lodepng_memcpy(info->exif, exif, exif_size);
   3318   info->exif_size = exif_size;
   3319   info->exif_defined = 1;
   3320 
   3321   return 0; /*ok*/
   3322 }
   3323 
   3324 static void lodepng_init_exif(LodePNGInfo* info) {
   3325   info->exif_defined = 0;
   3326   info->exif = NULL;
   3327   info->exif_size = 0;
   3328 }
   3329 
   3330 void lodepng_clear_exif(LodePNGInfo* info) {
   3331   lodepng_free(info->exif);
   3332   lodepng_init_exif(info);
   3333 }
   3334 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   3335 
   3336 void lodepng_info_init(LodePNGInfo* info) {
   3337   lodepng_color_mode_init(&info->color);
   3338   info->interlace_method = 0;
   3339   info->compression_method = 0;
   3340   info->filter_method = 0;
   3341 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   3342   info->background_defined = 0;
   3343   info->background_r = info->background_g = info->background_b = 0;
   3344 
   3345   LodePNGText_init(info);
   3346   LodePNGIText_init(info);
   3347   lodepng_init_icc(info);
   3348   lodepng_init_exif(info);
   3349 
   3350   info->time_defined = 0;
   3351   info->phys_defined = 0;
   3352 
   3353   info->gama_defined = 0;
   3354   info->chrm_defined = 0;
   3355   info->srgb_defined = 0;
   3356   info->cicp_defined = 0;
   3357   info->cicp_color_primaries = 0;
   3358   info->cicp_transfer_function = 0;
   3359   info->cicp_matrix_coefficients = 0;
   3360   info->cicp_video_full_range_flag = 0;
   3361   info->mdcv_defined = 0;
   3362   info->mdcv_red_x = 0;
   3363   info->mdcv_red_y = 0;
   3364   info->mdcv_green_x = 0;
   3365   info->mdcv_green_y = 0;
   3366   info->mdcv_blue_x = 0;
   3367   info->mdcv_blue_y = 0;
   3368   info->mdcv_white_x = 0;
   3369   info->mdcv_white_y = 0;
   3370   info->mdcv_max_luminance = 0;
   3371   info->mdcv_min_luminance = 0;
   3372   info->clli_defined = 0;
   3373   info->clli_max_cll = 0;
   3374   info->clli_max_fall = 0;
   3375 
   3376   info->sbit_defined = 0;
   3377   info->sbit_r = info->sbit_g = info->sbit_b = info->sbit_a = 0;
   3378 
   3379   LodePNGUnknownChunks_init(info);
   3380 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   3381 }
   3382 
   3383 void lodepng_info_cleanup(LodePNGInfo* info) {
   3384   lodepng_color_mode_cleanup(&info->color);
   3385 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   3386   LodePNGText_cleanup(info);
   3387   LodePNGIText_cleanup(info);
   3388 
   3389   lodepng_clear_icc(info);
   3390   lodepng_clear_exif(info);
   3391 
   3392   LodePNGUnknownChunks_cleanup(info);
   3393 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   3394 }
   3395 
   3396 unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) {
   3397   lodepng_info_cleanup(dest);
   3398   lodepng_memcpy(dest, source, sizeof(LodePNGInfo));
   3399 
   3400   /*ensure to initialize all fields pointing to allocated data to NULL first*/
   3401   lodepng_color_mode_init(&dest->color);
   3402 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   3403   LodePNGText_init(dest);
   3404   LodePNGIText_init(dest);
   3405   lodepng_init_icc(dest);
   3406   lodepng_init_exif(dest);
   3407   LodePNGUnknownChunks_init(dest);
   3408 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   3409 
   3410   CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color));
   3411 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   3412   CERROR_TRY_RETURN(LodePNGText_copy(dest, source));
   3413   CERROR_TRY_RETURN(LodePNGIText_copy(dest, source));
   3414   if(source->iccp_defined) {
   3415     CERROR_TRY_RETURN(lodepng_set_icc(dest, source->iccp_name, source->iccp_profile, source->iccp_profile_size));
   3416   }
   3417   if(source->exif_defined) {
   3418     CERROR_TRY_RETURN(lodepng_set_exif(dest, source->exif, source->exif_size));
   3419   }
   3420   CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source));
   3421 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   3422 
   3423   return 0;
   3424 }
   3425 
   3426 /* ////////////////////////////////////////////////////////////////////////// */
   3427 
   3428 /*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/
   3429 static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) {
   3430   unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/
   3431   /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/
   3432   unsigned p = index & m;
   3433   in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/
   3434   in = in << (bits * (m - p));
   3435   if(p == 0) out[index * bits / 8u] = in;
   3436   else out[index * bits / 8u] |= in;
   3437 }
   3438 
   3439 typedef struct ColorTree ColorTree;
   3440 
   3441 /*
   3442 One node of a color tree
   3443 This is the data structure used to count the number of unique colors and to get a palette
   3444 index for a color. It's like an octree, but because the alpha channel is used too, each
   3445 node has 16 instead of 8 children.
   3446 */
   3447 struct ColorTree {
   3448   ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/
   3449   int index; /*the payload. Only has a meaningful value if this is in the last level*/
   3450 };
   3451 
   3452 static void color_tree_init(ColorTree* tree) {
   3453   lodepng_memset(tree->children, 0, 16 * sizeof(*tree->children));
   3454   tree->index = -1;
   3455 }
   3456 
   3457 static void color_tree_cleanup(ColorTree* tree) {
   3458   int i;
   3459   for(i = 0; i != 16; ++i) {
   3460     if(tree->children[i]) {
   3461       color_tree_cleanup(tree->children[i]);
   3462       lodepng_free(tree->children[i]);
   3463     }
   3464   }
   3465 }
   3466 
   3467 /*returns -1 if color not present, its index otherwise*/
   3468 static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
   3469   int bit = 0;
   3470   for(bit = 0; bit < 8; ++bit) {
   3471     int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1);
   3472     if(!tree->children[i]) return -1;
   3473     else tree = tree->children[i];
   3474   }
   3475   return tree ? tree->index : -1;
   3476 }
   3477 
   3478 #ifdef LODEPNG_COMPILE_ENCODER
   3479 static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
   3480   return color_tree_get(tree, r, g, b, a) >= 0;
   3481 }
   3482 #endif /*LODEPNG_COMPILE_ENCODER*/
   3483 
   3484 /*color is not allowed to already exist.
   3485 Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")
   3486 Returns error code, or 0 if ok*/
   3487 static unsigned color_tree_add(ColorTree* tree,
   3488                                unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) {
   3489   int bit;
   3490   for(bit = 0; bit < 8; ++bit) {
   3491     int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1);
   3492     if(!tree->children[i]) {
   3493       tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree));
   3494       if(!tree->children[i]) return 83; /*alloc fail*/
   3495       color_tree_init(tree->children[i]);
   3496     }
   3497     tree = tree->children[i];
   3498   }
   3499   tree->index = (int)index;
   3500   return 0;
   3501 }
   3502 
   3503 /*put a pixel, given its RGBA color, into image of any color type*/
   3504 static unsigned rgba8ToPixel(unsigned char* out, size_t i,
   3505                              const LodePNGColorMode* mode, ColorTree* tree /*for palette*/,
   3506                              unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
   3507   if(mode->colortype == LCT_GREY) {
   3508     unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/
   3509     if(mode->bitdepth == 8) out[i] = gray;
   3510     else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = gray;
   3511     else {
   3512       /*take the most significant bits of gray*/
   3513       gray = ((unsigned)gray >> (8u - mode->bitdepth)) & ((1u << mode->bitdepth) - 1u);
   3514       addColorBits(out, i, mode->bitdepth, gray);
   3515     }
   3516   } else if(mode->colortype == LCT_RGB) {
   3517     if(mode->bitdepth == 8) {
   3518       out[i * 3 + 0] = r;
   3519       out[i * 3 + 1] = g;
   3520       out[i * 3 + 2] = b;
   3521     } else {
   3522       out[i * 6 + 0] = out[i * 6 + 1] = r;
   3523       out[i * 6 + 2] = out[i * 6 + 3] = g;
   3524       out[i * 6 + 4] = out[i * 6 + 5] = b;
   3525     }
   3526   } else if(mode->colortype == LCT_PALETTE) {
   3527     int index = color_tree_get(tree, r, g, b, a);
   3528     if(index < 0) return 82; /*color not in palette*/
   3529     if(mode->bitdepth == 8) out[i] = index;
   3530     else addColorBits(out, i, mode->bitdepth, (unsigned)index);
   3531   } else if(mode->colortype == LCT_GREY_ALPHA) {
   3532     unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/
   3533     if(mode->bitdepth == 8) {
   3534       out[i * 2 + 0] = gray;
   3535       out[i * 2 + 1] = a;
   3536     } else if(mode->bitdepth == 16) {
   3537       out[i * 4 + 0] = out[i * 4 + 1] = gray;
   3538       out[i * 4 + 2] = out[i * 4 + 3] = a;
   3539     }
   3540   } else if(mode->colortype == LCT_RGBA) {
   3541     if(mode->bitdepth == 8) {
   3542       out[i * 4 + 0] = r;
   3543       out[i * 4 + 1] = g;
   3544       out[i * 4 + 2] = b;
   3545       out[i * 4 + 3] = a;
   3546     } else {
   3547       out[i * 8 + 0] = out[i * 8 + 1] = r;
   3548       out[i * 8 + 2] = out[i * 8 + 3] = g;
   3549       out[i * 8 + 4] = out[i * 8 + 5] = b;
   3550       out[i * 8 + 6] = out[i * 8 + 7] = a;
   3551     }
   3552   }
   3553 
   3554   return 0; /*no error*/
   3555 }
   3556 
   3557 /*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/
   3558 static void rgba16ToPixel(unsigned char* out, size_t i,
   3559                          const LodePNGColorMode* mode,
   3560                          unsigned short r, unsigned short g, unsigned short b, unsigned short a) {
   3561   if(mode->colortype == LCT_GREY) {
   3562     unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/
   3563     out[i * 2 + 0] = (gray >> 8) & 255;
   3564     out[i * 2 + 1] = gray & 255;
   3565   } else if(mode->colortype == LCT_RGB) {
   3566     out[i * 6 + 0] = (r >> 8) & 255;
   3567     out[i * 6 + 1] = r & 255;
   3568     out[i * 6 + 2] = (g >> 8) & 255;
   3569     out[i * 6 + 3] = g & 255;
   3570     out[i * 6 + 4] = (b >> 8) & 255;
   3571     out[i * 6 + 5] = b & 255;
   3572   } else if(mode->colortype == LCT_GREY_ALPHA) {
   3573     unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/
   3574     out[i * 4 + 0] = (gray >> 8) & 255;
   3575     out[i * 4 + 1] = gray & 255;
   3576     out[i * 4 + 2] = (a >> 8) & 255;
   3577     out[i * 4 + 3] = a & 255;
   3578   } else if(mode->colortype == LCT_RGBA) {
   3579     out[i * 8 + 0] = (r >> 8) & 255;
   3580     out[i * 8 + 1] = r & 255;
   3581     out[i * 8 + 2] = (g >> 8) & 255;
   3582     out[i * 8 + 3] = g & 255;
   3583     out[i * 8 + 4] = (b >> 8) & 255;
   3584     out[i * 8 + 5] = b & 255;
   3585     out[i * 8 + 6] = (a >> 8) & 255;
   3586     out[i * 8 + 7] = a & 255;
   3587   }
   3588 }
   3589 
   3590 /*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/
   3591 static void getPixelColorRGBA8(unsigned char* r, unsigned char* g,
   3592                                unsigned char* b, unsigned char* a,
   3593                                const unsigned char* in, size_t i,
   3594                                const LodePNGColorMode* mode) {
   3595   if(mode->colortype == LCT_GREY) {
   3596     if(mode->bitdepth == 8) {
   3597       *r = *g = *b = in[i];
   3598       if(mode->key_defined && *r == mode->key_r) *a = 0;
   3599       else *a = 255;
   3600     } else if(mode->bitdepth == 16) {
   3601       *r = *g = *b = in[i * 2 + 0];
   3602       if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0;
   3603       else *a = 255;
   3604     } else {
   3605       unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/
   3606       size_t j = i * mode->bitdepth;
   3607       unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);
   3608       *r = *g = *b = (value * 255) / highest;
   3609       if(mode->key_defined && value == mode->key_r) *a = 0;
   3610       else *a = 255;
   3611     }
   3612   } else if(mode->colortype == LCT_RGB) {
   3613     if(mode->bitdepth == 8) {
   3614       *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2];
   3615       if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0;
   3616       else *a = 255;
   3617     } else {
   3618       *r = in[i * 6 + 0];
   3619       *g = in[i * 6 + 2];
   3620       *b = in[i * 6 + 4];
   3621       if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r
   3622          && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g
   3623          && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0;
   3624       else *a = 255;
   3625     }
   3626   } else if(mode->colortype == LCT_PALETTE) {
   3627     unsigned index;
   3628     if(mode->bitdepth == 8) index = in[i];
   3629     else {
   3630       size_t j = i * mode->bitdepth;
   3631       index = readBitsFromReversedStream(&j, in, mode->bitdepth);
   3632     }
   3633     /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
   3634     *r = mode->palette[index * 4 + 0];
   3635     *g = mode->palette[index * 4 + 1];
   3636     *b = mode->palette[index * 4 + 2];
   3637     *a = mode->palette[index * 4 + 3];
   3638   } else if(mode->colortype == LCT_GREY_ALPHA) {
   3639     if(mode->bitdepth == 8) {
   3640       *r = *g = *b = in[i * 2 + 0];
   3641       *a = in[i * 2 + 1];
   3642     } else {
   3643       *r = *g = *b = in[i * 4 + 0];
   3644       *a = in[i * 4 + 2];
   3645     }
   3646   } else if(mode->colortype == LCT_RGBA) {
   3647     if(mode->bitdepth == 8) {
   3648       *r = in[i * 4 + 0];
   3649       *g = in[i * 4 + 1];
   3650       *b = in[i * 4 + 2];
   3651       *a = in[i * 4 + 3];
   3652     } else {
   3653       *r = in[i * 8 + 0];
   3654       *g = in[i * 8 + 2];
   3655       *b = in[i * 8 + 4];
   3656       *a = in[i * 8 + 6];
   3657     }
   3658   }
   3659 }
   3660 
   3661 /*Similar to getPixelColorRGBA8, but with all the for loops inside of the color
   3662 mode test cases, optimized to convert the colors much faster, when converting
   3663 to the common case of RGBA with 8 bit per channel. buffer must be RGBA with
   3664 enough memory.*/
   3665 static void getPixelColorsRGBA8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels,
   3666                                 const unsigned char* LODEPNG_RESTRICT in,
   3667                                 const LodePNGColorMode* mode) {
   3668   unsigned num_channels = 4;
   3669   size_t i;
   3670   if(mode->colortype == LCT_GREY) {
   3671     if(mode->bitdepth == 8) {
   3672       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3673         buffer[0] = buffer[1] = buffer[2] = in[i];
   3674         buffer[3] = 255;
   3675       }
   3676       if(mode->key_defined) {
   3677         buffer -= numpixels * num_channels;
   3678         for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3679           if(buffer[0] == mode->key_r) buffer[3] = 0;
   3680         }
   3681       }
   3682     } else if(mode->bitdepth == 16) {
   3683       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3684         buffer[0] = buffer[1] = buffer[2] = in[i * 2];
   3685         buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255;
   3686       }
   3687     } else {
   3688       unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/
   3689       size_t j = 0;
   3690       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3691         unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);
   3692         buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest;
   3693         buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255;
   3694       }
   3695     }
   3696   } else if(mode->colortype == LCT_RGB) {
   3697     if(mode->bitdepth == 8) {
   3698       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3699         lodepng_memcpy(buffer, &in[i * 3], 3);
   3700         buffer[3] = 255;
   3701       }
   3702       if(mode->key_defined) {
   3703         buffer -= numpixels * num_channels;
   3704         for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3705           if(buffer[0] == mode->key_r && buffer[1]== mode->key_g && buffer[2] == mode->key_b) buffer[3] = 0;
   3706         }
   3707       }
   3708     } else {
   3709       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3710         buffer[0] = in[i * 6 + 0];
   3711         buffer[1] = in[i * 6 + 2];
   3712         buffer[2] = in[i * 6 + 4];
   3713         buffer[3] = mode->key_defined
   3714            && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r
   3715            && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g
   3716            && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255;
   3717       }
   3718     }
   3719   } else if(mode->colortype == LCT_PALETTE) {
   3720     if(mode->bitdepth == 8) {
   3721       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3722         unsigned index = in[i];
   3723         /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
   3724         lodepng_memcpy(buffer, &mode->palette[index * 4], 4);
   3725       }
   3726     } else {
   3727       size_t j = 0;
   3728       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3729         unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth);
   3730         /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
   3731         lodepng_memcpy(buffer, &mode->palette[index * 4], 4);
   3732       }
   3733     }
   3734   } else if(mode->colortype == LCT_GREY_ALPHA) {
   3735     if(mode->bitdepth == 8) {
   3736       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3737         buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0];
   3738         buffer[3] = in[i * 2 + 1];
   3739       }
   3740     } else {
   3741       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3742         buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0];
   3743         buffer[3] = in[i * 4 + 2];
   3744       }
   3745     }
   3746   } else if(mode->colortype == LCT_RGBA) {
   3747     if(mode->bitdepth == 8) {
   3748       lodepng_memcpy(buffer, in, numpixels * 4);
   3749     } else {
   3750       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3751         buffer[0] = in[i * 8 + 0];
   3752         buffer[1] = in[i * 8 + 2];
   3753         buffer[2] = in[i * 8 + 4];
   3754         buffer[3] = in[i * 8 + 6];
   3755       }
   3756     }
   3757   }
   3758 }
   3759 
   3760 /*Similar to getPixelColorsRGBA8, but with 3-channel RGB output.*/
   3761 static void getPixelColorsRGB8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels,
   3762                                const unsigned char* LODEPNG_RESTRICT in,
   3763                                const LodePNGColorMode* mode) {
   3764   const unsigned num_channels = 3;
   3765   size_t i;
   3766   if(mode->colortype == LCT_GREY) {
   3767     if(mode->bitdepth == 8) {
   3768       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3769         buffer[0] = buffer[1] = buffer[2] = in[i];
   3770       }
   3771     } else if(mode->bitdepth == 16) {
   3772       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3773         buffer[0] = buffer[1] = buffer[2] = in[i * 2];
   3774       }
   3775     } else {
   3776       unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/
   3777       size_t j = 0;
   3778       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3779         unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);
   3780         buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest;
   3781       }
   3782     }
   3783   } else if(mode->colortype == LCT_RGB) {
   3784     if(mode->bitdepth == 8) {
   3785       lodepng_memcpy(buffer, in, numpixels * 3);
   3786     } else {
   3787       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3788         buffer[0] = in[i * 6 + 0];
   3789         buffer[1] = in[i * 6 + 2];
   3790         buffer[2] = in[i * 6 + 4];
   3791       }
   3792     }
   3793   } else if(mode->colortype == LCT_PALETTE) {
   3794     if(mode->bitdepth == 8) {
   3795       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3796         unsigned index = in[i];
   3797         /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
   3798         lodepng_memcpy(buffer, &mode->palette[index * 4], 3);
   3799       }
   3800     } else {
   3801       size_t j = 0;
   3802       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3803         unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth);
   3804         /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
   3805         lodepng_memcpy(buffer, &mode->palette[index * 4], 3);
   3806       }
   3807     }
   3808   } else if(mode->colortype == LCT_GREY_ALPHA) {
   3809     if(mode->bitdepth == 8) {
   3810       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3811         buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0];
   3812       }
   3813     } else {
   3814       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3815         buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0];
   3816       }
   3817     }
   3818   } else if(mode->colortype == LCT_RGBA) {
   3819     if(mode->bitdepth == 8) {
   3820       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3821         lodepng_memcpy(buffer, &in[i * 4], 3);
   3822       }
   3823     } else {
   3824       for(i = 0; i != numpixels; ++i, buffer += num_channels) {
   3825         buffer[0] = in[i * 8 + 0];
   3826         buffer[1] = in[i * 8 + 2];
   3827         buffer[2] = in[i * 8 + 4];
   3828       }
   3829     }
   3830   }
   3831 }
   3832 
   3833 /*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with
   3834 given color type, but the given color type must be 16-bit itself.*/
   3835 static void getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a,
   3836                                 const unsigned char* in, size_t i, const LodePNGColorMode* mode) {
   3837   if(mode->colortype == LCT_GREY) {
   3838     *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1];
   3839     if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0;
   3840     else *a = 65535;
   3841   } else if(mode->colortype == LCT_RGB) {
   3842     *r = 256u * in[i * 6 + 0] + in[i * 6 + 1];
   3843     *g = 256u * in[i * 6 + 2] + in[i * 6 + 3];
   3844     *b = 256u * in[i * 6 + 4] + in[i * 6 + 5];
   3845     if(mode->key_defined
   3846        && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r
   3847        && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g
   3848        && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0;
   3849     else *a = 65535;
   3850   } else if(mode->colortype == LCT_GREY_ALPHA) {
   3851     *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1];
   3852     *a = 256u * in[i * 4 + 2] + in[i * 4 + 3];
   3853   } else if(mode->colortype == LCT_RGBA) {
   3854     *r = 256u * in[i * 8 + 0] + in[i * 8 + 1];
   3855     *g = 256u * in[i * 8 + 2] + in[i * 8 + 3];
   3856     *b = 256u * in[i * 8 + 4] + in[i * 8 + 5];
   3857     *a = 256u * in[i * 8 + 6] + in[i * 8 + 7];
   3858   }
   3859 }
   3860 
   3861 unsigned lodepng_convert(unsigned char* out, const unsigned char* in,
   3862                          const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in,
   3863                          unsigned w, unsigned h) {
   3864   size_t i;
   3865   ColorTree tree;
   3866   size_t numpixels = (size_t)w * (size_t)h;
   3867   unsigned error = 0;
   3868 
   3869   if(mode_in->colortype == LCT_PALETTE && !mode_in->palette) {
   3870     return 107; /* error: must provide palette if input mode is palette */
   3871   }
   3872 
   3873   if(lodepng_color_mode_equal(mode_out, mode_in)) {
   3874     size_t numbytes = lodepng_get_raw_size(w, h, mode_in);
   3875     lodepng_memcpy(out, in, numbytes);
   3876     return 0;
   3877   }
   3878 
   3879   if(mode_out->colortype == LCT_PALETTE) {
   3880     size_t palettesize = mode_out->palettesize;
   3881     const unsigned char* palette = mode_out->palette;
   3882     size_t palsize = (size_t)1u << mode_out->bitdepth;
   3883     /*if the user specified output palette but did not give the values, assume
   3884     they want the values of the input color type (assuming that one is palette).
   3885     Note that we never create a new palette ourselves.*/
   3886     if(palettesize == 0) {
   3887       palettesize = mode_in->palettesize;
   3888       palette = mode_in->palette;
   3889       /*if the input was also palette with same bitdepth, then the color types are also
   3890       equal, so copy literally. This to preserve the exact indices that were in the PNG
   3891       even in case there are duplicate colors in the palette.*/
   3892       if(mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) {
   3893         size_t numbytes = lodepng_get_raw_size(w, h, mode_in);
   3894         lodepng_memcpy(out, in, numbytes);
   3895         return 0;
   3896       }
   3897     }
   3898     if(palettesize < palsize) palsize = palettesize;
   3899     color_tree_init(&tree);
   3900     for(i = 0; i != palsize; ++i) {
   3901       const unsigned char* p = &palette[i * 4];
   3902       error = color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i);
   3903       if(error) break;
   3904     }
   3905   }
   3906 
   3907   if(!error) {
   3908     if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) {
   3909       for(i = 0; i != numpixels; ++i) {
   3910         unsigned short r = 0, g = 0, b = 0, a = 0;
   3911         getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);
   3912         rgba16ToPixel(out, i, mode_out, r, g, b, a);
   3913       }
   3914     } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) {
   3915       getPixelColorsRGBA8(out, numpixels, in, mode_in);
   3916     } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) {
   3917       getPixelColorsRGB8(out, numpixels, in, mode_in);
   3918     } else {
   3919       unsigned char r = 0, g = 0, b = 0, a = 0;
   3920       for(i = 0; i != numpixels; ++i) {
   3921         getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in);
   3922         error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a);
   3923         if(error) break;
   3924       }
   3925     }
   3926   }
   3927 
   3928   if(mode_out->colortype == LCT_PALETTE) {
   3929     color_tree_cleanup(&tree);
   3930   }
   3931 
   3932   return error;
   3933 }
   3934 
   3935 
   3936 /* Converts a single rgb color without alpha from one type to another, color bits truncated to
   3937 their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow
   3938 function, do not use to process all pixels of an image. Alpha channel not supported on purpose:
   3939 this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the
   3940 specification it looks like bKGD should ignore the alpha values of the palette since it can use
   3941 any palette index but doesn't have an alpha channel. Idem with ignoring color key. */
   3942 unsigned lodepng_convert_rgb(
   3943     unsigned* r_out, unsigned* g_out, unsigned* b_out,
   3944     unsigned r_in, unsigned g_in, unsigned b_in,
   3945     const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in) {
   3946   unsigned r = 0, g = 0, b = 0;
   3947   unsigned mul = 65535 / ((1u << mode_in->bitdepth) - 1u); /*65535, 21845, 4369, 257, 1*/
   3948   unsigned shift = 16 - mode_out->bitdepth;
   3949 
   3950   if(mode_in->colortype == LCT_GREY || mode_in->colortype == LCT_GREY_ALPHA) {
   3951     r = g = b = r_in * mul;
   3952   } else if(mode_in->colortype == LCT_RGB || mode_in->colortype == LCT_RGBA) {
   3953     r = r_in * mul;
   3954     g = g_in * mul;
   3955     b = b_in * mul;
   3956   } else if(mode_in->colortype == LCT_PALETTE) {
   3957     if(r_in >= mode_in->palettesize) return 82;
   3958     r = mode_in->palette[r_in * 4 + 0] * 257u;
   3959     g = mode_in->palette[r_in * 4 + 1] * 257u;
   3960     b = mode_in->palette[r_in * 4 + 2] * 257u;
   3961   } else {
   3962     return 31;
   3963   }
   3964 
   3965   /* now convert to output format */
   3966   if(mode_out->colortype == LCT_GREY || mode_out->colortype == LCT_GREY_ALPHA) {
   3967     *r_out = r >> shift ;
   3968   } else if(mode_out->colortype == LCT_RGB || mode_out->colortype == LCT_RGBA) {
   3969     *r_out = r >> shift ;
   3970     *g_out = g >> shift ;
   3971     *b_out = b >> shift ;
   3972   } else if(mode_out->colortype == LCT_PALETTE) {
   3973     unsigned i;
   3974     /* a 16-bit color cannot be in the palette */
   3975     if((r >> 8) != (r & 255) || (g >> 8) != (g & 255) || (b >> 8) != (b & 255)) return 82;
   3976     for(i = 0; i < mode_out->palettesize; i++) {
   3977       unsigned j = i * 4;
   3978       if((r >> 8) == mode_out->palette[j + 0] && (g >> 8) == mode_out->palette[j + 1] &&
   3979           (b >> 8) == mode_out->palette[j + 2]) {
   3980         *r_out = i;
   3981         return 0;
   3982       }
   3983     }
   3984     return 82;
   3985   } else {
   3986     return 31;
   3987   }
   3988 
   3989   return 0;
   3990 }
   3991 
   3992 #ifdef LODEPNG_COMPILE_ENCODER
   3993 
   3994 void lodepng_color_stats_init(LodePNGColorStats* stats) {
   3995   /*stats*/
   3996   stats->colored = 0;
   3997   stats->key = 0;
   3998   stats->key_r = stats->key_g = stats->key_b = 0;
   3999   stats->alpha = 0;
   4000   stats->numcolors = 0;
   4001   stats->bits = 1;
   4002   stats->numpixels = 0;
   4003   /*settings*/
   4004   stats->allow_palette = 1;
   4005   stats->allow_greyscale = 1;
   4006 }
   4007 
   4008 /*function used for debug purposes with C++*/
   4009 /*void printColorStats(LodePNGColorStats* p) {
   4010   std::cout << "colored: " << (int)p->colored << ", ";
   4011   std::cout << "key: " << (int)p->key << ", ";
   4012   std::cout << "key_r: " << (int)p->key_r << ", ";
   4013   std::cout << "key_g: " << (int)p->key_g << ", ";
   4014   std::cout << "key_b: " << (int)p->key_b << ", ";
   4015   std::cout << "alpha: " << (int)p->alpha << ", ";
   4016   std::cout << "numcolors: " << (int)p->numcolors << ", ";
   4017   std::cout << "bits: " << (int)p->bits << std::endl;
   4018 }*/
   4019 
   4020 /*Returns how many bits needed to represent given value (max 8 bit)*/
   4021 static unsigned getValueRequiredBits(unsigned char value) {
   4022   if(value == 0 || value == 255) return 1;
   4023   /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/
   4024   if(value % 17 == 0) return value % 85 == 0 ? 2 : 4;
   4025   return 8;
   4026 }
   4027 
   4028 /*stats must already have been inited. */
   4029 unsigned lodepng_compute_color_stats(LodePNGColorStats* stats,
   4030                                      const unsigned char* in, unsigned w, unsigned h,
   4031                                      const LodePNGColorMode* mode_in) {
   4032   size_t i;
   4033   ColorTree tree;
   4034   size_t numpixels = (size_t)w * (size_t)h;
   4035   unsigned error = 0;
   4036 
   4037   /* mark things as done already if it would be impossible to have a more expensive case */
   4038   unsigned colored_done = lodepng_is_greyscale_type(mode_in) ? 1 : 0;
   4039   unsigned alpha_done = lodepng_can_have_alpha(mode_in) ? 0 : 1;
   4040   unsigned numcolors_done = 0;
   4041   unsigned bpp = lodepng_get_bpp(mode_in);
   4042   unsigned bits_done = (stats->bits == 1 && bpp == 1) ? 1 : 0;
   4043   unsigned sixteen = 0; /* whether the input image is 16 bit */
   4044   unsigned maxnumcolors = 257;
   4045   if(bpp <= 8) maxnumcolors = LODEPNG_MIN(257, stats->numcolors + (1u << bpp));
   4046 
   4047   stats->numpixels += numpixels;
   4048 
   4049   /*if palette not allowed, no need to compute numcolors*/
   4050   if(!stats->allow_palette) numcolors_done = 1;
   4051 
   4052   color_tree_init(&tree);
   4053 
   4054   /*If the stats was already filled in from previous data, fill its palette in tree
   4055   and mark things as done already if we know they are the most expensive case already*/
   4056   if(stats->alpha) alpha_done = 1;
   4057   if(stats->colored) colored_done = 1;
   4058   if(stats->bits == 16) numcolors_done = 1;
   4059   if(stats->bits >= bpp) bits_done = 1;
   4060   if(stats->numcolors >= maxnumcolors) numcolors_done = 1;
   4061 
   4062   if(!numcolors_done) {
   4063     for(i = 0; i < stats->numcolors; i++) {
   4064       const unsigned char* color = &stats->palette[i * 4];
   4065       error = color_tree_add(&tree, color[0], color[1], color[2], color[3], (unsigned)i);
   4066       if(error) goto cleanup;
   4067     }
   4068   }
   4069 
   4070   /*Check if the 16-bit input is truly 16-bit*/
   4071   if(mode_in->bitdepth == 16 && !sixteen) {
   4072     unsigned short r = 0, g = 0, b = 0, a = 0;
   4073     for(i = 0; i != numpixels; ++i) {
   4074       getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);
   4075       if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) ||
   4076          (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) /*first and second byte differ*/ {
   4077         stats->bits = 16;
   4078         sixteen = 1;
   4079         bits_done = 1;
   4080         numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/
   4081         break;
   4082       }
   4083     }
   4084   }
   4085 
   4086   if(sixteen) {
   4087     unsigned short r = 0, g = 0, b = 0, a = 0;
   4088 
   4089     for(i = 0; i != numpixels; ++i) {
   4090       getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);
   4091 
   4092       if(!colored_done && (r != g || r != b)) {
   4093         stats->colored = 1;
   4094         colored_done = 1;
   4095       }
   4096 
   4097       if(!alpha_done) {
   4098         unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b);
   4099         if(a != 65535 && (a != 0 || (stats->key && !matchkey))) {
   4100           stats->alpha = 1;
   4101           stats->key = 0;
   4102           alpha_done = 1;
   4103         } else if(a == 0 && !stats->alpha && !stats->key) {
   4104           stats->key = 1;
   4105           stats->key_r = r;
   4106           stats->key_g = g;
   4107           stats->key_b = b;
   4108         } else if(a == 65535 && stats->key && matchkey) {
   4109           /* Color key cannot be used if an opaque pixel also has that RGB color. */
   4110           stats->alpha = 1;
   4111           stats->key = 0;
   4112           alpha_done = 1;
   4113         }
   4114       }
   4115       if(alpha_done && numcolors_done && colored_done && bits_done) break;
   4116     }
   4117 
   4118     if(stats->key && !stats->alpha) {
   4119       for(i = 0; i != numpixels; ++i) {
   4120         getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);
   4121         if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) {
   4122           /* Color key cannot be used if an opaque pixel also has that RGB color. */
   4123           stats->alpha = 1;
   4124           stats->key = 0;
   4125           alpha_done = 1;
   4126         }
   4127       }
   4128     }
   4129   } else /* < 16-bit */ {
   4130     unsigned char r = 0, g = 0, b = 0, a = 0;
   4131     unsigned char pr = 0, pg = 0, pb = 0, pa = 0;
   4132     for(i = 0; i != numpixels; ++i) {
   4133       getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in);
   4134 
   4135       /*skip if color same as before, this speeds up large non-photographic
   4136       images with many same colors by avoiding 'color_tree_has' below */
   4137       if(i != 0 && r == pr && g == pg && b == pb && a == pa) continue;
   4138       pr = r;
   4139       pg = g;
   4140       pb = b;
   4141       pa = a;
   4142 
   4143       if(!bits_done && stats->bits < 8) {
   4144         /*only r is checked, < 8 bits is only relevant for grayscale*/
   4145         unsigned bits = getValueRequiredBits(r);
   4146         if(bits > stats->bits) stats->bits = bits;
   4147       }
   4148       bits_done = (stats->bits >= bpp);
   4149 
   4150       if(!colored_done && (r != g || r != b)) {
   4151         stats->colored = 1;
   4152         colored_done = 1;
   4153         if(stats->bits < 8) stats->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/
   4154       }
   4155 
   4156       if(!alpha_done) {
   4157         unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b);
   4158         if(a != 255 && (a != 0 || (stats->key && !matchkey))) {
   4159           stats->alpha = 1;
   4160           stats->key = 0;
   4161           alpha_done = 1;
   4162           if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/
   4163         } else if(a == 0 && !stats->alpha && !stats->key) {
   4164           stats->key = 1;
   4165           stats->key_r = r;
   4166           stats->key_g = g;
   4167           stats->key_b = b;
   4168         } else if(a == 255 && stats->key && matchkey) {
   4169           /* Color key cannot be used if an opaque pixel also has that RGB color. */
   4170           stats->alpha = 1;
   4171           stats->key = 0;
   4172           alpha_done = 1;
   4173           if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/
   4174         }
   4175       }
   4176 
   4177       if(!numcolors_done) {
   4178         if(!color_tree_has(&tree, r, g, b, a)) {
   4179           error = color_tree_add(&tree, r, g, b, a, stats->numcolors);
   4180           if(error) goto cleanup;
   4181           if(stats->numcolors < 256) {
   4182             unsigned char* p = stats->palette;
   4183             unsigned n = stats->numcolors;
   4184             p[n * 4 + 0] = r;
   4185             p[n * 4 + 1] = g;
   4186             p[n * 4 + 2] = b;
   4187             p[n * 4 + 3] = a;
   4188           }
   4189           ++stats->numcolors;
   4190           numcolors_done = stats->numcolors >= maxnumcolors;
   4191         }
   4192       }
   4193 
   4194       if(alpha_done && numcolors_done && colored_done && bits_done) break;
   4195     }
   4196 
   4197     if(stats->key && !stats->alpha) {
   4198       for(i = 0; i != numpixels; ++i) {
   4199         getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in);
   4200         if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) {
   4201           /* Color key cannot be used if an opaque pixel also has that RGB color. */
   4202           stats->alpha = 1;
   4203           stats->key = 0;
   4204           alpha_done = 1;
   4205           if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/
   4206         }
   4207       }
   4208     }
   4209 
   4210     /*make the stats's key always 16-bit for consistency - repeat each byte twice*/
   4211     stats->key_r += (stats->key_r << 8);
   4212     stats->key_g += (stats->key_g << 8);
   4213     stats->key_b += (stats->key_b << 8);
   4214   }
   4215 
   4216 cleanup:
   4217   color_tree_cleanup(&tree);
   4218   return error;
   4219 }
   4220 
   4221 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   4222 /*Adds a single color to the color stats. The stats must already have been inited. The color must be given as 16-bit
   4223 (with 2 bytes repeating for 8-bit and 65535 for opaque alpha channel). This function is expensive, do not call it for
   4224 all pixels of an image but only for a few additional values. */
   4225 static unsigned lodepng_color_stats_add(LodePNGColorStats* stats,
   4226                                         unsigned r, unsigned g, unsigned b, unsigned a) {
   4227   unsigned error = 0;
   4228   unsigned char image[8];
   4229   LodePNGColorMode mode;
   4230   lodepng_color_mode_init(&mode);
   4231   image[0] = r >> 8; image[1] = r; image[2] = g >> 8; image[3] = g;
   4232   image[4] = b >> 8; image[5] = b; image[6] = a >> 8; image[7] = a;
   4233   mode.bitdepth = 16;
   4234   mode.colortype = LCT_RGBA;
   4235   error = lodepng_compute_color_stats(stats, image, 1, 1, &mode);
   4236   lodepng_color_mode_cleanup(&mode);
   4237   return error;
   4238 }
   4239 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   4240 
   4241 /*Computes a minimal PNG color model that can contain all colors as indicated by the stats.
   4242 The stats should be computed with lodepng_compute_color_stats.
   4243 mode_in is raw color profile of the image the stats were computed on, to copy palette order from when relevant.
   4244 Minimal PNG color model means the color type and bit depth that gives smallest amount of bits in the output image,
   4245 e.g. gray if only grayscale pixels, palette if less than 256 colors, color key if only single transparent color, ...
   4246 This is used if auto_convert is enabled (it is by default).
   4247 */
   4248 static unsigned auto_choose_color(LodePNGColorMode* mode_out,
   4249                                   const LodePNGColorMode* mode_in,
   4250                                   const LodePNGColorStats* stats) {
   4251   unsigned error = 0;
   4252   unsigned palettebits;
   4253   size_t i, n;
   4254   size_t numpixels = stats->numpixels;
   4255   unsigned palette_ok, gray_ok;
   4256 
   4257   unsigned alpha = stats->alpha;
   4258   unsigned key = stats->key;
   4259   unsigned bits = stats->bits;
   4260 
   4261   mode_out->key_defined = 0;
   4262 
   4263   if(key && numpixels <= 16) {
   4264     alpha = 1; /*too few pixels to justify tRNS chunk overhead*/
   4265     key = 0;
   4266     if(bits < 8) bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/
   4267   }
   4268 
   4269   gray_ok = !stats->colored;
   4270   if(!stats->allow_greyscale) gray_ok = 0;
   4271   if(!gray_ok && bits < 8) bits = 8;
   4272 
   4273   n = stats->numcolors;
   4274   palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8));
   4275   palette_ok = n <= 256 && bits <= 8 && n != 0; /*n==0 means likely numcolors wasn't computed*/
   4276   if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/
   4277   if(gray_ok && !alpha && bits <= palettebits) palette_ok = 0; /*gray is less overhead*/
   4278   if(!stats->allow_palette) palette_ok = 0;
   4279 
   4280   if(palette_ok) {
   4281     const unsigned char* p = stats->palette;
   4282     lodepng_palette_clear(mode_out); /*remove potential earlier palette*/
   4283     for(i = 0; i != stats->numcolors; ++i) {
   4284       error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]);
   4285       if(error) break;
   4286     }
   4287 
   4288     mode_out->colortype = LCT_PALETTE;
   4289     mode_out->bitdepth = palettebits;
   4290 
   4291     if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize
   4292         && mode_in->bitdepth == mode_out->bitdepth) {
   4293       /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/
   4294       lodepng_color_mode_cleanup(mode_out); /*clears palette, keeps the above set colortype and bitdepth fields as-is*/
   4295       lodepng_color_mode_copy(mode_out, mode_in);
   4296     }
   4297   } else /*8-bit or 16-bit per channel*/ {
   4298     mode_out->bitdepth = bits;
   4299     mode_out->colortype = alpha ? (gray_ok ? LCT_GREY_ALPHA : LCT_RGBA)
   4300                                 : (gray_ok ? LCT_GREY : LCT_RGB);
   4301     if(key) {
   4302       unsigned mask = (1u << mode_out->bitdepth) - 1u; /*stats always uses 16-bit, mask converts it*/
   4303       mode_out->key_r = stats->key_r & mask;
   4304       mode_out->key_g = stats->key_g & mask;
   4305       mode_out->key_b = stats->key_b & mask;
   4306       mode_out->key_defined = 1;
   4307     }
   4308   }
   4309 
   4310   return error;
   4311 }
   4312 
   4313 #endif /* #ifdef LODEPNG_COMPILE_ENCODER */
   4314 
   4315 /*Paeth predictor, used by PNG filter type 4*/
   4316 static unsigned char paethPredictor(unsigned char a, unsigned char b, unsigned char c) {
   4317   /* the subtractions of unsigned char cast it to a signed type.
   4318   With gcc, short is faster than int, with clang int is as fast (as of april 2023)*/
   4319   short pa = (b - c) < 0 ? -(b - c) : (b - c);
   4320   short pb = (a - c) < 0 ? -(a - c) : (a - c);
   4321   /* writing it out like this compiles to something faster than introducing a temp variable*/
   4322   short pc = (a + b - c - c) < 0 ? -(a + b - c - c) : (a + b - c - c);
   4323   /* return input value associated with smallest of pa, pb, pc (with certain priority if equal) */
   4324   if(pb < pa) { a = b; pa = pb; }
   4325   return (pc < pa) ? c : a;
   4326 }
   4327 
   4328 /*shared values used by multiple Adam7 related functions*/
   4329 
   4330 static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/
   4331 static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/
   4332 static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/
   4333 static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/
   4334 
   4335 /*
   4336 Outputs various dimensions and positions in the image related to the Adam7 reduced images.
   4337 passw: output containing the width of the 7 passes
   4338 passh: output containing the height of the 7 passes
   4339 filter_passstart: output containing the index of the start and end of each
   4340  reduced image with filter bytes
   4341 padded_passstart output containing the index of the start and end of each
   4342  reduced image when without filter bytes but with padded scanlines
   4343 passstart: output containing the index of the start and end of each reduced
   4344  image without padding between scanlines, but still padding between the images
   4345 w, h: width and height of non-interlaced image
   4346 bpp: bits per pixel
   4347 "padded" is only relevant if bpp is less than 8 and a scanline or image does not
   4348  end at a full byte
   4349 */
   4350 static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8],
   4351                                 size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) {
   4352   /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/
   4353   unsigned i;
   4354 
   4355   /*calculate width and height in pixels of each pass*/
   4356   for(i = 0; i != 7; ++i) {
   4357     passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i];
   4358     passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i];
   4359     if(passw[i] == 0) passh[i] = 0;
   4360     if(passh[i] == 0) passw[i] = 0;
   4361   }
   4362 
   4363   filter_passstart[0] = padded_passstart[0] = passstart[0] = 0;
   4364   for(i = 0; i != 7; ++i) {
   4365     /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/
   4366     filter_passstart[i + 1] = filter_passstart[i]
   4367                             + ((passw[i] && passh[i]) ? passh[i] * (1u + (passw[i] * bpp + 7u) / 8u) : 0);
   4368     /*bits padded if needed to fill full byte at end of each scanline*/
   4369     padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7u) / 8u);
   4370     /*only padded at end of reduced image*/
   4371     passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7u) / 8u;
   4372   }
   4373 }
   4374 
   4375 #ifdef LODEPNG_COMPILE_DECODER
   4376 
   4377 /* ////////////////////////////////////////////////////////////////////////// */
   4378 /* / PNG Decoder                                                            / */
   4379 /* ////////////////////////////////////////////////////////////////////////// */
   4380 
   4381 /*read the information from the header and store it in the LodePNGInfo. return value is error*/
   4382 unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state,
   4383                          const unsigned char* in, size_t insize) {
   4384   unsigned width, height;
   4385   LodePNGInfo* info = &state->info_png;
   4386   if(insize == 0 || in == 0) {
   4387     CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/
   4388   }
   4389   if(insize < 33) {
   4390     CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/
   4391   }
   4392 
   4393   /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/
   4394   /* TODO: remove this. One should use a new LodePNGState for new sessions */
   4395   lodepng_info_cleanup(info);
   4396   lodepng_info_init(info);
   4397 
   4398   if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71
   4399      || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) {
   4400     CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/
   4401   }
   4402   if(lodepng_chunk_length(in + 8) != 13) {
   4403     CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/
   4404   }
   4405   if(!lodepng_chunk_type_equals(in + 8, "IHDR")) {
   4406     CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/
   4407   }
   4408 
   4409   /*read the values given in the header*/
   4410   width = lodepng_read32bitInt(&in[16]);
   4411   height = lodepng_read32bitInt(&in[20]);
   4412   /*TODO: remove the undocumented feature that allows to give null pointers to width or height*/
   4413   if(w) *w = width;
   4414   if(h) *h = height;
   4415   info->color.bitdepth = in[24];
   4416   info->color.colortype = (LodePNGColorType)in[25];
   4417   info->compression_method = in[26];
   4418   info->filter_method = in[27];
   4419   info->interlace_method = in[28];
   4420 
   4421   /*errors returned only after the parsing so other values are still output*/
   4422 
   4423   /*error: invalid image size*/
   4424   if(width == 0 || height == 0) CERROR_RETURN_ERROR(state->error, 93);
   4425   /*error: invalid colortype or bitdepth combination*/
   4426   state->error = checkColorValidity(info->color.colortype, info->color.bitdepth);
   4427   if(state->error) return state->error;
   4428   /*error: only compression method 0 is allowed in the specification*/
   4429   if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32);
   4430   /*error: only filter method 0 is allowed in the specification*/
   4431   if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33);
   4432   /*error: only interlace methods 0 and 1 exist in the specification*/
   4433   if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34);
   4434 
   4435   if(!state->decoder.ignore_crc) {
   4436     unsigned crc = lodepng_read32bitInt(&in[29]);
   4437     unsigned checksum = lodepng_crc32(&in[12], 17);
   4438     if(crc != checksum) {
   4439       CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/
   4440     }
   4441   }
   4442 
   4443   return state->error;
   4444 }
   4445 
   4446 static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon,
   4447                                  size_t bytewidth, unsigned char filterType, size_t length) {
   4448   /*
   4449   For PNG filter method 0
   4450   unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte,
   4451   the filter works byte per byte (bytewidth = 1)
   4452   precon is the previous unfiltered scanline, recon the result, scanline the current one
   4453   the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead
   4454   recon and scanline MAY be the same memory address! precon must be disjoint.
   4455   */
   4456 
   4457   size_t i;
   4458   switch(filterType) {
   4459     case 0:
   4460       for(i = 0; i != length; ++i) recon[i] = scanline[i];
   4461       break;
   4462     case 1: {
   4463       size_t j = 0;
   4464       for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i];
   4465       for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + recon[j];
   4466       break;
   4467     }
   4468     case 2:
   4469       if(precon) {
   4470         for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i];
   4471       } else {
   4472         for(i = 0; i != length; ++i) recon[i] = scanline[i];
   4473       }
   4474       break;
   4475     case 3:
   4476       if(precon) {
   4477         size_t j = 0;
   4478         for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u);
   4479         /* Unroll independent paths of this predictor. A 6x and 8x version is also possible but that adds
   4480         too much code. Whether this speeds up anything depends on compiler and settings. */
   4481         if(bytewidth >= 4) {
   4482           for(; i + 3 < length; i += 4, j += 4) {
   4483             unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2], s3 = scanline[i + 3];
   4484             unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2], r3 = recon[j + 3];
   4485             unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2], p3 = precon[i + 3];
   4486             recon[i + 0] = s0 + ((r0 + p0) >> 1u);
   4487             recon[i + 1] = s1 + ((r1 + p1) >> 1u);
   4488             recon[i + 2] = s2 + ((r2 + p2) >> 1u);
   4489             recon[i + 3] = s3 + ((r3 + p3) >> 1u);
   4490           }
   4491         } else if(bytewidth >= 3) {
   4492           for(; i + 2 < length; i += 3, j += 3) {
   4493             unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2];
   4494             unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2];
   4495             unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2];
   4496             recon[i + 0] = s0 + ((r0 + p0) >> 1u);
   4497             recon[i + 1] = s1 + ((r1 + p1) >> 1u);
   4498             recon[i + 2] = s2 + ((r2 + p2) >> 1u);
   4499           }
   4500         } else if(bytewidth >= 2) {
   4501           for(; i + 1 < length; i += 2, j += 2) {
   4502             unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1];
   4503             unsigned char r0 = recon[j + 0], r1 = recon[j + 1];
   4504             unsigned char p0 = precon[i + 0], p1 = precon[i + 1];
   4505             recon[i + 0] = s0 + ((r0 + p0) >> 1u);
   4506             recon[i + 1] = s1 + ((r1 + p1) >> 1u);
   4507           }
   4508         }
   4509         for(; i != length; ++i, ++j) recon[i] = scanline[i] + ((recon[j] + precon[i]) >> 1u);
   4510       } else {
   4511         size_t j = 0;
   4512         for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i];
   4513         for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + (recon[j] >> 1u);
   4514       }
   4515       break;
   4516     case 4:
   4517       if(precon) {
   4518         /* Unroll independent paths of this predictor. Whether this speeds up
   4519         anything depends on compiler and settings. */
   4520         if(bytewidth == 8) {
   4521           unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0;
   4522           unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0;
   4523           unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0;
   4524           unsigned char a6, b6 = 0, c6, d6 = 0, a7, b7 = 0, c7, d7 = 0;
   4525           for(i = 0; i + 7 < length; i += 8) {
   4526             c0 = b0; c1 = b1; c2 = b2; c3 = b3;
   4527             c4 = b4; c5 = b5; c6 = b6; c7 = b7;
   4528             b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2]; b3 = precon[i + 3];
   4529             b4 = precon[i + 4]; b5 = precon[i + 5]; b6 = precon[i + 6]; b7 = precon[i + 7];
   4530             a0 = d0; a1 = d1; a2 = d2; a3 = d3;
   4531             a4 = d4; a5 = d5; a6 = d6; a7 = d7;
   4532             d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
   4533             d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
   4534             d2 = scanline[i + 2] + paethPredictor(a2, b2, c2);
   4535             d3 = scanline[i + 3] + paethPredictor(a3, b3, c3);
   4536             d4 = scanline[i + 4] + paethPredictor(a4, b4, c4);
   4537             d5 = scanline[i + 5] + paethPredictor(a5, b5, c5);
   4538             d6 = scanline[i + 6] + paethPredictor(a6, b6, c6);
   4539             d7 = scanline[i + 7] + paethPredictor(a7, b7, c7);
   4540             recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2; recon[i + 3] = d3;
   4541             recon[i + 4] = d4; recon[i + 5] = d5; recon[i + 6] = d6; recon[i + 7] = d7;
   4542           }
   4543         } else if(bytewidth == 6) {
   4544           unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0;
   4545           unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0;
   4546           unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0;
   4547           for(i = 0; i + 5 < length; i += 6) {
   4548             c0 = b0; c1 = b1; c2 = b2;
   4549             c3 = b3; c4 = b4; c5 = b5;
   4550             b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2];
   4551             b3 = precon[i + 3]; b4 = precon[i + 4]; b5 = precon[i + 5];
   4552             a0 = d0; a1 = d1; a2 = d2;
   4553             a3 = d3; a4 = d4; a5 = d5;
   4554             d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
   4555             d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
   4556             d2 = scanline[i + 2] + paethPredictor(a2, b2, c2);
   4557             d3 = scanline[i + 3] + paethPredictor(a3, b3, c3);
   4558             d4 = scanline[i + 4] + paethPredictor(a4, b4, c4);
   4559             d5 = scanline[i + 5] + paethPredictor(a5, b5, c5);
   4560             recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2;
   4561             recon[i + 3] = d3; recon[i + 4] = d4; recon[i + 5] = d5;
   4562           }
   4563         } else if(bytewidth == 4) {
   4564           unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0;
   4565           unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0;
   4566           for(i = 0; i + 3 < length; i += 4) {
   4567             c0 = b0; c1 = b1; c2 = b2; c3 = b3;
   4568             b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2]; b3 = precon[i + 3];
   4569             a0 = d0; a1 = d1; a2 = d2; a3 = d3;
   4570             d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
   4571             d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
   4572             d2 = scanline[i + 2] + paethPredictor(a2, b2, c2);
   4573             d3 = scanline[i + 3] + paethPredictor(a3, b3, c3);
   4574             recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2; recon[i + 3] = d3;
   4575           }
   4576         } else if(bytewidth == 3) {
   4577           unsigned char a0, b0 = 0, c0, d0 = 0;
   4578           unsigned char a1, b1 = 0, c1, d1 = 0;
   4579           unsigned char a2, b2 = 0, c2, d2 = 0;
   4580           for(i = 0; i + 2 < length; i += 3) {
   4581             c0 = b0; c1 = b1; c2 = b2;
   4582             b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2];
   4583             a0 = d0; a1 = d1; a2 = d2;
   4584             d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
   4585             d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
   4586             d2 = scanline[i + 2] + paethPredictor(a2, b2, c2);
   4587             recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2;
   4588           }
   4589         } else if(bytewidth == 2) {
   4590           unsigned char a0, b0 = 0, c0, d0 = 0;
   4591           unsigned char a1, b1 = 0, c1, d1 = 0;
   4592           for(i = 0; i + 1 < length; i += 2) {
   4593             c0 = b0; c1 = b1;
   4594             b0 = precon[i + 0];
   4595             b1 = precon[i + 1];
   4596             a0 = d0; a1 = d1;
   4597             d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
   4598             d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
   4599             recon[i + 0] = d0;
   4600             recon[i + 1] = d1;
   4601           }
   4602         } else if(bytewidth == 1) {
   4603           unsigned char a, b = 0, c, d = 0;
   4604           for(i = 0; i != length; ++i) {
   4605             c = b;
   4606             b = precon[i];
   4607             a = d;
   4608             d = scanline[i] + paethPredictor(a, b, c);
   4609             recon[i] = d;
   4610           }
   4611         } else {
   4612           /* Normally not a possible case, but this would handle it correctly */
   4613           for(i = 0; i != bytewidth; ++i) {
   4614             recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/
   4615           }
   4616         }
   4617         /* finish any remaining bytes */
   4618         for(; i != length; ++i) {
   4619           recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth]));
   4620         }
   4621       } else {
   4622         size_t j = 0;
   4623         for(i = 0; i != bytewidth; ++i) {
   4624           recon[i] = scanline[i];
   4625         }
   4626         for(i = bytewidth; i != length; ++i, ++j) {
   4627           /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/
   4628           recon[i] = (scanline[i] + recon[j]);
   4629         }
   4630       }
   4631       break;
   4632     default: return 36; /*error: invalid filter type given*/
   4633   }
   4634   return 0;
   4635 }
   4636 
   4637 static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) {
   4638   /*
   4639   For PNG filter method 0
   4640   this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times)
   4641   out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline
   4642   w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel
   4643   in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes)
   4644   */
   4645 
   4646   unsigned y;
   4647   unsigned char* prevline = 0;
   4648 
   4649   /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/
   4650   size_t bytewidth = (bpp + 7u) / 8u;
   4651   /*the width of a scanline in bytes, not including the filter type*/
   4652   size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u;
   4653 
   4654   for(y = 0; y < h; ++y) {
   4655     size_t outindex = linebytes * y;
   4656     size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/
   4657     unsigned char filterType = in[inindex];
   4658 
   4659     CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes));
   4660 
   4661     prevline = &out[outindex];
   4662   }
   4663 
   4664   return 0;
   4665 }
   4666 
   4667 /*
   4668 in: Adam7 interlaced image, with no padding bits between scanlines, but between
   4669  reduced images so that each reduced image starts at a byte.
   4670 out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h
   4671 bpp: bits per pixel
   4672 out has the following size in bits: w * h * bpp.
   4673 in is possibly bigger due to padding bits between reduced images.
   4674 out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation
   4675 (because that's likely a little bit faster)
   4676 NOTE: comments about padding bits are only relevant if bpp < 8
   4677 */
   4678 static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) {
   4679   unsigned passw[7], passh[7];
   4680   size_t filter_passstart[8], padded_passstart[8], passstart[8];
   4681   unsigned i;
   4682 
   4683   Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
   4684 
   4685   if(bpp >= 8) {
   4686     for(i = 0; i != 7; ++i) {
   4687       unsigned x, y, b;
   4688       size_t bytewidth = bpp / 8u;
   4689       for(y = 0; y < passh[i]; ++y)
   4690       for(x = 0; x < passw[i]; ++x) {
   4691         size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth;
   4692         size_t pixeloutstart = ((ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * (size_t)w
   4693                              + ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bytewidth;
   4694         for(b = 0; b < bytewidth; ++b) {
   4695           out[pixeloutstart + b] = in[pixelinstart + b];
   4696         }
   4697       }
   4698     }
   4699   } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ {
   4700     for(i = 0; i != 7; ++i) {
   4701       unsigned x, y, b;
   4702       unsigned ilinebits = bpp * passw[i];
   4703       unsigned olinebits = bpp * w;
   4704       size_t obp, ibp; /*bit pointers (for out and in buffer)*/
   4705       for(y = 0; y < passh[i]; ++y)
   4706       for(x = 0; x < passw[i]; ++x) {
   4707         ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp);
   4708         obp = (ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bpp;
   4709         for(b = 0; b < bpp; ++b) {
   4710           unsigned char bit = readBitFromReversedStream(&ibp, in);
   4711           setBitOfReversedStream(&obp, out, bit);
   4712         }
   4713       }
   4714     }
   4715   }
   4716 }
   4717 
   4718 static void removePaddingBits(unsigned char* out, const unsigned char* in,
   4719                               size_t olinebits, size_t ilinebits, unsigned h) {
   4720   /*
   4721   After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need
   4722   to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers
   4723   for the Adam7 code, the color convert code and the output to the user.
   4724   in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must
   4725   have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits
   4726   also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7
   4727   only useful if (ilinebits - olinebits) is a value in the range 1..7
   4728   */
   4729   unsigned y;
   4730   size_t diff = ilinebits - olinebits;
   4731   size_t ibp = 0, obp = 0; /*input and output bit pointers*/
   4732   for(y = 0; y < h; ++y) {
   4733     size_t x;
   4734     for(x = 0; x < olinebits; ++x) {
   4735       unsigned char bit = readBitFromReversedStream(&ibp, in);
   4736       setBitOfReversedStream(&obp, out, bit);
   4737     }
   4738     ibp += diff;
   4739   }
   4740 }
   4741 
   4742 /*out must be buffer big enough to contain full image, and in must contain the full decompressed data from
   4743 the IDAT chunks (with filter index bytes and possible padding bits)
   4744 return value is error*/
   4745 static unsigned postProcessScanlines(unsigned char* out, unsigned char* in,
   4746                                      unsigned w, unsigned h, const LodePNGInfo* info_png) {
   4747   /*
   4748   This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype.
   4749   Steps:
   4750   *) if no Adam7: 1) unfilter 2) remove padding bits (= possible extra bits per scanline if bpp < 8)
   4751   *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace
   4752   NOTE: the in buffer will be overwritten with intermediate data!
   4753   */
   4754   unsigned bpp = lodepng_get_bpp(&info_png->color);
   4755   if(bpp == 0) return 31; /*error: invalid colortype*/
   4756 
   4757   if(info_png->interlace_method == 0) {
   4758     if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) {
   4759       CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp));
   4760       removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h);
   4761     }
   4762     /*we can immediately filter into the out buffer, no other steps needed*/
   4763     else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp));
   4764   } else /*interlace_method is 1 (Adam7)*/ {
   4765     unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
   4766     unsigned i;
   4767 
   4768     Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
   4769 
   4770     for(i = 0; i != 7; ++i) {
   4771       CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp));
   4772       /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline,
   4773       move bytes instead of bits or move not at all*/
   4774       if(bpp < 8) {
   4775         /*remove padding bits in scanlines; after this there still may be padding
   4776         bits between the different reduced images: each reduced image still starts nicely at a byte*/
   4777         removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp,
   4778                           ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]);
   4779       }
   4780     }
   4781 
   4782     Adam7_deinterlace(out, in, w, h, bpp);
   4783   }
   4784 
   4785   return 0;
   4786 }
   4787 
   4788 static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) {
   4789   unsigned pos = 0, i;
   4790   color->palettesize = chunkLength / 3u;
   4791   if(color->palettesize == 0 || color->palettesize > 256) return 38; /*error: palette too small or big*/
   4792   lodepng_color_mode_alloc_palette(color);
   4793   if(!color->palette && color->palettesize) {
   4794     color->palettesize = 0;
   4795     return 83; /*alloc fail*/
   4796   }
   4797 
   4798   for(i = 0; i != color->palettesize; ++i) {
   4799     color->palette[4 * i + 0] = data[pos++]; /*R*/
   4800     color->palette[4 * i + 1] = data[pos++]; /*G*/
   4801     color->palette[4 * i + 2] = data[pos++]; /*B*/
   4802     color->palette[4 * i + 3] = 255; /*alpha*/
   4803   }
   4804 
   4805   return 0; /* OK */
   4806 }
   4807 
   4808 static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) {
   4809   unsigned i;
   4810   if(color->colortype == LCT_PALETTE) {
   4811     /*error: more alpha values given than there are palette entries*/
   4812     if(chunkLength > color->palettesize) return 39;
   4813 
   4814     for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i];
   4815   } else if(color->colortype == LCT_GREY) {
   4816     /*error: this chunk must be 2 bytes for grayscale image*/
   4817     if(chunkLength != 2) return 30;
   4818 
   4819     color->key_defined = 1;
   4820     color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1];
   4821   } else if(color->colortype == LCT_RGB) {
   4822     /*error: this chunk must be 6 bytes for RGB image*/
   4823     if(chunkLength != 6) return 41;
   4824 
   4825     color->key_defined = 1;
   4826     color->key_r = 256u * data[0] + data[1];
   4827     color->key_g = 256u * data[2] + data[3];
   4828     color->key_b = 256u * data[4] + data[5];
   4829   }
   4830   else return 42; /*error: tRNS chunk not allowed for other color models*/
   4831 
   4832   return 0; /* OK */
   4833 }
   4834 
   4835 
   4836 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   4837 /*background color chunk (bKGD)*/
   4838 static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   4839   if(info->color.colortype == LCT_PALETTE) {
   4840     /*error: this chunk must be 1 byte for indexed color image*/
   4841     if(chunkLength != 1) return 43;
   4842 
   4843     /*error: invalid palette index, or maybe this chunk appeared before PLTE*/
   4844     if(data[0] >= info->color.palettesize) return 103;
   4845 
   4846     info->background_defined = 1;
   4847     info->background_r = info->background_g = info->background_b = data[0];
   4848   } else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) {
   4849     /*error: this chunk must be 2 bytes for grayscale image*/
   4850     if(chunkLength != 2) return 44;
   4851 
   4852     /*the values are truncated to bitdepth in the PNG file*/
   4853     info->background_defined = 1;
   4854     info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1];
   4855   } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) {
   4856     /*error: this chunk must be 6 bytes for grayscale image*/
   4857     if(chunkLength != 6) return 45;
   4858 
   4859     /*the values are truncated to bitdepth in the PNG file*/
   4860     info->background_defined = 1;
   4861     info->background_r = 256u * data[0] + data[1];
   4862     info->background_g = 256u * data[2] + data[3];
   4863     info->background_b = 256u * data[4] + data[5];
   4864   }
   4865 
   4866   return 0; /* OK */
   4867 }
   4868 
   4869 /*text chunk (tEXt)*/
   4870 static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   4871   unsigned error = 0;
   4872   char *key = 0, *str = 0;
   4873 
   4874   while(!error) /*not really a while loop, only used to break on error*/ {
   4875     unsigned length, string2_begin;
   4876 
   4877     length = 0;
   4878     while(length < chunkLength && data[length] != 0) ++length;
   4879     /*even though it's not allowed by the standard, no error is thrown if
   4880     there's no null termination char, if the text is empty*/
   4881     if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/
   4882 
   4883     key = (char*)lodepng_malloc(length + 1);
   4884     if(!key) CERROR_BREAK(error, 83); /*alloc fail*/
   4885 
   4886     lodepng_memcpy(key, data, length);
   4887     key[length] = 0;
   4888 
   4889     string2_begin = length + 1; /*skip keyword null terminator*/
   4890 
   4891     length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin);
   4892     str = (char*)lodepng_malloc(length + 1);
   4893     if(!str) CERROR_BREAK(error, 83); /*alloc fail*/
   4894 
   4895     lodepng_memcpy(str, data + string2_begin, length);
   4896     str[length] = 0;
   4897 
   4898     error = lodepng_add_text(info, key, str);
   4899 
   4900     break;
   4901   }
   4902 
   4903   lodepng_free(key);
   4904   lodepng_free(str);
   4905 
   4906   return error;
   4907 }
   4908 
   4909 /*compressed text chunk (zTXt)*/
   4910 static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder,
   4911                                const unsigned char* data, size_t chunkLength) {
   4912   unsigned error = 0;
   4913 
   4914   /*copy the object to change parameters in it*/
   4915   LodePNGDecompressSettings zlibsettings = decoder->zlibsettings;
   4916 
   4917   unsigned length, string2_begin;
   4918   char *key = 0;
   4919   unsigned char* str = 0;
   4920   size_t size = 0;
   4921 
   4922   while(!error) /*not really a while loop, only used to break on error*/ {
   4923     for(length = 0; length < chunkLength && data[length] != 0; ++length) ;
   4924     if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/
   4925     if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/
   4926 
   4927     key = (char*)lodepng_malloc(length + 1);
   4928     if(!key) CERROR_BREAK(error, 83); /*alloc fail*/
   4929 
   4930     lodepng_memcpy(key, data, length);
   4931     key[length] = 0;
   4932 
   4933     if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/
   4934 
   4935     string2_begin = length + 2;
   4936     if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/
   4937 
   4938     length = (unsigned)chunkLength - string2_begin;
   4939     zlibsettings.max_output_size = decoder->max_text_size;
   4940     /*will fail if zlib error, e.g. if length is too small*/
   4941     error = zlib_decompress(&str, &size, 0, &data[string2_begin],
   4942                             length, &zlibsettings);
   4943     /*error: compressed text larger than  decoder->max_text_size*/
   4944     if(error && size > zlibsettings.max_output_size) error = 112;
   4945     if(error) break;
   4946     error = lodepng_add_text_sized(info, key, (char*)str, size);
   4947     break;
   4948   }
   4949 
   4950   lodepng_free(key);
   4951   lodepng_free(str);
   4952 
   4953   return error;
   4954 }
   4955 
   4956 /*international text chunk (iTXt)*/
   4957 static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder,
   4958                                const unsigned char* data, size_t chunkLength) {
   4959   unsigned error = 0;
   4960   unsigned i;
   4961 
   4962   /*copy the object to change parameters in it*/
   4963   LodePNGDecompressSettings zlibsettings = decoder->zlibsettings;
   4964 
   4965   unsigned length, begin, compressed;
   4966   char *key = 0, *langtag = 0, *transkey = 0;
   4967 
   4968   while(!error) /*not really a while loop, only used to break on error*/ {
   4969     /*Quick check if the chunk length isn't too small. Even without check
   4970     it'd still fail with other error checks below if it's too short. This just gives a different error code.*/
   4971     if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/
   4972 
   4973     /*read the key*/
   4974     for(length = 0; length < chunkLength && data[length] != 0; ++length) ;
   4975     if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/
   4976     if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/
   4977 
   4978     key = (char*)lodepng_malloc(length + 1);
   4979     if(!key) CERROR_BREAK(error, 83); /*alloc fail*/
   4980 
   4981     lodepng_memcpy(key, data, length);
   4982     key[length] = 0;
   4983 
   4984     /*read the compression method*/
   4985     compressed = data[length + 1];
   4986     if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/
   4987 
   4988     /*even though it's not allowed by the standard, no error is thrown if
   4989     there's no null termination char, if the text is empty for the next 3 texts*/
   4990 
   4991     /*read the langtag*/
   4992     begin = length + 3;
   4993     length = 0;
   4994     for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length;
   4995 
   4996     langtag = (char*)lodepng_malloc(length + 1);
   4997     if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/
   4998 
   4999     lodepng_memcpy(langtag, data + begin, length);
   5000     langtag[length] = 0;
   5001 
   5002     /*read the transkey*/
   5003     begin += length + 1;
   5004     length = 0;
   5005     for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length;
   5006 
   5007     transkey = (char*)lodepng_malloc(length + 1);
   5008     if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/
   5009 
   5010     lodepng_memcpy(transkey, data + begin, length);
   5011     transkey[length] = 0;
   5012 
   5013     /*read the actual text*/
   5014     begin += length + 1;
   5015 
   5016     length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin;
   5017 
   5018     if(compressed) {
   5019       unsigned char* str = 0;
   5020       size_t size = 0;
   5021       zlibsettings.max_output_size = decoder->max_text_size;
   5022       /*will fail if zlib error, e.g. if length is too small*/
   5023       error = zlib_decompress(&str, &size, 0, &data[begin],
   5024                               length, &zlibsettings);
   5025       /*error: compressed text larger than  decoder->max_text_size*/
   5026       if(error && size > zlibsettings.max_output_size) error = 112;
   5027       if(!error) error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)str, size);
   5028       lodepng_free(str);
   5029     } else {
   5030       error = lodepng_add_itext_sized(info, key, langtag, transkey, (const char*)(data + begin), length);
   5031     }
   5032 
   5033     break;
   5034   }
   5035 
   5036   lodepng_free(key);
   5037   lodepng_free(langtag);
   5038   lodepng_free(transkey);
   5039 
   5040   return error;
   5041 }
   5042 
   5043 static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5044   if(chunkLength != 7) return 73; /*invalid tIME chunk size*/
   5045 
   5046   info->time_defined = 1;
   5047   info->time.year = 256u * data[0] + data[1];
   5048   info->time.month = data[2];
   5049   info->time.day = data[3];
   5050   info->time.hour = data[4];
   5051   info->time.minute = data[5];
   5052   info->time.second = data[6];
   5053 
   5054   return 0; /* OK */
   5055 }
   5056 
   5057 static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5058   if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/
   5059 
   5060   info->phys_defined = 1;
   5061   info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3];
   5062   info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7];
   5063   info->phys_unit = data[8];
   5064 
   5065   return 0; /* OK */
   5066 }
   5067 
   5068 static unsigned readChunk_gAMA(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5069   if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/
   5070 
   5071   info->gama_defined = 1;
   5072   info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3];
   5073 
   5074   return 0; /* OK */
   5075 }
   5076 
   5077 static unsigned readChunk_cHRM(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5078   if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/
   5079 
   5080   info->chrm_defined = 1;
   5081   info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3];
   5082   info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7];
   5083   info->chrm_red_x   = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11];
   5084   info->chrm_red_y   = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15];
   5085   info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19];
   5086   info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23];
   5087   info->chrm_blue_x  = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27];
   5088   info->chrm_blue_y  = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31];
   5089 
   5090   return 0; /* OK */
   5091 }
   5092 
   5093 static unsigned readChunk_sRGB(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5094   if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/
   5095 
   5096   info->srgb_defined = 1;
   5097   info->srgb_intent = data[0];
   5098 
   5099   return 0; /* OK */
   5100 }
   5101 
   5102 static unsigned readChunk_iCCP(LodePNGInfo* info, const LodePNGDecoderSettings* decoder,
   5103                                const unsigned char* data, size_t chunkLength) {
   5104   unsigned error = 0;
   5105   unsigned i;
   5106   size_t size = 0;
   5107   /*copy the object to change parameters in it*/
   5108   LodePNGDecompressSettings zlibsettings = decoder->zlibsettings;
   5109 
   5110   unsigned length, string2_begin;
   5111 
   5112   if(info->iccp_defined) lodepng_clear_icc(info);
   5113 
   5114   for(length = 0; length < chunkLength && data[length] != 0; ++length) ;
   5115   if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/
   5116   if(length < 1 || length > 79) return 89; /*keyword too short or long*/
   5117 
   5118   info->iccp_name = (char*)lodepng_malloc(length + 1);
   5119   if(!info->iccp_name) return 83; /*alloc fail*/
   5120 
   5121   info->iccp_name[length] = 0;
   5122   for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i];
   5123 
   5124   if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/
   5125 
   5126   string2_begin = length + 2;
   5127   if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/
   5128 
   5129   length = (unsigned)chunkLength - string2_begin;
   5130   zlibsettings.max_output_size = decoder->max_icc_size;
   5131   error = zlib_decompress(&info->iccp_profile, &size, 0,
   5132                           &data[string2_begin],
   5133                           length, &zlibsettings);
   5134   /*error: ICC profile larger than decoder->max_icc_size*/
   5135   if(error && size > zlibsettings.max_output_size) error = 113;
   5136   info->iccp_profile_size = (unsigned)size;
   5137   if(!error && !info->iccp_profile_size) error = 123; /*invalid ICC profile size*/
   5138 
   5139   if(!error) info->iccp_defined = 1;
   5140   return error;
   5141 }
   5142 
   5143 static unsigned readChunk_cICP(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5144   if(chunkLength != 4) return 117; /*invalid cICP chunk size*/
   5145 
   5146   info->cicp_defined = 1;
   5147   /* No error checking for value ranges is done here, that is up to a CICP
   5148   handling library, not the PNG decoding. Just pass on the metadata. */
   5149   info->cicp_color_primaries = data[0];
   5150   info->cicp_transfer_function = data[1];
   5151   info->cicp_matrix_coefficients = data[2];
   5152   info->cicp_video_full_range_flag = data[3];
   5153 
   5154   return 0; /* OK */
   5155 }
   5156 
   5157 static unsigned readChunk_mDCV(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5158   if(chunkLength != 24) return 119; /*invalid mDCV chunk size*/
   5159 
   5160   info->mdcv_defined = 1;
   5161   info->mdcv_red_x = 256u * data[0] + data[1];
   5162   info->mdcv_red_y = 256u * data[2] + data[3];
   5163   info->mdcv_green_x = 256u * data[4] + data[5];
   5164   info->mdcv_green_y = 256u * data[6] + data[7];
   5165   info->mdcv_blue_x = 256u * data[8] + data[9];
   5166   info->mdcv_blue_y = 256u * data[10] + data[11];
   5167   info->mdcv_white_x = 256u * data[12] + data[13];
   5168   info->mdcv_white_y = 256u * data[14] + data[15];
   5169   info->mdcv_max_luminance = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19];
   5170   info->mdcv_min_luminance = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23];
   5171 
   5172   return 0; /* OK */
   5173 }
   5174 
   5175 static unsigned readChunk_cLLI(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5176   if(chunkLength != 8) return 120; /*invalid cLLI chunk size*/
   5177 
   5178   info->clli_defined = 1;
   5179   info->clli_max_cll = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3];
   5180   info->clli_max_fall = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7];
   5181 
   5182   return 0; /* OK */
   5183 }
   5184 
   5185 static unsigned readChunk_eXIf(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5186   return lodepng_set_exif(info, data, (unsigned)chunkLength);
   5187 }
   5188 
   5189 /*significant bits chunk (sBIT)*/
   5190 static unsigned readChunk_sBIT(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
   5191   unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth;
   5192   if(info->color.colortype == LCT_GREY) {
   5193     /*error: this chunk must be 1 bytes for grayscale image*/
   5194     if(chunkLength != 1) return 114;
   5195     if(data[0] == 0 || data[0] > bitdepth) return 115;
   5196     info->sbit_defined = 1;
   5197     info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/
   5198   } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) {
   5199     /*error: this chunk must be 3 bytes for RGB and palette image*/
   5200     if(chunkLength != 3) return 114;
   5201     if(data[0] == 0 || data[1] == 0 || data[2] == 0) return 115;
   5202     if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth) return 115;
   5203     info->sbit_defined = 1;
   5204     info->sbit_r = data[0];
   5205     info->sbit_g = data[1];
   5206     info->sbit_b = data[2];
   5207   } else if(info->color.colortype == LCT_GREY_ALPHA) {
   5208     /*error: this chunk must be 2 byte for grayscale with alpha image*/
   5209     if(chunkLength != 2) return 114;
   5210     if(data[0] == 0 || data[1] == 0) return 115;
   5211     if(data[0] > bitdepth || data[1] > bitdepth) return 115;
   5212     info->sbit_defined = 1;
   5213     info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/
   5214     info->sbit_a = data[1];
   5215   } else if(info->color.colortype == LCT_RGBA) {
   5216     /*error: this chunk must be 4 bytes for grayscale image*/
   5217     if(chunkLength != 4) return 114;
   5218     if(data[0] == 0 || data[1] == 0 || data[2] == 0 || data[3] == 0) return 115;
   5219     if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth || data[3] > bitdepth) return 115;
   5220     info->sbit_defined = 1;
   5221     info->sbit_r = data[0];
   5222     info->sbit_g = data[1];
   5223     info->sbit_b = data[2];
   5224     info->sbit_a = data[3];
   5225   }
   5226 
   5227   return 0; /* OK */
   5228 }
   5229 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   5230 
   5231 unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos,
   5232                                const unsigned char* in, size_t insize) {
   5233   const unsigned char* chunk = in + pos;
   5234   unsigned chunkLength;
   5235   const unsigned char* data;
   5236   unsigned unhandled = 0;
   5237   unsigned error = 0;
   5238 
   5239   if(pos + 4 > insize) return 30;
   5240   chunkLength = lodepng_chunk_length(chunk);
   5241   if(chunkLength > 2147483647) return 63;
   5242   data = lodepng_chunk_data_const(chunk);
   5243   if(chunkLength + 12 > insize - pos) return 30;
   5244 
   5245   if(lodepng_chunk_type_equals(chunk, "PLTE")) {
   5246     error = readChunk_PLTE(&state->info_png.color, data, chunkLength);
   5247   } else if(lodepng_chunk_type_equals(chunk, "tRNS")) {
   5248     error = readChunk_tRNS(&state->info_png.color, data, chunkLength);
   5249 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   5250   } else if(lodepng_chunk_type_equals(chunk, "bKGD")) {
   5251     error = readChunk_bKGD(&state->info_png, data, chunkLength);
   5252   } else if(lodepng_chunk_type_equals(chunk, "tEXt")) {
   5253     error = readChunk_tEXt(&state->info_png, data, chunkLength);
   5254   } else if(lodepng_chunk_type_equals(chunk, "zTXt")) {
   5255     error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength);
   5256   } else if(lodepng_chunk_type_equals(chunk, "iTXt")) {
   5257     error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength);
   5258   } else if(lodepng_chunk_type_equals(chunk, "tIME")) {
   5259     error = readChunk_tIME(&state->info_png, data, chunkLength);
   5260   } else if(lodepng_chunk_type_equals(chunk, "pHYs")) {
   5261     error = readChunk_pHYs(&state->info_png, data, chunkLength);
   5262   } else if(lodepng_chunk_type_equals(chunk, "gAMA")) {
   5263     error = readChunk_gAMA(&state->info_png, data, chunkLength);
   5264   } else if(lodepng_chunk_type_equals(chunk, "cHRM")) {
   5265     error = readChunk_cHRM(&state->info_png, data, chunkLength);
   5266   } else if(lodepng_chunk_type_equals(chunk, "sRGB")) {
   5267     error = readChunk_sRGB(&state->info_png, data, chunkLength);
   5268   } else if(lodepng_chunk_type_equals(chunk, "iCCP")) {
   5269     error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength);
   5270   } else if(lodepng_chunk_type_equals(chunk, "cICP")) {
   5271     error = readChunk_cICP(&state->info_png, data, chunkLength);
   5272   } else if(lodepng_chunk_type_equals(chunk, "mDCV")) {
   5273     error = readChunk_mDCV(&state->info_png, data, chunkLength);
   5274   } else if(lodepng_chunk_type_equals(chunk, "cLLI")) {
   5275     error = readChunk_cLLI(&state->info_png, data, chunkLength);
   5276   } else if(lodepng_chunk_type_equals(chunk, "eXIf")) {
   5277     error = readChunk_eXIf(&state->info_png, data, chunkLength);
   5278   } else if(lodepng_chunk_type_equals(chunk, "sBIT")) {
   5279     error = readChunk_sBIT(&state->info_png, data, chunkLength);
   5280 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   5281   } else {
   5282     /* unhandled chunk is ok (is not an error) */
   5283     unhandled = 1;
   5284   }
   5285 
   5286   if(!error && !unhandled && !state->decoder.ignore_crc) {
   5287     if(lodepng_chunk_check_crc(chunk)) return 57; /*invalid CRC*/
   5288   }
   5289 
   5290   return error;
   5291 }
   5292 
   5293 /*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/
   5294 static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h,
   5295                           LodePNGState* state,
   5296                           const unsigned char* in, size_t insize) {
   5297   unsigned char IEND = 0;
   5298   const unsigned char* chunk; /*points to beginning of next chunk*/
   5299   unsigned char* idat; /*the data from idat chunks, zlib compressed*/
   5300   size_t idatsize = 0;
   5301   unsigned char* scanlines = 0;
   5302   size_t scanlines_size = 0, expected_size = 0;
   5303   size_t outsize = 0;
   5304 
   5305   /*for unknown chunk order*/
   5306   unsigned unknown = 0;
   5307 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   5308   unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/
   5309 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   5310 
   5311 
   5312   /* safe output values in case error happens */
   5313   *out = 0;
   5314   *w = *h = 0;
   5315 
   5316   state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/
   5317   if(state->error) return;
   5318 
   5319   if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) {
   5320     CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/
   5321   }
   5322 
   5323   /*the input filesize is a safe upper bound for the sum of idat chunks size*/
   5324   idat = (unsigned char*)lodepng_malloc(insize);
   5325   if(!idat) CERROR_RETURN(state->error, 83); /*alloc fail*/
   5326 
   5327   chunk = &in[33]; /*first byte of the first chunk after the header*/
   5328 
   5329   /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk.
   5330   IDAT data is put at the start of the in buffer*/
   5331   while(!IEND && !state->error) {
   5332     unsigned chunkLength;
   5333     const unsigned char* data; /*the data in the chunk*/
   5334     size_t pos = (size_t)(chunk - in);
   5335 
   5336     /*error: next chunk out of bounds of the in buffer*/
   5337     if(chunk < in || pos + 12 > insize) {
   5338       if(state->decoder.ignore_end) break; /*other errors may still happen though*/
   5339       CERROR_BREAK(state->error, 30);
   5340     }
   5341 
   5342     /*length of the data of the chunk, excluding the 12 bytes for length, chunk type and CRC*/
   5343     chunkLength = lodepng_chunk_length(chunk);
   5344     /*error: chunk length larger than the max PNG chunk size*/
   5345     if(chunkLength > 2147483647) {
   5346       if(state->decoder.ignore_end) break; /*other errors may still happen though*/
   5347       CERROR_BREAK(state->error, 63);
   5348     }
   5349 
   5350     if(pos + (size_t)chunkLength + 12 > insize || pos + (size_t)chunkLength + 12 < pos) {
   5351       CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk (or int overflow)*/
   5352     }
   5353 
   5354     data = lodepng_chunk_data_const(chunk);
   5355 
   5356     unknown = 0;
   5357 
   5358     /*IDAT chunk, containing compressed image data*/
   5359     if(lodepng_chunk_type_equals(chunk, "IDAT")) {
   5360       size_t newsize;
   5361       if(lodepng_addofl(idatsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95);
   5362       if(newsize > insize) CERROR_BREAK(state->error, 95);
   5363       lodepng_memcpy(idat + idatsize, data, chunkLength);
   5364       idatsize += chunkLength;
   5365 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   5366       critical_pos = 3;
   5367 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   5368     } else if(lodepng_chunk_type_equals(chunk, "IEND")) {
   5369       /*IEND chunk*/
   5370       IEND = 1;
   5371     } else if(lodepng_chunk_type_equals(chunk, "PLTE")) {
   5372       /*palette chunk (PLTE)*/
   5373       state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength);
   5374       if(state->error) break;
   5375 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   5376       critical_pos = 2;
   5377 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   5378     } else if(lodepng_chunk_type_equals(chunk, "tRNS")) {
   5379       /*palette transparency chunk (tRNS). Even though this one is an ancillary chunk , it is still compiled
   5380       in without 'LODEPNG_COMPILE_ANCILLARY_CHUNKS' because it contains essential color information that
   5381       affects the alpha channel of pixels. */
   5382       state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength);
   5383       if(state->error) break;
   5384 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   5385       /*background color chunk (bKGD)*/
   5386     } else if(lodepng_chunk_type_equals(chunk, "bKGD")) {
   5387       state->error = readChunk_bKGD(&state->info_png, data, chunkLength);
   5388       if(state->error) break;
   5389     } else if(lodepng_chunk_type_equals(chunk, "tEXt")) {
   5390       /*text chunk (tEXt)*/
   5391       if(state->decoder.read_text_chunks) {
   5392         state->error = readChunk_tEXt(&state->info_png, data, chunkLength);
   5393         if(state->error) break;
   5394       }
   5395     } else if(lodepng_chunk_type_equals(chunk, "zTXt")) {
   5396       /*compressed text chunk (zTXt)*/
   5397       if(state->decoder.read_text_chunks) {
   5398         state->error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength);
   5399         if(state->error) break;
   5400       }
   5401     } else if(lodepng_chunk_type_equals(chunk, "iTXt")) {
   5402       /*international text chunk (iTXt)*/
   5403       if(state->decoder.read_text_chunks) {
   5404         state->error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength);
   5405         if(state->error) break;
   5406       }
   5407     } else if(lodepng_chunk_type_equals(chunk, "tIME")) {
   5408       state->error = readChunk_tIME(&state->info_png, data, chunkLength);
   5409       if(state->error) break;
   5410     } else if(lodepng_chunk_type_equals(chunk, "pHYs")) {
   5411       state->error = readChunk_pHYs(&state->info_png, data, chunkLength);
   5412       if(state->error) break;
   5413     } else if(lodepng_chunk_type_equals(chunk, "gAMA")) {
   5414       state->error = readChunk_gAMA(&state->info_png, data, chunkLength);
   5415       if(state->error) break;
   5416     } else if(lodepng_chunk_type_equals(chunk, "cHRM")) {
   5417       state->error = readChunk_cHRM(&state->info_png, data, chunkLength);
   5418       if(state->error) break;
   5419     } else if(lodepng_chunk_type_equals(chunk, "sRGB")) {
   5420       state->error = readChunk_sRGB(&state->info_png, data, chunkLength);
   5421       if(state->error) break;
   5422     } else if(lodepng_chunk_type_equals(chunk, "iCCP")) {
   5423       state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength);
   5424       if(state->error) break;
   5425     } else if(lodepng_chunk_type_equals(chunk, "cICP")) {
   5426       state->error = readChunk_cICP(&state->info_png, data, chunkLength);
   5427       if(state->error) break;
   5428     } else if(lodepng_chunk_type_equals(chunk, "mDCV")) {
   5429       state->error = readChunk_mDCV(&state->info_png, data, chunkLength);
   5430       if(state->error) break;
   5431     } else if(lodepng_chunk_type_equals(chunk, "cLLI")) {
   5432       state->error = readChunk_cLLI(&state->info_png, data, chunkLength);
   5433       if(state->error) break;
   5434     } else if(lodepng_chunk_type_equals(chunk, "eXIf")) {
   5435       state->error = readChunk_eXIf(&state->info_png, data, chunkLength);
   5436       if(state->error) break;
   5437     } else if(lodepng_chunk_type_equals(chunk, "sBIT")) {
   5438       state->error = readChunk_sBIT(&state->info_png, data, chunkLength);
   5439       if(state->error) break;
   5440 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   5441     } else /*it's not an implemented chunk type, so ignore it: skip over the data*/ {
   5442       if(!lodepng_chunk_type_name_valid(chunk)) {
   5443         CERROR_BREAK(state->error, 121); /* invalid chunk type name */
   5444       }
   5445       if(lodepng_chunk_reserved(chunk)) {
   5446         CERROR_BREAK(state->error, 122); /* invalid third lowercase character */
   5447       }
   5448 
   5449       /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/
   5450       if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) {
   5451         CERROR_BREAK(state->error, 69);
   5452       }
   5453 
   5454       unknown = 1;
   5455 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   5456       if(state->decoder.remember_unknown_chunks) {
   5457         state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1],
   5458                                             &state->info_png.unknown_chunks_size[critical_pos - 1], chunk);
   5459         if(state->error) break;
   5460       }
   5461 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   5462     }
   5463 
   5464     if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ {
   5465       if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/
   5466     }
   5467 
   5468     if(!IEND) chunk = lodepng_chunk_next_const(chunk, in + insize);
   5469   }
   5470 
   5471   if(!state->error && state->info_png.color.colortype == LCT_PALETTE && !state->info_png.color.palette) {
   5472     state->error = 106; /* error: PNG file must have PLTE chunk if color type is palette */
   5473   }
   5474 
   5475   if(!state->error) {
   5476     /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation.
   5477     If the decompressed size does not match the prediction, the image must be corrupt.*/
   5478     if(state->info_png.interlace_method == 0) {
   5479       unsigned bpp = lodepng_get_bpp(&state->info_png.color);
   5480       expected_size = lodepng_get_raw_size_idat(*w, *h, bpp);
   5481     } else {
   5482       unsigned bpp = lodepng_get_bpp(&state->info_png.color);
   5483       /*Adam-7 interlaced: expected size is the sum of the 7 sub-images sizes*/
   5484       expected_size = 0;
   5485       expected_size += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, bpp);
   5486       if(*w > 4) expected_size += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, bpp);
   5487       expected_size += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, bpp);
   5488       if(*w > 2) expected_size += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, bpp);
   5489       expected_size += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, bpp);
   5490       if(*w > 1) expected_size += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, bpp);
   5491       expected_size += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, bpp);
   5492     }
   5493 
   5494     state->error = zlib_decompress(&scanlines, &scanlines_size, expected_size, idat, idatsize, &state->decoder.zlibsettings);
   5495   }
   5496   if(!state->error && scanlines_size != expected_size) state->error = 91; /*decompressed size doesn't match prediction*/
   5497   lodepng_free(idat);
   5498 
   5499   if(!state->error) {
   5500     outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color);
   5501     *out = (unsigned char*)lodepng_malloc(outsize);
   5502     if(!*out) state->error = 83; /*alloc fail*/
   5503   }
   5504   if(!state->error) {
   5505     lodepng_memset(*out, 0, outsize);
   5506     state->error = postProcessScanlines(*out, scanlines, *w, *h, &state->info_png);
   5507   }
   5508   lodepng_free(scanlines);
   5509 }
   5510 
   5511 unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h,
   5512                         LodePNGState* state,
   5513                         const unsigned char* in, size_t insize) {
   5514   *out = 0;
   5515   decodeGeneric(out, w, h, state, in, insize);
   5516   if(state->error) return state->error;
   5517   if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) {
   5518     /*same color type, no copying or converting of data needed*/
   5519     /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype
   5520     the raw image has to the end user*/
   5521     if(!state->decoder.color_convert) {
   5522       state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color);
   5523       if(state->error) return state->error;
   5524     }
   5525   } else { /*color conversion needed*/
   5526     unsigned char* data = *out;
   5527     size_t outsize;
   5528 
   5529     /*TODO: check if this works according to the statement in the documentation: "The converter can convert
   5530     from grayscale input color type, to 8-bit grayscale or grayscale with alpha"*/
   5531     if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA)
   5532        && !(state->info_raw.bitdepth == 8)) {
   5533       return 56; /*unsupported color mode conversion*/
   5534     }
   5535 
   5536     outsize = lodepng_get_raw_size(*w, *h, &state->info_raw);
   5537     *out = (unsigned char*)lodepng_malloc(outsize);
   5538     if(!(*out)) {
   5539       state->error = 83; /*alloc fail*/
   5540     }
   5541     else state->error = lodepng_convert(*out, data, &state->info_raw,
   5542                                         &state->info_png.color, *w, *h);
   5543     lodepng_free(data);
   5544   }
   5545   return state->error;
   5546 }
   5547 
   5548 unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in,
   5549                                size_t insize, LodePNGColorType colortype, unsigned bitdepth) {
   5550   unsigned error;
   5551   LodePNGState state;
   5552   lodepng_state_init(&state);
   5553   state.info_raw.colortype = colortype;
   5554   state.info_raw.bitdepth = bitdepth;
   5555 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   5556   /*disable reading things that this function doesn't output*/
   5557   state.decoder.read_text_chunks = 0;
   5558   state.decoder.remember_unknown_chunks = 0;
   5559 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   5560   error = lodepng_decode(out, w, h, &state, in, insize);
   5561   lodepng_state_cleanup(&state);
   5562   return error;
   5563 }
   5564 
   5565 unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) {
   5566   return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8);
   5567 }
   5568 
   5569 unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) {
   5570   return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8);
   5571 }
   5572 
   5573 #ifdef LODEPNG_COMPILE_DISK
   5574 unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename,
   5575                              LodePNGColorType colortype, unsigned bitdepth) {
   5576   unsigned char* buffer = 0;
   5577   size_t buffersize;
   5578   unsigned error;
   5579   /* safe output values in case error happens */
   5580   *out = 0;
   5581   *w = *h = 0;
   5582   error = lodepng_load_file(&buffer, &buffersize, filename);
   5583   if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth);
   5584   lodepng_free(buffer);
   5585   return error;
   5586 }
   5587 
   5588 unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) {
   5589   return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8);
   5590 }
   5591 
   5592 unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) {
   5593   return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8);
   5594 }
   5595 #endif /*LODEPNG_COMPILE_DISK*/
   5596 
   5597 void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) {
   5598   settings->color_convert = 1;
   5599 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   5600   settings->read_text_chunks = 1;
   5601   settings->remember_unknown_chunks = 0;
   5602   settings->max_text_size = 16777216;
   5603   settings->max_icc_size = 16777216; /* 16MB is much more than enough for any reasonable ICC profile */
   5604 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   5605   settings->ignore_crc = 0;
   5606   settings->ignore_critical = 0;
   5607   settings->ignore_end = 0;
   5608   lodepng_decompress_settings_init(&settings->zlibsettings);
   5609 }
   5610 
   5611 #endif /*LODEPNG_COMPILE_DECODER*/
   5612 
   5613 #if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER)
   5614 
   5615 void lodepng_state_init(LodePNGState* state) {
   5616 #ifdef LODEPNG_COMPILE_DECODER
   5617   lodepng_decoder_settings_init(&state->decoder);
   5618 #endif /*LODEPNG_COMPILE_DECODER*/
   5619 #ifdef LODEPNG_COMPILE_ENCODER
   5620   lodepng_encoder_settings_init(&state->encoder);
   5621 #endif /*LODEPNG_COMPILE_ENCODER*/
   5622   lodepng_color_mode_init(&state->info_raw);
   5623   lodepng_info_init(&state->info_png);
   5624   state->error = 1;
   5625 }
   5626 
   5627 void lodepng_state_cleanup(LodePNGState* state) {
   5628   lodepng_color_mode_cleanup(&state->info_raw);
   5629   lodepng_info_cleanup(&state->info_png);
   5630 }
   5631 
   5632 unsigned lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) {
   5633   lodepng_state_cleanup(dest);
   5634   *dest = *source;
   5635   lodepng_color_mode_init(&dest->info_raw);
   5636   lodepng_info_init(&dest->info_png);
   5637   dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw);
   5638   if(dest->error) return dest->error;
   5639   dest->error = lodepng_info_copy(&dest->info_png, &source->info_png);
   5640   return dest->error;
   5641 }
   5642 
   5643 #endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */
   5644 
   5645 #ifdef LODEPNG_COMPILE_ENCODER
   5646 
   5647 /* ////////////////////////////////////////////////////////////////////////// */
   5648 /* / PNG Encoder                                                            / */
   5649 /* ////////////////////////////////////////////////////////////////////////// */
   5650 
   5651 
   5652 static unsigned writeSignature(ucvector* out) {
   5653   size_t pos = out->size;
   5654   const unsigned char signature[] = {137, 80, 78, 71, 13, 10, 26, 10};
   5655   /*8 bytes PNG signature, aka the magic bytes*/
   5656   if(!ucvector_resize(out, out->size + 8)) return 83; /*alloc fail*/
   5657   lodepng_memcpy(out->data + pos, signature, 8);
   5658   return 0;
   5659 }
   5660 
   5661 static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h,
   5662                               LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) {
   5663   unsigned char *chunk, *data;
   5664   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 13, "IHDR"));
   5665   data = chunk + 8;
   5666 
   5667   lodepng_set32bitInt(data + 0, w); /*width*/
   5668   lodepng_set32bitInt(data + 4, h); /*height*/
   5669   data[8] = (unsigned char)bitdepth; /*bit depth*/
   5670   data[9] = (unsigned char)colortype; /*color type*/
   5671   data[10] = 0; /*compression method*/
   5672   data[11] = 0; /*filter method*/
   5673   data[12] = interlace_method; /*interlace method*/
   5674 
   5675   lodepng_chunk_generate_crc(chunk);
   5676   return 0;
   5677 }
   5678 
   5679 /* only adds the chunk if needed (there is a key or palette with alpha) */
   5680 static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) {
   5681   unsigned char* chunk;
   5682   size_t i, j = 8;
   5683 
   5684   if(info->palettesize == 0 || info->palettesize > 256) {
   5685     return 68; /*invalid palette size, it is only allowed to be 1-256*/
   5686   }
   5687 
   5688   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE"));
   5689 
   5690   for(i = 0; i != info->palettesize; ++i) {
   5691     /*add all channels except alpha channel*/
   5692     chunk[j++] = info->palette[i * 4 + 0];
   5693     chunk[j++] = info->palette[i * 4 + 1];
   5694     chunk[j++] = info->palette[i * 4 + 2];
   5695   }
   5696 
   5697   lodepng_chunk_generate_crc(chunk);
   5698   return 0;
   5699 }
   5700 
   5701 static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) {
   5702   unsigned char* chunk = 0;
   5703 
   5704   if(info->colortype == LCT_PALETTE) {
   5705     size_t i, amount = info->palettesize;
   5706     /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/
   5707     for(i = info->palettesize; i != 0; --i) {
   5708       if(info->palette[4 * (i - 1) + 3] != 255) break;
   5709       --amount;
   5710     }
   5711     if(amount) {
   5712       CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, amount, "tRNS"));
   5713       /*add the alpha channel values from the palette*/
   5714       for(i = 0; i != amount; ++i) chunk[8 + i] = info->palette[4 * i + 3];
   5715     }
   5716   } else if(info->colortype == LCT_GREY) {
   5717     if(info->key_defined) {
   5718       CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "tRNS"));
   5719       chunk[8] = (unsigned char)(info->key_r >> 8);
   5720       chunk[9] = (unsigned char)(info->key_r & 255);
   5721     }
   5722   } else if(info->colortype == LCT_RGB) {
   5723     if(info->key_defined) {
   5724       CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "tRNS"));
   5725       chunk[8] = (unsigned char)(info->key_r >> 8);
   5726       chunk[9] = (unsigned char)(info->key_r & 255);
   5727       chunk[10] = (unsigned char)(info->key_g >> 8);
   5728       chunk[11] = (unsigned char)(info->key_g & 255);
   5729       chunk[12] = (unsigned char)(info->key_b >> 8);
   5730       chunk[13] = (unsigned char)(info->key_b & 255);
   5731     }
   5732   }
   5733 
   5734   if(chunk) lodepng_chunk_generate_crc(chunk);
   5735   return 0;
   5736 }
   5737 
   5738 static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize,
   5739                               const LodePNGCompressSettings* zlibsettings) {
   5740   unsigned error = 0;
   5741   unsigned char* zlib = 0;
   5742   size_t pos = 0;
   5743   size_t zlibsize = 0;
   5744   /* max chunk length allowed by the specification is 2147483647 bytes */
   5745   const size_t max_chunk_length = 2147483647u;
   5746 
   5747   error = zlib_compress(&zlib, &zlibsize, data, datasize, zlibsettings);
   5748   while(!error) {
   5749     if(zlibsize - pos > max_chunk_length) {
   5750       error = lodepng_chunk_createv(out, max_chunk_length, "IDAT", zlib + pos);
   5751       pos += max_chunk_length;
   5752     } else {
   5753       error = lodepng_chunk_createv(out, zlibsize - pos, "IDAT", zlib + pos);
   5754       break;
   5755     }
   5756   }
   5757   lodepng_free(zlib);
   5758   return error;
   5759 }
   5760 
   5761 static unsigned addChunk_IEND(ucvector* out) {
   5762   return lodepng_chunk_createv(out, 0, "IEND", 0);
   5763 }
   5764 
   5765 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   5766 
   5767 static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) {
   5768   unsigned char* chunk = 0;
   5769   size_t keysize = lodepng_strlen(keyword), textsize = lodepng_strlen(textstring);
   5770   size_t size = keysize + 1 + textsize;
   5771   if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/
   5772   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, size, "tEXt"));
   5773   lodepng_memcpy(chunk + 8, keyword, keysize);
   5774   chunk[8 + keysize] = 0; /*null termination char*/
   5775   lodepng_memcpy(chunk + 9 + keysize, textstring, textsize);
   5776   lodepng_chunk_generate_crc(chunk);
   5777   return 0;
   5778 }
   5779 
   5780 static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring,
   5781                               const LodePNGCompressSettings* zlibsettings) {
   5782   unsigned error = 0;
   5783   unsigned char* chunk = 0;
   5784   unsigned char* compressed = 0;
   5785   size_t compressedsize = 0;
   5786   size_t textsize = lodepng_strlen(textstring);
   5787   size_t keysize = lodepng_strlen(keyword);
   5788   if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/
   5789 
   5790   error = zlib_compress(&compressed, &compressedsize,
   5791                         (const unsigned char*)textstring, textsize, zlibsettings);
   5792   if(!error) {
   5793     size_t size = keysize + 2 + compressedsize;
   5794     error = lodepng_chunk_init(&chunk, out, size, "zTXt");
   5795   }
   5796   if(!error) {
   5797     lodepng_memcpy(chunk + 8, keyword, keysize);
   5798     chunk[8 + keysize] = 0; /*null termination char*/
   5799     chunk[9 + keysize] = 0; /*compression method: 0*/
   5800     lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize);
   5801     lodepng_chunk_generate_crc(chunk);
   5802   }
   5803 
   5804   lodepng_free(compressed);
   5805   return error;
   5806 }
   5807 
   5808 static unsigned addChunk_iTXt(ucvector* out, unsigned compress, const char* keyword, const char* langtag,
   5809                               const char* transkey, const char* textstring, const LodePNGCompressSettings* zlibsettings) {
   5810   unsigned error = 0;
   5811   unsigned char* chunk = 0;
   5812   unsigned char* compressed = 0;
   5813   size_t compressedsize = 0;
   5814   size_t textsize = lodepng_strlen(textstring);
   5815   size_t keysize = lodepng_strlen(keyword), langsize = lodepng_strlen(langtag), transsize = lodepng_strlen(transkey);
   5816 
   5817   if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/
   5818 
   5819   if(compress) {
   5820     error = zlib_compress(&compressed, &compressedsize,
   5821                           (const unsigned char*)textstring, textsize, zlibsettings);
   5822   }
   5823   if(!error) {
   5824     size_t size = keysize + 3 + langsize + 1 + transsize + 1 + (compress ? compressedsize : textsize);
   5825     error = lodepng_chunk_init(&chunk, out, size, "iTXt");
   5826   }
   5827   if(!error) {
   5828     size_t pos = 8;
   5829     lodepng_memcpy(chunk + pos, keyword, keysize);
   5830     pos += keysize;
   5831     chunk[pos++] = 0; /*null termination char*/
   5832     chunk[pos++] = (compress ? 1 : 0); /*compression flag*/
   5833     chunk[pos++] = 0; /*compression method: 0*/
   5834     lodepng_memcpy(chunk + pos, langtag, langsize);
   5835     pos += langsize;
   5836     chunk[pos++] = 0; /*null termination char*/
   5837     lodepng_memcpy(chunk + pos, transkey, transsize);
   5838     pos += transsize;
   5839     chunk[pos++] = 0; /*null termination char*/
   5840     if(compress) {
   5841       lodepng_memcpy(chunk + pos, compressed, compressedsize);
   5842     } else {
   5843       lodepng_memcpy(chunk + pos, textstring, textsize);
   5844     }
   5845     lodepng_chunk_generate_crc(chunk);
   5846   }
   5847 
   5848   lodepng_free(compressed);
   5849   return error;
   5850 }
   5851 
   5852 static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) {
   5853   unsigned char* chunk = 0;
   5854   if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) {
   5855     CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "bKGD"));
   5856     chunk[8] = (unsigned char)(info->background_r >> 8);
   5857     chunk[9] = (unsigned char)(info->background_r & 255);
   5858   } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) {
   5859     CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "bKGD"));
   5860     chunk[8] = (unsigned char)(info->background_r >> 8);
   5861     chunk[9] = (unsigned char)(info->background_r & 255);
   5862     chunk[10] = (unsigned char)(info->background_g >> 8);
   5863     chunk[11] = (unsigned char)(info->background_g & 255);
   5864     chunk[12] = (unsigned char)(info->background_b >> 8);
   5865     chunk[13] = (unsigned char)(info->background_b & 255);
   5866   } else if(info->color.colortype == LCT_PALETTE) {
   5867     CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "bKGD"));
   5868     chunk[8] = (unsigned char)(info->background_r & 255); /*palette index*/
   5869   }
   5870   if(chunk) lodepng_chunk_generate_crc(chunk);
   5871   return 0;
   5872 }
   5873 
   5874 static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) {
   5875   unsigned char* chunk;
   5876   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 7, "tIME"));
   5877   chunk[8] = (unsigned char)(time->year >> 8);
   5878   chunk[9] = (unsigned char)(time->year & 255);
   5879   chunk[10] = (unsigned char)time->month;
   5880   chunk[11] = (unsigned char)time->day;
   5881   chunk[12] = (unsigned char)time->hour;
   5882   chunk[13] = (unsigned char)time->minute;
   5883   chunk[14] = (unsigned char)time->second;
   5884   lodepng_chunk_generate_crc(chunk);
   5885   return 0;
   5886 }
   5887 
   5888 static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) {
   5889   unsigned char* chunk;
   5890   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 9, "pHYs"));
   5891   lodepng_set32bitInt(chunk + 8, info->phys_x);
   5892   lodepng_set32bitInt(chunk + 12, info->phys_y);
   5893   chunk[16] = info->phys_unit;
   5894   lodepng_chunk_generate_crc(chunk);
   5895   return 0;
   5896 }
   5897 
   5898 static unsigned addChunk_gAMA(ucvector* out, const LodePNGInfo* info) {
   5899   unsigned char* chunk;
   5900   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "gAMA"));
   5901   lodepng_set32bitInt(chunk + 8, info->gama_gamma);
   5902   lodepng_chunk_generate_crc(chunk);
   5903   return 0;
   5904 }
   5905 
   5906 static unsigned addChunk_cHRM(ucvector* out, const LodePNGInfo* info) {
   5907   unsigned char* chunk;
   5908   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 32, "cHRM"));
   5909   lodepng_set32bitInt(chunk + 8, info->chrm_white_x);
   5910   lodepng_set32bitInt(chunk + 12, info->chrm_white_y);
   5911   lodepng_set32bitInt(chunk + 16, info->chrm_red_x);
   5912   lodepng_set32bitInt(chunk + 20, info->chrm_red_y);
   5913   lodepng_set32bitInt(chunk + 24, info->chrm_green_x);
   5914   lodepng_set32bitInt(chunk + 28, info->chrm_green_y);
   5915   lodepng_set32bitInt(chunk + 32, info->chrm_blue_x);
   5916   lodepng_set32bitInt(chunk + 36, info->chrm_blue_y);
   5917   lodepng_chunk_generate_crc(chunk);
   5918   return 0;
   5919 }
   5920 
   5921 static unsigned addChunk_sRGB(ucvector* out, const LodePNGInfo* info) {
   5922   unsigned char data = info->srgb_intent;
   5923   return lodepng_chunk_createv(out, 1, "sRGB", &data);
   5924 }
   5925 
   5926 static unsigned addChunk_iCCP(ucvector* out, const LodePNGInfo* info, const LodePNGCompressSettings* zlibsettings) {
   5927   unsigned error = 0;
   5928   unsigned char* chunk = 0;
   5929   unsigned char* compressed = 0;
   5930   size_t compressedsize = 0;
   5931   size_t keysize = lodepng_strlen(info->iccp_name);
   5932 
   5933   if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/
   5934   error = zlib_compress(&compressed, &compressedsize,
   5935                         info->iccp_profile, info->iccp_profile_size, zlibsettings);
   5936   if(!error) {
   5937     size_t size = keysize + 2 + compressedsize;
   5938     error = lodepng_chunk_init(&chunk, out, size, "iCCP");
   5939   }
   5940   if(!error) {
   5941     lodepng_memcpy(chunk + 8, info->iccp_name, keysize);
   5942     chunk[8 + keysize] = 0; /*null termination char*/
   5943     chunk[9 + keysize] = 0; /*compression method: 0*/
   5944     lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize);
   5945     lodepng_chunk_generate_crc(chunk);
   5946   }
   5947 
   5948   lodepng_free(compressed);
   5949   return error;
   5950 }
   5951 
   5952 static unsigned addChunk_cICP(ucvector* out, const LodePNGInfo* info) {
   5953   unsigned char* chunk;
   5954   /* Allow up to 255 since they are bytes. The ITU-R-BT.709 spec has a more
   5955   restricted set of valid values for each field, but that's up to the error
   5956   handling of a CICP library, not the PNG encoding/decoding, to manage. */
   5957   if(info->cicp_color_primaries > 255) return 116;
   5958   if(info->cicp_transfer_function > 255) return 116;
   5959   if(info->cicp_matrix_coefficients > 255) return 116;
   5960   if(info->cicp_video_full_range_flag > 255) return 116;
   5961   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "cICP"));
   5962   chunk[8 + 0] = (unsigned char)info->cicp_color_primaries;
   5963   chunk[8 + 1] = (unsigned char)info->cicp_transfer_function;
   5964   chunk[8 + 2] = (unsigned char)info->cicp_matrix_coefficients;
   5965   chunk[8 + 3] = (unsigned char)info->cicp_video_full_range_flag;
   5966   lodepng_chunk_generate_crc(chunk);
   5967   return 0;
   5968 }
   5969 
   5970 static unsigned addChunk_mDCV(ucvector* out, const LodePNGInfo* info) {
   5971   unsigned char* chunk;
   5972   /* Allow up to 65535 since they are 16-bit ints. */
   5973   if(info->mdcv_red_x > 65535) return 118;
   5974   if(info->mdcv_red_y > 65535) return 118;
   5975   if(info->mdcv_green_x > 65535) return 118;
   5976   if(info->mdcv_green_y > 65535) return 118;
   5977   if(info->mdcv_blue_x > 65535) return 118;
   5978   if(info->mdcv_blue_y > 65535) return 118;
   5979   if(info->mdcv_white_x > 65535) return 118;
   5980   if(info->mdcv_white_y > 65535) return 118;
   5981   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 24, "mDCV"));
   5982   chunk[8 + 0] = (unsigned char)((info->mdcv_red_x) >> 8u);
   5983   chunk[8 + 1] = (unsigned char)(info->mdcv_red_x);
   5984   chunk[8 + 2] = (unsigned char)((info->mdcv_red_y) >> 8u);
   5985   chunk[8 + 3] = (unsigned char)(info->mdcv_red_y);
   5986   chunk[8 + 4] = (unsigned char)((info->mdcv_green_x) >> 8u);
   5987   chunk[8 + 5] = (unsigned char)(info->mdcv_green_x);
   5988   chunk[8 + 6] = (unsigned char)((info->mdcv_green_y) >> 8u);
   5989   chunk[8 + 7] = (unsigned char)(info->mdcv_green_y);
   5990   chunk[8 + 8] = (unsigned char)((info->mdcv_blue_x) >> 8u);
   5991   chunk[8 + 9] = (unsigned char)(info->mdcv_blue_x);
   5992   chunk[8 + 10] = (unsigned char)((info->mdcv_blue_y) >> 8u);
   5993   chunk[8 + 11] = (unsigned char)(info->mdcv_blue_y);
   5994   chunk[8 + 12] = (unsigned char)((info->mdcv_white_x) >> 8u);
   5995   chunk[8 + 13] = (unsigned char)(info->mdcv_white_x);
   5996   chunk[8 + 14] = (unsigned char)((info->mdcv_white_y) >> 8u);
   5997   chunk[8 + 15] = (unsigned char)(info->mdcv_white_y);
   5998   lodepng_set32bitInt(chunk + 8 + 16, info->mdcv_max_luminance);
   5999   lodepng_set32bitInt(chunk + 8 + 20, info->mdcv_min_luminance);
   6000   lodepng_chunk_generate_crc(chunk);
   6001   return 0;
   6002 }
   6003 
   6004 static unsigned addChunk_cLLI(ucvector* out, const LodePNGInfo* info) {
   6005   unsigned char* chunk;
   6006   CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 8, "cLLI"));
   6007   lodepng_set32bitInt(chunk + 8 + 0, info->clli_max_cll);
   6008   lodepng_set32bitInt(chunk + 8 + 4, info->clli_max_fall);
   6009   lodepng_chunk_generate_crc(chunk);
   6010   return 0;
   6011 }
   6012 
   6013 static unsigned addChunk_eXIf(ucvector* out, const LodePNGInfo* info) {
   6014   return lodepng_chunk_createv(out, info->exif_size, "eXIf", info->exif);
   6015 }
   6016 
   6017 static unsigned addChunk_sBIT(ucvector* out, const LodePNGInfo* info) {
   6018   unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth;
   6019   unsigned char* chunk = 0;
   6020   if(info->color.colortype == LCT_GREY) {
   6021     if(info->sbit_r == 0 || info->sbit_r > bitdepth) return 115;
   6022     CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "sBIT"));
   6023     chunk[8] = info->sbit_r;
   6024   } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) {
   6025     if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0) return 115;
   6026     if(info->sbit_r > bitdepth || info->sbit_g > bitdepth || info->sbit_b > bitdepth) return 115;
   6027     CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 3, "sBIT"));
   6028     chunk[8] = info->sbit_r;
   6029     chunk[9] = info->sbit_g;
   6030     chunk[10] = info->sbit_b;
   6031   } else if(info->color.colortype == LCT_GREY_ALPHA) {
   6032     if(info->sbit_r == 0 || info->sbit_a == 0) return 115;
   6033     if(info->sbit_r > bitdepth || info->sbit_a > bitdepth) return 115;
   6034     CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "sBIT"));
   6035     chunk[8] = info->sbit_r;
   6036     chunk[9] = info->sbit_a;
   6037   } else if(info->color.colortype == LCT_RGBA) {
   6038     if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0 || info->sbit_a == 0 ||
   6039        info->sbit_r > bitdepth || info->sbit_g > bitdepth ||
   6040        info->sbit_b > bitdepth || info->sbit_a > bitdepth) {
   6041       return 115;
   6042     }
   6043     CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "sBIT"));
   6044     chunk[8] = info->sbit_r;
   6045     chunk[9] = info->sbit_g;
   6046     chunk[10] = info->sbit_b;
   6047     chunk[11] = info->sbit_a;
   6048   }
   6049   if(chunk) lodepng_chunk_generate_crc(chunk);
   6050   return 0;
   6051 }
   6052 
   6053 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   6054 
   6055 static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline,
   6056                            size_t length, size_t bytewidth, unsigned char filterType) {
   6057   size_t i;
   6058   switch(filterType) {
   6059     case 0: /*None*/
   6060       for(i = 0; i != length; ++i) out[i] = scanline[i];
   6061       break;
   6062     case 1: /*Sub*/
   6063       for(i = 0; i != bytewidth; ++i) out[i] = scanline[i];
   6064       for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth];
   6065       break;
   6066     case 2: /*Up*/
   6067       if(prevline) {
   6068         for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i];
   6069       } else {
   6070         for(i = 0; i != length; ++i) out[i] = scanline[i];
   6071       }
   6072       break;
   6073     case 3: /*Average*/
   6074       if(prevline) {
   6075         for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1);
   6076         for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1);
   6077       } else {
   6078         for(i = 0; i != bytewidth; ++i) out[i] = scanline[i];
   6079         for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1);
   6080       }
   6081       break;
   6082     case 4: /*Paeth*/
   6083       if(prevline) {
   6084         /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/
   6085         for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]);
   6086         for(i = bytewidth; i < length; ++i) {
   6087           out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth]));
   6088         }
   6089       } else {
   6090         for(i = 0; i != bytewidth; ++i) out[i] = scanline[i];
   6091         /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/
   6092         for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]);
   6093       }
   6094       break;
   6095     default: return; /*invalid filter type given*/
   6096   }
   6097 }
   6098 
   6099 /* integer binary logarithm, max return value is 31 */
   6100 static size_t ilog2(size_t i) {
   6101   size_t result = 0;
   6102   if(i >= 65536) { result += 16; i >>= 16; }
   6103   if(i >= 256) { result += 8; i >>= 8; }
   6104   if(i >= 16) { result += 4; i >>= 4; }
   6105   if(i >= 4) { result += 2; i >>= 2; }
   6106   if(i >= 2) { result += 1; /*i >>= 1;*/ }
   6107   return result;
   6108 }
   6109 
   6110 /* integer approximation for i * log2(i), helper function for LFS_ENTROPY */
   6111 static size_t ilog2i(size_t i) {
   6112   size_t l;
   6113   if(i == 0) return 0;
   6114   l = ilog2(i);
   6115   /* approximate i*log2(i): l is integer logarithm, ((i - (1u << l)) << 1u)
   6116   linearly approximates the missing fractional part multiplied by i */
   6117   return i * l + ((i - (((size_t)1) << l)) << 1u);
   6118 }
   6119 
   6120 static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h,
   6121                        const LodePNGColorMode* color, const LodePNGEncoderSettings* settings) {
   6122   /*
   6123   For PNG filter method 0
   6124   out must be a buffer with as size: h + (w * h * bpp + 7u) / 8u, because there are
   6125   the scanlines with 1 extra byte per scanline
   6126   */
   6127 
   6128   unsigned bpp = lodepng_get_bpp(color);
   6129   /*the width of a scanline in bytes, not including the filter type*/
   6130   size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u;
   6131 
   6132   /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/
   6133   size_t bytewidth = (bpp + 7u) / 8u;
   6134   const unsigned char* prevline = 0;
   6135   unsigned x, y;
   6136   unsigned error = 0;
   6137   LodePNGFilterStrategy strategy = settings->filter_strategy;
   6138 
   6139   if(settings->filter_palette_zero && (color->colortype == LCT_PALETTE || color->bitdepth < 8)) {
   6140     /*if the filter_palette_zero setting is enabled, override the filter strategy with
   6141     zero for all scanlines for palette and less-than-8-bitdepth images*/
   6142     strategy = LFS_ZERO;
   6143   }
   6144 
   6145   if(bpp == 0) return 31; /*error: invalid color type*/
   6146 
   6147   if(strategy >= LFS_ZERO && strategy <= LFS_FOUR) {
   6148     unsigned char type = (unsigned char)strategy;
   6149     for(y = 0; y != h; ++y) {
   6150       size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/
   6151       size_t inindex = linebytes * y;
   6152       out[outindex] = type; /*filter type byte*/
   6153       filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type);
   6154       prevline = &in[inindex];
   6155     }
   6156   } else if(strategy == LFS_MINSUM) {
   6157     /*adaptive filtering: independently for each row, try all five filter types and select the one that produces the
   6158     smallest sum of absolute values per row.*/
   6159     unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/
   6160     size_t smallest = 0;
   6161     unsigned char type, bestType = 0;
   6162 
   6163     for(type = 0; type != 5; ++type) {
   6164       attempt[type] = (unsigned char*)lodepng_malloc(linebytes);
   6165       if(!attempt[type]) error = 83; /*alloc fail*/
   6166     }
   6167 
   6168     if(!error) {
   6169       for(y = 0; y != h; ++y) {
   6170         /*try the 5 filter types*/
   6171         for(type = 0; type != 5; ++type) {
   6172           size_t sum = 0;
   6173           filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type);
   6174 
   6175           /*calculate the sum of the result*/
   6176           if(type == 0) {
   6177             for(x = 0; x != linebytes; ++x) sum += (unsigned char)(attempt[type][x]);
   6178           } else {
   6179             for(x = 0; x != linebytes; ++x) {
   6180               /*For differences, each byte should be treated as signed, values above 127 are negative
   6181               (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there.
   6182               This means filtertype 0 is almost never chosen, but that is justified.*/
   6183               unsigned char s = attempt[type][x];
   6184               sum += s < 128 ? s : (255U - s);
   6185             }
   6186           }
   6187 
   6188           /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/
   6189           if(type == 0 || sum < smallest) {
   6190             bestType = type;
   6191             smallest = sum;
   6192           }
   6193         }
   6194 
   6195         prevline = &in[y * linebytes];
   6196 
   6197         /*now fill the out values*/
   6198         out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/
   6199         for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x];
   6200       }
   6201     }
   6202 
   6203     for(type = 0; type != 5; ++type) lodepng_free(attempt[type]);
   6204   } else if(strategy == LFS_ENTROPY) {
   6205     unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/
   6206     size_t bestSum = 0;
   6207     unsigned type, bestType = 0;
   6208     unsigned count[256];
   6209 
   6210     for(type = 0; type != 5; ++type) {
   6211       attempt[type] = (unsigned char*)lodepng_malloc(linebytes);
   6212       if(!attempt[type]) error = 83; /*alloc fail*/
   6213     }
   6214 
   6215     if(!error) {
   6216       for(y = 0; y != h; ++y) {
   6217         /*try the 5 filter types*/
   6218         for(type = 0; type != 5; ++type) {
   6219           size_t sum = 0;
   6220           filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type);
   6221           lodepng_memset(count, 0, 256 * sizeof(*count));
   6222           for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]];
   6223           ++count[type]; /*the filter type itself is part of the scanline*/
   6224           for(x = 0; x != 256; ++x) {
   6225             sum += ilog2i(count[x]);
   6226           }
   6227           /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/
   6228           if(type == 0 || sum > bestSum) {
   6229             bestType = type;
   6230             bestSum = sum;
   6231           }
   6232         }
   6233 
   6234         prevline = &in[y * linebytes];
   6235 
   6236         /*now fill the out values*/
   6237         out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/
   6238         for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x];
   6239       }
   6240     }
   6241 
   6242     for(type = 0; type != 5; ++type) lodepng_free(attempt[type]);
   6243   } else if(strategy == LFS_PREDEFINED) {
   6244     for(y = 0; y != h; ++y) {
   6245       size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/
   6246       size_t inindex = linebytes * y;
   6247       unsigned char type = settings->predefined_filters[y];
   6248       out[outindex] = type; /*filter type byte*/
   6249       filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type);
   6250       prevline = &in[inindex];
   6251     }
   6252   } else if(strategy == LFS_BRUTE_FORCE) {
   6253     /*brute force filter chooser.
   6254     deflate the scanline after every filter attempt to see which one deflates best.
   6255     This is very slow and gives only slightly smaller, sometimes even larger, result*/
   6256     size_t size[5];
   6257     unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/
   6258     size_t smallest = 0;
   6259     unsigned type = 0, bestType = 0;
   6260     unsigned char* dummy;
   6261     LodePNGCompressSettings zlibsettings;
   6262     lodepng_memcpy(&zlibsettings, &settings->zlibsettings, sizeof(LodePNGCompressSettings));
   6263     /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose,
   6264     to simulate the true case where the tree is the same for the whole image. Sometimes it gives
   6265     better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare
   6266     cases better compression. It does make this a bit less slow, so it's worth doing this.*/
   6267     zlibsettings.btype = 1;
   6268     /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG
   6269     images only, so disable it*/
   6270     zlibsettings.custom_zlib = 0;
   6271     zlibsettings.custom_deflate = 0;
   6272     for(type = 0; type != 5; ++type) {
   6273       attempt[type] = (unsigned char*)lodepng_malloc(linebytes);
   6274       if(!attempt[type]) error = 83; /*alloc fail*/
   6275     }
   6276     if(!error) {
   6277       for(y = 0; y != h; ++y) /*try the 5 filter types*/ {
   6278         for(type = 0; type != 5; ++type) {
   6279           unsigned testsize = (unsigned)linebytes;
   6280           /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/
   6281 
   6282           filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type);
   6283           size[type] = 0;
   6284           dummy = 0;
   6285           zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings);
   6286           lodepng_free(dummy);
   6287           /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/
   6288           if(type == 0 || size[type] < smallest) {
   6289             bestType = type;
   6290             smallest = size[type];
   6291           }
   6292         }
   6293         prevline = &in[y * linebytes];
   6294         out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/
   6295         for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x];
   6296       }
   6297     }
   6298     for(type = 0; type != 5; ++type) lodepng_free(attempt[type]);
   6299   }
   6300   else return 88; /* unknown filter strategy */
   6301 
   6302   return error;
   6303 }
   6304 
   6305 static void addPaddingBits(unsigned char* out, const unsigned char* in,
   6306                            size_t olinebits, size_t ilinebits, unsigned h) {
   6307   /*The opposite of the removePaddingBits function
   6308   olinebits must be >= ilinebits*/
   6309   unsigned y;
   6310   size_t diff = olinebits - ilinebits;
   6311   size_t obp = 0, ibp = 0; /*bit pointers*/
   6312   for(y = 0; y != h; ++y) {
   6313     size_t x;
   6314     for(x = 0; x < ilinebits; ++x) {
   6315       unsigned char bit = readBitFromReversedStream(&ibp, in);
   6316       setBitOfReversedStream(&obp, out, bit);
   6317     }
   6318     /*obp += diff; --> no, fill in some value in the padding bits too, to avoid
   6319     "Use of uninitialised value of size ###" warning from valgrind*/
   6320     for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0);
   6321   }
   6322 }
   6323 
   6324 /*
   6325 in: non-interlaced image with size w*h
   6326 out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with
   6327  no padding bits between scanlines, but between reduced images so that each
   6328  reduced image starts at a byte.
   6329 bpp: bits per pixel
   6330 there are no padding bits, not between scanlines, not between reduced images
   6331 in has the following size in bits: w * h * bpp.
   6332 out is possibly bigger due to padding bits between reduced images
   6333 NOTE: comments about padding bits are only relevant if bpp < 8
   6334 */
   6335 static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) {
   6336   unsigned passw[7], passh[7];
   6337   size_t filter_passstart[8], padded_passstart[8], passstart[8];
   6338   unsigned i;
   6339 
   6340   Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
   6341 
   6342   if(bpp >= 8) {
   6343     for(i = 0; i != 7; ++i) {
   6344       unsigned x, y, b;
   6345       size_t bytewidth = bpp / 8u;
   6346       for(y = 0; y < passh[i]; ++y)
   6347       for(x = 0; x < passw[i]; ++x) {
   6348         size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth;
   6349         size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth;
   6350         for(b = 0; b < bytewidth; ++b) {
   6351           out[pixeloutstart + b] = in[pixelinstart + b];
   6352         }
   6353       }
   6354     }
   6355   } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ {
   6356     for(i = 0; i != 7; ++i) {
   6357       unsigned x, y, b;
   6358       unsigned ilinebits = bpp * passw[i];
   6359       unsigned olinebits = bpp * w;
   6360       size_t obp, ibp; /*bit pointers (for out and in buffer)*/
   6361       for(y = 0; y < passh[i]; ++y)
   6362       for(x = 0; x < passw[i]; ++x) {
   6363         ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp;
   6364         obp = (8 * passstart[i]) + (y * ilinebits + x * bpp);
   6365         for(b = 0; b < bpp; ++b) {
   6366           unsigned char bit = readBitFromReversedStream(&ibp, in);
   6367           setBitOfReversedStream(&obp, out, bit);
   6368         }
   6369       }
   6370     }
   6371   }
   6372 }
   6373 
   6374 /*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image.
   6375 return value is error**/
   6376 static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in,
   6377                                     unsigned w, unsigned h,
   6378                                     const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) {
   6379   /*
   6380   This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps:
   6381   *) if no Adam7: 1) add padding bits (= possible extra bits per scanline if bpp < 8) 2) filter
   6382   *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter
   6383   */
   6384   size_t bpp = lodepng_get_bpp(&info_png->color);
   6385   unsigned error = 0;
   6386   if(info_png->interlace_method == 0) {
   6387     /*image size plus an extra byte per scanline + possible padding bits*/
   6388     *outsize = (size_t)h + ((size_t)h * (((size_t)w * bpp + 7u) / 8u));
   6389     *out = (unsigned char*)lodepng_malloc(*outsize);
   6390     if(!(*out) && (*outsize)) error = 83; /*alloc fail*/
   6391 
   6392     if(!error) {
   6393       /*non multiple of 8 bits per scanline, padding bits needed per scanline*/
   6394       if(bpp < 8 && (size_t)w * bpp != (((size_t)w * bpp + 7u) / 8u) * 8u) {
   6395         unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7u) / 8u));
   6396         if(!padded) error = 83; /*alloc fail*/
   6397         if(!error) {
   6398           addPaddingBits(padded, in, (((size_t)w * bpp + 7u) / 8u) * 8u, (size_t)w * bpp, h);
   6399           error = filter(*out, padded, w, h, &info_png->color, settings);
   6400         }
   6401         lodepng_free(padded);
   6402       } else {
   6403         /*we can immediately filter into the out buffer, no other steps needed*/
   6404         error = filter(*out, in, w, h, &info_png->color, settings);
   6405       }
   6406     }
   6407   } else /*interlace_method is 1 (Adam7)*/ {
   6408     unsigned passw[7], passh[7];
   6409     size_t filter_passstart[8], padded_passstart[8], passstart[8];
   6410     unsigned char* adam7;
   6411 
   6412     Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, (unsigned)bpp);
   6413 
   6414     *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/
   6415     *out = (unsigned char*)lodepng_malloc(*outsize);
   6416     if(!(*out)) error = 83; /*alloc fail*/
   6417 
   6418     adam7 = (unsigned char*)lodepng_malloc(passstart[7]);
   6419     if(!adam7 && passstart[7]) error = 83; /*alloc fail*/
   6420 
   6421     if(!error) {
   6422       unsigned i;
   6423 
   6424       Adam7_interlace(adam7, in, w, h, (unsigned)bpp);
   6425       for(i = 0; i != 7; ++i) {
   6426         if(bpp < 8) {
   6427           unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]);
   6428           if(!padded) ERROR_BREAK(83); /*alloc fail*/
   6429           addPaddingBits(padded, &adam7[passstart[i]],
   6430                          (((size_t)passw[i] * bpp + 7u) / 8u) * 8u, (size_t)passw[i] * bpp, passh[i]);
   6431           error = filter(&(*out)[filter_passstart[i]], padded,
   6432                          passw[i], passh[i], &info_png->color, settings);
   6433           lodepng_free(padded);
   6434         } else {
   6435           error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]],
   6436                          passw[i], passh[i], &info_png->color, settings);
   6437         }
   6438 
   6439         if(error) break;
   6440       }
   6441     }
   6442 
   6443     lodepng_free(adam7);
   6444   }
   6445 
   6446   return error;
   6447 }
   6448 
   6449 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6450 static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) {
   6451   unsigned char* inchunk = data;
   6452   while((size_t)(inchunk - data) < datasize) {
   6453     CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk));
   6454     out->allocsize = out->size; /*fix the allocsize again*/
   6455     inchunk = lodepng_chunk_next(inchunk, data + datasize);
   6456   }
   6457   return 0;
   6458 }
   6459 
   6460 static unsigned isGrayICCProfile(const unsigned char* profile, unsigned size) {
   6461   /*
   6462   It is a gray profile if bytes 16-19 are "GRAY", rgb profile if bytes 16-19
   6463   are "RGB ". We do not perform any full parsing of the ICC profile here, other
   6464   than check those 4 bytes to grayscale profile. Other than that, validity of
   6465   the profile is not checked. This is needed only because the PNG specification
   6466   requires using a non-gray color model if there is an ICC profile with "RGB "
   6467   (sadly limiting compression opportunities if the input data is grayscale RGB
   6468   data), and requires using a gray color model if it is "GRAY".
   6469   */
   6470   if(size < 20) return 0;
   6471   return profile[16] == 'G' &&  profile[17] == 'R' &&  profile[18] == 'A' &&  profile[19] == 'Y';
   6472 }
   6473 
   6474 static unsigned isRGBICCProfile(const unsigned char* profile, unsigned size) {
   6475   /* See comment in isGrayICCProfile*/
   6476   if(size < 20) return 0;
   6477   return profile[16] == 'R' &&  profile[17] == 'G' &&  profile[18] == 'B' &&  profile[19] == ' ';
   6478 }
   6479 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   6480 
   6481 unsigned lodepng_encode(unsigned char** out, size_t* outsize,
   6482                         const unsigned char* image, unsigned w, unsigned h,
   6483                         LodePNGState* state) {
   6484   unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/
   6485   size_t datasize = 0;
   6486   ucvector outv = ucvector_init(NULL, 0);
   6487   LodePNGInfo info;
   6488   const LodePNGInfo* info_png = &state->info_png;
   6489   LodePNGColorMode auto_color;
   6490   unsigned error = 0;
   6491 
   6492   lodepng_info_init(&info);
   6493   lodepng_color_mode_init(&auto_color);
   6494 
   6495   /*provide some proper output values if error will happen*/
   6496   *out = 0;
   6497   *outsize = 0;
   6498 
   6499   /*check input values validity*/
   6500   if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette)
   6501       && (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) {
   6502     /*this error is returned even if auto_convert is enabled and thus encoder could
   6503     generate the palette by itself: while allowing this could be possible in theory,
   6504     it may complicate the code or edge cases, and always requiring to give a palette
   6505     when setting this color type is a simpler contract*/
   6506     error = 68; /*invalid palette size, it is only allowed to be 1-256*/
   6507     goto cleanup;
   6508   }
   6509   if(state->encoder.zlibsettings.btype > 2) {
   6510     error = 61; /*error: invalid btype*/
   6511     goto cleanup;
   6512   }
   6513   if(info_png->interlace_method > 1) {
   6514     error = 71; /*error: invalid interlace mode*/
   6515     goto cleanup;
   6516   }
   6517   error = checkColorValidity(info_png->color.colortype, info_png->color.bitdepth);
   6518   if(error) goto cleanup; /*error: invalid color type given*/
   6519   error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth);
   6520   if(error) goto cleanup; /*error: invalid color type given*/
   6521 
   6522   /* color convert and compute scanline filter types */
   6523   CERROR_TRY_RETURN(lodepng_info_copy(&info, &state->info_png));
   6524   if(state->encoder.auto_convert) {
   6525     LodePNGColorStats stats;
   6526     unsigned allow_convert = 1;
   6527     lodepng_color_stats_init(&stats);
   6528 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6529     if(info_png->iccp_defined &&
   6530         isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) {
   6531       /*the PNG specification does not allow to use palette with a GRAY ICC profile, even
   6532       if the palette has only gray colors, so disallow it.*/
   6533       stats.allow_palette = 0;
   6534     }
   6535     if(info_png->iccp_defined &&
   6536         isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) {
   6537       /*the PNG specification does not allow to use grayscale color with RGB ICC profile, so disallow gray.*/
   6538       stats.allow_greyscale = 0;
   6539     }
   6540 #endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */
   6541     error = lodepng_compute_color_stats(&stats, image, w, h, &state->info_raw);
   6542     if(error) goto cleanup;
   6543 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6544     if(info_png->background_defined) {
   6545       /*the background chunk's color must be taken into account as well*/
   6546       unsigned r = 0, g = 0, b = 0;
   6547       LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16);
   6548       lodepng_convert_rgb(&r, &g, &b,
   6549           info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color);
   6550       error = lodepng_color_stats_add(&stats, r, g, b, 65535);
   6551       if(error) goto cleanup;
   6552     }
   6553 #endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */
   6554     error = auto_choose_color(&auto_color, &state->info_raw, &stats);
   6555     if(error) goto cleanup;
   6556 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6557     if(info_png->sbit_defined) {
   6558       /*if sbit is defined, due to strict requirements of which sbit values can be present for which color modes,
   6559       auto_convert can't be done in many cases. However, do support a few cases here.
   6560       TODO: more conversions may be possible, and it may also be possible to get a more appropriate color type out of
   6561             auto_choose_color if knowledge about sbit is used beforehand
   6562       */
   6563       unsigned sbit_max = LODEPNG_MAX(LODEPNG_MAX(LODEPNG_MAX(info_png->sbit_r, info_png->sbit_g),
   6564                            info_png->sbit_b), info_png->sbit_a);
   6565       unsigned equal = (!info_png->sbit_g || info_png->sbit_g == info_png->sbit_r)
   6566                     && (!info_png->sbit_b || info_png->sbit_b == info_png->sbit_r)
   6567                     && (!info_png->sbit_a || info_png->sbit_a == info_png->sbit_r);
   6568       allow_convert = 0;
   6569       if(info.color.colortype == LCT_PALETTE &&
   6570          auto_color.colortype == LCT_PALETTE) {
   6571         /* input and output are palette, and in this case it may happen that palette data is
   6572         expected to be copied from info_raw into the info_png */
   6573         allow_convert = 1;
   6574       }
   6575       /*going from 8-bit RGB to palette (or 16-bit as long as sbit_max <= 8) is possible
   6576       since both are 8-bit RGB for sBIT's purposes*/
   6577       if(info.color.colortype == LCT_RGB &&
   6578          auto_color.colortype == LCT_PALETTE && sbit_max <= 8) {
   6579         allow_convert = 1;
   6580       }
   6581       /*going from 8-bit RGBA to palette is also ok but only if sbit_a is exactly 8*/
   6582       if(info.color.colortype == LCT_RGBA && auto_color.colortype == LCT_PALETTE &&
   6583          info_png->sbit_a == 8 && sbit_max <= 8) {
   6584         allow_convert = 1;
   6585       }
   6586       /*going from 16-bit RGB(A) to 8-bit RGB(A) is ok if all sbit values are <= 8*/
   6587       if((info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA) && info.color.bitdepth == 16 &&
   6588          auto_color.colortype == info.color.colortype && auto_color.bitdepth == 8 &&
   6589          sbit_max <= 8) {
   6590         allow_convert = 1;
   6591       }
   6592       /*going to less channels is ok if all bit values are equal (all possible values in sbit,
   6593         as well as the chosen bitdepth of the result). Due to how auto_convert works,
   6594         we already know that auto_color.colortype has less than or equal amount of channels than
   6595         info.colortype. Palette is not used here. This conversion is not allowed if
   6596         info_png->sbit_r < auto_color.bitdepth, because specifically for alpha, non-presence of
   6597         an sbit value heavily implies that alpha's bit depth is equal to the PNG bit depth (rather
   6598         than the bit depths set in the r, g and b sbit values, by how the PNG specification describes
   6599         handling tRNS chunk case with sBIT), so be conservative here about ignoring user input.*/
   6600       if(info.color.colortype != LCT_PALETTE && auto_color.colortype != LCT_PALETTE &&
   6601          equal && info_png->sbit_r == auto_color.bitdepth) {
   6602         allow_convert = 1;
   6603       }
   6604     }
   6605 #endif
   6606     if(state->encoder.force_palette) {
   6607       if(info.color.colortype != LCT_GREY && info.color.colortype != LCT_GREY_ALPHA &&
   6608          (auto_color.colortype == LCT_GREY || auto_color.colortype == LCT_GREY_ALPHA)) {
   6609         /*user specifically forced a PLTE palette, so cannot convert to grayscale types because
   6610         the PNG specification only allows writing a suggested palette in PLTE for truecolor types*/
   6611         allow_convert = 0;
   6612       }
   6613     }
   6614     if(allow_convert) {
   6615       lodepng_color_mode_copy(&info.color, &auto_color);
   6616 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6617       /*also convert the background chunk*/
   6618       if(info_png->background_defined) {
   6619         if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b,
   6620             info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) {
   6621           error = 104;
   6622           goto cleanup;
   6623         }
   6624       }
   6625 #endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */
   6626     }
   6627   }
   6628 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6629   if(info_png->iccp_defined) {
   6630     unsigned gray_icc = isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size);
   6631     unsigned rgb_icc = isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size);
   6632     unsigned gray_png = info.color.colortype == LCT_GREY || info.color.colortype == LCT_GREY_ALPHA;
   6633     if(!gray_icc && !rgb_icc) {
   6634       error = 100; /* Disallowed profile color type for PNG */
   6635       goto cleanup;
   6636     }
   6637     if(gray_icc != gray_png) {
   6638       /*Not allowed to use RGB/RGBA/palette with GRAY ICC profile or vice versa,
   6639       or in case of auto_convert, it wasn't possible to find appropriate model*/
   6640       error = state->encoder.auto_convert ? 102 : 101;
   6641       goto cleanup;
   6642     }
   6643   }
   6644 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   6645   if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) {
   6646     unsigned char* converted;
   6647     size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7u) / 8u;
   6648 
   6649     converted = (unsigned char*)lodepng_malloc(size);
   6650     if(!converted && size) error = 83; /*alloc fail*/
   6651     if(!error) {
   6652       error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h);
   6653     }
   6654     if(!error) {
   6655       error = preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder);
   6656     }
   6657     lodepng_free(converted);
   6658     if(error) goto cleanup;
   6659   } else {
   6660     error = preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder);
   6661     if(error) goto cleanup;
   6662   }
   6663 
   6664   /* output all PNG chunks */ {
   6665 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6666     size_t i;
   6667 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   6668     /*write signature and chunks*/
   6669     error = writeSignature(&outv);
   6670     if(error) goto cleanup;
   6671     /*IHDR*/
   6672     error = addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method);
   6673     if(error) goto cleanup;
   6674 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6675     /*unknown chunks between IHDR and PLTE*/
   6676     if(info.unknown_chunks_data[0]) {
   6677       error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]);
   6678       if(error) goto cleanup;
   6679     }
   6680     /*color profile chunks must come before PLTE */
   6681     if(info.cicp_defined) {
   6682       error = addChunk_cICP(&outv, &info);
   6683       if(error) goto cleanup;
   6684     }
   6685     if(info.mdcv_defined) {
   6686       error = addChunk_mDCV(&outv, &info);
   6687       if(error) goto cleanup;
   6688     }
   6689     if(info.clli_defined) {
   6690       error = addChunk_cLLI(&outv, &info);
   6691       if(error) goto cleanup;
   6692     }
   6693     if(info.iccp_defined) {
   6694       error = addChunk_iCCP(&outv, &info, &state->encoder.zlibsettings);
   6695       if(error) goto cleanup;
   6696     }
   6697     if(info.srgb_defined) {
   6698       error = addChunk_sRGB(&outv, &info);
   6699       if(error) goto cleanup;
   6700     }
   6701     if(info.gama_defined) {
   6702       error = addChunk_gAMA(&outv, &info);
   6703       if(error) goto cleanup;
   6704     }
   6705     if(info.chrm_defined) {
   6706       error = addChunk_cHRM(&outv, &info);
   6707       if(error) goto cleanup;
   6708     }
   6709     if(info_png->sbit_defined) {
   6710       error = addChunk_sBIT(&outv, &info);
   6711       if(error) goto cleanup;
   6712     }
   6713     if(info.exif_defined) {
   6714       error = addChunk_eXIf(&outv, &info);
   6715       if(error) goto cleanup;
   6716     }
   6717 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   6718     /*PLTE*/
   6719     if(info.color.colortype == LCT_PALETTE) {
   6720       error = addChunk_PLTE(&outv, &info.color);
   6721       if(error) goto cleanup;
   6722     }
   6723     if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) {
   6724       /*force_palette means: write suggested palette for truecolor in PLTE chunk*/
   6725       error = addChunk_PLTE(&outv, &info.color);
   6726       if(error) goto cleanup;
   6727     }
   6728     /*tRNS (this will only add if when necessary) */
   6729     error = addChunk_tRNS(&outv, &info.color);
   6730     if(error) goto cleanup;
   6731 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6732     /*bKGD (must come between PLTE and the IDAt chunks*/
   6733     if(info.background_defined) {
   6734       error = addChunk_bKGD(&outv, &info);
   6735       if(error) goto cleanup;
   6736     }
   6737     /*pHYs (must come before the IDAT chunks)*/
   6738     if(info.phys_defined) {
   6739       error = addChunk_pHYs(&outv, &info);
   6740       if(error) goto cleanup;
   6741     }
   6742 
   6743     /*unknown chunks between PLTE and IDAT*/
   6744     if(info.unknown_chunks_data[1]) {
   6745       error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]);
   6746       if(error) goto cleanup;
   6747     }
   6748 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   6749     /*IDAT (multiple IDAT chunks must be consecutive)*/
   6750     error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings);
   6751     if(error) goto cleanup;
   6752 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6753     /*tIME*/
   6754     if(info.time_defined) {
   6755       error = addChunk_tIME(&outv, &info.time);
   6756       if(error) goto cleanup;
   6757     }
   6758     /*tEXt and/or zTXt*/
   6759     for(i = 0; i != info.text_num; ++i) {
   6760       if(lodepng_strlen(info.text_keys[i]) > 79) {
   6761         error = 66; /*text chunk too large*/
   6762         goto cleanup;
   6763       }
   6764       if(lodepng_strlen(info.text_keys[i]) < 1) {
   6765         error = 67; /*text chunk too small*/
   6766         goto cleanup;
   6767       }
   6768       if(state->encoder.text_compression) {
   6769         error = addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings);
   6770         if(error) goto cleanup;
   6771       } else {
   6772         error = addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]);
   6773         if(error) goto cleanup;
   6774       }
   6775     }
   6776     /*LodePNG version id in text chunk*/
   6777     if(state->encoder.add_id) {
   6778       unsigned already_added_id_text = 0;
   6779       for(i = 0; i != info.text_num; ++i) {
   6780         const char* k = info.text_keys[i];
   6781         /* Could use strcmp, but we're not calling or reimplementing this C library function for this use only */
   6782         if(k[0] == 'L' && k[1] == 'o' && k[2] == 'd' && k[3] == 'e' &&
   6783            k[4] == 'P' && k[5] == 'N' && k[6] == 'G' && k[7] == '\0') {
   6784           already_added_id_text = 1;
   6785           break;
   6786         }
   6787       }
   6788       if(already_added_id_text == 0) {
   6789         error = addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/
   6790         if(error) goto cleanup;
   6791       }
   6792     }
   6793     /*iTXt*/
   6794     for(i = 0; i != info.itext_num; ++i) {
   6795       if(lodepng_strlen(info.itext_keys[i]) > 79) {
   6796         error = 66; /*text chunk too large*/
   6797         goto cleanup;
   6798       }
   6799       if(lodepng_strlen(info.itext_keys[i]) < 1) {
   6800         error = 67; /*text chunk too small*/
   6801         goto cleanup;
   6802       }
   6803       error = addChunk_iTXt(
   6804           &outv, state->encoder.text_compression,
   6805           info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i],
   6806           &state->encoder.zlibsettings);
   6807       if(error) goto cleanup;
   6808     }
   6809 
   6810     /*unknown chunks between IDAT and IEND*/
   6811     if(info.unknown_chunks_data[2]) {
   6812       error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]);
   6813       if(error) goto cleanup;
   6814     }
   6815 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   6816     error = addChunk_IEND(&outv);
   6817     if(error) goto cleanup;
   6818   }
   6819 
   6820 cleanup:
   6821   lodepng_info_cleanup(&info);
   6822   lodepng_free(data);
   6823   lodepng_color_mode_cleanup(&auto_color);
   6824 
   6825   /*instead of cleaning the vector up, give it to the output*/
   6826   *out = outv.data;
   6827   *outsize = outv.size;
   6828 
   6829   state->error = error; /*TODO: remove this and make input state const*/
   6830 
   6831   return error;
   6832 }
   6833 
   6834 unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image,
   6835                                unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) {
   6836   unsigned error;
   6837   LodePNGState state;
   6838   lodepng_state_init(&state);
   6839   state.info_raw.colortype = colortype;
   6840   state.info_raw.bitdepth = bitdepth;
   6841   state.info_png.color.colortype = colortype;
   6842   state.info_png.color.bitdepth = bitdepth;
   6843   error = lodepng_encode(out, outsize, image, w, h, &state);
   6844   lodepng_state_cleanup(&state);
   6845   return error;
   6846 }
   6847 
   6848 unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) {
   6849   return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8);
   6850 }
   6851 
   6852 unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) {
   6853   return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8);
   6854 }
   6855 
   6856 #ifdef LODEPNG_COMPILE_DISK
   6857 unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h,
   6858                              LodePNGColorType colortype, unsigned bitdepth) {
   6859   unsigned char* buffer;
   6860   size_t buffersize;
   6861   unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth);
   6862   if(!error) error = lodepng_save_file(buffer, buffersize, filename);
   6863   lodepng_free(buffer);
   6864   return error;
   6865 }
   6866 
   6867 unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) {
   6868   return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8);
   6869 }
   6870 
   6871 unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) {
   6872   return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8);
   6873 }
   6874 #endif /*LODEPNG_COMPILE_DISK*/
   6875 
   6876 void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) {
   6877   lodepng_compress_settings_init(&settings->zlibsettings);
   6878   settings->filter_palette_zero = 1;
   6879   settings->filter_strategy = LFS_MINSUM;
   6880   settings->auto_convert = 1;
   6881   settings->force_palette = 0;
   6882   settings->predefined_filters = 0;
   6883 #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
   6884   settings->add_id = 0;
   6885   settings->text_compression = 1;
   6886 #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
   6887 }
   6888 
   6889 #endif /*LODEPNG_COMPILE_ENCODER*/
   6890 #endif /*LODEPNG_COMPILE_PNG*/
   6891 
   6892 #ifdef LODEPNG_COMPILE_ERROR_TEXT
   6893 /*
   6894 This returns the description of a numerical error code in English. This is also
   6895 the documentation of all the error codes.
   6896 */
   6897 const char* lodepng_error_text(unsigned code) {
   6898   switch(code) {
   6899     case 0: return "no error, everything went ok";
   6900     case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/
   6901     case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/
   6902     case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/
   6903     case 13: return "problem while processing dynamic deflate block";
   6904     case 14: return "problem while processing dynamic deflate block";
   6905     case 15: return "problem while processing dynamic deflate block";
   6906     /*this error could happen if there are only 0 or 1 symbols present in the huffman code:*/
   6907     case 16: return "invalid code while processing dynamic deflate block";
   6908     case 17: return "end of out buffer memory reached while inflating";
   6909     case 18: return "invalid distance code while inflating";
   6910     case 19: return "end of out buffer memory reached while inflating";
   6911     case 20: return "invalid deflate block BTYPE encountered while decoding";
   6912     case 21: return "NLEN is not ones complement of LEN in a deflate block";
   6913 
   6914     /*end of out buffer memory reached while inflating:
   6915     This can happen if the inflated deflate data is longer than the amount of bytes required to fill up
   6916     all the pixels of the image, given the color depth and image dimensions. Something that doesn't
   6917     happen in a normal, well encoded, PNG image.*/
   6918     case 22: return "end of out buffer memory reached while inflating";
   6919     case 23: return "end of in buffer memory reached while inflating";
   6920     case 24: return "invalid FCHECK in zlib header";
   6921     case 25: return "invalid compression method in zlib header";
   6922     case 26: return "FDICT encountered in zlib header while it's not used for PNG";
   6923     case 27: return "PNG file is smaller than a PNG header";
   6924     /*Checks the magic file header, the first 8 bytes of the PNG file*/
   6925     case 28: return "incorrect PNG signature, it's no PNG or corrupted";
   6926     case 29: return "first chunk is not the header chunk";
   6927     case 30: return "chunk length too large, chunk broken off at end of file";
   6928     case 31: return "illegal PNG color type or bpp";
   6929     case 32: return "illegal PNG compression method";
   6930     case 33: return "illegal PNG filter method";
   6931     case 34: return "illegal PNG interlace method";
   6932     case 35: return "chunk length of a chunk is too large or the chunk too small";
   6933     case 36: return "illegal PNG filter type encountered";
   6934     case 37: return "illegal bit depth for this color type given";
   6935     case 38: return "the palette is too small or too big"; /*0, or more than 256 colors*/
   6936     case 39: return "tRNS chunk before PLTE or has more entries than palette size";
   6937     case 40: return "tRNS chunk has wrong size for grayscale image";
   6938     case 41: return "tRNS chunk has wrong size for RGB image";
   6939     case 42: return "tRNS chunk appeared while it was not allowed for this color type";
   6940     case 43: return "bKGD chunk has wrong size for palette image";
   6941     case 44: return "bKGD chunk has wrong size for grayscale image";
   6942     case 45: return "bKGD chunk has wrong size for RGB image";
   6943     case 48: return "empty input buffer given to decoder. Maybe caused by non-existing file?";
   6944     case 49: return "jumped past memory while generating dynamic huffman tree";
   6945     case 50: return "jumped past memory while generating dynamic huffman tree";
   6946     case 51: return "jumped past memory while inflating huffman block";
   6947     case 52: return "jumped past memory while inflating";
   6948     case 53: return "size of zlib data too small";
   6949     case 54: return "repeat symbol in tree while there was no value symbol yet";
   6950     /*jumped past tree while generating huffman tree, this could be when the
   6951     tree will have more leaves than symbols after generating it out of the
   6952     given lengths. They call this an oversubscribed dynamic bit lengths tree in zlib.*/
   6953     case 55: return "jumped past tree while generating huffman tree";
   6954     case 56: return "given output image colortype or bitdepth not supported for color conversion";
   6955     case 57: return "invalid CRC encountered (checking CRC can be disabled)";
   6956     case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)";
   6957     case 59: return "requested color conversion not supported";
   6958     case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)";
   6959     case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)";
   6960     /*LodePNG leaves the choice of RGB to grayscale conversion formula to the user.*/
   6961     case 62: return "conversion from color to grayscale not supported";
   6962     /*(2^31-1)*/
   6963     case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk";
   6964     /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/
   6965     case 64: return "the length of the END symbol 256 in the Huffman tree is 0";
   6966     case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes";
   6967     case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte";
   6968     case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors";
   6969     case 69: return "unknown chunk type with 'critical' flag encountered by the decoder";
   6970     case 71: return "invalid interlace mode given to encoder (must be 0 or 1)";
   6971     case 72: return "while decoding, invalid compression method encountered in zTXt, iTXt or iCCP chunk (it must be 0)";
   6972     case 73: return "invalid tIME chunk size";
   6973     case 74: return "invalid pHYs chunk size";
   6974     /*length could be wrong, or data chopped off*/
   6975     case 75: return "no null termination char found while decoding text chunk";
   6976     case 76: return "iTXt chunk too short to contain required bytes";
   6977     case 77: return "integer overflow in buffer size";
   6978     case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/
   6979     case 79: return "failed to open file for writing";
   6980     case 80: return "tried creating a tree of 0 symbols";
   6981     case 81: return "lazy matching at pos 0 is impossible";
   6982     case 82: return "color conversion to palette requested while a color isn't in palette, or index out of bounds";
   6983     case 83: return "memory allocation failed";
   6984     case 84: return "given image too small to contain all pixels to be encoded";
   6985     case 86: return "impossible offset in lz77 encoding (internal bug)";
   6986     case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined";
   6987     case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy";
   6988     case 89: return "text chunk keyword too short or long: must have size 1-79";
   6989     /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/
   6990     case 90: return "windowsize must be a power of two";
   6991     case 91: return "invalid decompressed idat size";
   6992     case 92: return "integer overflow due to too many pixels";
   6993     case 93: return "zero width or height is invalid";
   6994     case 94: return "header chunk must have a size of 13 bytes";
   6995     case 95: return "integer overflow with combined idat chunk size";
   6996     case 96: return "invalid gAMA chunk size";
   6997     case 97: return "invalid cHRM chunk size";
   6998     case 98: return "invalid sRGB chunk size";
   6999     case 99: return "invalid sRGB rendering intent";
   7000     case 100: return "invalid ICC profile color type, the PNG specification only allows RGB or GRAY";
   7001     case 101: return "PNG specification does not allow RGB ICC profile on gray color types and vice versa";
   7002     case 102: return "not allowed to set grayscale ICC profile with colored pixels by PNG specification";
   7003     case 103: return "invalid palette index in bKGD chunk. Maybe it came before PLTE chunk?";
   7004     case 104: return "invalid bKGD color while encoding (e.g. palette index out of range)";
   7005     case 105: return "integer overflow of bitsize";
   7006     case 106: return "PNG file must have PLTE chunk if color type is palette";
   7007     case 107: return "color convert from palette mode requested without setting the palette data in it";
   7008     case 108: return "tried to add more than 256 values to a palette";
   7009     /*this limit can be configured in LodePNGDecompressSettings*/
   7010     case 109: return "tried to decompress zlib or deflate data larger than desired max_output_size";
   7011     case 110: return "custom zlib or inflate decompression failed";
   7012     case 111: return "custom zlib or deflate compression failed";
   7013     /*max text size limit can be configured in LodePNGDecoderSettings. This error prevents
   7014     unreasonable memory consumption when decoding due to impossibly large text sizes.*/
   7015     case 112: return "compressed text unreasonably large";
   7016     /*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents
   7017     unreasonable memory consumption when decoding due to impossibly large ICC profile*/
   7018     case 113: return "ICC profile unreasonably large";
   7019     case 114: return "sBIT chunk has wrong size for the color type of the image";
   7020     case 115: return "sBIT value out of range";
   7021     case 116: return "cICP value out of range";
   7022     case 117: return "invalid cICP chunk size";
   7023     case 118: return "mDCV value out of range";
   7024     case 119: return "invalid mDCV chunk size";
   7025     case 120: return "invalid cLLI chunk size";
   7026     case 121: return "invalid chunk type name: may only contain [a-zA-Z]";
   7027     case 122: return "invalid chunk type name: third character must be uppercase";
   7028     case 123: return "invalid ICC profile size";
   7029   }
   7030   return "unknown error code";
   7031 }
   7032 #endif /*LODEPNG_COMPILE_ERROR_TEXT*/
   7033 
   7034 /* ////////////////////////////////////////////////////////////////////////// */
   7035 /* ////////////////////////////////////////////////////////////////////////// */
   7036 /* // C++ Wrapper                                                          // */
   7037 /* ////////////////////////////////////////////////////////////////////////// */
   7038 /* ////////////////////////////////////////////////////////////////////////// */
   7039 
   7040 #ifdef LODEPNG_COMPILE_CPP
   7041 namespace lodepng {
   7042 
   7043 #ifdef LODEPNG_COMPILE_DISK
   7044 /* Resizes the vector to the file size and reads the file into it. Returns error code.*/
   7045 static unsigned load_file_(std::vector<unsigned char>& buffer, FILE* file) {
   7046   long size = lodepng_filesize(file);
   7047   if(size < 0) return 78;
   7048   buffer.resize((size_t)size);
   7049   if(size == 0) return 0; /*ok*/
   7050   if(fread(&buffer[0], 1, buffer.size(), file) != buffer.size()) return 78;
   7051   return 0; /*ok*/
   7052 }
   7053 
   7054 unsigned load_file(std::vector<unsigned char>& buffer, const std::string& filename) {
   7055   unsigned error;
   7056   FILE* file = fopen(filename.c_str(), "rb");
   7057   if(!file) return 78;
   7058   error = load_file_(buffer, file);
   7059   fclose(file);
   7060   return error;
   7061 }
   7062 
   7063 /*write given buffer to the file, overwriting the file, it doesn't append to it.*/
   7064 unsigned save_file(const std::vector<unsigned char>& buffer, const std::string& filename) {
   7065   return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str());
   7066 }
   7067 #endif /* LODEPNG_COMPILE_DISK */
   7068 
   7069 #ifdef LODEPNG_COMPILE_ZLIB
   7070 #ifdef LODEPNG_COMPILE_DECODER
   7071 unsigned decompress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,
   7072                     const LodePNGDecompressSettings& settings) {
   7073   unsigned char* buffer = 0;
   7074   size_t buffersize = 0;
   7075   unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings);
   7076   if(buffer) {
   7077     out.insert(out.end(), buffer, &buffer[buffersize]);
   7078     lodepng_free(buffer);
   7079   }
   7080   return error;
   7081 }
   7082 
   7083 unsigned decompress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,
   7084                     const LodePNGDecompressSettings& settings) {
   7085   return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings);
   7086 }
   7087 #endif /* LODEPNG_COMPILE_DECODER */
   7088 
   7089 #ifdef LODEPNG_COMPILE_ENCODER
   7090 unsigned compress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,
   7091                   const LodePNGCompressSettings& settings) {
   7092   unsigned char* buffer = 0;
   7093   size_t buffersize = 0;
   7094   unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings);
   7095   if(buffer) {
   7096     out.insert(out.end(), buffer, &buffer[buffersize]);
   7097     lodepng_free(buffer);
   7098   }
   7099   return error;
   7100 }
   7101 
   7102 unsigned compress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,
   7103                   const LodePNGCompressSettings& settings) {
   7104   return compress(out, in.empty() ? 0 : &in[0], in.size(), settings);
   7105 }
   7106 #endif /* LODEPNG_COMPILE_ENCODER */
   7107 #endif /* LODEPNG_COMPILE_ZLIB */
   7108 
   7109 
   7110 #ifdef LODEPNG_COMPILE_PNG
   7111 
   7112 State::State() {
   7113   lodepng_state_init(this);
   7114 }
   7115 
   7116 State::State(const State& other) {
   7117   lodepng_state_init(this);
   7118   lodepng_state_copy(this, &other);
   7119 }
   7120 
   7121 State::~State() {
   7122   lodepng_state_cleanup(this);
   7123 }
   7124 
   7125 State& State::operator=(const State& other) {
   7126   lodepng_state_copy(this, &other);
   7127   return *this;
   7128 }
   7129 
   7130 #ifdef LODEPNG_COMPILE_DECODER
   7131 
   7132 unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const unsigned char* in,
   7133                 size_t insize, LodePNGColorType colortype, unsigned bitdepth) {
   7134   unsigned char* buffer = 0;
   7135   unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth);
   7136   if(buffer && !error) {
   7137     State state;
   7138     state.info_raw.colortype = colortype;
   7139     state.info_raw.bitdepth = bitdepth;
   7140     size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);
   7141     out.insert(out.end(), buffer, &buffer[buffersize]);
   7142   }
   7143   lodepng_free(buffer);
   7144   return error;
   7145 }
   7146 
   7147 unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
   7148                 const std::vector<unsigned char>& in, LodePNGColorType colortype, unsigned bitdepth) {
   7149   return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth);
   7150 }
   7151 
   7152 unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
   7153                 State& state,
   7154                 const unsigned char* in, size_t insize) {
   7155   unsigned char* buffer = NULL;
   7156   unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize);
   7157   if(buffer && !error) {
   7158     size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);
   7159     out.insert(out.end(), buffer, &buffer[buffersize]);
   7160   }
   7161   lodepng_free(buffer);
   7162   return error;
   7163 }
   7164 
   7165 unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
   7166                 State& state,
   7167                 const std::vector<unsigned char>& in) {
   7168   return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size());
   7169 }
   7170 
   7171 #ifdef LODEPNG_COMPILE_DISK
   7172 unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const std::string& filename,
   7173                 LodePNGColorType colortype, unsigned bitdepth) {
   7174   std::vector<unsigned char> buffer;
   7175   /* safe output values in case error happens */
   7176   w = h = 0;
   7177   unsigned error = load_file(buffer, filename);
   7178   if(error) return error;
   7179   return decode(out, w, h, buffer, colortype, bitdepth);
   7180 }
   7181 #endif /* LODEPNG_COMPILE_DECODER */
   7182 #endif /* LODEPNG_COMPILE_DISK */
   7183 
   7184 #ifdef LODEPNG_COMPILE_ENCODER
   7185 unsigned encode(std::vector<unsigned char>& out, const unsigned char* in, unsigned w, unsigned h,
   7186                 LodePNGColorType colortype, unsigned bitdepth) {
   7187   unsigned char* buffer;
   7188   size_t buffersize;
   7189   unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth);
   7190   if(buffer) {
   7191     out.insert(out.end(), buffer, &buffer[buffersize]);
   7192     lodepng_free(buffer);
   7193   }
   7194   return error;
   7195 }
   7196 
   7197 unsigned encode(std::vector<unsigned char>& out,
   7198                 const std::vector<unsigned char>& in, unsigned w, unsigned h,
   7199                 LodePNGColorType colortype, unsigned bitdepth) {
   7200   if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84;
   7201   return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth);
   7202 }
   7203 
   7204 unsigned encode(std::vector<unsigned char>& out,
   7205                 const unsigned char* in, unsigned w, unsigned h,
   7206                 State& state) {
   7207   unsigned char* buffer;
   7208   size_t buffersize;
   7209   unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state);
   7210   if(buffer) {
   7211     out.insert(out.end(), buffer, &buffer[buffersize]);
   7212     lodepng_free(buffer);
   7213   }
   7214   return error;
   7215 }
   7216 
   7217 unsigned encode(std::vector<unsigned char>& out,
   7218                 const std::vector<unsigned char>& in, unsigned w, unsigned h,
   7219                 State& state) {
   7220   if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84;
   7221   return encode(out, in.empty() ? 0 : &in[0], w, h, state);
   7222 }
   7223 
   7224 #ifdef LODEPNG_COMPILE_DISK
   7225 unsigned encode(const std::string& filename,
   7226                 const unsigned char* in, unsigned w, unsigned h,
   7227                 LodePNGColorType colortype, unsigned bitdepth) {
   7228   std::vector<unsigned char> buffer;
   7229   unsigned error = encode(buffer, in, w, h, colortype, bitdepth);
   7230   if(!error) error = save_file(buffer, filename);
   7231   return error;
   7232 }
   7233 
   7234 unsigned encode(const std::string& filename,
   7235                 const std::vector<unsigned char>& in, unsigned w, unsigned h,
   7236                 LodePNGColorType colortype, unsigned bitdepth) {
   7237   if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84;
   7238   return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth);
   7239 }
   7240 #endif /* LODEPNG_COMPILE_DISK */
   7241 #endif /* LODEPNG_COMPILE_ENCODER */
   7242 #endif /* LODEPNG_COMPILE_PNG */
   7243 } /* namespace lodepng */
   7244 #endif /*LODEPNG_COMPILE_CPP*/

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.