Coverage Report

Created: 2025-08-26 06:16

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