comparison src/semicongine/resources/lodepng.c @ 254:0fab53ca30b7

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