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