Coverage Report

Created: 2025-07-18 06:56

/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
784k
static void* lodepng_malloc(size_t size) {
75
784k
#ifdef LODEPNG_MAX_ALLOC
76
784k
  if(size > LODEPNG_MAX_ALLOC) return 0;
77
784k
#endif
78
784k
  return malloc(size);
79
784k
}
80
81
/* NOTE: when realloc returns NULL, it leaves the original memory untouched */
82
237k
static void* lodepng_realloc(void* ptr, size_t new_size) {
83
237k
#ifdef LODEPNG_MAX_ALLOC
84
237k
  if(new_size > LODEPNG_MAX_ALLOC) return 0;
85
237k
#endif
86
237k
  return realloc(ptr, new_size);
87
237k
}
88
89
954k
static void lodepng_free(void* ptr) {
90
954k
  free(ptr);
91
954k
}
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
18.8M
                           const void* LODEPNG_RESTRICT src, size_t size) {
122
18.8M
  size_t i;
123
402M
  for(i = 0; i < size; i++) ((char*)dst)[i] = ((const char*)src)[i];
124
18.8M
}
125
126
static void lodepng_memset(void* LODEPNG_RESTRICT dst,
127
68.4k
                           int value, size_t num) {
128
68.4k
  size_t i;
129
201M
  for(i = 0; i < num; i++) ((char*)dst)[i] = (char)value;
130
68.4k
}
131
132
/* does not check memory out of bounds, do not use on untrusted data */
133
986k
static size_t lodepng_strlen(const char* a) {
134
986k
  const char* orig = a;
135
  /* avoid warning about unused function in case of disabled COMPILE... macros */
136
986k
  (void)(&lodepng_strlen);
137
10.9M
  while(*a) a++;
138
986k
  return (size_t)(a - orig);
139
986k
}
140
141
24.3k
#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
159k
static int lodepng_addofl(size_t a, size_t b, size_t* result) {
148
159k
  *result = a + b; /* Unsigned addition is well defined and safe in C90 */
149
159k
  return *result < a;
150
159k
}
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.6k
static int lodepng_mulofl(size_t a, size_t b, size_t* result) {
157
39.6k
  *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */
158
39.6k
  return (a != 0 && *result / a != b);
159
39.6k
}
160
161
#ifdef LODEPNG_COMPILE_ZLIB
162
/* Safely check if a + b > c, even if overflow could happen. */
163
4.97k
static int lodepng_gtofl(size_t a, size_t b, size_t c) {
164
4.97k
  size_t d;
165
4.97k
  if(lodepng_addofl(a, b, &d)) return 1;
166
4.97k
  return d > c;
167
4.97k
}
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
918
}
183
184
/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/
185
582
#define ERROR_BREAK(code) CERROR_BREAK(error, code)
186
187
/*Set error var to the error code, and return it.*/
188
216
#define CERROR_RETURN_ERROR(errorvar, code){\
189
216
  errorvar = code;\
190
216
  return code;\
191
216
}
192
193
/*Try the code, if it returns error, also return the error.*/
194
92.5k
#define CERROR_TRY_RETURN(call){\
195
92.5k
  unsigned error = call;\
196
92.5k
  if(error) return error;\
197
92.5k
}
198
199
/*Set error var to the error code, and return from the void function.*/
200
58
#define CERROR_RETURN(errorvar, code){\
201
58
  errorvar = code;\
202
58
  return;\
203
58
}
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
46.5k
static unsigned ucvector_reserve(ucvector* p, size_t size) {
270
46.5k
  if(size > p->allocsize) {
271
29.8k
    size_t newsize = size + (p->allocsize >> 1u);
272
29.8k
    void* data = lodepng_realloc(p->data, newsize);
273
29.8k
    if(data) {
274
29.0k
      p->allocsize = newsize;
275
29.0k
      p->data = (unsigned char*)data;
276
29.0k
    }
277
797
    else return 0; /*error: not enough memory*/
278
29.8k
  }
279
45.7k
  return 1; /*success*/
280
46.5k
}
281
282
/*returns 1 if success, 0 if failure ==> nothing done*/
283
11.1k
static unsigned ucvector_resize(ucvector* p, size_t size) {
284
11.1k
  p->size = size;
285
11.1k
  return ucvector_reserve(p, size);
286
11.1k
}
287
288
9.16k
static ucvector ucvector_init(unsigned char* buffer, size_t size) {
289
9.16k
  ucvector v;
290
9.16k
  v.data = buffer;
291
9.16k
  v.allocsize = v.size = size;
292
9.16k
  return v;
293
9.16k
}
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
221k
static void string_cleanup(char** out) {
302
221k
  lodepng_free(*out);
303
221k
  *out = NULL;
304
221k
}
305
306
/*also appends null termination character*/
307
208k
static char* alloc_string_sized(const char* in, size_t insize) {
308
208k
  char* out = (char*)lodepng_malloc(insize + 1);
309
208k
  if(out) {
310
208k
    lodepng_memcpy(out, in, insize);
311
208k
    out[insize] = 0;
312
208k
  }
313
208k
  return out;
314
208k
}
315
316
/* dynamically allocates a new string with a copy of the null terminated input text */
317
111k
static char* alloc_string(const char* in) {
318
111k
  return alloc_string_sized(in, lodepng_strlen(in));
319
111k
}
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
266k
static unsigned lodepng_read32bitInt(const unsigned char* buffer) {
327
266k
  return (((unsigned)buffer[0] << 24u) | ((unsigned)buffer[1] << 16u) |
328
266k
         ((unsigned)buffer[2] << 8u) | (unsigned)buffer[3]);
329
266k
}
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.53k
static unsigned LodePNGBitReader_init(LodePNGBitReader* reader, const unsigned char* data, size_t size) {
455
8.53k
  size_t temp;
456
8.53k
  reader->data = data;
457
8.53k
  reader->size = size;
458
  /* size in bits, return error if overflow (if size_t is 32 bit this supports up to 500MB)  */
459
8.53k
  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.53k
  if(lodepng_addofl(reader->bitsize, 64u, &temp)) return 105;
463
8.53k
  reader->bp = 0;
464
8.53k
  reader->buffer = 0;
465
8.53k
  return 0; /*ok*/
466
8.53k
}
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
100k
static LODEPNG_INLINE void ensureBits9(LodePNGBitReader* reader, size_t nbits) {
478
100k
  size_t start = reader->bp >> 3u;
479
100k
  size_t size = reader->size;
480
100k
  if(start + 1u < size) {
481
100k
    reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u);
482
100k
    reader->buffer >>= (reader->bp & 7u);
483
100k
  } else {
484
171
    reader->buffer = 0;
485
171
    if(start + 0u < size) reader->buffer = reader->data[start + 0];
486
171
    reader->buffer >>= (reader->bp & 7u);
487
171
  }
488
100k
  (void)nbits;
489
100k
}
490
491
/*See ensureBits documentation above. This one ensures up to 17 bits */
492
4.97k
static LODEPNG_INLINE void ensureBits17(LodePNGBitReader* reader, size_t nbits) {
493
4.97k
  size_t start = reader->bp >> 3u;
494
4.97k
  size_t size = reader->size;
495
4.97k
  if(start + 2u < size) {
496
4.94k
    reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) |
497
4.94k
                     ((unsigned)reader->data[start + 2] << 16u);
498
4.94k
    reader->buffer >>= (reader->bp & 7u);
499
4.94k
  } 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
4.97k
  (void)nbits;
506
4.97k
}
507
508
/*See ensureBits documentation above. This one ensures up to 25 bits */
509
1.87M
static LODEPNG_INLINE void ensureBits25(LodePNGBitReader* reader, size_t nbits) {
510
1.87M
  size_t start = reader->bp >> 3u;
511
1.87M
  size_t size = reader->size;
512
1.87M
  if(start + 3u < size) {
513
1.86M
    reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) |
514
1.86M
                     ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u);
515
1.86M
    reader->buffer >>= (reader->bp & 7u);
516
1.86M
  } else {
517
6.95k
    reader->buffer = 0;
518
6.95k
    if(start + 0u < size) reader->buffer |= reader->data[start + 0];
519
6.95k
    if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u);
520
6.95k
    if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u);
521
6.95k
    reader->buffer >>= (reader->bp & 7u);
522
6.95k
  }
523
1.87M
  (void)nbits;
524
1.87M
}
525
526
/*See ensureBits documentation above. This one ensures up to 32 bits */
527
40.0M
static LODEPNG_INLINE void ensureBits32(LodePNGBitReader* reader, size_t nbits) {
528
40.0M
  size_t start = reader->bp >> 3u;
529
40.0M
  size_t size = reader->size;
530
40.0M
  if(start + 4u < size) {
531
40.0M
    reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) |
532
40.0M
                     ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u);
533
40.0M
    reader->buffer >>= (reader->bp & 7u);
534
40.0M
    reader->buffer |= (((unsigned)reader->data[start + 4] << 24u) << (8u - (reader->bp & 7u)));
535
40.0M
  } else {
536
33.2k
    reader->buffer = 0;
537
33.2k
    if(start + 0u < size) reader->buffer |= reader->data[start + 0];
538
33.2k
    if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u);
539
33.2k
    if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u);
540
33.2k
    if(start + 3u < size) reader->buffer |= ((unsigned)reader->data[start + 3] << 24u);
541
33.2k
    reader->buffer >>= (reader->bp & 7u);
542
33.2k
  }
543
40.0M
  (void)nbits;
544
40.0M
}
545
546
/* Get bits without advancing the bit pointer. Must have enough bits available with ensureBits. Max nbits is 31. */
547
52.2M
static LODEPNG_INLINE unsigned peekBits(LodePNGBitReader* reader, size_t nbits) {
548
  /* The shift allows nbits to be only up to 31. */
549
52.2M
  return reader->buffer & ((1u << nbits) - 1u);
550
52.2M
}
551
552
/* Must have enough bits available with ensureBits */
553
52.2M
static LODEPNG_INLINE void advanceBits(LodePNGBitReader* reader, size_t nbits) {
554
52.2M
  reader->buffer >>= nbits;
555
52.2M
  reader->bp += nbits;
556
52.2M
}
557
558
/* Must have enough bits available with ensureBits */
559
6.47M
static LODEPNG_INLINE unsigned readBits(LodePNGBitReader* reader, size_t nbits) {
560
6.47M
  unsigned result = peekBits(reader, nbits);
561
6.47M
  advanceBits(reader, nbits);
562
6.47M
  return result;
563
6.47M
}
564
#endif /*LODEPNG_COMPILE_DECODER*/
565
566
4.92M
static unsigned reverseBits(unsigned bits, unsigned num) {
567
  /*TODO: implement faster lookup table based version when needed*/
568
4.92M
  unsigned i, result = 0;
569
43.7M
  for(i = 0; i < num; i++) result |= ((bits >> (num - i - 1u)) & 1u) << i;
570
4.92M
  return result;
571
4.92M
}
572
573
/* ////////////////////////////////////////////////////////////////////////// */
574
/* / Deflate - Huffman                                                      / */
575
/* ////////////////////////////////////////////////////////////////////////// */
576
577
73.5M
#define FIRST_LENGTH_CODE_INDEX 257
578
18.3M
#define LAST_LENGTH_CODE_INDEX 285
579
/*256 literals, the end code, some length codes, and 2 unused codes*/
580
43.8k
#define NUM_DEFLATE_CODE_SYMBOLS 288
581
/*the distance codes have their own symbols, 30 used, 2 unused*/
582
530k
#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
31.7k
#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
44.4k
static void HuffmanTree_init(HuffmanTree* tree) {
627
44.4k
  tree->codes = 0;
628
44.4k
  tree->lengths = 0;
629
44.4k
  tree->table_len = 0;
630
44.4k
  tree->table_value = 0;
631
44.4k
}
632
633
44.4k
static void HuffmanTree_cleanup(HuffmanTree* tree) {
634
44.4k
  lodepng_free(tree->codes);
635
44.4k
  lodepng_free(tree->lengths);
636
44.4k
  lodepng_free(tree->table_len);
637
44.4k
  lodepng_free(tree->table_value);
638
44.4k
}
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
152M
#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
982k
#define INVALIDSYMBOL 65535u
647
648
/* make table for huffman decoding */
649
43.7k
static unsigned HuffmanTree_makeTable(HuffmanTree* tree) {
650
43.7k
  static const unsigned headsize = 1u << FIRSTBITS; /*size of the first table*/
651
43.7k
  static const unsigned mask = (1u << FIRSTBITS) /*headsize*/ - 1u;
652
43.7k
  size_t i, numpresent, pointer, size; /*total table size*/
653
43.7k
  unsigned* maxlens = (unsigned*)lodepng_malloc(headsize * sizeof(unsigned));
654
43.7k
  if(!maxlens) return 83; /*alloc fail*/
655
656
  /* compute maxlens: max total bit length of symbols sharing prefix in the first table*/
657
43.7k
  lodepng_memset(maxlens, 0, headsize * sizeof(*maxlens));
658
6.35M
  for(i = 0; i < tree->numcodes; i++) {
659
6.30M
    unsigned symbol = tree->codes[i];
660
6.30M
    unsigned l = tree->lengths[i];
661
6.30M
    unsigned index;
662
6.30M
    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
16.5k
    index = reverseBits(symbol >> (l - FIRSTBITS), FIRSTBITS);
665
16.5k
    maxlens[index] = LODEPNG_MAX(maxlens[index], l);
666
16.5k
  }
667
  /* compute total table size: size of first table plus all secondary tables for symbols longer than FIRSTBITS */
668
43.7k
  size = headsize;
669
22.4M
  for(i = 0; i < headsize; ++i) {
670
22.3M
    unsigned l = maxlens[i];
671
22.3M
    if(l > FIRSTBITS) size += (((size_t)1) << (l - FIRSTBITS));
672
22.3M
  }
673
43.7k
  tree->table_len = (unsigned char*)lodepng_malloc(size * sizeof(*tree->table_len));
674
43.7k
  tree->table_value = (unsigned short*)lodepng_malloc(size * sizeof(*tree->table_value));
675
43.7k
  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
22.4M
  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
43.7k
  pointer = headsize;
685
22.4M
  for(i = 0; i < headsize; ++i) {
686
22.3M
    unsigned l = maxlens[i];
687
22.3M
    if(l <= FIRSTBITS) continue;
688
6.34k
    tree->table_len[i] = l;
689
6.34k
    tree->table_value[i] = (unsigned short)pointer;
690
6.34k
    pointer += (((size_t)1) << (l - FIRSTBITS));
691
6.34k
  }
692
43.7k
  lodepng_free(maxlens);
693
694
  /*fill in the first table for short symbols, or secondary table for long symbols*/
695
43.7k
  numpresent = 0;
696
6.34M
  for(i = 0; i < tree->numcodes; ++i) {
697
6.30M
    unsigned l = tree->lengths[i];
698
6.30M
    unsigned symbol, reverse;
699
6.30M
    if(l == 0) continue;
700
4.91M
    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
4.91M
    reverse = reverseBits(symbol, l);
703
4.91M
    numpresent++;
704
705
4.91M
    if(l <= FIRSTBITS) {
706
      /*short symbol, fully in first table, replicated num times if l < FIRSTBITS*/
707
4.89M
      unsigned num = 1u << (FIRSTBITS - l);
708
4.89M
      unsigned j;
709
26.2M
      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
21.3M
        unsigned index = reverse | (j << l);
712
21.3M
        if(tree->table_len[index] != 16) return 55; /*invalid tree: long symbol shares prefix with short symbol*/
713
21.3M
        tree->table_len[index] = l;
714
21.3M
        tree->table_value[index] = (unsigned short)i;
715
21.3M
      }
716
4.89M
    } 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
15.8k
      unsigned index = reverse & mask;
720
15.8k
      unsigned maxlen = tree->table_len[index];
721
      /*log2 of secondary table length, should be >= l - FIRSTBITS*/
722
15.8k
      unsigned tablelen = maxlen - FIRSTBITS;
723
15.8k
      unsigned start = tree->table_value[index]; /*starting index in secondary table*/
724
15.8k
      unsigned num = 1u << (tablelen - (l - FIRSTBITS)); /*amount of entries of this symbol in secondary table*/
725
15.8k
      unsigned j;
726
15.8k
      if(maxlen < l) return 55; /*invalid tree: long symbol shares prefix with short symbol*/
727
33.0k
      for(j = 0; j < num; ++j) {
728
17.1k
        unsigned reverse2 = reverse >> FIRSTBITS; /* l - FIRSTBITS bits */
729
17.1k
        unsigned index2 = start + (reverse2 | (j << (l - FIRSTBITS)));
730
17.1k
        tree->table_len[index2] = l;
731
17.1k
        tree->table_value[index2] = (unsigned short)i;
732
17.1k
      }
733
15.8k
    }
734
4.91M
  }
735
736
43.6k
  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.12M
      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
982k
        tree->table_len[i] = (i < headsize) ? 1 : (FIRSTBITS + 1);
749
982k
        tree->table_value[i] = INVALIDSYMBOL;
750
982k
      }
751
1.12M
    }
752
41.4k
  } 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
21.2M
    for(i = 0; i < size; ++i) {
758
21.2M
      if(tree->table_len[i] == 16) return 55;
759
21.2M
    }
760
41.4k
  }
761
762
43.5k
  return 0;
763
43.6k
}
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
43.7k
static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) {
771
43.7k
  unsigned* blcount;
772
43.7k
  unsigned* nextcode;
773
43.7k
  unsigned error = 0;
774
43.7k
  unsigned bits, n;
775
776
43.7k
  tree->codes = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned));
777
43.7k
  blcount = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned));
778
43.7k
  nextcode = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned));
779
43.7k
  if(!tree->codes || !blcount || !nextcode) error = 83; /*alloc fail*/
780
781
43.7k
  if(!error) {
782
703k
    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
6.35M
    for(bits = 0; bits != tree->numcodes; ++bits) ++blcount[tree->lengths[bits]];
785
    /*step 2: generate the nextcode values*/
786
660k
    for(bits = 1; bits <= tree->maxbitlen; ++bits) {
787
616k
      nextcode[bits] = (nextcode[bits - 1] + blcount[bits - 1]) << 1u;
788
616k
    }
789
    /*step 3: generate all the codes*/
790
6.35M
    for(n = 0; n != tree->numcodes; ++n) {
791
6.30M
      if(tree->lengths[n] != 0) {
792
4.91M
        tree->codes[n] = nextcode[tree->lengths[n]]++;
793
        /*remove superfluous bits from the code*/
794
4.91M
        tree->codes[n] &= ((1u << tree->lengths[n]) - 1u);
795
4.91M
      }
796
6.30M
    }
797
43.7k
  }
798
799
43.7k
  lodepng_free(blcount);
800
43.7k
  lodepng_free(nextcode);
801
802
43.7k
  if(!error) error = HuffmanTree_makeTable(tree);
803
43.7k
  return error;
804
43.7k
}
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
43.7k
                                            size_t numcodes, unsigned maxbitlen) {
813
43.7k
  unsigned i;
814
43.7k
  tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned));
815
43.7k
  if(!tree->lengths) return 83; /*alloc fail*/
816
6.35M
  for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i];
817
43.7k
  tree->numcodes = (unsigned)numcodes; /*number of symbols*/
818
43.7k
  tree->maxbitlen = maxbitlen;
819
43.7k
  return HuffmanTree_makeFromLengths2(tree);
820
43.7k
}
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
14.7k
static unsigned generateFixedLitLenTree(HuffmanTree* tree) {
1023
14.7k
  unsigned i, error = 0;
1024
14.7k
  unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned));
1025
14.7k
  if(!bitlen) return 83; /*alloc fail*/
1026
1027
  /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/
1028
2.13M
  for(i =   0; i <= 143; ++i) bitlen[i] = 8;
1029
1.66M
  for(i = 144; i <= 255; ++i) bitlen[i] = 9;
1030
368k
  for(i = 256; i <= 279; ++i) bitlen[i] = 7;
1031
132k
  for(i = 280; i <= 287; ++i) bitlen[i] = 8;
1032
1033
14.7k
  error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15);
1034
1035
14.7k
  lodepng_free(bitlen);
1036
14.7k
  return error;
1037
14.7k
}
1038
1039
/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/
1040
14.7k
static unsigned generateFixedDistanceTree(HuffmanTree* tree) {
1041
14.7k
  unsigned i, error = 0;
1042
14.7k
  unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned));
1043
14.7k
  if(!bitlen) return 83; /*alloc fail*/
1044
1045
  /*there are 32 distance codes, but 30-31 are unused*/
1046
486k
  for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5;
1047
14.7k
  error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15);
1048
1049
14.7k
  lodepng_free(bitlen);
1050
14.7k
  return error;
1051
14.7k
}
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.5M
static unsigned huffmanDecodeSymbol(LodePNGBitReader* reader, const HuffmanTree* codetree) {
1059
45.5M
  unsigned short code = peekBits(reader, FIRSTBITS);
1060
45.5M
  unsigned short l = codetree->table_len[code];
1061
45.5M
  unsigned short value = codetree->table_value[code];
1062
45.5M
  if(l <= FIRSTBITS) {
1063
45.3M
    advanceBits(reader, l);
1064
45.3M
    return value;
1065
45.3M
  } else {
1066
190k
    advanceBits(reader, FIRSTBITS);
1067
190k
    value += peekBits(reader, l - FIRSTBITS);
1068
190k
    advanceBits(reader, codetree->table_len[value] - FIRSTBITS);
1069
190k
    return codetree->table_value[value];
1070
190k
  }
1071
45.5M
}
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
14.7k
static unsigned getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) {
1083
14.7k
  unsigned error = generateFixedLitLenTree(tree_ll);
1084
14.7k
  if(error) return error;
1085
14.7k
  return generateFixedDistanceTree(tree_d);
1086
14.7k
}
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
4.99k
                                      LodePNGBitReader* reader) {
1091
  /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/
1092
4.99k
  unsigned error = 0;
1093
4.99k
  unsigned n, HLIT, HDIST, HCLEN, i;
1094
1095
  /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/
1096
4.99k
  unsigned* bitlen_ll = 0; /*lit,len code lengths*/
1097
4.99k
  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
4.99k
  unsigned* bitlen_cl = 0;
1100
4.99k
  HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/
1101
1102
4.99k
  if(reader->bitsize - reader->bp < 14) return 49; /*error: the bit pointer is or will go past the memory*/
1103
4.97k
  ensureBits17(reader, 14);
1104
1105
  /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/
1106
4.97k
  HLIT =  readBits(reader, 5) + 257;
1107
  /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/
1108
4.97k
  HDIST = readBits(reader, 5) + 1;
1109
  /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/
1110
4.97k
  HCLEN = readBits(reader, 4) + 4;
1111
1112
4.97k
  bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned));
1113
4.97k
  if(!bitlen_cl) return 83 /*alloc fail*/;
1114
1115
4.97k
  HuffmanTree_init(&tree_cl);
1116
1117
4.97k
  while(!error) {
1118
    /*read the code length codes out of 3 * (amount of code length codes) bits*/
1119
4.97k
    if(lodepng_gtofl(reader->bp, HCLEN * 3, reader->bitsize)) {
1120
54
      ERROR_BREAK(50); /*error: the bit pointer is or will go past the memory*/
1121
0
    }
1122
81.4k
    for(i = 0; i != HCLEN; ++i) {
1123
76.4k
      ensureBits9(reader, 3); /*out of bounds already checked above */
1124
76.4k
      bitlen_cl[CLCL_ORDER[i]] = readBits(reader, 3);
1125
76.4k
    }
1126
21.8k
    for(i = HCLEN; i != NUM_CODE_LENGTH_CODES; ++i) {
1127
16.9k
      bitlen_cl[CLCL_ORDER[i]] = 0;
1128
16.9k
    }
1129
1130
4.91k
    error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7);
1131
4.91k
    if(error) break;
1132
1133
    /*now we can use this tree to read the lengths for the tree that this function will return*/
1134
4.84k
    bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned));
1135
4.84k
    bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned));
1136
4.84k
    if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/);
1137
4.84k
    lodepng_memset(bitlen_ll, 0, NUM_DEFLATE_CODE_SYMBOLS * sizeof(*bitlen_ll));
1138
4.84k
    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
4.84k
    i = 0;
1142
232k
    while(i < HLIT + HDIST) {
1143
227k
      unsigned code;
1144
227k
      ensureBits25(reader, 22); /* up to 15 bits for huffman code, up to 7 extra bits below*/
1145
227k
      code = huffmanDecodeSymbol(reader, &tree_cl);
1146
227k
      if(code <= 15) /*a length code*/ {
1147
190k
        if(i < HLIT) bitlen_ll[i] = code;
1148
58.9k
        else bitlen_d[i - HLIT] = code;
1149
190k
        ++i;
1150
190k
      } else if(code == 16) /*repeat previous*/ {
1151
5.16k
        unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/
1152
5.16k
        unsigned value; /*set value to the previous code*/
1153
1154
5.16k
        if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/
1155
1156
5.15k
        replength += readBits(reader, 2);
1157
1158
5.15k
        if(i < HLIT + 1) value = bitlen_ll[i - 1];
1159
1.79k
        else value = bitlen_d[i - HLIT - 1];
1160
        /*repeat this value in the next lengths*/
1161
23.3k
        for(n = 0; n < replength; ++n) {
1162
18.2k
          if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/
1163
18.2k
          if(i < HLIT) bitlen_ll[i] = value;
1164
5.68k
          else bitlen_d[i - HLIT] = value;
1165
18.2k
          ++i;
1166
18.2k
        }
1167
31.4k
      } else if(code == 17) /*repeat "0" 3-10 times*/ {
1168
17.6k
        unsigned replength = 3; /*read in the bits that indicate repeat length*/
1169
17.6k
        replength += readBits(reader, 3);
1170
1171
        /*repeat this value in the next lengths*/
1172
107k
        for(n = 0; n < replength; ++n) {
1173
90.3k
          if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/
1174
1175
90.3k
          if(i < HLIT) bitlen_ll[i] = 0;
1176
8.29k
          else bitlen_d[i - HLIT] = 0;
1177
90.3k
          ++i;
1178
90.3k
        }
1179
17.6k
      } else if(code == 18) /*repeat "0" 11-138 times*/ {
1180
13.7k
        unsigned replength = 11; /*read in the bits that indicate repeat length*/
1181
13.7k
        replength += readBits(reader, 7);
1182
1183
        /*repeat this value in the next lengths*/
1184
1.14M
        for(n = 0; n < replength; ++n) {
1185
1.12M
          if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/
1186
1187
1.12M
          if(i < HLIT) bitlen_ll[i] = 0;
1188
19.5k
          else bitlen_d[i - HLIT] = 0;
1189
1.12M
          ++i;
1190
1.12M
        }
1191
13.7k
      } else /*if(code == INVALIDSYMBOL)*/ {
1192
23
        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
227k
      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
111
        ERROR_BREAK(50); /*error, bit pointer jumps past memory*/
1200
0
      }
1201
227k
    }
1202
4.84k
    if(error) break;
1203
1204
4.67k
    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
4.67k
    error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15);
1208
4.67k
    if(error) break;
1209
4.62k
    error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15);
1210
1211
4.62k
    break; /*end of error-while*/
1212
4.67k
  }
1213
1214
4.97k
  lodepng_free(bitlen_cl);
1215
4.97k
  lodepng_free(bitlen_ll);
1216
4.97k
  lodepng_free(bitlen_d);
1217
4.97k
  HuffmanTree_cleanup(&tree_cl);
1218
1219
4.97k
  return error;
1220
4.97k
}
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
19.7k
                                    unsigned btype, size_t max_output_size) {
1225
19.7k
  unsigned error = 0;
1226
19.7k
  HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/
1227
19.7k
  HuffmanTree tree_d; /*the huffman tree for distance codes*/
1228
19.7k
  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
19.7k
  int done = 0;
1230
1231
19.7k
  if(!ucvector_reserve(out, out->size + reserved_size)) return 83; /*alloc fail*/
1232
1233
19.7k
  HuffmanTree_init(&tree_ll);
1234
19.7k
  HuffmanTree_init(&tree_d);
1235
1236
19.7k
  if(btype == 1) error = getTreeInflateFixed(&tree_ll, &tree_d);
1237
4.99k
  else /*if(btype == 2)*/ error = getTreeInflateDynamic(&tree_ll, &tree_d, reader);
1238
1239
1240
21.6M
  while(!error && !done) /*decode all symbols until end reached, breaks at end code*/ {
1241
    /*code_ll is literal, length or end code*/
1242
21.6M
    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.6M
    ensureBits32(reader, 30);
1246
21.6M
    code_ll = huffmanDecodeSymbol(reader, &tree_ll);
1247
21.6M
    if(code_ll <= 255) {
1248
      /*slightly faster code path if multiple literals in a row*/
1249
5.26M
      out->data[out->size++] = (unsigned char)code_ll;
1250
5.26M
      code_ll = huffmanDecodeSymbol(reader, &tree_ll);
1251
5.26M
    }
1252
21.6M
    if(code_ll <= 255) /*literal symbol*/ {
1253
3.27M
      out->data[out->size++] = (unsigned char)code_ll;
1254
18.4M
    } else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ {
1255
18.3M
      unsigned code_d, distance;
1256
18.3M
      unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/
1257
18.3M
      size_t start, backward, length;
1258
1259
      /*part 1: get length base*/
1260
18.3M
      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.3M
      numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX];
1264
18.3M
      if(numextrabits_l != 0) {
1265
        /* bits already ensured above */
1266
1.64M
        ensureBits25(reader, 5);
1267
1.64M
        length += readBits(reader, numextrabits_l);
1268
1.64M
      }
1269
1270
      /*part 3: get distance code*/
1271
18.3M
      ensureBits32(reader, 28); /* up to 15 for the huffman symbol, up to 13 for the extra bits */
1272
18.3M
      code_d = huffmanDecodeSymbol(reader, &tree_d);
1273
18.3M
      if(code_d > 29) {
1274
13
        if(code_d <= 31) {
1275
5
          ERROR_BREAK(18); /*error: invalid distance code (30-31 are never used)*/
1276
8
        } else /* if(code_d == INVALIDSYMBOL) */{
1277
8
          ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/
1278
0
        }
1279
13
      }
1280
18.3M
      distance = DISTANCEBASE[code_d];
1281
1282
      /*part 4: get extra bits from distance*/
1283
18.3M
      numextrabits_d = DISTANCEEXTRA[code_d];
1284
18.3M
      if(numextrabits_d != 0) {
1285
        /* bits already ensured above */
1286
4.65M
        distance += readBits(reader, numextrabits_d);
1287
4.65M
      }
1288
1289
      /*part 5: fill in all the out[n] values based on the length and dist*/
1290
18.3M
      start = out->size;
1291
18.3M
      if(distance > start) ERROR_BREAK(52); /*too long backward distance*/
1292
18.3M
      backward = start - distance;
1293
1294
18.3M
      out->size += length;
1295
18.3M
      if(distance < length) {
1296
14.1M
        size_t forward;
1297
14.1M
        lodepng_memcpy(out->data + start, out->data + backward, distance);
1298
14.1M
        start += distance;
1299
3.55G
        for(forward = distance; forward < length; ++forward) {
1300
3.54G
          out->data[start++] = out->data[backward++];
1301
3.54G
        }
1302
14.1M
      } else {
1303
4.21M
        lodepng_memcpy(out->data + start, out->data + backward, length);
1304
4.21M
      }
1305
18.3M
    } else if(code_ll == 256) {
1306
19.0k
      done = 1; /*end code, finish the loop*/
1307
19.0k
    } else /*if(code_ll == INVALIDSYMBOL)*/ {
1308
14
      ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/
1309
0
    }
1310
21.6M
    if(out->allocsize - out->size < reserved_size) {
1311
15.5k
      if(!ucvector_reserve(out, out->size + reserved_size)) ERROR_BREAK(83); /*alloc fail*/
1312
15.5k
    }
1313
    /*check if any of the ensureBits above went out of bounds*/
1314
21.6M
    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
259
      ERROR_BREAK(51); /*error, bit pointer jumps past memory*/
1319
0
    }
1320
21.6M
    if(max_output_size && out->size > max_output_size) {
1321
19
      ERROR_BREAK(109); /*error, larger than max size*/
1322
0
    }
1323
21.6M
  }
1324
1325
19.7k
  HuffmanTree_cleanup(&tree_ll);
1326
19.7k
  HuffmanTree_cleanup(&tree_d);
1327
1328
19.7k
  return error;
1329
19.7k
}
1330
1331
static unsigned inflateNoCompression(ucvector* out, LodePNGBitReader* reader,
1332
4.50k
                                     const LodePNGDecompressSettings* settings) {
1333
4.50k
  size_t bytepos;
1334
4.50k
  size_t size = reader->size;
1335
4.50k
  unsigned LEN, NLEN, error = 0;
1336
1337
  /*go to first boundary of byte*/
1338
4.50k
  bytepos = (reader->bp + 7u) >> 3u;
1339
1340
  /*read LEN (2 bytes) and NLEN (2 bytes)*/
1341
4.50k
  if(bytepos + 4 >= size) return 52; /*error, bit pointer will jump past memory*/
1342
4.47k
  LEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2;
1343
4.47k
  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
4.47k
  if(!settings->ignore_nlen && LEN + NLEN != 65535) {
1347
0
    return 21; /*error: NLEN is not one's complement of LEN*/
1348
0
  }
1349
1350
4.47k
  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
4.47k
  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
4.33k
  if (LEN) {
1357
933
    lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN);
1358
933
    bytepos += LEN;
1359
933
  }
1360
1361
4.33k
  reader->bp = bytepos << 3u;
1362
1363
4.33k
  return error;
1364
4.47k
}
1365
1366
static unsigned lodepng_inflatev(ucvector* out,
1367
                                 const unsigned char* in, size_t insize,
1368
8.53k
                                 const LodePNGDecompressSettings* settings) {
1369
8.53k
  unsigned BFINAL = 0;
1370
8.53k
  LodePNGBitReader reader;
1371
8.53k
  unsigned error = LodePNGBitReader_init(&reader, in, insize);
1372
1373
8.53k
  if(error) return error;
1374
1375
31.8k
  while(!BFINAL) {
1376
24.2k
    unsigned BTYPE;
1377
24.2k
    if(reader.bitsize - reader.bp < 3) return 52; /*error, bit pointer will jump past memory*/
1378
24.2k
    ensureBits9(&reader, 3);
1379
24.2k
    BFINAL = readBits(&reader, 1);
1380
24.2k
    BTYPE = readBits(&reader, 2);
1381
1382
24.2k
    if(BTYPE == 3) return 20; /*error: invalid BTYPE*/
1383
24.2k
    else if(BTYPE == 0) error = inflateNoCompression(out, &reader, settings); /*no compression*/
1384
19.7k
    else error = inflateHuffmanBlock(out, &reader, BTYPE, settings->max_output_size); /*compression, BTYPE 01 or 10*/
1385
24.2k
    if(!error && settings->max_output_size && out->size > settings->max_output_size) error = 109;
1386
24.2k
    if(error) break;
1387
24.2k
  }
1388
1389
8.50k
  return error;
1390
8.53k
}
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.53k
                        const LodePNGDecompressSettings* settings) {
1404
8.53k
  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.53k
  } else {
1415
8.53k
    return lodepng_inflatev(out, in, insize, settings);
1416
8.53k
  }
1417
8.53k
}
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.16k
                                         const LodePNGDecompressSettings* settings) {
2156
9.16k
  unsigned error = 0;
2157
9.16k
  unsigned CM, CINFO, FDICT;
2158
2159
9.16k
  if(insize < 2) return 53; /*error, size of zlib data too small*/
2160
  /*read information from zlib header*/
2161
8.58k
  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
33
    return 24;
2164
33
  }
2165
2166
8.55k
  CM = in[0] & 15;
2167
8.55k
  CINFO = (in[0] >> 4) & 15;
2168
  /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/
2169
8.55k
  FDICT = (in[1] >> 5) & 1;
2170
  /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/
2171
2172
8.55k
  if(CM != 8 || CINFO > 7) {
2173
    /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/
2174
18
    return 25;
2175
18
  }
2176
8.53k
  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.53k
  error = inflatev(out, in + 2, insize - 2, settings);
2183
8.53k
  if(error) return error;
2184
2185
7.59k
  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.59k
  return 0; /*no error*/
2192
7.59k
}
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.16k
                                const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) {
2207
9.16k
  unsigned error;
2208
9.16k
  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.16k
  } else {
2217
9.16k
    ucvector v = ucvector_init(*out, *outsize);
2218
9.16k
    if(expected_size) {
2219
      /*reserve the memory to avoid intermediate reallocations*/
2220
6.72k
      ucvector_resize(&v, *outsize + expected_size);
2221
6.72k
      v.size = *outsize;
2222
6.72k
    }
2223
9.16k
    error = lodepng_zlib_decompressv(&v, in, insize, settings);
2224
9.16k
    *out = v.data;
2225
9.16k
    *outsize = v.size;
2226
9.16k
  }
2227
9.16k
  return error;
2228
9.16k
}
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.73k
#define DEFAULT_WINDOWSIZE 2048
2311
2312
4.73k
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.73k
  settings->btype = 2;
2315
4.73k
  settings->use_lz77 = 1;
2316
4.73k
  settings->windowsize = DEFAULT_WINDOWSIZE;
2317
4.73k
  settings->minmatch = 3;
2318
4.73k
  settings->nicematch = 128;
2319
4.73k
  settings->lazymatching = 1;
2320
2321
4.73k
  settings->custom_zlib = 0;
2322
4.73k
  settings->custom_deflate = 0;
2323
4.73k
  settings->custom_context = 0;
2324
4.73k
}
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.73k
void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) {
2334
4.73k
  settings->ignore_adler32 = 0;
2335
4.73k
  settings->ignore_nlen = 0;
2336
4.73k
  settings->max_output_size = 0;
2337
2338
4.73k
  settings->custom_zlib = 0;
2339
4.73k
  settings->custom_inflate = 0;
2340
4.73k
  settings->custom_context = 0;
2341
4.73k
}
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
537M
static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) {
2694
537M
  unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1);
2695
537M
  ++(*bitpointer);
2696
537M
  return result;
2697
537M
}
2698
2699
/* TODO: make this faster */
2700
79.6M
static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) {
2701
79.6M
  unsigned result = 0;
2702
79.6M
  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.6M
  return result;
2708
79.6M
}
2709
2710
456M
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
456M
  if(bit == 0) bitstream[(*bitpointer) >> 3u] &=  (unsigned char)(~(1u << (7u - ((*bitpointer) & 7u))));
2713
109M
  else         bitstream[(*bitpointer) >> 3u] |=  (1u << (7u - ((*bitpointer) & 7u)));
2714
456M
  ++(*bitpointer);
2715
456M
}
2716
2717
/* ////////////////////////////////////////////////////////////////////////// */
2718
/* / PNG chunks                                                             / */
2719
/* ////////////////////////////////////////////////////////////////////////// */
2720
2721
251k
unsigned lodepng_chunk_length(const unsigned char* chunk) {
2722
251k
  return lodepng_read32bitInt(chunk);
2723
251k
}
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
786k
unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) {
2732
786k
  if(lodepng_strlen(type) != 4) return 0;
2733
786k
  return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]);
2734
786k
}
2735
2736
/* chunk type name must exist only out of alphabetic characters a-z or A-Z */
2737
3.89k
static unsigned char lodepng_chunk_type_name_valid(const unsigned char* chunk) {
2738
3.89k
  unsigned i;
2739
19.2k
  for(i = 0; i != 4; ++i) {
2740
15.4k
    char c = (char)chunk[4 + i];
2741
15.4k
    if(!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {
2742
75
      return 0; /* not valid */
2743
75
    }
2744
15.4k
  }
2745
3.82k
  return 1; /* valid */
2746
3.89k
}
2747
2748
3.81k
unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) {
2749
3.81k
  return((chunk[4] & 32) != 0);
2750
3.81k
}
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
3.82k
static unsigned char lodepng_chunk_reserved(const unsigned char* chunk) {
2759
3.82k
  return((chunk[6] & 32) != 0);
2760
3.82k
}
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
121k
const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) {
2771
121k
  return &chunk[8];
2772
121k
}
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
120k
const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end) {
2805
120k
  size_t available_size = (size_t)(end - chunk);
2806
120k
  if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/
2807
120k
  if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47
2808
120k
    && 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
120k
  } else {
2812
120k
    size_t total_chunk_length;
2813
120k
    if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end;
2814
120k
    if(total_chunk_length > available_size) return end; /*outside of range*/
2815
120k
    return chunk + total_chunk_length;
2816
120k
  }
2817
120k
}
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.90k
static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) {
2914
7.90k
  switch(colortype) {
2915
2.93k
    case LCT_GREY:       if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break;
2916
2.91k
    case LCT_RGB:        if(!(                                 bd == 8 || bd == 16)) return 37; break;
2917
2.66k
    case LCT_PALETTE:    if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8            )) return 37; break;
2918
718
    case LCT_GREY_ALPHA: if(!(                                 bd == 8 || bd == 16)) return 37; break;
2919
933
    case LCT_RGBA:       if(!(                                 bd == 8 || bd == 16)) return 37; break;
2920
920
    case LCT_MAX_OCTET_VALUE: return 31; /* invalid color type */
2921
4
    default: return 31; /* invalid color type */
2922
7.90k
  }
2923
7.82k
  return 0; /*allowed color type / bits combination*/
2924
7.90k
}
2925
2926
46.8k
static unsigned getNumColorChannels(LodePNGColorType colortype) {
2927
46.8k
  switch(colortype) {
2928
12.5k
    case LCT_GREY: return 1;
2929
14.0k
    case LCT_RGB: return 3;
2930
2.85k
    case LCT_PALETTE: return 1;
2931
3.53k
    case LCT_GREY_ALPHA: return 2;
2932
13.8k
    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
46.8k
  }
2936
46.8k
}
2937
2938
46.8k
static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) {
2939
  /*bits per pixel is amount of channels * bits per channel*/
2940
46.8k
  return getNumColorChannels(colortype) * bitdepth;
2941
46.8k
}
2942
2943
/* ////////////////////////////////////////////////////////////////////////// */
2944
2945
17.5k
void lodepng_color_mode_init(LodePNGColorMode* info) {
2946
17.5k
  info->key_defined = 0;
2947
17.5k
  info->key_r = info->key_g = info->key_b = 0;
2948
17.5k
  info->colortype = LCT_RGBA;
2949
17.5k
  info->bitdepth = 8;
2950
17.5k
  info->palette = 0;
2951
17.5k
  info->palettesize = 0;
2952
17.5k
}
2953
2954
/*allocates palette memory if needed, and initializes all colors to black*/
2955
2.85k
static void lodepng_color_mode_alloc_palette(LodePNGColorMode* info) {
2956
2.85k
  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.85k
  if(!info->palette) info->palette = (unsigned char*)lodepng_malloc(1024);
2960
2.85k
  if(!info->palette) return; /*alloc fail*/
2961
734k
  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
731k
    info->palette[i * 4 + 0] = 0;
2966
731k
    info->palette[i * 4 + 1] = 0;
2967
731k
    info->palette[i * 4 + 2] = 0;
2968
731k
    info->palette[i * 4 + 3] = 255;
2969
731k
  }
2970
2.85k
}
2971
2972
19.2k
void lodepng_color_mode_cleanup(LodePNGColorMode* info) {
2973
19.2k
  lodepng_palette_clear(info);
2974
19.2k
}
2975
2976
1.68k
unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) {
2977
1.68k
  lodepng_color_mode_cleanup(dest);
2978
1.68k
  lodepng_memcpy(dest, source, sizeof(LodePNGColorMode));
2979
1.68k
  if(source->palette) {
2980
177
    dest->palette = (unsigned char*)lodepng_malloc(1024);
2981
177
    if(!dest->palette && source->palettesize) return 83; /*alloc fail*/
2982
177
    lodepng_memcpy(dest->palette, source->palette, source->palettesize * 4);
2983
177
  }
2984
1.68k
  return 0;
2985
1.68k
}
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.78k
static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) {
2996
4.78k
  size_t i;
2997
4.78k
  if(a->colortype != b->colortype) return 0;
2998
2.13k
  if(a->bitdepth != b->bitdepth) return 0;
2999
1.71k
  if(a->key_defined != b->key_defined) return 0;
3000
1.71k
  if(a->key_defined) {
3001
472
    if(a->key_r != b->key_r) return 0;
3002
472
    if(a->key_g != b->key_g) return 0;
3003
472
    if(a->key_b != b->key_b) return 0;
3004
472
  }
3005
1.71k
  if(a->palettesize != b->palettesize) return 0;
3006
12.9k
  for(i = 0; i != a->palettesize * 4; ++i) {
3007
11.2k
    if(a->palette[i] != b->palette[i]) return 0;
3008
11.2k
  }
3009
1.71k
  return 1;
3010
1.71k
}
3011
3012
19.2k
void lodepng_palette_clear(LodePNGColorMode* info) {
3013
19.2k
  if(info->palette) lodepng_free(info->palette);
3014
19.2k
  info->palette = 0;
3015
19.2k
  info->palettesize = 0;
3016
19.2k
}
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
35.4k
unsigned lodepng_get_bpp(const LodePNGColorMode* info) {
3037
35.4k
  return lodepng_get_bpp_lct(info->colortype, info->bitdepth);
3038
35.4k
}
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.4k
static size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) {
3071
11.4k
  size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth);
3072
11.4k
  size_t n = (size_t)w * (size_t)h;
3073
11.4k
  return ((n / 8u) * bpp) + ((n & 7u) * bpp + 7u) / 8u;
3074
11.4k
}
3075
3076
11.4k
size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) {
3077
11.4k
  return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth);
3078
11.4k
}
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.1k
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.1k
  size_t line = ((size_t)(w / 8u) * bpp) + 1u + ((w & 7u) * bpp + 7u) / 8u;
3090
28.1k
  return (size_t)h * line;
3091
28.1k
}
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.80k
                                  const LodePNGColorMode* pngcolor, const LodePNGColorMode* rawcolor) {
3104
7.80k
  size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor));
3105
7.80k
  size_t numpixels, total;
3106
7.80k
  size_t line; /* bytes per line in worst case */
3107
3108
7.80k
  if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1;
3109
7.80k
  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.76k
  if(lodepng_mulofl((size_t)(w / 8u), bpp, &line)) return 1;
3113
7.76k
  if(lodepng_addofl(line, ((w & 7u) * bpp + 7u) / 8u, &line)) return 1;
3114
3115
7.76k
  if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */
3116
7.76k
  if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */
3117
3118
7.74k
  return 0; /* no overflow */
3119
7.76k
}
3120
#endif /*LODEPNG_COMPILE_DECODER*/
3121
#endif /*LODEPNG_COMPILE_PNG*/
3122
3123
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
3124
3125
12.8k
static void LodePNGUnknownChunks_init(LodePNGInfo* info) {
3126
12.8k
  unsigned i;
3127
51.3k
  for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0;
3128
51.3k
  for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0;
3129
12.8k
}
3130
3131
12.8k
static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) {
3132
12.8k
  unsigned i;
3133
51.3k
  for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]);
3134
12.8k
}
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.8k
static void LodePNGText_init(LodePNGInfo* info) {
3157
12.8k
  info->text_num = 0;
3158
12.8k
  info->text_keys = NULL;
3159
12.8k
  info->text_strings = NULL;
3160
12.8k
}
3161
3162
12.8k
static void LodePNGText_cleanup(LodePNGInfo* info) {
3163
12.8k
  size_t i;
3164
101k
  for(i = 0; i != info->text_num; ++i) {
3165
88.8k
    string_cleanup(&info->text_keys[i]);
3166
88.8k
    string_cleanup(&info->text_strings[i]);
3167
88.8k
  }
3168
12.8k
  lodepng_free(info->text_keys);
3169
12.8k
  lodepng_free(info->text_strings);
3170
12.8k
}
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
88.8k
static unsigned lodepng_add_text_sized(LodePNGInfo* info, const char* key, const char* str, size_t size) {
3184
88.8k
  char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1)));
3185
88.8k
  char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1)));
3186
3187
88.8k
  if(new_keys) info->text_keys = new_keys;
3188
88.8k
  if(new_strings) info->text_strings = new_strings;
3189
3190
88.8k
  if(!new_keys || !new_strings) return 83; /*alloc fail*/
3191
3192
88.8k
  ++info->text_num;
3193
88.8k
  info->text_keys[info->text_num - 1] = alloc_string(key);
3194
88.8k
  info->text_strings[info->text_num - 1] = alloc_string_sized(str, size);
3195
88.8k
  if(!info->text_keys[info->text_num - 1] || !info->text_strings[info->text_num - 1]) return 83; /*alloc fail*/
3196
3197
88.8k
  return 0;
3198
88.8k
}
3199
3200
88.0k
unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) {
3201
88.0k
  return lodepng_add_text_sized(info, key, str, lodepng_strlen(str));
3202
88.0k
}
3203
3204
0
void lodepng_clear_text(LodePNGInfo* info) {
3205
0
  LodePNGText_cleanup(info);
3206
0
}
3207
3208
/******************************************************************************/
3209
3210
12.8k
static void LodePNGIText_init(LodePNGInfo* info) {
3211
12.8k
  info->itext_num = 0;
3212
12.8k
  info->itext_keys = NULL;
3213
12.8k
  info->itext_langtags = NULL;
3214
12.8k
  info->itext_transkeys = NULL;
3215
12.8k
  info->itext_strings = NULL;
3216
12.8k
}
3217
3218
12.8k
static void LodePNGIText_cleanup(LodePNGInfo* info) {
3219
12.8k
  size_t i;
3220
20.4k
  for(i = 0; i != info->itext_num; ++i) {
3221
7.60k
    string_cleanup(&info->itext_keys[i]);
3222
7.60k
    string_cleanup(&info->itext_langtags[i]);
3223
7.60k
    string_cleanup(&info->itext_transkeys[i]);
3224
7.60k
    string_cleanup(&info->itext_strings[i]);
3225
7.60k
  }
3226
12.8k
  lodepng_free(info->itext_keys);
3227
12.8k
  lodepng_free(info->itext_langtags);
3228
12.8k
  lodepng_free(info->itext_transkeys);
3229
12.8k
  lodepng_free(info->itext_strings);
3230
12.8k
}
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
7.60k
                                        const char* transkey, const char* str, size_t size) {
3252
7.60k
  char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1)));
3253
7.60k
  char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1)));
3254
7.60k
  char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1)));
3255
7.60k
  char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1)));
3256
3257
7.60k
  if(new_keys) info->itext_keys = new_keys;
3258
7.60k
  if(new_langtags) info->itext_langtags = new_langtags;
3259
7.60k
  if(new_transkeys) info->itext_transkeys = new_transkeys;
3260
7.60k
  if(new_strings) info->itext_strings = new_strings;
3261
3262
7.60k
  if(!new_keys || !new_langtags || !new_transkeys || !new_strings) return 83; /*alloc fail*/
3263
3264
7.60k
  ++info->itext_num;
3265
3266
7.60k
  info->itext_keys[info->itext_num - 1] = alloc_string(key);
3267
7.60k
  info->itext_langtags[info->itext_num - 1] = alloc_string(langtag);
3268
7.60k
  info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey);
3269
7.60k
  info->itext_strings[info->itext_num - 1] = alloc_string_sized(str, size);
3270
3271
7.60k
  return 0;
3272
7.60k
}
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
639
unsigned lodepng_set_exif(LodePNGInfo* info, const unsigned char* exif, unsigned exif_size) {
3309
639
  if(info->exif_defined) lodepng_clear_exif(info);
3310
639
  info->exif = (unsigned char*)lodepng_malloc(exif_size);
3311
3312
639
  if(!info->exif) return 83; /*alloc fail*/
3313
3314
639
  lodepng_memcpy(info->exif, exif, exif_size);
3315
639
  info->exif_size = exif_size;
3316
639
  info->exif_defined = 1;
3317
3318
639
  return 0; /*ok*/
3319
639
}
3320
3321
13.3k
void lodepng_clear_exif(LodePNGInfo* info) {
3322
13.3k
  lodepng_free(info->exif);
3323
13.3k
  info->exif = NULL;
3324
13.3k
  info->exif_size = 0;
3325
13.3k
  info->exif_defined = 0;
3326
13.3k
}
3327
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
3328
3329
12.8k
void lodepng_info_init(LodePNGInfo* info) {
3330
12.8k
  lodepng_color_mode_init(&info->color);
3331
12.8k
  info->interlace_method = 0;
3332
12.8k
  info->compression_method = 0;
3333
12.8k
  info->filter_method = 0;
3334
12.8k
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
3335
12.8k
  info->background_defined = 0;
3336
12.8k
  info->background_r = info->background_g = info->background_b = 0;
3337
3338
12.8k
  LodePNGText_init(info);
3339
12.8k
  LodePNGIText_init(info);
3340
3341
12.8k
  info->time_defined = 0;
3342
12.8k
  info->phys_defined = 0;
3343
3344
12.8k
  info->gama_defined = 0;
3345
12.8k
  info->chrm_defined = 0;
3346
12.8k
  info->srgb_defined = 0;
3347
12.8k
  info->iccp_defined = 0;
3348
12.8k
  info->iccp_name = NULL;
3349
12.8k
  info->iccp_profile = NULL;
3350
12.8k
  info->cicp_defined = 0;
3351
12.8k
  info->cicp_color_primaries = 0;
3352
12.8k
  info->cicp_transfer_function = 0;
3353
12.8k
  info->cicp_matrix_coefficients = 0;
3354
12.8k
  info->cicp_video_full_range_flag = 0;
3355
12.8k
  info->mdcv_defined = 0;
3356
12.8k
  info->mdcv_red_x = 0;
3357
12.8k
  info->mdcv_red_y = 0;
3358
12.8k
  info->mdcv_green_x = 0;
3359
12.8k
  info->mdcv_green_y = 0;
3360
12.8k
  info->mdcv_blue_x = 0;
3361
12.8k
  info->mdcv_blue_y = 0;
3362
12.8k
  info->mdcv_white_x = 0;
3363
12.8k
  info->mdcv_white_y = 0;
3364
12.8k
  info->mdcv_max_luminance = 0;
3365
12.8k
  info->mdcv_min_luminance = 0;
3366
12.8k
  info->clli_defined = 0;
3367
12.8k
  info->clli_max_cll = 0;
3368
12.8k
  info->clli_max_fall = 0;
3369
3370
12.8k
  info->exif_defined = 0;
3371
12.8k
  info->exif = NULL;
3372
12.8k
  info->exif_size = 0;
3373
3374
12.8k
  info->sbit_defined = 0;
3375
12.8k
  info->sbit_r = info->sbit_g = info->sbit_b = info->sbit_a = 0;
3376
3377
12.8k
  LodePNGUnknownChunks_init(info);
3378
12.8k
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
3379
12.8k
}
3380
3381
12.8k
void lodepng_info_cleanup(LodePNGInfo* info) {
3382
12.8k
  lodepng_color_mode_cleanup(&info->color);
3383
12.8k
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
3384
12.8k
  LodePNGText_cleanup(info);
3385
12.8k
  LodePNGIText_cleanup(info);
3386
3387
12.8k
  lodepng_clear_icc(info);
3388
12.8k
  lodepng_clear_exif(info);
3389
3390
12.8k
  LodePNGUnknownChunks_cleanup(info);
3391
12.8k
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
3392
12.8k
}
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
9.79k
static void color_tree_init(ColorTree* tree) {
3445
9.79k
  lodepng_memset(tree->children, 0, 16 * sizeof(*tree->children));
3446
9.79k
  tree->index = -1;
3447
9.79k
}
3448
3449
9.79k
static void color_tree_cleanup(ColorTree* tree) {
3450
9.79k
  int i;
3451
166k
  for(i = 0; i != 16; ++i) {
3452
156k
    if(tree->children[i]) {
3453
9.65k
      color_tree_cleanup(tree->children[i]);
3454
9.65k
      lodepng_free(tree->children[i]);
3455
9.65k
    }
3456
156k
  }
3457
9.79k
}
3458
3459
/*returns -1 if color not present, its index otherwise*/
3460
1.32k
static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
3461
1.32k
  int bit = 0;
3462
11.1k
  for(bit = 0; bit < 8; ++bit) {
3463
9.92k
    int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1);
3464
9.92k
    if(!tree->children[i]) return -1;
3465
9.81k
    else tree = tree->children[i];
3466
9.92k
  }
3467
1.21k
  return tree ? tree->index : -1;
3468
1.32k
}
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.45k
                               unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) {
3481
2.45k
  int bit;
3482
22.0k
  for(bit = 0; bit < 8; ++bit) {
3483
19.6k
    int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1);
3484
19.6k
    if(!tree->children[i]) {
3485
9.65k
      tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree));
3486
9.65k
      if(!tree->children[i]) return 83; /*alloc fail*/
3487
9.65k
      color_tree_init(tree->children[i]);
3488
9.65k
    }
3489
19.6k
    tree = tree->children[i];
3490
19.6k
  }
3491
2.45k
  tree->index = (int)index;
3492
2.45k
  return 0;
3493
2.45k
}
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.7M
                             unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
3499
62.7M
  if(mode->colortype == LCT_GREY) {
3500
228k
    unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/
3501
228k
    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.3M
    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.3M
    } else {
3514
14.3M
      out[i * 6 + 0] = out[i * 6 + 1] = r;
3515
14.3M
      out[i * 6 + 2] = out[i * 6 + 3] = g;
3516
14.3M
      out[i * 6 + 4] = out[i * 6 + 5] = b;
3517
14.3M
    }
3518
48.2M
  } else if(mode->colortype == LCT_PALETTE) {
3519
1.32k
    int index = color_tree_get(tree, r, g, b, a);
3520
1.32k
    if(index < 0) return 82; /*color not in palette*/
3521
1.21k
    if(mode->bitdepth == 8) out[i] = index;
3522
0
    else addColorBits(out, i, mode->bitdepth, (unsigned)index);
3523
48.2M
  } 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
670k
    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
670k
    } else {
3539
670k
      out[i * 8 + 0] = out[i * 8 + 1] = r;
3540
670k
      out[i * 8 + 2] = out[i * 8 + 3] = g;
3541
670k
      out[i * 8 + 4] = out[i * 8 + 5] = b;
3542
670k
      out[i * 8 + 6] = out[i * 8 + 7] = a;
3543
670k
    }
3544
670k
  }
3545
3546
62.7M
  return 0; /*no error*/
3547
62.7M
}
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
8.21k
                         unsigned short r, unsigned short g, unsigned short b, unsigned short a) {
3553
8.21k
  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
8.21k
  } else if(mode->colortype == LCT_RGB) {
3558
3.55k
    out[i * 6 + 0] = (r >> 8) & 255;
3559
3.55k
    out[i * 6 + 1] = r & 255;
3560
3.55k
    out[i * 6 + 2] = (g >> 8) & 255;
3561
3.55k
    out[i * 6 + 3] = g & 255;
3562
3.55k
    out[i * 6 + 4] = (b >> 8) & 255;
3563
3.55k
    out[i * 6 + 5] = b & 255;
3564
4.66k
  } 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.66k
  } else if(mode->colortype == LCT_RGBA) {
3571
4.66k
    out[i * 8 + 0] = (r >> 8) & 255;
3572
4.66k
    out[i * 8 + 1] = r & 255;
3573
4.66k
    out[i * 8 + 2] = (g >> 8) & 255;
3574
4.66k
    out[i * 8 + 3] = g & 255;
3575
4.66k
    out[i * 8 + 4] = (b >> 8) & 255;
3576
4.66k
    out[i * 8 + 5] = b & 255;
3577
4.66k
    out[i * 8 + 6] = (a >> 8) & 255;
3578
4.66k
    out[i * 8 + 7] = a & 255;
3579
4.66k
  }
3580
8.21k
}
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.7M
                               const LodePNGColorMode* mode) {
3587
62.7M
  if(mode->colortype == LCT_GREY) {
3588
62.7M
    if(mode->bitdepth == 8) {
3589
4.11k
      *r = *g = *b = in[i];
3590
4.11k
      if(mode->key_defined && *r == mode->key_r) *a = 0;
3591
3.76k
      else *a = 255;
3592
62.7M
    } else if(mode->bitdepth == 16) {
3593
3.19k
      *r = *g = *b = in[i * 2 + 0];
3594
3.19k
      if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0;
3595
2.95k
      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
5.86k
    if(mode->bitdepth == 8) {
3606
2.94k
      *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2];
3607
2.94k
      if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0;
3608
2.64k
      else *a = 255;
3609
2.94k
    } else {
3610
2.91k
      *r = in[i * 6 + 0];
3611
2.91k
      *g = in[i * 6 + 2];
3612
2.91k
      *b = in[i * 6 + 4];
3613
2.91k
      if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r
3614
2.91k
         && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g
3615
2.91k
         && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0;
3616
2.70k
      else *a = 255;
3617
2.91k
    }
3618
5.86k
  } else if(mode->colortype == LCT_PALETTE) {
3619
2.16k
    unsigned index;
3620
2.16k
    if(mode->bitdepth == 8) index = in[i];
3621
1.59k
    else {
3622
1.59k
      size_t j = i * mode->bitdepth;
3623
1.59k
      index = readBitsFromReversedStream(&j, in, mode->bitdepth);
3624
1.59k
    }
3625
    /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
3626
2.16k
    *r = mode->palette[index * 4 + 0];
3627
2.16k
    *g = mode->palette[index * 4 + 1];
3628
2.16k
    *b = mode->palette[index * 4 + 2];
3629
2.16k
    *a = mode->palette[index * 4 + 3];
3630
3.03k
  } else if(mode->colortype == LCT_GREY_ALPHA) {
3631
1.64k
    if(mode->bitdepth == 8) {
3632
764
      *r = *g = *b = in[i * 2 + 0];
3633
764
      *a = in[i * 2 + 1];
3634
877
    } else {
3635
877
      *r = *g = *b = in[i * 4 + 0];
3636
877
      *a = in[i * 4 + 2];
3637
877
    }
3638
1.64k
  } else if(mode->colortype == LCT_RGBA) {
3639
1.39k
    if(mode->bitdepth == 8) {
3640
775
      *r = in[i * 4 + 0];
3641
775
      *g = in[i * 4 + 1];
3642
775
      *b = in[i * 4 + 2];
3643
775
      *a = in[i * 4 + 3];
3644
775
    } else {
3645
618
      *r = in[i * 8 + 0];
3646
618
      *g = in[i * 8 + 2];
3647
618
      *b = in[i * 8 + 4];
3648
618
      *a = in[i * 8 + 6];
3649
618
    }
3650
1.39k
  }
3651
62.7M
}
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
409
                                const LodePNGColorMode* mode) {
3660
409
  unsigned num_channels = 4;
3661
409
  size_t i;
3662
409
  if(mode->colortype == LCT_GREY) {
3663
149
    if(mode->bitdepth == 8) {
3664
101k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3665
101k
        buffer[0] = buffer[1] = buffer[2] = in[i];
3666
101k
        buffer[3] = 255;
3667
101k
      }
3668
48
      if(mode->key_defined) {
3669
25
        buffer -= numpixels * num_channels;
3670
67.0k
        for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3671
67.0k
          if(buffer[0] == mode->key_r) buffer[3] = 0;
3672
67.0k
        }
3673
25
      }
3674
101
    } else if(mode->bitdepth == 16) {
3675
1.97k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3676
1.93k
        buffer[0] = buffer[1] = buffer[2] = in[i * 2];
3677
1.93k
        buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255;
3678
1.93k
      }
3679
66
    } else {
3680
66
      unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/
3681
66
      size_t j = 0;
3682
1.63M
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3683
1.63M
        unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);
3684
1.63M
        buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest;
3685
1.63M
        buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255;
3686
1.63M
      }
3687
66
    }
3688
260
  } else if(mode->colortype == LCT_RGB) {
3689
190
    if(mode->bitdepth == 8) {
3690
4.60k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3691
4.50k
        lodepng_memcpy(buffer, &in[i * 3], 3);
3692
4.50k
        buffer[3] = 255;
3693
4.50k
      }
3694
100
      if(mode->key_defined) {
3695
68
        buffer -= numpixels * num_channels;
3696
2.27k
        for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3697
2.21k
          if(buffer[0] == mode->key_r && buffer[1]== mode->key_g && buffer[2] == mode->key_b) buffer[3] = 0;
3698
2.21k
        }
3699
68
      }
3700
100
    } else {
3701
3.70k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3702
3.61k
        buffer[0] = in[i * 6 + 0];
3703
3.61k
        buffer[1] = in[i * 6 + 2];
3704
3.61k
        buffer[2] = in[i * 6 + 4];
3705
3.61k
        buffer[3] = mode->key_defined
3706
3.61k
           && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r
3707
3.61k
           && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g
3708
3.61k
           && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255;
3709
3.61k
      }
3710
90
    }
3711
190
  } else if(mode->colortype == LCT_PALETTE) {
3712
20
    if(mode->bitdepth == 8) {
3713
334
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3714
326
        unsigned index = in[i];
3715
        /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
3716
326
        lodepng_memcpy(buffer, &mode->palette[index * 4], 4);
3717
326
      }
3718
12
    } else {
3719
12
      size_t j = 0;
3720
425
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3721
413
        unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth);
3722
        /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
3723
413
        lodepng_memcpy(buffer, &mode->palette[index * 4], 4);
3724
413
      }
3725
12
    }
3726
50
  } else if(mode->colortype == LCT_GREY_ALPHA) {
3727
32
    if(mode->bitdepth == 8) {
3728
1.77k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3729
1.76k
        buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0];
3730
1.76k
        buffer[3] = in[i * 2 + 1];
3731
1.76k
      }
3732
19
    } else {
3733
180k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3734
180k
        buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0];
3735
180k
        buffer[3] = in[i * 4 + 2];
3736
180k
      }
3737
19
    }
3738
32
  } else if(mode->colortype == LCT_RGBA) {
3739
18
    if(mode->bitdepth == 8) {
3740
0
      lodepng_memcpy(buffer, in, numpixels * 4);
3741
18
    } else {
3742
12.2k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3743
12.2k
        buffer[0] = in[i * 8 + 0];
3744
12.2k
        buffer[1] = in[i * 8 + 2];
3745
12.2k
        buffer[2] = in[i * 8 + 4];
3746
12.2k
        buffer[3] = in[i * 8 + 6];
3747
12.2k
      }
3748
18
    }
3749
18
  }
3750
409
}
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
192
                               const LodePNGColorMode* mode) {
3756
192
  const unsigned num_channels = 3;
3757
192
  size_t i;
3758
192
  if(mode->colortype == LCT_GREY) {
3759
76
    if(mode->bitdepth == 8) {
3760
66.2k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3761
66.2k
        buffer[0] = buffer[1] = buffer[2] = in[i];
3762
66.2k
      }
3763
63
    } else if(mode->bitdepth == 16) {
3764
1.01k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3765
998
        buffer[0] = buffer[1] = buffer[2] = in[i * 2];
3766
998
      }
3767
46
    } else {
3768
46
      unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/
3769
46
      size_t j = 0;
3770
15.2M
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3771
15.2M
        unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth);
3772
15.2M
        buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest;
3773
15.2M
      }
3774
46
    }
3775
116
  } else if(mode->colortype == LCT_RGB) {
3776
24
    if(mode->bitdepth == 8) {
3777
0
      lodepng_memcpy(buffer, in, numpixels * 3);
3778
24
    } else {
3779
1.45k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3780
1.42k
        buffer[0] = in[i * 6 + 0];
3781
1.42k
        buffer[1] = in[i * 6 + 2];
3782
1.42k
        buffer[2] = in[i * 6 + 4];
3783
1.42k
      }
3784
24
    }
3785
92
  } else if(mode->colortype == LCT_PALETTE) {
3786
30
    if(mode->bitdepth == 8) {
3787
346
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3788
336
        unsigned index = in[i];
3789
        /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
3790
336
        lodepng_memcpy(buffer, &mode->palette[index * 4], 3);
3791
336
      }
3792
20
    } else {
3793
20
      size_t j = 0;
3794
890
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3795
870
        unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth);
3796
        /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/
3797
870
        lodepng_memcpy(buffer, &mode->palette[index * 4], 3);
3798
870
      }
3799
20
    }
3800
62
  } else if(mode->colortype == LCT_GREY_ALPHA) {
3801
35
    if(mode->bitdepth == 8) {
3802
534
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3803
522
        buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0];
3804
522
      }
3805
23
    } else {
3806
194k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3807
194k
        buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0];
3808
194k
      }
3809
23
    }
3810
35
  } else if(mode->colortype == LCT_RGBA) {
3811
27
    if(mode->bitdepth == 8) {
3812
1.87k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3813
1.85k
        lodepng_memcpy(buffer, &in[i * 4], 3);
3814
1.85k
      }
3815
15
    } else {
3816
11.7k
      for(i = 0; i != numpixels; ++i, buffer += num_channels) {
3817
11.7k
        buffer[0] = in[i * 8 + 0];
3818
11.7k
        buffer[1] = in[i * 8 + 2];
3819
11.7k
        buffer[2] = in[i * 8 + 4];
3820
11.7k
      }
3821
12
    }
3822
27
  }
3823
192
}
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
8.21k
                                const unsigned char* in, size_t i, const LodePNGColorMode* mode) {
3829
8.21k
  if(mode->colortype == LCT_GREY) {
3830
2.58k
    *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1];
3831
2.58k
    if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0;
3832
2.35k
    else *a = 65535;
3833
5.63k
  } else if(mode->colortype == LCT_RGB) {
3834
3.12k
    *r = 256u * in[i * 6 + 0] + in[i * 6 + 1];
3835
3.12k
    *g = 256u * in[i * 6 + 2] + in[i * 6 + 3];
3836
3.12k
    *b = 256u * in[i * 6 + 4] + in[i * 6 + 5];
3837
3.12k
    if(mode->key_defined
3838
3.12k
       && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r
3839
3.12k
       && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g
3840
3.12k
       && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0;
3841
2.90k
    else *a = 65535;
3842
3.12k
  } else if(mode->colortype == LCT_GREY_ALPHA) {
3843
864
    *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1];
3844
864
    *a = 256u * in[i * 4 + 2] + in[i * 4 + 3];
3845
1.65k
  } else if(mode->colortype == LCT_RGBA) {
3846
1.65k
    *r = 256u * in[i * 8 + 0] + in[i * 8 + 1];
3847
1.65k
    *g = 256u * in[i * 8 + 2] + in[i * 8 + 3];
3848
1.65k
    *b = 256u * in[i * 8 + 4] + in[i * 8 + 5];
3849
1.65k
    *a = 256u * in[i * 8 + 6] + in[i * 8 + 7];
3850
1.65k
  }
3851
8.21k
}
3852
3853
unsigned lodepng_convert(unsigned char* out, const unsigned char* in,
3854
                         const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in,
3855
1.40k
                         unsigned w, unsigned h) {
3856
1.40k
  size_t i;
3857
1.40k
  ColorTree tree;
3858
1.40k
  size_t numpixels = (size_t)w * (size_t)h;
3859
1.40k
  unsigned error = 0;
3860
3861
1.40k
  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.40k
  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.40k
  if(mode_out->colortype == LCT_PALETTE) {
3872
147
    size_t palettesize = mode_out->palettesize;
3873
147
    const unsigned char* palette = mode_out->palette;
3874
147
    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
147
    if(palettesize == 0) {
3879
75
      palettesize = mode_in->palettesize;
3880
75
      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
75
      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
75
    }
3890
147
    if(palettesize < palsize) palsize = palettesize;
3891
147
    color_tree_init(&tree);
3892
2.59k
    for(i = 0; i != palsize; ++i) {
3893
2.45k
      const unsigned char* p = &palette[i * 4];
3894
2.45k
      error = color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i);
3895
2.45k
      if(error) break;
3896
2.45k
    }
3897
147
  }
3898
3899
1.40k
  if(!error) {
3900
1.40k
    if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) {
3901
8.39k
      for(i = 0; i != numpixels; ++i) {
3902
8.21k
        unsigned short r = 0, g = 0, b = 0, a = 0;
3903
8.21k
        getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in);
3904
8.21k
        rgba16ToPixel(out, i, mode_out, r, g, b, a);
3905
8.21k
      }
3906
1.23k
    } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) {
3907
409
      getPixelColorsRGBA8(out, numpixels, in, mode_in);
3908
824
    } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) {
3909
192
      getPixelColorsRGB8(out, numpixels, in, mode_in);
3910
632
    } else {
3911
632
      unsigned char r = 0, g = 0, b = 0, a = 0;
3912
62.7M
      for(i = 0; i != numpixels; ++i) {
3913
62.7M
        getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in);
3914
62.7M
        error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a);
3915
62.7M
        if(error) break;
3916
62.7M
      }
3917
632
    }
3918
1.40k
  }
3919
3920
1.40k
  if(mode_out->colortype == LCT_PALETTE) {
3921
147
    color_tree_cleanup(&tree);
3922
147
  }
3923
3924
1.40k
  return error;
3925
1.40k
}
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
331k
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
331k
  short pa = (b - c) < 0 ? -(b - c) : (b - c);
4312
331k
  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
331k
  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
331k
  if(pb < pa) { a = b; pa = pb; }
4317
331k
  return (pc < pa) ? c : a;
4318
331k
}
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.68k
                                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.68k
  unsigned i;
4346
4347
  /*calculate width and height in pixels of each pass*/
4348
21.4k
  for(i = 0; i != 7; ++i) {
4349
18.7k
    passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i];
4350
18.7k
    passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i];
4351
18.7k
    if(passw[i] == 0) passh[i] = 0;
4352
18.7k
    if(passh[i] == 0) passw[i] = 0;
4353
18.7k
  }
4354
4355
2.68k
  filter_passstart[0] = padded_passstart[0] = passstart[0] = 0;
4356
21.4k
  for(i = 0; i != 7; ++i) {
4357
    /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/
4358
18.7k
    filter_passstart[i + 1] = filter_passstart[i]
4359
18.7k
                            + ((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.7k
    padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7u) / 8u);
4362
    /*only padded at end of reduced image*/
4363
18.7k
    passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7u) / 8u;
4364
18.7k
  }
4365
2.68k
}
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
8.10k
                         const unsigned char* in, size_t insize) {
4376
8.10k
  unsigned width, height;
4377
8.10k
  LodePNGInfo* info = &state->info_png;
4378
8.10k
  if(insize == 0 || in == 0) {
4379
0
    CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/
4380
0
  }
4381
8.10k
  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
8.09k
  lodepng_info_cleanup(info);
4388
8.09k
  lodepng_info_init(info);
4389
4390
8.09k
  if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71
4391
8.09k
     || 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
8.00k
  if(lodepng_chunk_length(in + 8) != 13) {
4395
49
    CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/
4396
0
  }
4397
7.95k
  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.91k
  width = lodepng_read32bitInt(&in[16]);
4403
7.91k
  height = lodepng_read32bitInt(&in[20]);
4404
  /*TODO: remove the undocumented feature that allows to give null pointers to width or height*/
4405
7.91k
  if(w) *w = width;
4406
7.91k
  if(h) *h = height;
4407
7.91k
  info->color.bitdepth = in[24];
4408
7.91k
  info->color.colortype = (LodePNGColorType)in[25];
4409
7.91k
  info->compression_method = in[26];
4410
7.91k
  info->filter_method = in[27];
4411
7.91k
  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.91k
  if(width == 0 || height == 0) CERROR_RETURN_ERROR(state->error, 93);
4417
  /*error: invalid colortype or bitdepth combination*/
4418
7.90k
  state->error = checkColorValidity(info->color.colortype, info->color.bitdepth);
4419
7.90k
  if(state->error) return state->error;
4420
  /*error: only compression method 0 is allowed in the specification*/
4421
7.82k
  if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32);
4422
  /*error: only filter method 0 is allowed in the specification*/
4423
7.81k
  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.81k
  if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34);
4426
4427
7.80k
  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.80k
  return state->error;
4436
7.80k
}
4437
4438
static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon,
4439
79.1k
                                 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
79.1k
  size_t i;
4450
79.1k
  switch(filterType) {
4451
22.9k
    case 0:
4452
27.7M
      for(i = 0; i != length; ++i) recon[i] = scanline[i];
4453
22.9k
      break;
4454
3.78k
    case 1: {
4455
3.78k
      size_t j = 0;
4456
14.2k
      for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i];
4457
44.1M
      for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + recon[j];
4458
3.78k
      break;
4459
0
    }
4460
6.78k
    case 2:
4461
6.78k
      if(precon) {
4462
147k
        for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i];
4463
5.56k
      } else {
4464
133k
        for(i = 0; i != length; ++i) recon[i] = scanline[i];
4465
1.21k
      }
4466
6.78k
      break;
4467
15.3k
    case 3:
4468
15.3k
      if(precon) {
4469
13.4k
        size_t j = 0;
4470
61.3k
        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
13.4k
        if(bytewidth >= 4) {
4474
12.2k
          for(; i + 3 < length; i += 4, j += 4) {
4475
6.27k
            unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2], s3 = scanline[i + 3];
4476
6.27k
            unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2], r3 = recon[j + 3];
4477
6.27k
            unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2], p3 = precon[i + 3];
4478
6.27k
            recon[i + 0] = s0 + ((r0 + p0) >> 1u);
4479
6.27k
            recon[i + 1] = s1 + ((r1 + p1) >> 1u);
4480
6.27k
            recon[i + 2] = s2 + ((r2 + p2) >> 1u);
4481
6.27k
            recon[i + 3] = s3 + ((r3 + p3) >> 1u);
4482
6.27k
          }
4483
7.44k
        } else if(bytewidth >= 3) {
4484
1.80k
          for(; i + 2 < length; i += 3, j += 3) {
4485
843
            unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2];
4486
843
            unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2];
4487
843
            unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2];
4488
843
            recon[i + 0] = s0 + ((r0 + p0) >> 1u);
4489
843
            recon[i + 1] = s1 + ((r1 + p1) >> 1u);
4490
843
            recon[i + 2] = s2 + ((r2 + p2) >> 1u);
4491
843
          }
4492
6.48k
        } else if(bytewidth >= 2) {
4493
5.57k
          for(; i + 1 < length; i += 2, j += 2) {
4494
2.36k
            unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1];
4495
2.36k
            unsigned char r0 = recon[j + 0], r1 = recon[j + 1];
4496
2.36k
            unsigned char p0 = precon[i + 0], p1 = precon[i + 1];
4497
2.36k
            recon[i + 0] = s0 + ((r0 + p0) >> 1u);
4498
2.36k
            recon[i + 1] = s1 + ((r1 + p1) >> 1u);
4499
2.36k
          }
4500
3.21k
        }
4501
129k
        for(; i != length; ++i, ++j) recon[i] = scanline[i] + ((recon[j] + precon[i]) >> 1u);
4502
13.4k
      } else {
4503
1.91k
        size_t j = 0;
4504
8.00k
        for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i];
4505
132k
        for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + (recon[j] >> 1u);
4506
1.91k
      }
4507
15.3k
      break;
4508
30.1k
    case 4:
4509
30.1k
      if(precon) {
4510
        /* Unroll independent paths of this predictor. Whether this speeds up
4511
        anything depends on compiler and settings. */
4512
27.1k
        if(bytewidth == 8) {
4513
2.52k
          unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0;
4514
2.52k
          unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0;
4515
2.52k
          unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0;
4516
2.52k
          unsigned char a6, b6 = 0, c6, d6 = 0, a7, b7 = 0, c7, d7 = 0;
4517
13.2k
          for(i = 0; i + 7 < length; i += 8) {
4518
10.7k
            c0 = b0; c1 = b1; c2 = b2; c3 = b3;
4519
10.7k
            c4 = b4; c5 = b5; c6 = b6; c7 = b7;
4520
10.7k
            b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2]; b3 = precon[i + 3];
4521
10.7k
            b4 = precon[i + 4]; b5 = precon[i + 5]; b6 = precon[i + 6]; b7 = precon[i + 7];
4522
10.7k
            a0 = d0; a1 = d1; a2 = d2; a3 = d3;
4523
10.7k
            a4 = d4; a5 = d5; a6 = d6; a7 = d7;
4524
10.7k
            d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
4525
10.7k
            d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
4526
10.7k
            d2 = scanline[i + 2] + paethPredictor(a2, b2, c2);
4527
10.7k
            d3 = scanline[i + 3] + paethPredictor(a3, b3, c3);
4528
10.7k
            d4 = scanline[i + 4] + paethPredictor(a4, b4, c4);
4529
10.7k
            d5 = scanline[i + 5] + paethPredictor(a5, b5, c5);
4530
10.7k
            d6 = scanline[i + 6] + paethPredictor(a6, b6, c6);
4531
10.7k
            d7 = scanline[i + 7] + paethPredictor(a7, b7, c7);
4532
10.7k
            recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2; recon[i + 3] = d3;
4533
10.7k
            recon[i + 4] = d4; recon[i + 5] = d5; recon[i + 6] = d6; recon[i + 7] = d7;
4534
10.7k
          }
4535
24.6k
        } else if(bytewidth == 6) {
4536
6.76k
          unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0;
4537
6.76k
          unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0;
4538
6.76k
          unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0;
4539
21.6k
          for(i = 0; i + 5 < length; i += 6) {
4540
14.9k
            c0 = b0; c1 = b1; c2 = b2;
4541
14.9k
            c3 = b3; c4 = b4; c5 = b5;
4542
14.9k
            b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2];
4543
14.9k
            b3 = precon[i + 3]; b4 = precon[i + 4]; b5 = precon[i + 5];
4544
14.9k
            a0 = d0; a1 = d1; a2 = d2;
4545
14.9k
            a3 = d3; a4 = d4; a5 = d5;
4546
14.9k
            d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
4547
14.9k
            d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
4548
14.9k
            d2 = scanline[i + 2] + paethPredictor(a2, b2, c2);
4549
14.9k
            d3 = scanline[i + 3] + paethPredictor(a3, b3, c3);
4550
14.9k
            d4 = scanline[i + 4] + paethPredictor(a4, b4, c4);
4551
14.9k
            d5 = scanline[i + 5] + paethPredictor(a5, b5, c5);
4552
14.9k
            recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2;
4553
14.9k
            recon[i + 3] = d3; recon[i + 4] = d4; recon[i + 5] = d5;
4554
14.9k
          }
4555
17.8k
        } else if(bytewidth == 4) {
4556
4.45k
          unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0;
4557
4.45k
          unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0;
4558
18.4k
          for(i = 0; i + 3 < length; i += 4) {
4559
13.9k
            c0 = b0; c1 = b1; c2 = b2; c3 = b3;
4560
13.9k
            b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2]; b3 = precon[i + 3];
4561
13.9k
            a0 = d0; a1 = d1; a2 = d2; a3 = d3;
4562
13.9k
            d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
4563
13.9k
            d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
4564
13.9k
            d2 = scanline[i + 2] + paethPredictor(a2, b2, c2);
4565
13.9k
            d3 = scanline[i + 3] + paethPredictor(a3, b3, c3);
4566
13.9k
            recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2; recon[i + 3] = d3;
4567
13.9k
          }
4568
13.3k
        } else if(bytewidth == 3) {
4569
1.24k
          unsigned char a0, b0 = 0, c0, d0 = 0;
4570
1.24k
          unsigned char a1, b1 = 0, c1, d1 = 0;
4571
1.24k
          unsigned char a2, b2 = 0, c2, d2 = 0;
4572
10.4k
          for(i = 0; i + 2 < length; i += 3) {
4573
9.22k
            c0 = b0; c1 = b1; c2 = b2;
4574
9.22k
            b0 = precon[i + 0]; b1 = precon[i + 1]; b2 = precon[i + 2];
4575
9.22k
            a0 = d0; a1 = d1; a2 = d2;
4576
9.22k
            d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
4577
9.22k
            d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
4578
9.22k
            d2 = scanline[i + 2] + paethPredictor(a2, b2, c2);
4579
9.22k
            recon[i + 0] = d0; recon[i + 1] = d1; recon[i + 2] = d2;
4580
9.22k
          }
4581
12.1k
        } else if(bytewidth == 2) {
4582
6.36k
          unsigned char a0, b0 = 0, c0, d0 = 0;
4583
6.36k
          unsigned char a1, b1 = 0, c1, d1 = 0;
4584
28.7k
          for(i = 0; i + 1 < length; i += 2) {
4585
22.4k
            c0 = b0; c1 = b1;
4586
22.4k
            b0 = precon[i + 0];
4587
22.4k
            b1 = precon[i + 1];
4588
22.4k
            a0 = d0; a1 = d1;
4589
22.4k
            d0 = scanline[i + 0] + paethPredictor(a0, b0, c0);
4590
22.4k
            d1 = scanline[i + 1] + paethPredictor(a1, b1, c1);
4591
22.4k
            recon[i + 0] = d0;
4592
22.4k
            recon[i + 1] = d1;
4593
22.4k
          }
4594
6.36k
        } else if(bytewidth == 1) {
4595
5.78k
          unsigned char a, b = 0, c, d = 0;
4596
33.9k
          for(i = 0; i != length; ++i) {
4597
28.1k
            c = b;
4598
28.1k
            b = precon[i];
4599
28.1k
            a = d;
4600
28.1k
            d = scanline[i] + paethPredictor(a, b, c);
4601
28.1k
            recon[i] = d;
4602
28.1k
          }
4603
5.78k
        } 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
27.1k
        for(; i != length; ++i) {
4611
0
          recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth]));
4612
0
        }
4613
27.1k
      } else {
4614
2.96k
        size_t j = 0;
4615
12.9k
        for(i = 0; i != bytewidth; ++i) {
4616
9.94k
          recon[i] = scanline[i];
4617
9.94k
        }
4618
56.4k
        for(i = bytewidth; i != length; ++i, ++j) {
4619
          /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/
4620
53.4k
          recon[i] = (scanline[i] + recon[j]);
4621
53.4k
        }
4622
2.96k
      }
4623
30.1k
      break;
4624
239
    default: return 36; /*error: invalid filter type given*/
4625
79.1k
  }
4626
78.9k
  return 0;
4627
79.1k
}
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
92.3k
  for(y = 0; y < h; ++y) {
4647
79.1k
    size_t outindex = linebytes * y;
4648
79.1k
    size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/
4649
79.1k
    unsigned char filterType = in[inindex];
4650
4651
79.1k
    CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes));
4652
4653
78.9k
    prevline = &out[outindex];
4654
78.9k
  }
4655
4656
13.1k
  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.30k
static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) {
4671
1.30k
  unsigned passw[7], passh[7];
4672
1.30k
  size_t filter_passstart[8], padded_passstart[8], passstart[8];
4673
1.30k
  unsigned i;
4674
4675
1.30k
  Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
4676
4677
1.30k
  if(bpp >= 8) {
4678
7.92k
    for(i = 0; i != 7; ++i) {
4679
6.93k
      unsigned x, y, b;
4680
6.93k
      size_t bytewidth = bpp / 8u;
4681
24.3k
      for(y = 0; y < passh[i]; ++y)
4682
67.6k
      for(x = 0; x < passw[i]; ++x) {
4683
50.2k
        size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth;
4684
50.2k
        size_t pixeloutstart = ((ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * (size_t)w
4685
50.2k
                             + ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bytewidth;
4686
159k
        for(b = 0; b < bytewidth; ++b) {
4687
109k
          out[pixeloutstart + b] = in[pixelinstart + b];
4688
109k
        }
4689
50.2k
      }
4690
6.93k
    }
4691
990
  } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ {
4692
2.54k
    for(i = 0; i != 7; ++i) {
4693
2.22k
      unsigned x, y, b;
4694
2.22k
      unsigned ilinebits = bpp * passw[i];
4695
2.22k
      unsigned olinebits = bpp * w;
4696
2.22k
      size_t obp, ibp; /*bit pointers (for out and in buffer)*/
4697
23.1k
      for(y = 0; y < passh[i]; ++y)
4698
176M
      for(x = 0; x < passw[i]; ++x) {
4699
175M
        ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp);
4700
175M
        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
175M
      }
4706
2.22k
    }
4707
318
  }
4708
1.30k
}
4709
4710
static void removePaddingBits(unsigned char* out, const unsigned char* in,
4711
2.96k
                              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.96k
  unsigned y;
4722
2.96k
  size_t diff = ilinebits - olinebits;
4723
2.96k
  size_t ibp = 0, obp = 0; /*input and output bit pointers*/
4724
29.7k
  for(y = 0; y < h; ++y) {
4725
26.7k
    size_t x;
4726
279M
    for(x = 0; x < olinebits; ++x) {
4727
279M
      unsigned char bit = readBitFromReversedStream(&ibp, in);
4728
279M
      setBitOfReversedStream(&obp, out, bit);
4729
279M
    }
4730
26.7k
    ibp += diff;
4731
26.7k
  }
4732
2.96k
}
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.30k
                                     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.30k
  unsigned bpp = lodepng_get_bpp(&info_png->color);
4747
5.30k
  if(bpp == 0) return 31; /*error: invalid colortype*/
4748
4749
5.30k
  if(info_png->interlace_method == 0) {
4750
3.92k
    if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) {
4751
701
      CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp));
4752
687
      removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h);
4753
687
    }
4754
    /*we can immediately filter into the out buffer, no other steps needed*/
4755
3.75k
    else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp));
4756
3.75k
  } else /*interlace_method is 1 (Adam7)*/ {
4757
1.37k
    unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
4758
1.37k
    unsigned i;
4759
4760
1.37k
    Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
4761
4762
10.7k
    for(i = 0; i != 7; ++i) {
4763
9.43k
      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.37k
      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
2.28k
        removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp,
4770
2.28k
                          ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]);
4771
2.28k
      }
4772
9.37k
    }
4773
4774
1.30k
    Adam7_deinterlace(out, in, w, h, bpp);
4775
1.30k
  }
4776
4777
5.06k
  return 0;
4778
5.30k
}
4779
4780
2.87k
static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) {
4781
2.87k
  unsigned pos = 0, i;
4782
2.87k
  color->palettesize = chunkLength / 3u;
4783
2.87k
  if(color->palettesize == 0 || color->palettesize > 256) return 38; /*error: palette too small or big*/
4784
2.85k
  lodepng_color_mode_alloc_palette(color);
4785
2.85k
  if(!color->palette && color->palettesize) {
4786
0
    color->palettesize = 0;
4787
0
    return 83; /*alloc fail*/
4788
0
  }
4789
4790
15.4k
  for(i = 0; i != color->palettesize; ++i) {
4791
12.6k
    color->palette[4 * i + 0] = data[pos++]; /*R*/
4792
12.6k
    color->palette[4 * i + 1] = data[pos++]; /*G*/
4793
12.6k
    color->palette[4 * i + 2] = data[pos++]; /*B*/
4794
12.6k
    color->palette[4 * i + 3] = 255; /*alpha*/
4795
12.6k
  }
4796
4797
2.85k
  return 0; /* OK */
4798
2.85k
}
4799
4800
2.77k
static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) {
4801
2.77k
  unsigned i;
4802
2.77k
  if(color->colortype == LCT_PALETTE) {
4803
    /*error: more alpha values given than there are palette entries*/
4804
749
    if(chunkLength > color->palettesize) return 39;
4805
4806
1.68k
    for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i];
4807
2.02k
  } else if(color->colortype == LCT_GREY) {
4808
    /*error: this chunk must be 2 bytes for grayscale image*/
4809
617
    if(chunkLength != 2) return 30;
4810
4811
613
    color->key_defined = 1;
4812
613
    color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1];
4813
1.40k
  } else if(color->colortype == LCT_RGB) {
4814
    /*error: this chunk must be 6 bytes for RGB image*/
4815
1.40k
    if(chunkLength != 6) return 41;
4816
4817
1.39k
    color->key_defined = 1;
4818
1.39k
    color->key_r = 256u * data[0] + data[1];
4819
1.39k
    color->key_g = 256u * data[2] + data[3];
4820
1.39k
    color->key_b = 256u * data[4] + data[5];
4821
1.39k
  }
4822
1
  else return 42; /*error: tRNS chunk not allowed for other color models*/
4823
4824
2.75k
  return 0; /* OK */
4825
2.77k
}
4826
4827
4828
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
4829
/*background color chunk (bKGD)*/
4830
993
static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
4831
993
  if(info->color.colortype == LCT_PALETTE) {
4832
    /*error: this chunk must be 1 byte for indexed color image*/
4833
278
    if(chunkLength != 1) return 43;
4834
4835
    /*error: invalid palette index, or maybe this chunk appeared before PLTE*/
4836
268
    if(data[0] >= info->color.palettesize) return 103;
4837
4838
258
    info->background_defined = 1;
4839
258
    info->background_r = info->background_g = info->background_b = data[0];
4840
715
  } 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
422
    if(chunkLength != 2) return 44;
4843
4844
    /*the values are truncated to bitdepth in the PNG file*/
4845
404
    info->background_defined = 1;
4846
404
    info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1];
4847
404
  } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) {
4848
    /*error: this chunk must be 6 bytes for grayscale image*/
4849
293
    if(chunkLength != 6) return 45;
4850
4851
    /*the values are truncated to bitdepth in the PNG file*/
4852
279
    info->background_defined = 1;
4853
279
    info->background_r = 256u * data[0] + data[1];
4854
279
    info->background_g = 256u * data[2] + data[3];
4855
279
    info->background_b = 256u * data[4] + data[5];
4856
279
  }
4857
4858
941
  return 0; /* OK */
4859
993
}
4860
4861
/*text chunk (tEXt)*/
4862
88.0k
static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
4863
88.0k
  unsigned error = 0;
4864
88.0k
  char *key = 0, *str = 0;
4865
4866
88.0k
  while(!error) /*not really a while loop, only used to break on error*/ {
4867
88.0k
    unsigned length, string2_begin;
4868
4869
88.0k
    length = 0;
4870
1.93M
    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
88.0k
    if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/
4874
4875
88.0k
    key = (char*)lodepng_malloc(length + 1);
4876
88.0k
    if(!key) CERROR_BREAK(error, 83); /*alloc fail*/
4877
4878
88.0k
    lodepng_memcpy(key, data, length);
4879
88.0k
    key[length] = 0;
4880
4881
88.0k
    string2_begin = length + 1; /*skip keyword null terminator*/
4882
4883
88.0k
    length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin);
4884
88.0k
    str = (char*)lodepng_malloc(length + 1);
4885
88.0k
    if(!str) CERROR_BREAK(error, 83); /*alloc fail*/
4886
4887
88.0k
    lodepng_memcpy(str, data + string2_begin, length);
4888
88.0k
    str[length] = 0;
4889
4890
88.0k
    error = lodepng_add_text(info, key, str);
4891
4892
88.0k
    break;
4893
88.0k
  }
4894
4895
88.0k
  lodepng_free(key);
4896
88.0k
  lodepng_free(str);
4897
4898
88.0k
  return error;
4899
88.0k
}
4900
4901
/*compressed text chunk (zTXt)*/
4902
static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder,
4903
939
                               const unsigned char* data, size_t chunkLength) {
4904
939
  unsigned error = 0;
4905
4906
  /*copy the object to change parameters in it*/
4907
939
  LodePNGDecompressSettings zlibsettings = decoder->zlibsettings;
4908
4909
939
  unsigned length, string2_begin;
4910
939
  char *key = 0;
4911
939
  unsigned char* str = 0;
4912
939
  size_t size = 0;
4913
4914
939
  while(!error) /*not really a while loop, only used to break on error*/ {
4915
2.94M
    for(length = 0; length < chunkLength && data[length] != 0; ++length) ;
4916
939
    if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/
4917
921
    if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/
4918
4919
894
    key = (char*)lodepng_malloc(length + 1);
4920
894
    if(!key) CERROR_BREAK(error, 83); /*alloc fail*/
4921
4922
894
    lodepng_memcpy(key, data, length);
4923
894
    key[length] = 0;
4924
4925
894
    if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/
4926
4927
891
    string2_begin = length + 2;
4928
891
    if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/
4929
4930
891
    length = (unsigned)chunkLength - string2_begin;
4931
891
    zlibsettings.max_output_size = decoder->max_text_size;
4932
    /*will fail if zlib error, e.g. if length is too small*/
4933
891
    error = zlib_decompress(&str, &size, 0, &data[string2_begin],
4934
891
                            length, &zlibsettings);
4935
    /*error: compressed text larger than  decoder->max_text_size*/
4936
891
    if(error && size > zlibsettings.max_output_size) error = 112;
4937
891
    if(error) break;
4938
774
    error = lodepng_add_text_sized(info, key, (char*)str, size);
4939
774
    break;
4940
891
  }
4941
4942
939
  lodepng_free(key);
4943
939
  lodepng_free(str);
4944
4945
939
  return error;
4946
939
}
4947
4948
/*international text chunk (iTXt)*/
4949
static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder,
4950
7.74k
                               const unsigned char* data, size_t chunkLength) {
4951
7.74k
  unsigned error = 0;
4952
7.74k
  unsigned i;
4953
4954
  /*copy the object to change parameters in it*/
4955
7.74k
  LodePNGDecompressSettings zlibsettings = decoder->zlibsettings;
4956
4957
7.74k
  unsigned length, begin, compressed;
4958
7.74k
  char *key = 0, *langtag = 0, *transkey = 0;
4959
4960
7.74k
  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
7.74k
    if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/
4964
4965
    /*read the key*/
4966
3.93M
    for(length = 0; length < chunkLength && data[length] != 0; ++length) ;
4967
7.74k
    if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/
4968
7.72k
    if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/
4969
4970
7.68k
    key = (char*)lodepng_malloc(length + 1);
4971
7.68k
    if(!key) CERROR_BREAK(error, 83); /*alloc fail*/
4972
4973
7.68k
    lodepng_memcpy(key, data, length);
4974
7.68k
    key[length] = 0;
4975
4976
    /*read the compression method*/
4977
7.68k
    compressed = data[length + 1];
4978
7.68k
    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
7.67k
    begin = length + 3;
4985
7.67k
    length = 0;
4986
4.66M
    for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length;
4987
4988
7.67k
    langtag = (char*)lodepng_malloc(length + 1);
4989
7.67k
    if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/
4990
4991
7.67k
    lodepng_memcpy(langtag, data + begin, length);
4992
7.67k
    langtag[length] = 0;
4993
4994
    /*read the transkey*/
4995
7.67k
    begin += length + 1;
4996
7.67k
    length = 0;
4997
2.25M
    for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length;
4998
4999
7.67k
    transkey = (char*)lodepng_malloc(length + 1);
5000
7.67k
    if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/
5001
5002
7.67k
    lodepng_memcpy(transkey, data + begin, length);
5003
7.67k
    transkey[length] = 0;
5004
5005
    /*read the actual text*/
5006
7.67k
    begin += length + 1;
5007
5008
7.67k
    length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin;
5009
5010
7.67k
    if(compressed) {
5011
544
      unsigned char* str = 0;
5012
544
      size_t size = 0;
5013
544
      zlibsettings.max_output_size = decoder->max_text_size;
5014
      /*will fail if zlib error, e.g. if length is too small*/
5015
544
      error = zlib_decompress(&str, &size, 0, &data[begin],
5016
544
                              length, &zlibsettings);
5017
      /*error: compressed text larger than  decoder->max_text_size*/
5018
544
      if(error && size > zlibsettings.max_output_size) error = 112;
5019
544
      if(!error) error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)str, size);
5020
544
      lodepng_free(str);
5021
7.13k
    } else {
5022
7.13k
      error = lodepng_add_itext_sized(info, key, langtag, transkey, (const char*)(data + begin), length);
5023
7.13k
    }
5024
5025
7.67k
    break;
5026
7.67k
  }
5027
5028
7.74k
  lodepng_free(key);
5029
7.74k
  lodepng_free(langtag);
5030
7.74k
  lodepng_free(transkey);
5031
5032
7.74k
  return error;
5033
7.74k
}
5034
5035
223
static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5036
223
  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
223
}
5048
5049
394
static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5050
394
  if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/
5051
5052
389
  info->phys_defined = 1;
5053
389
  info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3];
5054
389
  info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7];
5055
389
  info->phys_unit = data[8];
5056
5057
389
  return 0; /* OK */
5058
394
}
5059
5060
388
static unsigned readChunk_gAMA(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5061
388
  if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/
5062
5063
374
  info->gama_defined = 1;
5064
374
  info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3];
5065
5066
374
  return 0; /* OK */
5067
388
}
5068
5069
210
static unsigned readChunk_cHRM(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5070
210
  if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/
5071
5072
203
  info->chrm_defined = 1;
5073
203
  info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3];
5074
203
  info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7];
5075
203
  info->chrm_red_x   = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11];
5076
203
  info->chrm_red_y   = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15];
5077
203
  info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19];
5078
203
  info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23];
5079
203
  info->chrm_blue_x  = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27];
5080
203
  info->chrm_blue_y  = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31];
5081
5082
203
  return 0; /* OK */
5083
210
}
5084
5085
210
static unsigned readChunk_sRGB(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5086
210
  if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/
5087
5088
202
  info->srgb_defined = 1;
5089
202
  info->srgb_intent = data[0];
5090
5091
202
  return 0; /* OK */
5092
210
}
5093
5094
static unsigned readChunk_iCCP(LodePNGInfo* info, const LodePNGDecoderSettings* decoder,
5095
1.07k
                               const unsigned char* data, size_t chunkLength) {
5096
1.07k
  unsigned error = 0;
5097
1.07k
  unsigned i;
5098
1.07k
  size_t size = 0;
5099
  /*copy the object to change parameters in it*/
5100
1.07k
  LodePNGDecompressSettings zlibsettings = decoder->zlibsettings;
5101
5102
1.07k
  unsigned length, string2_begin;
5103
5104
1.07k
  if(info->iccp_defined) lodepng_clear_icc(info);
5105
1.07k
  info->iccp_defined = 1;
5106
5107
1.75M
  for(length = 0; length < chunkLength && data[length] != 0; ++length) ;
5108
1.07k
  if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/
5109
1.05k
  if(length < 1 || length > 79) return 89; /*keyword too short or long*/
5110
5111
1.02k
  info->iccp_name = (char*)lodepng_malloc(length + 1);
5112
1.02k
  if(!info->iccp_name) return 83; /*alloc fail*/
5113
5114
1.02k
  info->iccp_name[length] = 0;
5115
4.31k
  for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i];
5116
5117
1.02k
  if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/
5118
5119
1.01k
  string2_begin = length + 2;
5120
1.01k
  if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/
5121
5122
1.01k
  length = (unsigned)chunkLength - string2_begin;
5123
1.01k
  zlibsettings.max_output_size = decoder->max_icc_size;
5124
1.01k
  error = zlib_decompress(&info->iccp_profile, &size, 0,
5125
1.01k
                          &data[string2_begin],
5126
1.01k
                          length, &zlibsettings);
5127
  /*error: ICC profile larger than decoder->max_icc_size*/
5128
1.01k
  if(error && size > zlibsettings.max_output_size) error = 113;
5129
1.01k
  info->iccp_profile_size = (unsigned)size;
5130
1.01k
  if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/
5131
1.01k
  return error;
5132
1.01k
}
5133
5134
86
static unsigned readChunk_cICP(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5135
86
  if(chunkLength != 4) return 117; /*invalid cICP chunk size*/
5136
5137
78
  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
78
  info->cicp_color_primaries = data[0];
5141
78
  info->cicp_transfer_function = data[1];
5142
78
  info->cicp_matrix_coefficients = data[2];
5143
78
  info->cicp_video_full_range_flag = data[3];
5144
5145
78
  return 0; /* OK */
5146
86
}
5147
5148
205
static unsigned readChunk_mDCV(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5149
205
  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
205
}
5165
5166
205
static unsigned readChunk_cLLI(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5167
205
  if(chunkLength != 8) return 120; /*invalid cLLI chunk size*/
5168
5169
202
  info->clli_defined = 1;
5170
202
  info->clli_max_cll = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3];
5171
202
  info->clli_max_fall = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7];
5172
5173
202
  return 0; /* OK */
5174
205
}
5175
5176
639
static unsigned readChunk_eXIf(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5177
639
  return lodepng_set_exif(info, data, (unsigned)chunkLength);
5178
639
}
5179
5180
/*significant bits chunk (sBIT)*/
5181
1.20k
static unsigned readChunk_sBIT(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
5182
1.20k
  unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth;
5183
1.20k
  if(info->color.colortype == LCT_GREY) {
5184
    /*error: this chunk must be 1 bytes for grayscale image*/
5185
224
    if(chunkLength != 1) return 114;
5186
217
    if(data[0] == 0 || data[0] > bitdepth) return 115;
5187
206
    info->sbit_defined = 1;
5188
206
    info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/
5189
985
  } 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
501
    if(chunkLength != 3) return 114;
5192
481
    if(data[0] == 0 || data[1] == 0 || data[2] == 0) return 115;
5193
478
    if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth) return 115;
5194
455
    info->sbit_defined = 1;
5195
455
    info->sbit_r = data[0];
5196
455
    info->sbit_g = data[1];
5197
455
    info->sbit_b = data[2];
5198
484
  } else if(info->color.colortype == LCT_GREY_ALPHA) {
5199
    /*error: this chunk must be 2 byte for grayscale with alpha image*/
5200
238
    if(chunkLength != 2) return 114;
5201
222
    if(data[0] == 0 || data[1] == 0) return 115;
5202
219
    if(data[0] > bitdepth || data[1] > bitdepth) return 115;
5203
205
    info->sbit_defined = 1;
5204
205
    info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/
5205
205
    info->sbit_a = data[1];
5206
246
  } else if(info->color.colortype == LCT_RGBA) {
5207
    /*error: this chunk must be 4 bytes for grayscale image*/
5208
246
    if(chunkLength != 4) return 114;
5209
236
    if(data[0] == 0 || data[1] == 0 || data[2] == 0 || data[3] == 0) return 115;
5210
232
    if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth || data[3] > bitdepth) return 115;
5211
207
    info->sbit_defined = 1;
5212
207
    info->sbit_r = data[0];
5213
207
    info->sbit_g = data[1];
5214
207
    info->sbit_b = data[2];
5215
207
    info->sbit_a = data[3];
5216
207
  }
5217
5218
1.07k
  return 0; /* OK */
5219
1.20k
}
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
8.10k
                          const unsigned char* in, size_t insize) {
5288
8.10k
  unsigned char IEND = 0;
5289
8.10k
  const unsigned char* chunk; /*points to beginning of next chunk*/
5290
8.10k
  unsigned char* idat; /*the data from idat chunks, zlib compressed*/
5291
8.10k
  size_t idatsize = 0;
5292
8.10k
  unsigned char* scanlines = 0;
5293
8.10k
  size_t scanlines_size = 0, expected_size = 0;
5294
8.10k
  size_t outsize = 0;
5295
5296
  /*for unknown chunk order*/
5297
8.10k
  unsigned unknown = 0;
5298
8.10k
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5299
8.10k
  unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/
5300
8.10k
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5301
5302
5303
  /* safe output values in case error happens */
5304
8.10k
  *out = 0;
5305
8.10k
  *w = *h = 0;
5306
5307
8.10k
  state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/
5308
8.10k
  if(state->error) return;
5309
5310
7.80k
  if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) {
5311
58
    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.74k
  idat = (unsigned char*)lodepng_malloc(insize);
5316
7.74k
  if(!idat) CERROR_RETURN(state->error, 83); /*alloc fail*/
5317
5318
7.74k
  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
128k
  while(!IEND && !state->error) {
5323
128k
    unsigned chunkLength;
5324
128k
    const unsigned char* data; /*the data in the chunk*/
5325
128k
    size_t pos = (size_t)(chunk - in);
5326
5327
    /*error: next chunk out of bounds of the in buffer*/
5328
128k
    if(chunk < in || pos + 12 > insize) {
5329
6.65k
      if(state->decoder.ignore_end) break; /*other errors may still happen though*/
5330
6.65k
      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
122k
    chunkLength = lodepng_chunk_length(chunk);
5335
    /*error: chunk length larger than the max PNG chunk size*/
5336
122k
    if(chunkLength > 2147483647) {
5337
117
      if(state->decoder.ignore_end) break; /*other errors may still happen though*/
5338
117
      CERROR_BREAK(state->error, 63);
5339
0
    }
5340
5341
121k
    if(pos + (size_t)chunkLength + 12 > insize || pos + (size_t)chunkLength + 12 < pos) {
5342
98
      CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk (or int overflow)*/
5343
0
    }
5344
5345
121k
    data = lodepng_chunk_data_const(chunk);
5346
5347
121k
    unknown = 0;
5348
5349
    /*IDAT chunk, containing compressed image data*/
5350
121k
    if(lodepng_chunk_type_equals(chunk, "IDAT")) {
5351
9.68k
      size_t newsize;
5352
9.68k
      if(lodepng_addofl(idatsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95);
5353
9.68k
      if(newsize > insize) CERROR_BREAK(state->error, 95);
5354
9.68k
      lodepng_memcpy(idat + idatsize, data, chunkLength);
5355
9.68k
      idatsize += chunkLength;
5356
9.68k
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5357
9.68k
      critical_pos = 3;
5358
9.68k
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5359
112k
    } else if(lodepng_chunk_type_equals(chunk, "IEND")) {
5360
      /*IEND chunk*/
5361
4
      IEND = 1;
5362
112k
    } else if(lodepng_chunk_type_equals(chunk, "PLTE")) {
5363
      /*palette chunk (PLTE)*/
5364
2.87k
      state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength);
5365
2.87k
      if(state->error) break;
5366
2.85k
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5367
2.85k
      critical_pos = 2;
5368
2.85k
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5369
109k
    } 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.77k
      state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength);
5374
2.77k
      if(state->error) break;
5375
2.77k
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5376
      /*background color chunk (bKGD)*/
5377
106k
    } else if(lodepng_chunk_type_equals(chunk, "bKGD")) {
5378
993
      state->error = readChunk_bKGD(&state->info_png, data, chunkLength);
5379
993
      if(state->error) break;
5380
105k
    } else if(lodepng_chunk_type_equals(chunk, "tEXt")) {
5381
      /*text chunk (tEXt)*/
5382
88.0k
      if(state->decoder.read_text_chunks) {
5383
88.0k
        state->error = readChunk_tEXt(&state->info_png, data, chunkLength);
5384
88.0k
        if(state->error) break;
5385
88.0k
      }
5386
88.0k
    } else if(lodepng_chunk_type_equals(chunk, "zTXt")) {
5387
      /*compressed text chunk (zTXt)*/
5388
939
      if(state->decoder.read_text_chunks) {
5389
939
        state->error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength);
5390
939
        if(state->error) break;
5391
939
      }
5392
16.4k
    } else if(lodepng_chunk_type_equals(chunk, "iTXt")) {
5393
      /*international text chunk (iTXt)*/
5394
7.74k
      if(state->decoder.read_text_chunks) {
5395
7.74k
        state->error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength);
5396
7.74k
        if(state->error) break;
5397
7.74k
      }
5398
8.74k
    } else if(lodepng_chunk_type_equals(chunk, "tIME")) {
5399
223
      state->error = readChunk_tIME(&state->info_png, data, chunkLength);
5400
223
      if(state->error) break;
5401
8.51k
    } else if(lodepng_chunk_type_equals(chunk, "pHYs")) {
5402
394
      state->error = readChunk_pHYs(&state->info_png, data, chunkLength);
5403
394
      if(state->error) break;
5404
8.12k
    } else if(lodepng_chunk_type_equals(chunk, "gAMA")) {
5405
388
      state->error = readChunk_gAMA(&state->info_png, data, chunkLength);
5406
388
      if(state->error) break;
5407
7.73k
    } else if(lodepng_chunk_type_equals(chunk, "cHRM")) {
5408
210
      state->error = readChunk_cHRM(&state->info_png, data, chunkLength);
5409
210
      if(state->error) break;
5410
7.52k
    } else if(lodepng_chunk_type_equals(chunk, "sRGB")) {
5411
210
      state->error = readChunk_sRGB(&state->info_png, data, chunkLength);
5412
210
      if(state->error) break;
5413
7.31k
    } else if(lodepng_chunk_type_equals(chunk, "iCCP")) {
5414
1.07k
      state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength);
5415
1.07k
      if(state->error) break;
5416
6.23k
    } else if(lodepng_chunk_type_equals(chunk, "cICP")) {
5417
86
      state->error = readChunk_cICP(&state->info_png, data, chunkLength);
5418
86
      if(state->error) break;
5419
6.15k
    } else if(lodepng_chunk_type_equals(chunk, "mDCV")) {
5420
205
      state->error = readChunk_mDCV(&state->info_png, data, chunkLength);
5421
205
      if(state->error) break;
5422
5.94k
    } else if(lodepng_chunk_type_equals(chunk, "cLLI")) {
5423
205
      state->error = readChunk_cLLI(&state->info_png, data, chunkLength);
5424
205
      if(state->error) break;
5425
5.74k
    } else if(lodepng_chunk_type_equals(chunk, "eXIf")) {
5426
639
      state->error = readChunk_eXIf(&state->info_png, data, chunkLength);
5427
639
      if(state->error) break;
5428
5.10k
    } else if(lodepng_chunk_type_equals(chunk, "sBIT")) {
5429
1.20k
      state->error = readChunk_sBIT(&state->info_png, data, chunkLength);
5430
1.20k
      if(state->error) break;
5431
1.20k
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5432
3.89k
    } else /*it's not an implemented chunk type, so ignore it: skip over the data*/ {
5433
3.89k
      if(!lodepng_chunk_type_name_valid(chunk)) {
5434
75
        CERROR_BREAK(state->error, 121); /* invalid chunk type name */
5435
0
      }
5436
3.82k
      if(lodepng_chunk_reserved(chunk)) {
5437
4
        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
3.81k
      if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) {
5442
10
        CERROR_BREAK(state->error, 69);
5443
0
      }
5444
5445
3.80k
      unknown = 1;
5446
3.80k
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5447
3.80k
      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
3.80k
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5453
3.80k
    }
5454
5455
120k
    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
120k
    if(!IEND) chunk = lodepng_chunk_next_const(chunk, in + insize);
5460
120k
  }
5461
5462
7.74k
  if(!state->error && state->info_png.color.colortype == LCT_PALETTE && !state->info_png.color.palette) {
5463
51
    state->error = 106; /* error: PNG file must have PLTE chunk if color type is palette */
5464
51
  }
5465
5466
7.74k
  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.72k
    if(state->info_png.interlace_method == 0) {
5470
4.95k
      unsigned bpp = lodepng_get_bpp(&state->info_png.color);
5471
4.95k
      expected_size = lodepng_get_raw_size_idat(*w, *h, bpp);
5472
4.95k
    } else {
5473
1.76k
      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.76k
      expected_size = 0;
5476
1.76k
      expected_size += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, bpp);
5477
1.76k
      if(*w > 4) expected_size += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, bpp);
5478
1.76k
      expected_size += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, bpp);
5479
1.76k
      if(*w > 2) expected_size += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, bpp);
5480
1.76k
      expected_size += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, bpp);
5481
1.76k
      if(*w > 1) expected_size += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, bpp);
5482
1.76k
      expected_size += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, bpp);
5483
1.76k
    }
5484
5485
6.72k
    state->error = zlib_decompress(&scanlines, &scanlines_size, expected_size, idat, idatsize, &state->decoder.zlibsettings);
5486
6.72k
  }
5487
7.74k
  if(!state->error && scanlines_size != expected_size) state->error = 91; /*decompressed size doesn't match prediction*/
5488
7.74k
  lodepng_free(idat);
5489
5490
7.74k
  if(!state->error) {
5491
5.30k
    outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color);
5492
5.30k
    *out = (unsigned char*)lodepng_malloc(outsize);
5493
5.30k
    if(!*out) state->error = 83; /*alloc fail*/
5494
5.30k
  }
5495
7.74k
  if(!state->error) {
5496
5.30k
    lodepng_memset(*out, 0, outsize);
5497
5.30k
    state->error = postProcessScanlines(*out, scanlines, *w, *h, &state->info_png);
5498
5.30k
  }
5499
7.74k
  lodepng_free(scanlines);
5500
7.74k
}
5501
5502
unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h,
5503
                        LodePNGState* state,
5504
8.10k
                        const unsigned char* in, size_t insize) {
5505
8.10k
  *out = 0;
5506
8.10k
  decodeGeneric(out, w, h, state, in, insize);
5507
8.10k
  if(state->error) return state->error;
5508
5.06k
  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.40k
    if(!state->decoder.color_convert) {
5513
1.68k
      state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color);
5514
1.68k
      if(state->error) return state->error;
5515
1.68k
    }
5516
3.40k
  } else { /*color conversion needed*/
5517
1.65k
    unsigned char* data = *out;
5518
1.65k
    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.65k
    if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA)
5523
1.65k
       && !(state->info_raw.bitdepth == 8)) {
5524
250
      return 56; /*unsupported color mode conversion*/
5525
250
    }
5526
5527
1.40k
    outsize = lodepng_get_raw_size(*w, *h, &state->info_raw);
5528
1.40k
    *out = (unsigned char*)lodepng_malloc(outsize);
5529
1.40k
    if(!(*out)) {
5530
1
      state->error = 83; /*alloc fail*/
5531
1
    }
5532
1.40k
    else state->error = lodepng_convert(*out, data, &state->info_raw,
5533
1.40k
                                        &state->info_png.color, *w, *h);
5534
1.40k
    lodepng_free(data);
5535
1.40k
  }
5536
4.81k
  return state->error;
5537
5.06k
}
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.73k
void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) {
5589
4.73k
  settings->color_convert = 1;
5590
4.73k
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
5591
4.73k
  settings->read_text_chunks = 1;
5592
4.73k
  settings->remember_unknown_chunks = 0;
5593
4.73k
  settings->max_text_size = 16777216;
5594
4.73k
  settings->max_icc_size = 16777216; /* 16MB is much more than enough for any reasonable ICC profile */
5595
4.73k
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
5596
4.73k
  settings->ignore_crc = 0;
5597
4.73k
  settings->ignore_critical = 0;
5598
4.73k
  settings->ignore_end = 0;
5599
4.73k
  lodepng_decompress_settings_init(&settings->zlibsettings);
5600
4.73k
}
5601
5602
#endif /*LODEPNG_COMPILE_DECODER*/
5603
5604
#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER)
5605
5606
4.73k
void lodepng_state_init(LodePNGState* state) {
5607
4.73k
#ifdef LODEPNG_COMPILE_DECODER
5608
4.73k
  lodepng_decoder_settings_init(&state->decoder);
5609
4.73k
#endif /*LODEPNG_COMPILE_DECODER*/
5610
4.73k
#ifdef LODEPNG_COMPILE_ENCODER
5611
4.73k
  lodepng_encoder_settings_init(&state->encoder);
5612
4.73k
#endif /*LODEPNG_COMPILE_ENCODER*/
5613
4.73k
  lodepng_color_mode_init(&state->info_raw);
5614
4.73k
  lodepng_info_init(&state->info_png);
5615
4.73k
  state->error = 1;
5616
4.73k
}
5617
5618
4.73k
void lodepng_state_cleanup(LodePNGState* state) {
5619
4.73k
  lodepng_color_mode_cleanup(&state->info_raw);
5620
4.73k
  lodepng_info_cleanup(&state->info_png);
5621
4.73k
}
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.73k
void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) {
6865
4.73k
  lodepng_compress_settings_init(&settings->zlibsettings);
6866
4.73k
  settings->filter_palette_zero = 1;
6867
4.73k
  settings->filter_strategy = LFS_MINSUM;
6868
4.73k
  settings->auto_convert = 1;
6869
4.73k
  settings->force_palette = 0;
6870
4.73k
  settings->predefined_filters = 0;
6871
4.73k
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
6872
4.73k
  settings->add_id = 0;
6873
4.73k
  settings->text_compression = 1;
6874
4.73k
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
6875
4.73k
}
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.73k
State::State() {
7100
4.73k
  lodepng_state_init(this);
7101
4.73k
}
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.73k
State::~State() {
7109
4.73k
  lodepng_state_cleanup(this);
7110
4.73k
}
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
8.10k
                const unsigned char* in, size_t insize) {
7142
8.10k
  unsigned char* buffer = NULL;
7143
8.10k
  unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize);
7144
8.10k
  if(buffer && !error) {
7145
4.70k
    size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);
7146
4.70k
    out.insert(out.end(), buffer, &buffer[buffersize]);
7147
4.70k
  }
7148
8.10k
  lodepng_free(buffer);
7149
8.10k
  return error;
7150
8.10k
}
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*/