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