github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/webp/libwebp/test/png/lodepng.cpp (about)

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