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