fix getsup (HH)
[luatex.git] / source / libs / libpng / libpng-src / png.c
blob78ce39f46d86393fc8eefba004c169912fdcdc46
2 /* png.c - location for general purpose libpng functions
4 * Last changed in libpng 1.6.28 [January 5, 2017]
5 * Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
9 * This code is released under the libpng license.
10 * For conditions of distribution and use, see the disclaimer
11 * and license in png.h
14 #include "pngpriv.h"
16 /* Generate a compiler error if there is an old png.h in the search path. */
17 typedef png_libpng_version_1_6_28 Your_png_h_is_not_version_1_6_28;
19 /* Tells libpng that we have already handled the first "num_bytes" bytes
20 * of the PNG file signature. If the PNG data is embedded into another
21 * stream we can set num_bytes = 8 so that libpng will not attempt to read
22 * or write any of the magic bytes before it starts on the IHDR.
25 #ifdef PNG_READ_SUPPORTED
26 void PNGAPI
27 png_set_sig_bytes(png_structrp png_ptr, int num_bytes)
29 unsigned int nb = (unsigned int)num_bytes;
31 png_debug(1, "in png_set_sig_bytes");
33 if (png_ptr == NULL)
34 return;
36 if (num_bytes < 0)
37 nb = 0;
39 if (nb > 8)
40 png_error(png_ptr, "Too many bytes for PNG signature");
42 png_ptr->sig_bytes = (png_byte)nb;
45 /* Checks whether the supplied bytes match the PNG signature. We allow
46 * checking less than the full 8-byte signature so that those apps that
47 * already read the first few bytes of a file to determine the file type
48 * can simply check the remaining bytes for extra assurance. Returns
49 * an integer less than, equal to, or greater than zero if sig is found,
50 * respectively, to be less than, to match, or be greater than the correct
51 * PNG signature (this is the same behavior as strcmp, memcmp, etc).
53 int PNGAPI
54 png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check)
56 png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
58 if (num_to_check > 8)
59 num_to_check = 8;
61 else if (num_to_check < 1)
62 return (-1);
64 if (start > 7)
65 return (-1);
67 if (start + num_to_check > 8)
68 num_to_check = 8 - start;
70 return ((int)(memcmp(&sig[start], &png_signature[start], num_to_check)));
73 #endif /* READ */
75 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
76 /* Function to allocate memory for zlib */
77 PNG_FUNCTION(voidpf /* PRIVATE */,
78 png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED)
80 png_alloc_size_t num_bytes = size;
82 if (png_ptr == NULL)
83 return NULL;
85 if (items >= (~(png_alloc_size_t)0)/size)
87 png_warning (png_voidcast(png_structrp, png_ptr),
88 "Potential overflow in png_zalloc()");
89 return NULL;
92 num_bytes *= items;
93 return png_malloc_warn(png_voidcast(png_structrp, png_ptr), num_bytes);
96 /* Function to free memory for zlib */
97 void /* PRIVATE */
98 png_zfree(voidpf png_ptr, voidpf ptr)
100 png_free(png_voidcast(png_const_structrp,png_ptr), ptr);
103 /* Reset the CRC variable to 32 bits of 1's. Care must be taken
104 * in case CRC is > 32 bits to leave the top bits 0.
106 void /* PRIVATE */
107 png_reset_crc(png_structrp png_ptr)
109 /* The cast is safe because the crc is a 32-bit value. */
110 png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);
113 /* Calculate the CRC over a section of data. We can only pass as
114 * much data to this routine as the largest single buffer size. We
115 * also check that this data will actually be used before going to the
116 * trouble of calculating it.
118 void /* PRIVATE */
119 png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)
121 int need_crc = 1;
123 if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0)
125 if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
126 (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
127 need_crc = 0;
130 else /* critical */
132 if ((png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) != 0)
133 need_crc = 0;
136 /* 'uLong' is defined in zlib.h as unsigned long; this means that on some
137 * systems it is a 64-bit value. crc32, however, returns 32 bits so the
138 * following cast is safe. 'uInt' may be no more than 16 bits, so it is
139 * necessary to perform a loop here.
141 if (need_crc != 0 && length > 0)
143 uLong crc = png_ptr->crc; /* Should never issue a warning */
147 uInt safe_length = (uInt)length;
148 #ifndef __COVERITY__
149 if (safe_length == 0)
150 safe_length = (uInt)-1; /* evil, but safe */
151 #endif
153 crc = crc32(crc, ptr, safe_length);
155 /* The following should never issue compiler warnings; if they do the
156 * target system has characteristics that will probably violate other
157 * assumptions within the libpng code.
159 ptr += safe_length;
160 length -= safe_length;
162 while (length > 0);
164 /* And the following is always safe because the crc is only 32 bits. */
165 png_ptr->crc = (png_uint_32)crc;
169 /* Check a user supplied version number, called from both read and write
170 * functions that create a png_struct.
173 png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
175 /* Libpng versions 1.0.0 and later are binary compatible if the version
176 * string matches through the second '.'; we must recompile any
177 * applications that use any older library version.
180 if (user_png_ver != NULL)
182 int i = -1;
183 int found_dots = 0;
187 i++;
188 if (user_png_ver[i] != PNG_LIBPNG_VER_STRING[i])
189 png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
190 if (user_png_ver[i] == '.')
191 found_dots++;
192 } while (found_dots < 2 && user_png_ver[i] != 0 &&
193 PNG_LIBPNG_VER_STRING[i] != 0);
196 else
197 png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
199 if ((png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) != 0)
201 #ifdef PNG_WARNINGS_SUPPORTED
202 size_t pos = 0;
203 char m[128];
205 pos = png_safecat(m, (sizeof m), pos,
206 "Application built with libpng-");
207 pos = png_safecat(m, (sizeof m), pos, user_png_ver);
208 pos = png_safecat(m, (sizeof m), pos, " but running with ");
209 pos = png_safecat(m, (sizeof m), pos, PNG_LIBPNG_VER_STRING);
210 PNG_UNUSED(pos)
212 png_warning(png_ptr, m);
213 #endif
215 #ifdef PNG_ERROR_NUMBERS_SUPPORTED
216 png_ptr->flags = 0;
217 #endif
219 return 0;
222 /* Success return. */
223 return 1;
226 /* Generic function to create a png_struct for either read or write - this
227 * contains the common initialization.
229 PNG_FUNCTION(png_structp /* PRIVATE */,
230 png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
231 png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
232 png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
234 png_struct create_struct;
235 # ifdef PNG_SETJMP_SUPPORTED
236 jmp_buf create_jmp_buf;
237 # endif
239 /* This temporary stack-allocated structure is used to provide a place to
240 * build enough context to allow the user provided memory allocator (if any)
241 * to be called.
243 memset(&create_struct, 0, (sizeof create_struct));
245 /* Added at libpng-1.2.6 */
246 # ifdef PNG_USER_LIMITS_SUPPORTED
247 create_struct.user_width_max = PNG_USER_WIDTH_MAX;
248 create_struct.user_height_max = PNG_USER_HEIGHT_MAX;
250 # ifdef PNG_USER_CHUNK_CACHE_MAX
251 /* Added at libpng-1.2.43 and 1.4.0 */
252 create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
253 # endif
255 # ifdef PNG_USER_CHUNK_MALLOC_MAX
256 /* Added at libpng-1.2.43 and 1.4.1, required only for read but exists
257 * in png_struct regardless.
259 create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
260 # endif
261 # endif
263 /* The following two API calls simply set fields in png_struct, so it is safe
264 * to do them now even though error handling is not yet set up.
266 # ifdef PNG_USER_MEM_SUPPORTED
267 png_set_mem_fn(&create_struct, mem_ptr, malloc_fn, free_fn);
268 # else
269 PNG_UNUSED(mem_ptr)
270 PNG_UNUSED(malloc_fn)
271 PNG_UNUSED(free_fn)
272 # endif
274 /* (*error_fn) can return control to the caller after the error_ptr is set,
275 * this will result in a memory leak unless the error_fn does something
276 * extremely sophisticated. The design lacks merit but is implicit in the
277 * API.
279 png_set_error_fn(&create_struct, error_ptr, error_fn, warn_fn);
281 # ifdef PNG_SETJMP_SUPPORTED
282 if (!setjmp(create_jmp_buf))
283 # endif
285 # ifdef PNG_SETJMP_SUPPORTED
286 /* Temporarily fake out the longjmp information until we have
287 * successfully completed this function. This only works if we have
288 * setjmp() support compiled in, but it is safe - this stuff should
289 * never happen.
291 create_struct.jmp_buf_ptr = &create_jmp_buf;
292 create_struct.jmp_buf_size = 0; /*stack allocation*/
293 create_struct.longjmp_fn = longjmp;
294 # endif
295 /* Call the general version checker (shared with read and write code):
297 if (png_user_version_check(&create_struct, user_png_ver) != 0)
299 png_structrp png_ptr = png_voidcast(png_structrp,
300 png_malloc_warn(&create_struct, (sizeof *png_ptr)));
302 if (png_ptr != NULL)
304 /* png_ptr->zstream holds a back-pointer to the png_struct, so
305 * this can only be done now:
307 create_struct.zstream.zalloc = png_zalloc;
308 create_struct.zstream.zfree = png_zfree;
309 create_struct.zstream.opaque = png_ptr;
311 # ifdef PNG_SETJMP_SUPPORTED
312 /* Eliminate the local error handling: */
313 create_struct.jmp_buf_ptr = NULL;
314 create_struct.jmp_buf_size = 0;
315 create_struct.longjmp_fn = 0;
316 # endif
318 *png_ptr = create_struct;
320 /* This is the successful return point */
321 return png_ptr;
326 /* A longjmp because of a bug in the application storage allocator or a
327 * simple failure to allocate the png_struct.
329 return NULL;
332 /* Allocate the memory for an info_struct for the application. */
333 PNG_FUNCTION(png_infop,PNGAPI
334 png_create_info_struct,(png_const_structrp png_ptr),PNG_ALLOCATED)
336 png_inforp info_ptr;
338 png_debug(1, "in png_create_info_struct");
340 if (png_ptr == NULL)
341 return NULL;
343 /* Use the internal API that does not (or at least should not) error out, so
344 * that this call always returns ok. The application typically sets up the
345 * error handling *after* creating the info_struct because this is the way it
346 * has always been done in 'example.c'.
348 info_ptr = png_voidcast(png_inforp, png_malloc_base(png_ptr,
349 (sizeof *info_ptr)));
351 if (info_ptr != NULL)
352 memset(info_ptr, 0, (sizeof *info_ptr));
354 return info_ptr;
357 /* This function frees the memory associated with a single info struct.
358 * Normally, one would use either png_destroy_read_struct() or
359 * png_destroy_write_struct() to free an info struct, but this may be
360 * useful for some applications. From libpng 1.6.0 this function is also used
361 * internally to implement the png_info release part of the 'struct' destroy
362 * APIs. This ensures that all possible approaches free the same data (all of
363 * it).
365 void PNGAPI
366 png_destroy_info_struct(png_const_structrp png_ptr, png_infopp info_ptr_ptr)
368 png_inforp info_ptr = NULL;
370 png_debug(1, "in png_destroy_info_struct");
372 if (png_ptr == NULL)
373 return;
375 if (info_ptr_ptr != NULL)
376 info_ptr = *info_ptr_ptr;
378 if (info_ptr != NULL)
380 /* Do this first in case of an error below; if the app implements its own
381 * memory management this can lead to png_free calling png_error, which
382 * will abort this routine and return control to the app error handler.
383 * An infinite loop may result if it then tries to free the same info
384 * ptr.
386 *info_ptr_ptr = NULL;
388 png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
389 memset(info_ptr, 0, (sizeof *info_ptr));
390 png_free(png_ptr, info_ptr);
394 /* Initialize the info structure. This is now an internal function (0.89)
395 * and applications using it are urged to use png_create_info_struct()
396 * instead. Use deprecated in 1.6.0, internal use removed (used internally it
397 * is just a memset).
399 * NOTE: it is almost inconceivable that this API is used because it bypasses
400 * the user-memory mechanism and the user error handling/warning mechanisms in
401 * those cases where it does anything other than a memset.
403 PNG_FUNCTION(void,PNGAPI
404 png_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size),
405 PNG_DEPRECATED)
407 png_inforp info_ptr = *ptr_ptr;
409 png_debug(1, "in png_info_init_3");
411 if (info_ptr == NULL)
412 return;
414 if ((sizeof (png_info)) > png_info_struct_size)
416 *ptr_ptr = NULL;
417 /* The following line is why this API should not be used: */
418 free(info_ptr);
419 info_ptr = png_voidcast(png_inforp, png_malloc_base(NULL,
420 (sizeof *info_ptr)));
421 if (info_ptr == NULL)
422 return;
423 *ptr_ptr = info_ptr;
426 /* Set everything to 0 */
427 memset(info_ptr, 0, (sizeof *info_ptr));
430 /* The following API is not called internally */
431 void PNGAPI
432 png_data_freer(png_const_structrp png_ptr, png_inforp info_ptr,
433 int freer, png_uint_32 mask)
435 png_debug(1, "in png_data_freer");
437 if (png_ptr == NULL || info_ptr == NULL)
438 return;
440 if (freer == PNG_DESTROY_WILL_FREE_DATA)
441 info_ptr->free_me |= mask;
443 else if (freer == PNG_USER_WILL_FREE_DATA)
444 info_ptr->free_me &= ~mask;
446 else
447 png_error(png_ptr, "Unknown freer parameter in png_data_freer");
450 void PNGAPI
451 png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,
452 int num)
454 png_debug(1, "in png_free_data");
456 if (png_ptr == NULL || info_ptr == NULL)
457 return;
459 #ifdef PNG_TEXT_SUPPORTED
460 /* Free text item num or (if num == -1) all text items */
461 if (info_ptr->text != NULL &&
462 ((mask & PNG_FREE_TEXT) & info_ptr->free_me) != 0)
464 if (num != -1)
466 png_free(png_ptr, info_ptr->text[num].key);
467 info_ptr->text[num].key = NULL;
470 else
472 int i;
474 for (i = 0; i < info_ptr->num_text; i++)
475 png_free(png_ptr, info_ptr->text[i].key);
477 png_free(png_ptr, info_ptr->text);
478 info_ptr->text = NULL;
479 info_ptr->num_text = 0;
480 info_ptr->max_text = 0;
483 #endif
485 #ifdef PNG_tRNS_SUPPORTED
486 /* Free any tRNS entry */
487 if (((mask & PNG_FREE_TRNS) & info_ptr->free_me) != 0)
489 info_ptr->valid &= ~PNG_INFO_tRNS;
490 png_free(png_ptr, info_ptr->trans_alpha);
491 info_ptr->trans_alpha = NULL;
492 info_ptr->num_trans = 0;
494 #endif
496 #ifdef PNG_sCAL_SUPPORTED
497 /* Free any sCAL entry */
498 if (((mask & PNG_FREE_SCAL) & info_ptr->free_me) != 0)
500 png_free(png_ptr, info_ptr->scal_s_width);
501 png_free(png_ptr, info_ptr->scal_s_height);
502 info_ptr->scal_s_width = NULL;
503 info_ptr->scal_s_height = NULL;
504 info_ptr->valid &= ~PNG_INFO_sCAL;
506 #endif
508 #ifdef PNG_pCAL_SUPPORTED
509 /* Free any pCAL entry */
510 if (((mask & PNG_FREE_PCAL) & info_ptr->free_me) != 0)
512 png_free(png_ptr, info_ptr->pcal_purpose);
513 png_free(png_ptr, info_ptr->pcal_units);
514 info_ptr->pcal_purpose = NULL;
515 info_ptr->pcal_units = NULL;
517 if (info_ptr->pcal_params != NULL)
519 int i;
521 for (i = 0; i < info_ptr->pcal_nparams; i++)
522 png_free(png_ptr, info_ptr->pcal_params[i]);
524 png_free(png_ptr, info_ptr->pcal_params);
525 info_ptr->pcal_params = NULL;
527 info_ptr->valid &= ~PNG_INFO_pCAL;
529 #endif
531 #ifdef PNG_iCCP_SUPPORTED
532 /* Free any profile entry */
533 if (((mask & PNG_FREE_ICCP) & info_ptr->free_me) != 0)
535 png_free(png_ptr, info_ptr->iccp_name);
536 png_free(png_ptr, info_ptr->iccp_profile);
537 info_ptr->iccp_name = NULL;
538 info_ptr->iccp_profile = NULL;
539 info_ptr->valid &= ~PNG_INFO_iCCP;
541 #endif
543 #ifdef PNG_sPLT_SUPPORTED
544 /* Free a given sPLT entry, or (if num == -1) all sPLT entries */
545 if (info_ptr->splt_palettes != NULL &&
546 ((mask & PNG_FREE_SPLT) & info_ptr->free_me) != 0)
548 if (num != -1)
550 png_free(png_ptr, info_ptr->splt_palettes[num].name);
551 png_free(png_ptr, info_ptr->splt_palettes[num].entries);
552 info_ptr->splt_palettes[num].name = NULL;
553 info_ptr->splt_palettes[num].entries = NULL;
556 else
558 int i;
560 for (i = 0; i < info_ptr->splt_palettes_num; i++)
562 png_free(png_ptr, info_ptr->splt_palettes[i].name);
563 png_free(png_ptr, info_ptr->splt_palettes[i].entries);
566 png_free(png_ptr, info_ptr->splt_palettes);
567 info_ptr->splt_palettes = NULL;
568 info_ptr->splt_palettes_num = 0;
569 info_ptr->valid &= ~PNG_INFO_sPLT;
572 #endif
574 #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
575 if (info_ptr->unknown_chunks != NULL &&
576 ((mask & PNG_FREE_UNKN) & info_ptr->free_me) != 0)
578 if (num != -1)
580 png_free(png_ptr, info_ptr->unknown_chunks[num].data);
581 info_ptr->unknown_chunks[num].data = NULL;
584 else
586 int i;
588 for (i = 0; i < info_ptr->unknown_chunks_num; i++)
589 png_free(png_ptr, info_ptr->unknown_chunks[i].data);
591 png_free(png_ptr, info_ptr->unknown_chunks);
592 info_ptr->unknown_chunks = NULL;
593 info_ptr->unknown_chunks_num = 0;
596 #endif
598 #ifdef PNG_hIST_SUPPORTED
599 /* Free any hIST entry */
600 if (((mask & PNG_FREE_HIST) & info_ptr->free_me) != 0)
602 png_free(png_ptr, info_ptr->hist);
603 info_ptr->hist = NULL;
604 info_ptr->valid &= ~PNG_INFO_hIST;
606 #endif
608 /* Free any PLTE entry that was internally allocated */
609 if (((mask & PNG_FREE_PLTE) & info_ptr->free_me) != 0)
611 png_free(png_ptr, info_ptr->palette);
612 info_ptr->palette = NULL;
613 info_ptr->valid &= ~PNG_INFO_PLTE;
614 info_ptr->num_palette = 0;
617 #ifdef PNG_INFO_IMAGE_SUPPORTED
618 /* Free any image bits attached to the info structure */
619 if (((mask & PNG_FREE_ROWS) & info_ptr->free_me) != 0)
621 if (info_ptr->row_pointers != NULL)
623 png_uint_32 row;
624 for (row = 0; row < info_ptr->height; row++)
625 png_free(png_ptr, info_ptr->row_pointers[row]);
627 png_free(png_ptr, info_ptr->row_pointers);
628 info_ptr->row_pointers = NULL;
630 info_ptr->valid &= ~PNG_INFO_IDAT;
632 #endif
634 if (num != -1)
635 mask &= ~PNG_FREE_MUL;
637 info_ptr->free_me &= ~mask;
639 #endif /* READ || WRITE */
641 /* This function returns a pointer to the io_ptr associated with the user
642 * functions. The application should free any memory associated with this
643 * pointer before png_write_destroy() or png_read_destroy() are called.
645 png_voidp PNGAPI
646 png_get_io_ptr(png_const_structrp png_ptr)
648 if (png_ptr == NULL)
649 return (NULL);
651 return (png_ptr->io_ptr);
654 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
655 # ifdef PNG_STDIO_SUPPORTED
656 /* Initialize the default input/output functions for the PNG file. If you
657 * use your own read or write routines, you can call either png_set_read_fn()
658 * or png_set_write_fn() instead of png_init_io(). If you have defined
659 * PNG_NO_STDIO or otherwise disabled PNG_STDIO_SUPPORTED, you must use a
660 * function of your own because "FILE *" isn't necessarily available.
662 void PNGAPI
663 png_init_io(png_structrp png_ptr, png_FILE_p fp)
665 png_debug(1, "in png_init_io");
667 if (png_ptr == NULL)
668 return;
670 png_ptr->io_ptr = (png_voidp)fp;
672 # endif
674 # ifdef PNG_SAVE_INT_32_SUPPORTED
675 /* PNG signed integers are saved in 32-bit 2's complement format. ANSI C-90
676 * defines a cast of a signed integer to an unsigned integer either to preserve
677 * the value, if it is positive, or to calculate:
679 * (UNSIGNED_MAX+1) + integer
681 * Where UNSIGNED_MAX is the appropriate maximum unsigned value, so when the
682 * negative integral value is added the result will be an unsigned value
683 * correspnding to the 2's complement representation.
685 void PNGAPI
686 png_save_int_32(png_bytep buf, png_int_32 i)
688 png_save_uint_32(buf, (png_uint_32)i);
690 # endif
692 # ifdef PNG_TIME_RFC1123_SUPPORTED
693 /* Convert the supplied time into an RFC 1123 string suitable for use in
694 * a "Creation Time" or other text-based time string.
696 int PNGAPI
697 png_convert_to_rfc1123_buffer(char out[29], png_const_timep ptime)
699 static PNG_CONST char short_months[12][4] =
700 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
701 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
703 if (out == NULL)
704 return 0;
706 if (ptime->year > 9999 /* RFC1123 limitation */ ||
707 ptime->month == 0 || ptime->month > 12 ||
708 ptime->day == 0 || ptime->day > 31 ||
709 ptime->hour > 23 || ptime->minute > 59 ||
710 ptime->second > 60)
711 return 0;
714 size_t pos = 0;
715 char number_buf[5]; /* enough for a four-digit year */
717 # define APPEND_STRING(string) pos = png_safecat(out, 29, pos, (string))
718 # define APPEND_NUMBER(format, value)\
719 APPEND_STRING(PNG_FORMAT_NUMBER(number_buf, format, (value)))
720 # define APPEND(ch) if (pos < 28) out[pos++] = (ch)
722 APPEND_NUMBER(PNG_NUMBER_FORMAT_u, (unsigned)ptime->day);
723 APPEND(' ');
724 APPEND_STRING(short_months[(ptime->month - 1)]);
725 APPEND(' ');
726 APPEND_NUMBER(PNG_NUMBER_FORMAT_u, ptime->year);
727 APPEND(' ');
728 APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->hour);
729 APPEND(':');
730 APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->minute);
731 APPEND(':');
732 APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->second);
733 APPEND_STRING(" +0000"); /* This reliably terminates the buffer */
734 PNG_UNUSED (pos)
736 # undef APPEND
737 # undef APPEND_NUMBER
738 # undef APPEND_STRING
741 return 1;
744 # if PNG_LIBPNG_VER < 10700
745 /* To do: remove the following from libpng-1.7 */
746 /* Original API that uses a private buffer in png_struct.
747 * Deprecated because it causes png_struct to carry a spurious temporary
748 * buffer (png_struct::time_buffer), better to have the caller pass this in.
750 png_const_charp PNGAPI
751 png_convert_to_rfc1123(png_structrp png_ptr, png_const_timep ptime)
753 if (png_ptr != NULL)
755 /* The only failure above if png_ptr != NULL is from an invalid ptime */
756 if (png_convert_to_rfc1123_buffer(png_ptr->time_buffer, ptime) == 0)
757 png_warning(png_ptr, "Ignoring invalid time value");
759 else
760 return png_ptr->time_buffer;
763 return NULL;
765 # endif /* LIBPNG_VER < 10700 */
766 # endif /* TIME_RFC1123 */
768 #endif /* READ || WRITE */
770 png_const_charp PNGAPI
771 png_get_copyright(png_const_structrp png_ptr)
773 PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */
774 #ifdef PNG_STRING_COPYRIGHT
775 return PNG_STRING_COPYRIGHT
776 #else
777 # ifdef __STDC__
778 return PNG_STRING_NEWLINE \
779 "libpng version 1.6.28 - January 5, 2017" PNG_STRING_NEWLINE \
780 "Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson" \
781 PNG_STRING_NEWLINE \
782 "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
783 "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
784 PNG_STRING_NEWLINE;
785 # else
786 return "libpng version 1.6.28 - January 5, 2017\
787 Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson\
788 Copyright (c) 1996-1997 Andreas Dilger\
789 Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
790 # endif
791 #endif
794 /* The following return the library version as a short string in the
795 * format 1.0.0 through 99.99.99zz. To get the version of *.h files
796 * used with your application, print out PNG_LIBPNG_VER_STRING, which
797 * is defined in png.h.
798 * Note: now there is no difference between png_get_libpng_ver() and
799 * png_get_header_ver(). Due to the version_nn_nn_nn typedef guard,
800 * it is guaranteed that png.c uses the correct version of png.h.
802 png_const_charp PNGAPI
803 png_get_libpng_ver(png_const_structrp png_ptr)
805 /* Version of *.c files used when building libpng */
806 return png_get_header_ver(png_ptr);
809 png_const_charp PNGAPI
810 png_get_header_ver(png_const_structrp png_ptr)
812 /* Version of *.h files used when building libpng */
813 PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */
814 return PNG_LIBPNG_VER_STRING;
817 png_const_charp PNGAPI
818 png_get_header_version(png_const_structrp png_ptr)
820 /* Returns longer string containing both version and date */
821 PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */
822 #ifdef __STDC__
823 return PNG_HEADER_VERSION_STRING
824 # ifndef PNG_READ_SUPPORTED
825 " (NO READ SUPPORT)"
826 # endif
827 PNG_STRING_NEWLINE;
828 #else
829 return PNG_HEADER_VERSION_STRING;
830 #endif
833 #ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
834 /* NOTE: this routine is not used internally! */
835 /* Build a grayscale palette. Palette is assumed to be 1 << bit_depth
836 * large of png_color. This lets grayscale images be treated as
837 * paletted. Most useful for gamma correction and simplification
838 * of code. This API is not used internally.
840 void PNGAPI
841 png_build_grayscale_palette(int bit_depth, png_colorp palette)
843 int num_palette;
844 int color_inc;
845 int i;
846 int v;
848 png_debug(1, "in png_do_build_grayscale_palette");
850 if (palette == NULL)
851 return;
853 switch (bit_depth)
855 case 1:
856 num_palette = 2;
857 color_inc = 0xff;
858 break;
860 case 2:
861 num_palette = 4;
862 color_inc = 0x55;
863 break;
865 case 4:
866 num_palette = 16;
867 color_inc = 0x11;
868 break;
870 case 8:
871 num_palette = 256;
872 color_inc = 1;
873 break;
875 default:
876 num_palette = 0;
877 color_inc = 0;
878 break;
881 for (i = 0, v = 0; i < num_palette; i++, v += color_inc)
883 palette[i].red = (png_byte)(v & 0xff);
884 palette[i].green = (png_byte)(v & 0xff);
885 palette[i].blue = (png_byte)(v & 0xff);
888 #endif
890 #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
891 int PNGAPI
892 png_handle_as_unknown(png_const_structrp png_ptr, png_const_bytep chunk_name)
894 /* Check chunk_name and return "keep" value if it's on the list, else 0 */
895 png_const_bytep p, p_end;
897 if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list == 0)
898 return PNG_HANDLE_CHUNK_AS_DEFAULT;
900 p_end = png_ptr->chunk_list;
901 p = p_end + png_ptr->num_chunk_list*5; /* beyond end */
903 /* The code is the fifth byte after each four byte string. Historically this
904 * code was always searched from the end of the list, this is no longer
905 * necessary because the 'set' routine handles duplicate entries correcty.
907 do /* num_chunk_list > 0, so at least one */
909 p -= 5;
911 if (memcmp(chunk_name, p, 4) == 0)
912 return p[4];
914 while (p > p_end);
916 /* This means that known chunks should be processed and unknown chunks should
917 * be handled according to the value of png_ptr->unknown_default; this can be
918 * confusing because, as a result, there are two levels of defaulting for
919 * unknown chunks.
921 return PNG_HANDLE_CHUNK_AS_DEFAULT;
924 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) ||\
925 defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
926 int /* PRIVATE */
927 png_chunk_unknown_handling(png_const_structrp png_ptr, png_uint_32 chunk_name)
929 png_byte chunk_string[5];
931 PNG_CSTRING_FROM_CHUNK(chunk_string, chunk_name);
932 return png_handle_as_unknown(png_ptr, chunk_string);
934 #endif /* READ_UNKNOWN_CHUNKS || HANDLE_AS_UNKNOWN */
935 #endif /* SET_UNKNOWN_CHUNKS */
937 #ifdef PNG_READ_SUPPORTED
938 /* This function, added to libpng-1.0.6g, is untested. */
939 int PNGAPI
940 png_reset_zstream(png_structrp png_ptr)
942 if (png_ptr == NULL)
943 return Z_STREAM_ERROR;
945 /* WARNING: this resets the window bits to the maximum! */
946 return (inflateReset(&png_ptr->zstream));
948 #endif /* READ */
950 /* This function was added to libpng-1.0.7 */
951 png_uint_32 PNGAPI
952 png_access_version_number(void)
954 /* Version of *.c files used when building libpng */
955 return((png_uint_32)PNG_LIBPNG_VER);
958 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
959 /* Ensure that png_ptr->zstream.msg holds some appropriate error message string.
960 * If it doesn't 'ret' is used to set it to something appropriate, even in cases
961 * like Z_OK or Z_STREAM_END where the error code is apparently a success code.
963 void /* PRIVATE */
964 png_zstream_error(png_structrp png_ptr, int ret)
966 /* Translate 'ret' into an appropriate error string, priority is given to the
967 * one in zstream if set. This always returns a string, even in cases like
968 * Z_OK or Z_STREAM_END where the error code is a success code.
970 if (png_ptr->zstream.msg == NULL) switch (ret)
972 default:
973 case Z_OK:
974 png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected zlib return code");
975 break;
977 case Z_STREAM_END:
978 /* Normal exit */
979 png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected end of LZ stream");
980 break;
982 case Z_NEED_DICT:
983 /* This means the deflate stream did not have a dictionary; this
984 * indicates a bogus PNG.
986 png_ptr->zstream.msg = PNGZ_MSG_CAST("missing LZ dictionary");
987 break;
989 case Z_ERRNO:
990 /* gz APIs only: should not happen */
991 png_ptr->zstream.msg = PNGZ_MSG_CAST("zlib IO error");
992 break;
994 case Z_STREAM_ERROR:
995 /* internal libpng error */
996 png_ptr->zstream.msg = PNGZ_MSG_CAST("bad parameters to zlib");
997 break;
999 case Z_DATA_ERROR:
1000 png_ptr->zstream.msg = PNGZ_MSG_CAST("damaged LZ stream");
1001 break;
1003 case Z_MEM_ERROR:
1004 png_ptr->zstream.msg = PNGZ_MSG_CAST("insufficient memory");
1005 break;
1007 case Z_BUF_ERROR:
1008 /* End of input or output; not a problem if the caller is doing
1009 * incremental read or write.
1011 png_ptr->zstream.msg = PNGZ_MSG_CAST("truncated");
1012 break;
1014 case Z_VERSION_ERROR:
1015 png_ptr->zstream.msg = PNGZ_MSG_CAST("unsupported zlib version");
1016 break;
1018 case PNG_UNEXPECTED_ZLIB_RETURN:
1019 /* Compile errors here mean that zlib now uses the value co-opted in
1020 * pngpriv.h for PNG_UNEXPECTED_ZLIB_RETURN; update the switch above
1021 * and change pngpriv.h. Note that this message is "... return",
1022 * whereas the default/Z_OK one is "... return code".
1024 png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected zlib return");
1025 break;
1029 /* png_convert_size: a PNGAPI but no longer in png.h, so deleted
1030 * at libpng 1.5.5!
1033 /* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */
1034 #ifdef PNG_GAMMA_SUPPORTED /* always set if COLORSPACE */
1035 static int
1036 png_colorspace_check_gamma(png_const_structrp png_ptr,
1037 png_colorspacerp colorspace, png_fixed_point gAMA, int from)
1038 /* This is called to check a new gamma value against an existing one. The
1039 * routine returns false if the new gamma value should not be written.
1041 * 'from' says where the new gamma value comes from:
1043 * 0: the new gamma value is the libpng estimate for an ICC profile
1044 * 1: the new gamma value comes from a gAMA chunk
1045 * 2: the new gamma value comes from an sRGB chunk
1048 png_fixed_point gtest;
1050 if ((colorspace->flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
1051 (png_muldiv(&gtest, colorspace->gamma, PNG_FP_1, gAMA) == 0 ||
1052 png_gamma_significant(gtest) != 0))
1054 /* Either this is an sRGB image, in which case the calculated gamma
1055 * approximation should match, or this is an image with a profile and the
1056 * value libpng calculates for the gamma of the profile does not match the
1057 * value recorded in the file. The former, sRGB, case is an error, the
1058 * latter is just a warning.
1060 if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0 || from == 2)
1062 png_chunk_report(png_ptr, "gamma value does not match sRGB",
1063 PNG_CHUNK_ERROR);
1064 /* Do not overwrite an sRGB value */
1065 return from == 2;
1068 else /* sRGB tag not involved */
1070 png_chunk_report(png_ptr, "gamma value does not match libpng estimate",
1071 PNG_CHUNK_WARNING);
1072 return from == 1;
1076 return 1;
1079 void /* PRIVATE */
1080 png_colorspace_set_gamma(png_const_structrp png_ptr,
1081 png_colorspacerp colorspace, png_fixed_point gAMA)
1083 /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't
1084 * occur. Since the fixed point representation is asymetrical it is
1085 * possible for 1/gamma to overflow the limit of 21474 and this means the
1086 * gamma value must be at least 5/100000 and hence at most 20000.0. For
1087 * safety the limits here are a little narrower. The values are 0.00016 to
1088 * 6250.0, which are truly ridiculous gamma values (and will produce
1089 * displays that are all black or all white.)
1091 * In 1.6.0 this test replaces the ones in pngrutil.c, in the gAMA chunk
1092 * handling code, which only required the value to be >0.
1094 png_const_charp errmsg;
1096 if (gAMA < 16 || gAMA > 625000000)
1097 errmsg = "gamma value out of range";
1099 # ifdef PNG_READ_gAMA_SUPPORTED
1100 /* Allow the application to set the gamma value more than once */
1101 else if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
1102 (colorspace->flags & PNG_COLORSPACE_FROM_gAMA) != 0)
1103 errmsg = "duplicate";
1104 # endif
1106 /* Do nothing if the colorspace is already invalid */
1107 else if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
1108 return;
1110 else
1112 if (png_colorspace_check_gamma(png_ptr, colorspace, gAMA,
1113 1/*from gAMA*/) != 0)
1115 /* Store this gamma value. */
1116 colorspace->gamma = gAMA;
1117 colorspace->flags |=
1118 (PNG_COLORSPACE_HAVE_GAMMA | PNG_COLORSPACE_FROM_gAMA);
1121 /* At present if the check_gamma test fails the gamma of the colorspace is
1122 * not updated however the colorspace is not invalidated. This
1123 * corresponds to the case where the existing gamma comes from an sRGB
1124 * chunk or profile. An error message has already been output.
1126 return;
1129 /* Error exit - errmsg has been set. */
1130 colorspace->flags |= PNG_COLORSPACE_INVALID;
1131 png_chunk_report(png_ptr, errmsg, PNG_CHUNK_WRITE_ERROR);
1134 void /* PRIVATE */
1135 png_colorspace_sync_info(png_const_structrp png_ptr, png_inforp info_ptr)
1137 if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)
1139 /* Everything is invalid */
1140 info_ptr->valid &= ~(PNG_INFO_gAMA|PNG_INFO_cHRM|PNG_INFO_sRGB|
1141 PNG_INFO_iCCP);
1143 # ifdef PNG_COLORSPACE_SUPPORTED
1144 /* Clean up the iCCP profile now if it won't be used. */
1145 png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, -1/*not used*/);
1146 # else
1147 PNG_UNUSED(png_ptr)
1148 # endif
1151 else
1153 # ifdef PNG_COLORSPACE_SUPPORTED
1154 /* Leave the INFO_iCCP flag set if the pngset.c code has already set
1155 * it; this allows a PNG to contain a profile which matches sRGB and
1156 * yet still have that profile retrievable by the application.
1158 if ((info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) != 0)
1159 info_ptr->valid |= PNG_INFO_sRGB;
1161 else
1162 info_ptr->valid &= ~PNG_INFO_sRGB;
1164 if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
1165 info_ptr->valid |= PNG_INFO_cHRM;
1167 else
1168 info_ptr->valid &= ~PNG_INFO_cHRM;
1169 # endif
1171 if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0)
1172 info_ptr->valid |= PNG_INFO_gAMA;
1174 else
1175 info_ptr->valid &= ~PNG_INFO_gAMA;
1179 #ifdef PNG_READ_SUPPORTED
1180 void /* PRIVATE */
1181 png_colorspace_sync(png_const_structrp png_ptr, png_inforp info_ptr)
1183 if (info_ptr == NULL) /* reduce code size; check here not in the caller */
1184 return;
1186 info_ptr->colorspace = png_ptr->colorspace;
1187 png_colorspace_sync_info(png_ptr, info_ptr);
1189 #endif
1190 #endif /* GAMMA */
1192 #ifdef PNG_COLORSPACE_SUPPORTED
1193 /* Added at libpng-1.5.5 to support read and write of true CIEXYZ values for
1194 * cHRM, as opposed to using chromaticities. These internal APIs return
1195 * non-zero on a parameter error. The X, Y and Z values are required to be
1196 * positive and less than 1.0.
1198 static int
1199 png_xy_from_XYZ(png_xy *xy, const png_XYZ *XYZ)
1201 png_int_32 d, dwhite, whiteX, whiteY;
1203 d = XYZ->red_X + XYZ->red_Y + XYZ->red_Z;
1204 if (png_muldiv(&xy->redx, XYZ->red_X, PNG_FP_1, d) == 0)
1205 return 1;
1206 if (png_muldiv(&xy->redy, XYZ->red_Y, PNG_FP_1, d) == 0)
1207 return 1;
1208 dwhite = d;
1209 whiteX = XYZ->red_X;
1210 whiteY = XYZ->red_Y;
1212 d = XYZ->green_X + XYZ->green_Y + XYZ->green_Z;
1213 if (png_muldiv(&xy->greenx, XYZ->green_X, PNG_FP_1, d) == 0)
1214 return 1;
1215 if (png_muldiv(&xy->greeny, XYZ->green_Y, PNG_FP_1, d) == 0)
1216 return 1;
1217 dwhite += d;
1218 whiteX += XYZ->green_X;
1219 whiteY += XYZ->green_Y;
1221 d = XYZ->blue_X + XYZ->blue_Y + XYZ->blue_Z;
1222 if (png_muldiv(&xy->bluex, XYZ->blue_X, PNG_FP_1, d) == 0)
1223 return 1;
1224 if (png_muldiv(&xy->bluey, XYZ->blue_Y, PNG_FP_1, d) == 0)
1225 return 1;
1226 dwhite += d;
1227 whiteX += XYZ->blue_X;
1228 whiteY += XYZ->blue_Y;
1230 /* The reference white is simply the sum of the end-point (X,Y,Z) vectors,
1231 * thus:
1233 if (png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite) == 0)
1234 return 1;
1235 if (png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite) == 0)
1236 return 1;
1238 return 0;
1241 static int
1242 png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy)
1244 png_fixed_point red_inverse, green_inverse, blue_scale;
1245 png_fixed_point left, right, denominator;
1247 /* Check xy and, implicitly, z. Note that wide gamut color spaces typically
1248 * have end points with 0 tristimulus values (these are impossible end
1249 * points, but they are used to cover the possible colors). We check
1250 * xy->whitey against 5, not 0, to avoid a possible integer overflow.
1252 if (xy->redx < 0 || xy->redx > PNG_FP_1) return 1;
1253 if (xy->redy < 0 || xy->redy > PNG_FP_1-xy->redx) return 1;
1254 if (xy->greenx < 0 || xy->greenx > PNG_FP_1) return 1;
1255 if (xy->greeny < 0 || xy->greeny > PNG_FP_1-xy->greenx) return 1;
1256 if (xy->bluex < 0 || xy->bluex > PNG_FP_1) return 1;
1257 if (xy->bluey < 0 || xy->bluey > PNG_FP_1-xy->bluex) return 1;
1258 if (xy->whitex < 0 || xy->whitex > PNG_FP_1) return 1;
1259 if (xy->whitey < 5 || xy->whitey > PNG_FP_1-xy->whitex) return 1;
1261 /* The reverse calculation is more difficult because the original tristimulus
1262 * value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8
1263 * derived values were recorded in the cHRM chunk;
1264 * (red,green,blue,white)x(x,y). This loses one degree of freedom and
1265 * therefore an arbitrary ninth value has to be introduced to undo the
1266 * original transformations.
1268 * Think of the original end-points as points in (X,Y,Z) space. The
1269 * chromaticity values (c) have the property:
1272 * c = ---------
1273 * X + Y + Z
1275 * For each c (x,y,z) from the corresponding original C (X,Y,Z). Thus the
1276 * three chromaticity values (x,y,z) for each end-point obey the
1277 * relationship:
1279 * x + y + z = 1
1281 * This describes the plane in (X,Y,Z) space that intersects each axis at the
1282 * value 1.0; call this the chromaticity plane. Thus the chromaticity
1283 * calculation has scaled each end-point so that it is on the x+y+z=1 plane
1284 * and chromaticity is the intersection of the vector from the origin to the
1285 * (X,Y,Z) value with the chromaticity plane.
1287 * To fully invert the chromaticity calculation we would need the three
1288 * end-point scale factors, (red-scale, green-scale, blue-scale), but these
1289 * were not recorded. Instead we calculated the reference white (X,Y,Z) and
1290 * recorded the chromaticity of this. The reference white (X,Y,Z) would have
1291 * given all three of the scale factors since:
1293 * color-C = color-c * color-scale
1294 * white-C = red-C + green-C + blue-C
1295 * = red-c*red-scale + green-c*green-scale + blue-c*blue-scale
1297 * But cHRM records only white-x and white-y, so we have lost the white scale
1298 * factor:
1300 * white-C = white-c*white-scale
1302 * To handle this the inverse transformation makes an arbitrary assumption
1303 * about white-scale:
1305 * Assume: white-Y = 1.0
1306 * Hence: white-scale = 1/white-y
1307 * Or: red-Y + green-Y + blue-Y = 1.0
1309 * Notice the last statement of the assumption gives an equation in three of
1310 * the nine values we want to calculate. 8 more equations come from the
1311 * above routine as summarised at the top above (the chromaticity
1312 * calculation):
1314 * Given: color-x = color-X / (color-X + color-Y + color-Z)
1315 * Hence: (color-x - 1)*color-X + color.x*color-Y + color.x*color-Z = 0
1317 * This is 9 simultaneous equations in the 9 variables "color-C" and can be
1318 * solved by Cramer's rule. Cramer's rule requires calculating 10 9x9 matrix
1319 * determinants, however this is not as bad as it seems because only 28 of
1320 * the total of 90 terms in the various matrices are non-zero. Nevertheless
1321 * Cramer's rule is notoriously numerically unstable because the determinant
1322 * calculation involves the difference of large, but similar, numbers. It is
1323 * difficult to be sure that the calculation is stable for real world values
1324 * and it is certain that it becomes unstable where the end points are close
1325 * together.
1327 * So this code uses the perhaps slightly less optimal but more
1328 * understandable and totally obvious approach of calculating color-scale.
1330 * This algorithm depends on the precision in white-scale and that is
1331 * (1/white-y), so we can immediately see that as white-y approaches 0 the
1332 * accuracy inherent in the cHRM chunk drops off substantially.
1334 * libpng arithmetic: a simple inversion of the above equations
1335 * ------------------------------------------------------------
1337 * white_scale = 1/white-y
1338 * white-X = white-x * white-scale
1339 * white-Y = 1.0
1340 * white-Z = (1 - white-x - white-y) * white_scale
1342 * white-C = red-C + green-C + blue-C
1343 * = red-c*red-scale + green-c*green-scale + blue-c*blue-scale
1345 * This gives us three equations in (red-scale,green-scale,blue-scale) where
1346 * all the coefficients are now known:
1348 * red-x*red-scale + green-x*green-scale + blue-x*blue-scale
1349 * = white-x/white-y
1350 * red-y*red-scale + green-y*green-scale + blue-y*blue-scale = 1
1351 * red-z*red-scale + green-z*green-scale + blue-z*blue-scale
1352 * = (1 - white-x - white-y)/white-y
1354 * In the last equation color-z is (1 - color-x - color-y) so we can add all
1355 * three equations together to get an alternative third:
1357 * red-scale + green-scale + blue-scale = 1/white-y = white-scale
1359 * So now we have a Cramer's rule solution where the determinants are just
1360 * 3x3 - far more tractible. Unfortunately 3x3 determinants still involve
1361 * multiplication of three coefficients so we can't guarantee to avoid
1362 * overflow in the libpng fixed point representation. Using Cramer's rule in
1363 * floating point is probably a good choice here, but it's not an option for
1364 * fixed point. Instead proceed to simplify the first two equations by
1365 * eliminating what is likely to be the largest value, blue-scale:
1367 * blue-scale = white-scale - red-scale - green-scale
1369 * Hence:
1371 * (red-x - blue-x)*red-scale + (green-x - blue-x)*green-scale =
1372 * (white-x - blue-x)*white-scale
1374 * (red-y - blue-y)*red-scale + (green-y - blue-y)*green-scale =
1375 * 1 - blue-y*white-scale
1377 * And now we can trivially solve for (red-scale,green-scale):
1379 * green-scale =
1380 * (white-x - blue-x)*white-scale - (red-x - blue-x)*red-scale
1381 * -----------------------------------------------------------
1382 * green-x - blue-x
1384 * red-scale =
1385 * 1 - blue-y*white-scale - (green-y - blue-y) * green-scale
1386 * ---------------------------------------------------------
1387 * red-y - blue-y
1389 * Hence:
1391 * red-scale =
1392 * ( (green-x - blue-x) * (white-y - blue-y) -
1393 * (green-y - blue-y) * (white-x - blue-x) ) / white-y
1394 * -------------------------------------------------------------------------
1395 * (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)
1397 * green-scale =
1398 * ( (red-y - blue-y) * (white-x - blue-x) -
1399 * (red-x - blue-x) * (white-y - blue-y) ) / white-y
1400 * -------------------------------------------------------------------------
1401 * (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)
1403 * Accuracy:
1404 * The input values have 5 decimal digits of accuracy. The values are all in
1405 * the range 0 < value < 1, so simple products are in the same range but may
1406 * need up to 10 decimal digits to preserve the original precision and avoid
1407 * underflow. Because we are using a 32-bit signed representation we cannot
1408 * match this; the best is a little over 9 decimal digits, less than 10.
1410 * The approach used here is to preserve the maximum precision within the
1411 * signed representation. Because the red-scale calculation above uses the
1412 * difference between two products of values that must be in the range -1..+1
1413 * it is sufficient to divide the product by 7; ceil(100,000/32767*2). The
1414 * factor is irrelevant in the calculation because it is applied to both
1415 * numerator and denominator.
1417 * Note that the values of the differences of the products of the
1418 * chromaticities in the above equations tend to be small, for example for
1419 * the sRGB chromaticities they are:
1421 * red numerator: -0.04751
1422 * green numerator: -0.08788
1423 * denominator: -0.2241 (without white-y multiplication)
1425 * The resultant Y coefficients from the chromaticities of some widely used
1426 * color space definitions are (to 15 decimal places):
1428 * sRGB
1429 * 0.212639005871510 0.715168678767756 0.072192315360734
1430 * Kodak ProPhoto
1431 * 0.288071128229293 0.711843217810102 0.000085653960605
1432 * Adobe RGB
1433 * 0.297344975250536 0.627363566255466 0.075291458493998
1434 * Adobe Wide Gamut RGB
1435 * 0.258728243040113 0.724682314948566 0.016589442011321
1437 /* By the argument, above overflow should be impossible here. The return
1438 * value of 2 indicates an internal error to the caller.
1440 if (png_muldiv(&left, xy->greenx-xy->bluex, xy->redy - xy->bluey, 7) == 0)
1441 return 2;
1442 if (png_muldiv(&right, xy->greeny-xy->bluey, xy->redx - xy->bluex, 7) == 0)
1443 return 2;
1444 denominator = left - right;
1446 /* Now find the red numerator. */
1447 if (png_muldiv(&left, xy->greenx-xy->bluex, xy->whitey-xy->bluey, 7) == 0)
1448 return 2;
1449 if (png_muldiv(&right, xy->greeny-xy->bluey, xy->whitex-xy->bluex, 7) == 0)
1450 return 2;
1452 /* Overflow is possible here and it indicates an extreme set of PNG cHRM
1453 * chunk values. This calculation actually returns the reciprocal of the
1454 * scale value because this allows us to delay the multiplication of white-y
1455 * into the denominator, which tends to produce a small number.
1457 if (png_muldiv(&red_inverse, xy->whitey, denominator, left-right) == 0 ||
1458 red_inverse <= xy->whitey /* r+g+b scales = white scale */)
1459 return 1;
1461 /* Similarly for green_inverse: */
1462 if (png_muldiv(&left, xy->redy-xy->bluey, xy->whitex-xy->bluex, 7) == 0)
1463 return 2;
1464 if (png_muldiv(&right, xy->redx-xy->bluex, xy->whitey-xy->bluey, 7) == 0)
1465 return 2;
1466 if (png_muldiv(&green_inverse, xy->whitey, denominator, left-right) == 0 ||
1467 green_inverse <= xy->whitey)
1468 return 1;
1470 /* And the blue scale, the checks above guarantee this can't overflow but it
1471 * can still produce 0 for extreme cHRM values.
1473 blue_scale = png_reciprocal(xy->whitey) - png_reciprocal(red_inverse) -
1474 png_reciprocal(green_inverse);
1475 if (blue_scale <= 0)
1476 return 1;
1479 /* And fill in the png_XYZ: */
1480 if (png_muldiv(&XYZ->red_X, xy->redx, PNG_FP_1, red_inverse) == 0)
1481 return 1;
1482 if (png_muldiv(&XYZ->red_Y, xy->redy, PNG_FP_1, red_inverse) == 0)
1483 return 1;
1484 if (png_muldiv(&XYZ->red_Z, PNG_FP_1 - xy->redx - xy->redy, PNG_FP_1,
1485 red_inverse) == 0)
1486 return 1;
1488 if (png_muldiv(&XYZ->green_X, xy->greenx, PNG_FP_1, green_inverse) == 0)
1489 return 1;
1490 if (png_muldiv(&XYZ->green_Y, xy->greeny, PNG_FP_1, green_inverse) == 0)
1491 return 1;
1492 if (png_muldiv(&XYZ->green_Z, PNG_FP_1 - xy->greenx - xy->greeny, PNG_FP_1,
1493 green_inverse) == 0)
1494 return 1;
1496 if (png_muldiv(&XYZ->blue_X, xy->bluex, blue_scale, PNG_FP_1) == 0)
1497 return 1;
1498 if (png_muldiv(&XYZ->blue_Y, xy->bluey, blue_scale, PNG_FP_1) == 0)
1499 return 1;
1500 if (png_muldiv(&XYZ->blue_Z, PNG_FP_1 - xy->bluex - xy->bluey, blue_scale,
1501 PNG_FP_1) == 0)
1502 return 1;
1504 return 0; /*success*/
1507 static int
1508 png_XYZ_normalize(png_XYZ *XYZ)
1510 png_int_32 Y;
1512 if (XYZ->red_Y < 0 || XYZ->green_Y < 0 || XYZ->blue_Y < 0 ||
1513 XYZ->red_X < 0 || XYZ->green_X < 0 || XYZ->blue_X < 0 ||
1514 XYZ->red_Z < 0 || XYZ->green_Z < 0 || XYZ->blue_Z < 0)
1515 return 1;
1517 /* Normalize by scaling so the sum of the end-point Y values is PNG_FP_1.
1518 * IMPLEMENTATION NOTE: ANSI requires signed overflow not to occur, therefore
1519 * relying on addition of two positive values producing a negative one is not
1520 * safe.
1522 Y = XYZ->red_Y;
1523 if (0x7fffffff - Y < XYZ->green_X)
1524 return 1;
1525 Y += XYZ->green_Y;
1526 if (0x7fffffff - Y < XYZ->blue_X)
1527 return 1;
1528 Y += XYZ->blue_Y;
1530 if (Y != PNG_FP_1)
1532 if (png_muldiv(&XYZ->red_X, XYZ->red_X, PNG_FP_1, Y) == 0)
1533 return 1;
1534 if (png_muldiv(&XYZ->red_Y, XYZ->red_Y, PNG_FP_1, Y) == 0)
1535 return 1;
1536 if (png_muldiv(&XYZ->red_Z, XYZ->red_Z, PNG_FP_1, Y) == 0)
1537 return 1;
1539 if (png_muldiv(&XYZ->green_X, XYZ->green_X, PNG_FP_1, Y) == 0)
1540 return 1;
1541 if (png_muldiv(&XYZ->green_Y, XYZ->green_Y, PNG_FP_1, Y) == 0)
1542 return 1;
1543 if (png_muldiv(&XYZ->green_Z, XYZ->green_Z, PNG_FP_1, Y) == 0)
1544 return 1;
1546 if (png_muldiv(&XYZ->blue_X, XYZ->blue_X, PNG_FP_1, Y) == 0)
1547 return 1;
1548 if (png_muldiv(&XYZ->blue_Y, XYZ->blue_Y, PNG_FP_1, Y) == 0)
1549 return 1;
1550 if (png_muldiv(&XYZ->blue_Z, XYZ->blue_Z, PNG_FP_1, Y) == 0)
1551 return 1;
1554 return 0;
1557 static int
1558 png_colorspace_endpoints_match(const png_xy *xy1, const png_xy *xy2, int delta)
1560 /* Allow an error of +/-0.01 (absolute value) on each chromaticity */
1561 if (PNG_OUT_OF_RANGE(xy1->whitex, xy2->whitex,delta) ||
1562 PNG_OUT_OF_RANGE(xy1->whitey, xy2->whitey,delta) ||
1563 PNG_OUT_OF_RANGE(xy1->redx, xy2->redx, delta) ||
1564 PNG_OUT_OF_RANGE(xy1->redy, xy2->redy, delta) ||
1565 PNG_OUT_OF_RANGE(xy1->greenx, xy2->greenx,delta) ||
1566 PNG_OUT_OF_RANGE(xy1->greeny, xy2->greeny,delta) ||
1567 PNG_OUT_OF_RANGE(xy1->bluex, xy2->bluex, delta) ||
1568 PNG_OUT_OF_RANGE(xy1->bluey, xy2->bluey, delta))
1569 return 0;
1570 return 1;
1573 /* Added in libpng-1.6.0, a different check for the validity of a set of cHRM
1574 * chunk chromaticities. Earlier checks used to simply look for the overflow
1575 * condition (where the determinant of the matrix to solve for XYZ ends up zero
1576 * because the chromaticity values are not all distinct.) Despite this it is
1577 * theoretically possible to produce chromaticities that are apparently valid
1578 * but that rapidly degrade to invalid, potentially crashing, sets because of
1579 * arithmetic inaccuracies when calculations are performed on them. The new
1580 * check is to round-trip xy -> XYZ -> xy and then check that the result is
1581 * within a small percentage of the original.
1583 static int
1584 png_colorspace_check_xy(png_XYZ *XYZ, const png_xy *xy)
1586 int result;
1587 png_xy xy_test;
1589 /* As a side-effect this routine also returns the XYZ endpoints. */
1590 result = png_XYZ_from_xy(XYZ, xy);
1591 if (result != 0)
1592 return result;
1594 result = png_xy_from_XYZ(&xy_test, XYZ);
1595 if (result != 0)
1596 return result;
1598 if (png_colorspace_endpoints_match(xy, &xy_test,
1599 5/*actually, the math is pretty accurate*/) != 0)
1600 return 0;
1602 /* Too much slip */
1603 return 1;
1606 /* This is the check going the other way. The XYZ is modified to normalize it
1607 * (another side-effect) and the xy chromaticities are returned.
1609 static int
1610 png_colorspace_check_XYZ(png_xy *xy, png_XYZ *XYZ)
1612 int result;
1613 png_XYZ XYZtemp;
1615 result = png_XYZ_normalize(XYZ);
1616 if (result != 0)
1617 return result;
1619 result = png_xy_from_XYZ(xy, XYZ);
1620 if (result != 0)
1621 return result;
1623 XYZtemp = *XYZ;
1624 return png_colorspace_check_xy(&XYZtemp, xy);
1627 /* Used to check for an endpoint match against sRGB */
1628 static const png_xy sRGB_xy = /* From ITU-R BT.709-3 */
1630 /* color x y */
1631 /* red */ 64000, 33000,
1632 /* green */ 30000, 60000,
1633 /* blue */ 15000, 6000,
1634 /* white */ 31270, 32900
1637 static int
1638 png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr,
1639 png_colorspacerp colorspace, const png_xy *xy, const png_XYZ *XYZ,
1640 int preferred)
1642 if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
1643 return 0;
1645 /* The consistency check is performed on the chromaticities; this factors out
1646 * variations because of the normalization (or not) of the end point Y
1647 * values.
1649 if (preferred < 2 &&
1650 (colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
1652 /* The end points must be reasonably close to any we already have. The
1653 * following allows an error of up to +/-.001
1655 if (png_colorspace_endpoints_match(xy, &colorspace->end_points_xy,
1656 100) == 0)
1658 colorspace->flags |= PNG_COLORSPACE_INVALID;
1659 png_benign_error(png_ptr, "inconsistent chromaticities");
1660 return 0; /* failed */
1663 /* Only overwrite with preferred values */
1664 if (preferred == 0)
1665 return 1; /* ok, but no change */
1668 colorspace->end_points_xy = *xy;
1669 colorspace->end_points_XYZ = *XYZ;
1670 colorspace->flags |= PNG_COLORSPACE_HAVE_ENDPOINTS;
1672 /* The end points are normally quoted to two decimal digits, so allow +/-0.01
1673 * on this test.
1675 if (png_colorspace_endpoints_match(xy, &sRGB_xy, 1000) != 0)
1676 colorspace->flags |= PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB;
1678 else
1679 colorspace->flags &= PNG_COLORSPACE_CANCEL(
1680 PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB);
1682 return 2; /* ok and changed */
1685 int /* PRIVATE */
1686 png_colorspace_set_chromaticities(png_const_structrp png_ptr,
1687 png_colorspacerp colorspace, const png_xy *xy, int preferred)
1689 /* We must check the end points to ensure they are reasonable - in the past
1690 * color management systems have crashed as a result of getting bogus
1691 * colorant values, while this isn't the fault of libpng it is the
1692 * responsibility of libpng because PNG carries the bomb and libpng is in a
1693 * position to protect against it.
1695 png_XYZ XYZ;
1697 switch (png_colorspace_check_xy(&XYZ, xy))
1699 case 0: /* success */
1700 return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, xy, &XYZ,
1701 preferred);
1703 case 1:
1704 /* We can't invert the chromaticities so we can't produce value XYZ
1705 * values. Likely as not a color management system will fail too.
1707 colorspace->flags |= PNG_COLORSPACE_INVALID;
1708 png_benign_error(png_ptr, "invalid chromaticities");
1709 break;
1711 default:
1712 /* libpng is broken; this should be a warning but if it happens we
1713 * want error reports so for the moment it is an error.
1715 colorspace->flags |= PNG_COLORSPACE_INVALID;
1716 png_error(png_ptr, "internal error checking chromaticities");
1719 return 0; /* failed */
1722 int /* PRIVATE */
1723 png_colorspace_set_endpoints(png_const_structrp png_ptr,
1724 png_colorspacerp colorspace, const png_XYZ *XYZ_in, int preferred)
1726 png_XYZ XYZ = *XYZ_in;
1727 png_xy xy;
1729 switch (png_colorspace_check_XYZ(&xy, &XYZ))
1731 case 0:
1732 return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, &xy, &XYZ,
1733 preferred);
1735 case 1:
1736 /* End points are invalid. */
1737 colorspace->flags |= PNG_COLORSPACE_INVALID;
1738 png_benign_error(png_ptr, "invalid end points");
1739 break;
1741 default:
1742 colorspace->flags |= PNG_COLORSPACE_INVALID;
1743 png_error(png_ptr, "internal error checking chromaticities");
1746 return 0; /* failed */
1749 #if defined(PNG_sRGB_SUPPORTED) || defined(PNG_iCCP_SUPPORTED)
1750 /* Error message generation */
1751 static char
1752 png_icc_tag_char(png_uint_32 byte)
1754 byte &= 0xff;
1755 if (byte >= 32 && byte <= 126)
1756 return (char)byte;
1757 else
1758 return '?';
1761 static void
1762 png_icc_tag_name(char *name, png_uint_32 tag)
1764 name[0] = '\'';
1765 name[1] = png_icc_tag_char(tag >> 24);
1766 name[2] = png_icc_tag_char(tag >> 16);
1767 name[3] = png_icc_tag_char(tag >> 8);
1768 name[4] = png_icc_tag_char(tag );
1769 name[5] = '\'';
1772 static int
1773 is_ICC_signature_char(png_alloc_size_t it)
1775 return it == 32 || (it >= 48 && it <= 57) || (it >= 65 && it <= 90) ||
1776 (it >= 97 && it <= 122);
1779 static int
1780 is_ICC_signature(png_alloc_size_t it)
1782 return is_ICC_signature_char(it >> 24) /* checks all the top bits */ &&
1783 is_ICC_signature_char((it >> 16) & 0xff) &&
1784 is_ICC_signature_char((it >> 8) & 0xff) &&
1785 is_ICC_signature_char(it & 0xff);
1788 static int
1789 png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace,
1790 png_const_charp name, png_alloc_size_t value, png_const_charp reason)
1792 size_t pos;
1793 char message[196]; /* see below for calculation */
1795 if (colorspace != NULL)
1796 colorspace->flags |= PNG_COLORSPACE_INVALID;
1798 pos = png_safecat(message, (sizeof message), 0, "profile '"); /* 9 chars */
1799 pos = png_safecat(message, pos+79, pos, name); /* Truncate to 79 chars */
1800 pos = png_safecat(message, (sizeof message), pos, "': "); /* +2 = 90 */
1801 if (is_ICC_signature(value) != 0)
1803 /* So 'value' is at most 4 bytes and the following cast is safe */
1804 png_icc_tag_name(message+pos, (png_uint_32)value);
1805 pos += 6; /* total +8; less than the else clause */
1806 message[pos++] = ':';
1807 message[pos++] = ' ';
1809 # ifdef PNG_WARNINGS_SUPPORTED
1810 else
1812 char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/
1814 pos = png_safecat(message, (sizeof message), pos,
1815 png_format_number(number, number+(sizeof number),
1816 PNG_NUMBER_FORMAT_x, value));
1817 pos = png_safecat(message, (sizeof message), pos, "h: "); /*+2 = 116*/
1819 # endif
1820 /* The 'reason' is an arbitrary message, allow +79 maximum 195 */
1821 pos = png_safecat(message, (sizeof message), pos, reason);
1822 PNG_UNUSED(pos)
1824 /* This is recoverable, but make it unconditionally an app_error on write to
1825 * avoid writing invalid ICC profiles into PNG files (i.e., we handle them
1826 * on read, with a warning, but on write unless the app turns off
1827 * application errors the PNG won't be written.)
1829 png_chunk_report(png_ptr, message,
1830 (colorspace != NULL) ? PNG_CHUNK_ERROR : PNG_CHUNK_WRITE_ERROR);
1832 return 0;
1834 #endif /* sRGB || iCCP */
1836 #ifdef PNG_sRGB_SUPPORTED
1837 int /* PRIVATE */
1838 png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,
1839 int intent)
1841 /* sRGB sets known gamma, end points and (from the chunk) intent. */
1842 /* IMPORTANT: these are not necessarily the values found in an ICC profile
1843 * because ICC profiles store values adapted to a D50 environment; it is
1844 * expected that the ICC profile mediaWhitePointTag will be D50; see the
1845 * checks and code elsewhere to understand this better.
1847 * These XYZ values, which are accurate to 5dp, produce rgb to gray
1848 * coefficients of (6968,23435,2366), which are reduced (because they add up
1849 * to 32769 not 32768) to (6968,23434,2366). These are the values that
1850 * libpng has traditionally used (and are the best values given the 15bit
1851 * algorithm used by the rgb to gray code.)
1853 static const png_XYZ sRGB_XYZ = /* D65 XYZ (*not* the D50 adapted values!) */
1855 /* color X Y Z */
1856 /* red */ 41239, 21264, 1933,
1857 /* green */ 35758, 71517, 11919,
1858 /* blue */ 18048, 7219, 95053
1861 /* Do nothing if the colorspace is already invalidated. */
1862 if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
1863 return 0;
1865 /* Check the intent, then check for existing settings. It is valid for the
1866 * PNG file to have cHRM or gAMA chunks along with sRGB, but the values must
1867 * be consistent with the correct values. If, however, this function is
1868 * called below because an iCCP chunk matches sRGB then it is quite
1869 * conceivable that an older app recorded incorrect gAMA and cHRM because of
1870 * an incorrect calculation based on the values in the profile - this does
1871 * *not* invalidate the profile (though it still produces an error, which can
1872 * be ignored.)
1874 if (intent < 0 || intent >= PNG_sRGB_INTENT_LAST)
1875 return png_icc_profile_error(png_ptr, colorspace, "sRGB",
1876 (unsigned)intent, "invalid sRGB rendering intent");
1878 if ((colorspace->flags & PNG_COLORSPACE_HAVE_INTENT) != 0 &&
1879 colorspace->rendering_intent != intent)
1880 return png_icc_profile_error(png_ptr, colorspace, "sRGB",
1881 (unsigned)intent, "inconsistent rendering intents");
1883 if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0)
1885 png_benign_error(png_ptr, "duplicate sRGB information ignored");
1886 return 0;
1889 /* If the standard sRGB cHRM chunk does not match the one from the PNG file
1890 * warn but overwrite the value with the correct one.
1892 if ((colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0 &&
1893 !png_colorspace_endpoints_match(&sRGB_xy, &colorspace->end_points_xy,
1894 100))
1895 png_chunk_report(png_ptr, "cHRM chunk does not match sRGB",
1896 PNG_CHUNK_ERROR);
1898 /* This check is just done for the error reporting - the routine always
1899 * returns true when the 'from' argument corresponds to sRGB (2).
1901 (void)png_colorspace_check_gamma(png_ptr, colorspace, PNG_GAMMA_sRGB_INVERSE,
1902 2/*from sRGB*/);
1904 /* intent: bugs in GCC force 'int' to be used as the parameter type. */
1905 colorspace->rendering_intent = (png_uint_16)intent;
1906 colorspace->flags |= PNG_COLORSPACE_HAVE_INTENT;
1908 /* endpoints */
1909 colorspace->end_points_xy = sRGB_xy;
1910 colorspace->end_points_XYZ = sRGB_XYZ;
1911 colorspace->flags |=
1912 (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB);
1914 /* gamma */
1915 colorspace->gamma = PNG_GAMMA_sRGB_INVERSE;
1916 colorspace->flags |= PNG_COLORSPACE_HAVE_GAMMA;
1918 /* Finally record that we have an sRGB profile */
1919 colorspace->flags |=
1920 (PNG_COLORSPACE_MATCHES_sRGB|PNG_COLORSPACE_FROM_sRGB);
1922 return 1; /* set */
1924 #endif /* sRGB */
1926 #ifdef PNG_iCCP_SUPPORTED
1927 /* Encoded value of D50 as an ICC XYZNumber. From the ICC 2010 spec the value
1928 * is XYZ(0.9642,1.0,0.8249), which scales to:
1930 * (63189.8112, 65536, 54060.6464)
1932 static const png_byte D50_nCIEXYZ[12] =
1933 { 0x00, 0x00, 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d };
1935 static int /* bool */
1936 icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace,
1937 png_const_charp name, png_uint_32 profile_length)
1939 if (profile_length < 132)
1940 return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
1941 "too short");
1943 return 1;
1946 #ifdef PNG_READ_iCCP_SUPPORTED
1947 int /* PRIVATE */
1948 png_icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace,
1949 png_const_charp name, png_uint_32 profile_length)
1951 if (!icc_check_length(png_ptr, colorspace, name, profile_length))
1952 return 0;
1954 /* This needs to be here because the 'normal' check is in
1955 * png_decompress_chunk, yet this happens after the attempt to
1956 * png_malloc_base the required data. We only need this on read; on write
1957 * the caller supplies the profile buffer so libpng doesn't allocate it. See
1958 * the call to icc_check_length below (the write case).
1960 # ifdef PNG_SET_USER_LIMITS_SUPPORTED
1961 else if (png_ptr->user_chunk_malloc_max > 0 &&
1962 png_ptr->user_chunk_malloc_max < profile_length)
1963 return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
1964 "exceeds application limits");
1965 # elif PNG_USER_CHUNK_MALLOC_MAX > 0
1966 else if (PNG_USER_CHUNK_MALLOC_MAX < profile_length)
1967 return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
1968 "exceeds libpng limits");
1969 # else /* !SET_USER_LIMITS */
1970 /* This will get compiled out on all 32-bit and better systems. */
1971 else if (PNG_SIZE_MAX < profile_length)
1972 return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
1973 "exceeds system limits");
1974 # endif /* !SET_USER_LIMITS */
1976 return 1;
1978 #endif /* READ_iCCP */
1980 int /* PRIVATE */
1981 png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
1982 png_const_charp name, png_uint_32 profile_length,
1983 png_const_bytep profile/* first 132 bytes only */, int color_type)
1985 png_uint_32 temp;
1987 /* Length check; this cannot be ignored in this code because profile_length
1988 * is used later to check the tag table, so even if the profile seems over
1989 * long profile_length from the caller must be correct. The caller can fix
1990 * this up on read or write by just passing in the profile header length.
1992 temp = png_get_uint_32(profile);
1993 if (temp != profile_length)
1994 return png_icc_profile_error(png_ptr, colorspace, name, temp,
1995 "length does not match profile");
1997 temp = (png_uint_32) (*(profile+8));
1998 if (temp > 3 && (profile_length & 3))
1999 return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
2000 "invalid length");
2002 temp = png_get_uint_32(profile+128); /* tag count: 12 bytes/tag */
2003 if (temp > 357913930 || /* (2^32-4-132)/12: maximum possible tag count */
2004 profile_length < 132+12*temp) /* truncated tag table */
2005 return png_icc_profile_error(png_ptr, colorspace, name, temp,
2006 "tag count too large");
2008 /* The 'intent' must be valid or we can't store it, ICC limits the intent to
2009 * 16 bits.
2011 temp = png_get_uint_32(profile+64);
2012 if (temp >= 0xffff) /* The ICC limit */
2013 return png_icc_profile_error(png_ptr, colorspace, name, temp,
2014 "invalid rendering intent");
2016 /* This is just a warning because the profile may be valid in future
2017 * versions.
2019 if (temp >= PNG_sRGB_INTENT_LAST)
2020 (void)png_icc_profile_error(png_ptr, NULL, name, temp,
2021 "intent outside defined range");
2023 /* At this point the tag table can't be checked because it hasn't necessarily
2024 * been loaded; however, various header fields can be checked. These checks
2025 * are for values permitted by the PNG spec in an ICC profile; the PNG spec
2026 * restricts the profiles that can be passed in an iCCP chunk (they must be
2027 * appropriate to processing PNG data!)
2030 /* Data checks (could be skipped). These checks must be independent of the
2031 * version number; however, the version number doesn't accomodate changes in
2032 * the header fields (just the known tags and the interpretation of the
2033 * data.)
2035 temp = png_get_uint_32(profile+36); /* signature 'ascp' */
2036 if (temp != 0x61637370)
2037 return png_icc_profile_error(png_ptr, colorspace, name, temp,
2038 "invalid signature");
2040 /* Currently the PCS illuminant/adopted white point (the computational
2041 * white point) are required to be D50,
2042 * however the profile contains a record of the illuminant so perhaps ICC
2043 * expects to be able to change this in the future (despite the rationale in
2044 * the introduction for using a fixed PCS adopted white.) Consequently the
2045 * following is just a warning.
2047 if (memcmp(profile+68, D50_nCIEXYZ, 12) != 0)
2048 (void)png_icc_profile_error(png_ptr, NULL, name, 0/*no tag value*/,
2049 "PCS illuminant is not D50");
2051 /* The PNG spec requires this:
2052 * "If the iCCP chunk is present, the image samples conform to the colour
2053 * space represented by the embedded ICC profile as defined by the
2054 * International Color Consortium [ICC]. The colour space of the ICC profile
2055 * shall be an RGB colour space for colour images (PNG colour types 2, 3, and
2056 * 6), or a greyscale colour space for greyscale images (PNG colour types 0
2057 * and 4)."
2059 * This checking code ensures the embedded profile (on either read or write)
2060 * conforms to the specification requirements. Notice that an ICC 'gray'
2061 * color-space profile contains the information to transform the monochrome
2062 * data to XYZ or L*a*b (according to which PCS the profile uses) and this
2063 * should be used in preference to the standard libpng K channel replication
2064 * into R, G and B channels.
2066 * Previously it was suggested that an RGB profile on grayscale data could be
2067 * handled. However it it is clear that using an RGB profile in this context
2068 * must be an error - there is no specification of what it means. Thus it is
2069 * almost certainly more correct to ignore the profile.
2071 temp = png_get_uint_32(profile+16); /* data colour space field */
2072 switch (temp)
2074 case 0x52474220: /* 'RGB ' */
2075 if ((color_type & PNG_COLOR_MASK_COLOR) == 0)
2076 return png_icc_profile_error(png_ptr, colorspace, name, temp,
2077 "RGB color space not permitted on grayscale PNG");
2078 break;
2080 case 0x47524159: /* 'GRAY' */
2081 if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
2082 return png_icc_profile_error(png_ptr, colorspace, name, temp,
2083 "Gray color space not permitted on RGB PNG");
2084 break;
2086 default:
2087 return png_icc_profile_error(png_ptr, colorspace, name, temp,
2088 "invalid ICC profile color space");
2091 /* It is up to the application to check that the profile class matches the
2092 * application requirements; the spec provides no guidance, but it's pretty
2093 * weird if the profile is not scanner ('scnr'), monitor ('mntr'), printer
2094 * ('prtr') or 'spac' (for generic color spaces). Issue a warning in these
2095 * cases. Issue an error for device link or abstract profiles - these don't
2096 * contain the records necessary to transform the color-space to anything
2097 * other than the target device (and not even that for an abstract profile).
2098 * Profiles of these classes may not be embedded in images.
2100 temp = png_get_uint_32(profile+12); /* profile/device class */
2101 switch (temp)
2103 case 0x73636e72: /* 'scnr' */
2104 case 0x6d6e7472: /* 'mntr' */
2105 case 0x70727472: /* 'prtr' */
2106 case 0x73706163: /* 'spac' */
2107 /* All supported */
2108 break;
2110 case 0x61627374: /* 'abst' */
2111 /* May not be embedded in an image */
2112 return png_icc_profile_error(png_ptr, colorspace, name, temp,
2113 "invalid embedded Abstract ICC profile");
2115 case 0x6c696e6b: /* 'link' */
2116 /* DeviceLink profiles cannot be interpreted in a non-device specific
2117 * fashion, if an app uses the AToB0Tag in the profile the results are
2118 * undefined unless the result is sent to the intended device,
2119 * therefore a DeviceLink profile should not be found embedded in a
2120 * PNG.
2122 return png_icc_profile_error(png_ptr, colorspace, name, temp,
2123 "unexpected DeviceLink ICC profile class");
2125 case 0x6e6d636c: /* 'nmcl' */
2126 /* A NamedColor profile is also device specific, however it doesn't
2127 * contain an AToB0 tag that is open to misinterpretation. Almost
2128 * certainly it will fail the tests below.
2130 (void)png_icc_profile_error(png_ptr, NULL, name, temp,
2131 "unexpected NamedColor ICC profile class");
2132 break;
2134 default:
2135 /* To allow for future enhancements to the profile accept unrecognized
2136 * profile classes with a warning, these then hit the test below on the
2137 * tag content to ensure they are backward compatible with one of the
2138 * understood profiles.
2140 (void)png_icc_profile_error(png_ptr, NULL, name, temp,
2141 "unrecognized ICC profile class");
2142 break;
2145 /* For any profile other than a device link one the PCS must be encoded
2146 * either in XYZ or Lab.
2148 temp = png_get_uint_32(profile+20);
2149 switch (temp)
2151 case 0x58595a20: /* 'XYZ ' */
2152 case 0x4c616220: /* 'Lab ' */
2153 break;
2155 default:
2156 return png_icc_profile_error(png_ptr, colorspace, name, temp,
2157 "unexpected ICC PCS encoding");
2160 return 1;
2163 int /* PRIVATE */
2164 png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace,
2165 png_const_charp name, png_uint_32 profile_length,
2166 png_const_bytep profile /* header plus whole tag table */)
2168 png_uint_32 tag_count = png_get_uint_32(profile+128);
2169 png_uint_32 itag;
2170 png_const_bytep tag = profile+132; /* The first tag */
2172 /* First scan all the tags in the table and add bits to the icc_info value
2173 * (temporarily in 'tags').
2175 for (itag=0; itag < tag_count; ++itag, tag += 12)
2177 png_uint_32 tag_id = png_get_uint_32(tag+0);
2178 png_uint_32 tag_start = png_get_uint_32(tag+4); /* must be aligned */
2179 png_uint_32 tag_length = png_get_uint_32(tag+8);/* not padded */
2181 /* The ICC specification does not exclude zero length tags, therefore the
2182 * start might actually be anywhere if there is no data, but this would be
2183 * a clear abuse of the intent of the standard so the start is checked for
2184 * being in range. All defined tag types have an 8 byte header - a 4 byte
2185 * type signature then 0.
2187 if ((tag_start & 3) != 0)
2189 /* CNHP730S.icc shipped with Microsoft Windows 64 violates this, it is
2190 * only a warning here because libpng does not care about the
2191 * alignment.
2193 (void)png_icc_profile_error(png_ptr, NULL, name, tag_id,
2194 "ICC profile tag start not a multiple of 4");
2197 /* This is a hard error; potentially it can cause read outside the
2198 * profile.
2200 if (tag_start > profile_length || tag_length > profile_length - tag_start)
2201 return png_icc_profile_error(png_ptr, colorspace, name, tag_id,
2202 "ICC profile tag outside profile");
2205 return 1; /* success, maybe with warnings */
2208 #ifdef PNG_sRGB_SUPPORTED
2209 #if PNG_sRGB_PROFILE_CHECKS >= 0
2210 /* Information about the known ICC sRGB profiles */
2211 static const struct
2213 png_uint_32 adler, crc, length;
2214 png_uint_32 md5[4];
2215 png_byte have_md5;
2216 png_byte is_broken;
2217 png_uint_16 intent;
2219 # define PNG_MD5(a,b,c,d) { a, b, c, d }, (a!=0)||(b!=0)||(c!=0)||(d!=0)
2220 # define PNG_ICC_CHECKSUM(adler, crc, md5, intent, broke, date, length, fname)\
2221 { adler, crc, length, md5, broke, intent },
2223 } png_sRGB_checks[] =
2225 /* This data comes from contrib/tools/checksum-icc run on downloads of
2226 * all four ICC sRGB profiles from www.color.org.
2228 /* adler32, crc32, MD5[4], intent, date, length, file-name */
2229 PNG_ICC_CHECKSUM(0x0a3fd9f6, 0x3b8772b9,
2230 PNG_MD5(0x29f83dde, 0xaff255ae, 0x7842fae4, 0xca83390d), 0, 0,
2231 "2009/03/27 21:36:31", 3048, "sRGB_IEC61966-2-1_black_scaled.icc")
2233 /* ICC sRGB v2 perceptual no black-compensation: */
2234 PNG_ICC_CHECKSUM(0x4909e5e1, 0x427ebb21,
2235 PNG_MD5(0xc95bd637, 0xe95d8a3b, 0x0df38f99, 0xc1320389), 1, 0,
2236 "2009/03/27 21:37:45", 3052, "sRGB_IEC61966-2-1_no_black_scaling.icc")
2238 PNG_ICC_CHECKSUM(0xfd2144a1, 0x306fd8ae,
2239 PNG_MD5(0xfc663378, 0x37e2886b, 0xfd72e983, 0x8228f1b8), 0, 0,
2240 "2009/08/10 17:28:01", 60988, "sRGB_v4_ICC_preference_displayclass.icc")
2242 /* ICC sRGB v4 perceptual */
2243 PNG_ICC_CHECKSUM(0x209c35d2, 0xbbef7812,
2244 PNG_MD5(0x34562abf, 0x994ccd06, 0x6d2c5721, 0xd0d68c5d), 0, 0,
2245 "2007/07/25 00:05:37", 60960, "sRGB_v4_ICC_preference.icc")
2247 /* The following profiles have no known MD5 checksum. If there is a match
2248 * on the (empty) MD5 the other fields are used to attempt a match and
2249 * a warning is produced. The first two of these profiles have a 'cprt' tag
2250 * which suggests that they were also made by Hewlett Packard.
2252 PNG_ICC_CHECKSUM(0xa054d762, 0x5d5129ce,
2253 PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 0,
2254 "2004/07/21 18:57:42", 3024, "sRGB_IEC61966-2-1_noBPC.icc")
2256 /* This is a 'mntr' (display) profile with a mediaWhitePointTag that does not
2257 * match the D50 PCS illuminant in the header (it is in fact the D65 values,
2258 * so the white point is recorded as the un-adapted value.) The profiles
2259 * below only differ in one byte - the intent - and are basically the same as
2260 * the previous profile except for the mediaWhitePointTag error and a missing
2261 * chromaticAdaptationTag.
2263 PNG_ICC_CHECKSUM(0xf784f3fb, 0x182ea552,
2264 PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 0, 1/*broken*/,
2265 "1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 perceptual")
2267 PNG_ICC_CHECKSUM(0x0398f3fc, 0xf29e526d,
2268 PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 1/*broken*/,
2269 "1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 media-relative")
2272 static int
2273 png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
2274 png_const_bytep profile, uLong adler)
2276 /* The quick check is to verify just the MD5 signature and trust the
2277 * rest of the data. Because the profile has already been verified for
2278 * correctness this is safe. png_colorspace_set_sRGB will check the 'intent'
2279 * field too, so if the profile has been edited with an intent not defined
2280 * by sRGB (but maybe defined by a later ICC specification) the read of
2281 * the profile will fail at that point.
2284 png_uint_32 length = 0;
2285 png_uint_32 intent = 0x10000; /* invalid */
2286 #if PNG_sRGB_PROFILE_CHECKS > 1
2287 uLong crc = 0; /* the value for 0 length data */
2288 #endif
2289 unsigned int i;
2291 #ifdef PNG_SET_OPTION_SUPPORTED
2292 /* First see if PNG_SKIP_sRGB_CHECK_PROFILE has been set to "on" */
2293 if (((png_ptr->options >> PNG_SKIP_sRGB_CHECK_PROFILE) & 3) ==
2294 PNG_OPTION_ON)
2295 return 0;
2296 #endif
2298 for (i=0; i < (sizeof png_sRGB_checks) / (sizeof png_sRGB_checks[0]); ++i)
2300 if (png_get_uint_32(profile+84) == png_sRGB_checks[i].md5[0] &&
2301 png_get_uint_32(profile+88) == png_sRGB_checks[i].md5[1] &&
2302 png_get_uint_32(profile+92) == png_sRGB_checks[i].md5[2] &&
2303 png_get_uint_32(profile+96) == png_sRGB_checks[i].md5[3])
2305 /* This may be one of the old HP profiles without an MD5, in that
2306 * case we can only use the length and Adler32 (note that these
2307 * are not used by default if there is an MD5!)
2309 # if PNG_sRGB_PROFILE_CHECKS == 0
2310 if (png_sRGB_checks[i].have_md5 != 0)
2311 return 1+png_sRGB_checks[i].is_broken;
2312 # endif
2314 /* Profile is unsigned or more checks have been configured in. */
2315 if (length == 0)
2317 length = png_get_uint_32(profile);
2318 intent = png_get_uint_32(profile+64);
2321 /* Length *and* intent must match */
2322 if (length == (png_uint_32) png_sRGB_checks[i].length &&
2323 intent == (png_uint_32) png_sRGB_checks[i].intent)
2325 /* Now calculate the adler32 if not done already. */
2326 if (adler == 0)
2328 adler = adler32(0, NULL, 0);
2329 adler = adler32(adler, profile, length);
2332 if (adler == png_sRGB_checks[i].adler)
2334 /* These basic checks suggest that the data has not been
2335 * modified, but if the check level is more than 1 perform
2336 * our own crc32 checksum on the data.
2338 # if PNG_sRGB_PROFILE_CHECKS > 1
2339 if (crc == 0)
2341 crc = crc32(0, NULL, 0);
2342 crc = crc32(crc, profile, length);
2345 /* So this check must pass for the 'return' below to happen.
2347 if (crc == png_sRGB_checks[i].crc)
2348 # endif
2350 if (png_sRGB_checks[i].is_broken != 0)
2352 /* These profiles are known to have bad data that may cause
2353 * problems if they are used, therefore attempt to
2354 * discourage their use, skip the 'have_md5' warning below,
2355 * which is made irrelevant by this error.
2357 png_chunk_report(png_ptr, "known incorrect sRGB profile",
2358 PNG_CHUNK_ERROR);
2361 /* Warn that this being done; this isn't even an error since
2362 * the profile is perfectly valid, but it would be nice if
2363 * people used the up-to-date ones.
2365 else if (png_sRGB_checks[i].have_md5 == 0)
2367 png_chunk_report(png_ptr,
2368 "out-of-date sRGB profile with no signature",
2369 PNG_CHUNK_WARNING);
2372 return 1+png_sRGB_checks[i].is_broken;
2376 # if PNG_sRGB_PROFILE_CHECKS > 0
2377 /* The signature matched, but the profile had been changed in some
2378 * way. This probably indicates a data error or uninformed hacking.
2379 * Fall through to "no match".
2381 png_chunk_report(png_ptr,
2382 "Not recognizing known sRGB profile that has been edited",
2383 PNG_CHUNK_WARNING);
2384 break;
2385 # endif
2390 return 0; /* no match */
2393 void /* PRIVATE */
2394 png_icc_set_sRGB(png_const_structrp png_ptr,
2395 png_colorspacerp colorspace, png_const_bytep profile, uLong adler)
2397 /* Is this profile one of the known ICC sRGB profiles? If it is, just set
2398 * the sRGB information.
2400 if (png_compare_ICC_profile_with_sRGB(png_ptr, profile, adler) != 0)
2401 (void)png_colorspace_set_sRGB(png_ptr, colorspace,
2402 (int)/*already checked*/png_get_uint_32(profile+64));
2404 #endif /* PNG_sRGB_PROFILE_CHECKS >= 0 */
2405 #endif /* sRGB */
2407 int /* PRIVATE */
2408 png_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace,
2409 png_const_charp name, png_uint_32 profile_length, png_const_bytep profile,
2410 int color_type)
2412 if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
2413 return 0;
2415 if (icc_check_length(png_ptr, colorspace, name, profile_length) != 0 &&
2416 png_icc_check_header(png_ptr, colorspace, name, profile_length, profile,
2417 color_type) != 0 &&
2418 png_icc_check_tag_table(png_ptr, colorspace, name, profile_length,
2419 profile) != 0)
2421 # if defined(PNG_sRGB_SUPPORTED) && PNG_sRGB_PROFILE_CHECKS >= 0
2422 /* If no sRGB support, don't try storing sRGB information */
2423 png_icc_set_sRGB(png_ptr, colorspace, profile, 0);
2424 # endif
2425 return 1;
2428 /* Failure case */
2429 return 0;
2431 #endif /* iCCP */
2433 #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
2434 void /* PRIVATE */
2435 png_colorspace_set_rgb_coefficients(png_structrp png_ptr)
2437 /* Set the rgb_to_gray coefficients from the colorspace. */
2438 if (png_ptr->rgb_to_gray_coefficients_set == 0 &&
2439 (png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
2441 /* png_set_background has not been called, get the coefficients from the Y
2442 * values of the colorspace colorants.
2444 png_fixed_point r = png_ptr->colorspace.end_points_XYZ.red_Y;
2445 png_fixed_point g = png_ptr->colorspace.end_points_XYZ.green_Y;
2446 png_fixed_point b = png_ptr->colorspace.end_points_XYZ.blue_Y;
2447 png_fixed_point total = r+g+b;
2449 if (total > 0 &&
2450 r >= 0 && png_muldiv(&r, r, 32768, total) && r >= 0 && r <= 32768 &&
2451 g >= 0 && png_muldiv(&g, g, 32768, total) && g >= 0 && g <= 32768 &&
2452 b >= 0 && png_muldiv(&b, b, 32768, total) && b >= 0 && b <= 32768 &&
2453 r+g+b <= 32769)
2455 /* We allow 0 coefficients here. r+g+b may be 32769 if two or
2456 * all of the coefficients were rounded up. Handle this by
2457 * reducing the *largest* coefficient by 1; this matches the
2458 * approach used for the default coefficients in pngrtran.c
2460 int add = 0;
2462 if (r+g+b > 32768)
2463 add = -1;
2464 else if (r+g+b < 32768)
2465 add = 1;
2467 if (add != 0)
2469 if (g >= r && g >= b)
2470 g += add;
2471 else if (r >= g && r >= b)
2472 r += add;
2473 else
2474 b += add;
2477 /* Check for an internal error. */
2478 if (r+g+b != 32768)
2479 png_error(png_ptr,
2480 "internal error handling cHRM coefficients");
2482 else
2484 png_ptr->rgb_to_gray_red_coeff = (png_uint_16)r;
2485 png_ptr->rgb_to_gray_green_coeff = (png_uint_16)g;
2489 /* This is a png_error at present even though it could be ignored -
2490 * it should never happen, but it is important that if it does, the
2491 * bug is fixed.
2493 else
2494 png_error(png_ptr, "internal error handling cHRM->XYZ");
2497 #endif /* READ_RGB_TO_GRAY */
2499 #endif /* COLORSPACE */
2501 #ifdef __GNUC__
2502 /* This exists solely to work round a warning from GNU C. */
2503 static int /* PRIVATE */
2504 png_gt(size_t a, size_t b)
2506 return a > b;
2508 #else
2509 # define png_gt(a,b) ((a) > (b))
2510 #endif
2512 void /* PRIVATE */
2513 png_check_IHDR(png_const_structrp png_ptr,
2514 png_uint_32 width, png_uint_32 height, int bit_depth,
2515 int color_type, int interlace_type, int compression_type,
2516 int filter_type)
2518 int error = 0;
2520 /* Check for width and height valid values */
2521 if (width == 0)
2523 png_warning(png_ptr, "Image width is zero in IHDR");
2524 error = 1;
2527 if (width > PNG_UINT_31_MAX)
2529 png_warning(png_ptr, "Invalid image width in IHDR");
2530 error = 1;
2533 if (png_gt(((width + 7) & (~7U)),
2534 ((PNG_SIZE_MAX
2535 - 48 /* big_row_buf hack */
2536 - 1) /* filter byte */
2537 / 8) /* 8-byte RGBA pixels */
2538 - 1)) /* extra max_pixel_depth pad */
2540 /* The size of the row must be within the limits of this architecture.
2541 * Because the read code can perform arbitrary transformations the
2542 * maximum size is checked here. Because the code in png_read_start_row
2543 * adds extra space "for safety's sake" in several places a conservative
2544 * limit is used here.
2546 * NOTE: it would be far better to check the size that is actually used,
2547 * but the effect in the real world is minor and the changes are more
2548 * extensive, therefore much more dangerous and much more difficult to
2549 * write in a way that avoids compiler warnings.
2551 png_warning(png_ptr, "Image width is too large for this architecture");
2552 error = 1;
2555 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
2556 if (width > png_ptr->user_width_max)
2557 #else
2558 if (width > PNG_USER_WIDTH_MAX)
2559 #endif
2561 png_warning(png_ptr, "Image width exceeds user limit in IHDR");
2562 error = 1;
2565 if (height == 0)
2567 png_warning(png_ptr, "Image height is zero in IHDR");
2568 error = 1;
2571 if (height > PNG_UINT_31_MAX)
2573 png_warning(png_ptr, "Invalid image height in IHDR");
2574 error = 1;
2577 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
2578 if (height > png_ptr->user_height_max)
2579 #else
2580 if (height > PNG_USER_HEIGHT_MAX)
2581 #endif
2583 png_warning(png_ptr, "Image height exceeds user limit in IHDR");
2584 error = 1;
2587 /* Check other values */
2588 if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 &&
2589 bit_depth != 8 && bit_depth != 16)
2591 png_warning(png_ptr, "Invalid bit depth in IHDR");
2592 error = 1;
2595 if (color_type < 0 || color_type == 1 ||
2596 color_type == 5 || color_type > 6)
2598 png_warning(png_ptr, "Invalid color type in IHDR");
2599 error = 1;
2602 if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) ||
2603 ((color_type == PNG_COLOR_TYPE_RGB ||
2604 color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||
2605 color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8))
2607 png_warning(png_ptr, "Invalid color type/bit depth combination in IHDR");
2608 error = 1;
2611 if (interlace_type >= PNG_INTERLACE_LAST)
2613 png_warning(png_ptr, "Unknown interlace method in IHDR");
2614 error = 1;
2617 if (compression_type != PNG_COMPRESSION_TYPE_BASE)
2619 png_warning(png_ptr, "Unknown compression method in IHDR");
2620 error = 1;
2623 #ifdef PNG_MNG_FEATURES_SUPPORTED
2624 /* Accept filter_method 64 (intrapixel differencing) only if
2625 * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
2626 * 2. Libpng did not read a PNG signature (this filter_method is only
2627 * used in PNG datastreams that are embedded in MNG datastreams) and
2628 * 3. The application called png_permit_mng_features with a mask that
2629 * included PNG_FLAG_MNG_FILTER_64 and
2630 * 4. The filter_method is 64 and
2631 * 5. The color_type is RGB or RGBA
2633 if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 &&
2634 png_ptr->mng_features_permitted != 0)
2635 png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
2637 if (filter_type != PNG_FILTER_TYPE_BASE)
2639 if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
2640 (filter_type == PNG_INTRAPIXEL_DIFFERENCING) &&
2641 ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) &&
2642 (color_type == PNG_COLOR_TYPE_RGB ||
2643 color_type == PNG_COLOR_TYPE_RGB_ALPHA)))
2645 png_warning(png_ptr, "Unknown filter method in IHDR");
2646 error = 1;
2649 if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0)
2651 png_warning(png_ptr, "Invalid filter method in IHDR");
2652 error = 1;
2656 #else
2657 if (filter_type != PNG_FILTER_TYPE_BASE)
2659 png_warning(png_ptr, "Unknown filter method in IHDR");
2660 error = 1;
2662 #endif
2664 if (error == 1)
2665 png_error(png_ptr, "Invalid IHDR data");
2668 #if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED)
2669 /* ASCII to fp functions */
2670 /* Check an ASCII formated floating point value, see the more detailed
2671 * comments in pngpriv.h
2673 /* The following is used internally to preserve the sticky flags */
2674 #define png_fp_add(state, flags) ((state) |= (flags))
2675 #define png_fp_set(state, value) ((state) = (value) | ((state) & PNG_FP_STICKY))
2677 int /* PRIVATE */
2678 png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
2679 png_size_tp whereami)
2681 int state = *statep;
2682 png_size_t i = *whereami;
2684 while (i < size)
2686 int type;
2687 /* First find the type of the next character */
2688 switch (string[i])
2690 case 43: type = PNG_FP_SAW_SIGN; break;
2691 case 45: type = PNG_FP_SAW_SIGN + PNG_FP_NEGATIVE; break;
2692 case 46: type = PNG_FP_SAW_DOT; break;
2693 case 48: type = PNG_FP_SAW_DIGIT; break;
2694 case 49: case 50: case 51: case 52:
2695 case 53: case 54: case 55: case 56:
2696 case 57: type = PNG_FP_SAW_DIGIT + PNG_FP_NONZERO; break;
2697 case 69:
2698 case 101: type = PNG_FP_SAW_E; break;
2699 default: goto PNG_FP_End;
2702 /* Now deal with this type according to the current
2703 * state, the type is arranged to not overlap the
2704 * bits of the PNG_FP_STATE.
2706 switch ((state & PNG_FP_STATE) + (type & PNG_FP_SAW_ANY))
2708 case PNG_FP_INTEGER + PNG_FP_SAW_SIGN:
2709 if ((state & PNG_FP_SAW_ANY) != 0)
2710 goto PNG_FP_End; /* not a part of the number */
2712 png_fp_add(state, type);
2713 break;
2715 case PNG_FP_INTEGER + PNG_FP_SAW_DOT:
2716 /* Ok as trailer, ok as lead of fraction. */
2717 if ((state & PNG_FP_SAW_DOT) != 0) /* two dots */
2718 goto PNG_FP_End;
2720 else if ((state & PNG_FP_SAW_DIGIT) != 0) /* trailing dot? */
2721 png_fp_add(state, type);
2723 else
2724 png_fp_set(state, PNG_FP_FRACTION | type);
2726 break;
2728 case PNG_FP_INTEGER + PNG_FP_SAW_DIGIT:
2729 if ((state & PNG_FP_SAW_DOT) != 0) /* delayed fraction */
2730 png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);
2732 png_fp_add(state, type | PNG_FP_WAS_VALID);
2734 break;
2736 case PNG_FP_INTEGER + PNG_FP_SAW_E:
2737 if ((state & PNG_FP_SAW_DIGIT) == 0)
2738 goto PNG_FP_End;
2740 png_fp_set(state, PNG_FP_EXPONENT);
2742 break;
2744 /* case PNG_FP_FRACTION + PNG_FP_SAW_SIGN:
2745 goto PNG_FP_End; ** no sign in fraction */
2747 /* case PNG_FP_FRACTION + PNG_FP_SAW_DOT:
2748 goto PNG_FP_End; ** Because SAW_DOT is always set */
2750 case PNG_FP_FRACTION + PNG_FP_SAW_DIGIT:
2751 png_fp_add(state, type | PNG_FP_WAS_VALID);
2752 break;
2754 case PNG_FP_FRACTION + PNG_FP_SAW_E:
2755 /* This is correct because the trailing '.' on an
2756 * integer is handled above - so we can only get here
2757 * with the sequence ".E" (with no preceding digits).
2759 if ((state & PNG_FP_SAW_DIGIT) == 0)
2760 goto PNG_FP_End;
2762 png_fp_set(state, PNG_FP_EXPONENT);
2764 break;
2766 case PNG_FP_EXPONENT + PNG_FP_SAW_SIGN:
2767 if ((state & PNG_FP_SAW_ANY) != 0)
2768 goto PNG_FP_End; /* not a part of the number */
2770 png_fp_add(state, PNG_FP_SAW_SIGN);
2772 break;
2774 /* case PNG_FP_EXPONENT + PNG_FP_SAW_DOT:
2775 goto PNG_FP_End; */
2777 case PNG_FP_EXPONENT + PNG_FP_SAW_DIGIT:
2778 png_fp_add(state, PNG_FP_SAW_DIGIT | PNG_FP_WAS_VALID);
2780 break;
2782 /* case PNG_FP_EXPONEXT + PNG_FP_SAW_E:
2783 goto PNG_FP_End; */
2785 default: goto PNG_FP_End; /* I.e. break 2 */
2788 /* The character seems ok, continue. */
2789 ++i;
2792 PNG_FP_End:
2793 /* Here at the end, update the state and return the correct
2794 * return code.
2796 *statep = state;
2797 *whereami = i;
2799 return (state & PNG_FP_SAW_DIGIT) != 0;
2803 /* The same but for a complete string. */
2805 png_check_fp_string(png_const_charp string, png_size_t size)
2807 int state=0;
2808 png_size_t char_index=0;
2810 if (png_check_fp_number(string, size, &state, &char_index) != 0 &&
2811 (char_index == size || string[char_index] == 0))
2812 return state /* must be non-zero - see above */;
2814 return 0; /* i.e. fail */
2816 #endif /* pCAL || sCAL */
2818 #ifdef PNG_sCAL_SUPPORTED
2819 # ifdef PNG_FLOATING_POINT_SUPPORTED
2820 /* Utility used below - a simple accurate power of ten from an integral
2821 * exponent.
2823 static double
2824 png_pow10(int power)
2826 int recip = 0;
2827 double d = 1;
2829 /* Handle negative exponent with a reciprocal at the end because
2830 * 10 is exact whereas .1 is inexact in base 2
2832 if (power < 0)
2834 if (power < DBL_MIN_10_EXP) return 0;
2835 recip = 1, power = -power;
2838 if (power > 0)
2840 /* Decompose power bitwise. */
2841 double mult = 10;
2844 if (power & 1) d *= mult;
2845 mult *= mult;
2846 power >>= 1;
2848 while (power > 0);
2850 if (recip != 0) d = 1/d;
2852 /* else power is 0 and d is 1 */
2854 return d;
2857 /* Function to format a floating point value in ASCII with a given
2858 * precision.
2860 void /* PRIVATE */
2861 png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
2862 double fp, unsigned int precision)
2864 /* We use standard functions from math.h, but not printf because
2865 * that would require stdio. The caller must supply a buffer of
2866 * sufficient size or we will png_error. The tests on size and
2867 * the space in ascii[] consumed are indicated below.
2869 if (precision < 1)
2870 precision = DBL_DIG;
2872 /* Enforce the limit of the implementation precision too. */
2873 if (precision > DBL_DIG+1)
2874 precision = DBL_DIG+1;
2876 /* Basic sanity checks */
2877 if (size >= precision+5) /* See the requirements below. */
2879 if (fp < 0)
2881 fp = -fp;
2882 *ascii++ = 45; /* '-' PLUS 1 TOTAL 1 */
2883 --size;
2886 if (fp >= DBL_MIN && fp <= DBL_MAX)
2888 int exp_b10; /* A base 10 exponent */
2889 double base; /* 10^exp_b10 */
2891 /* First extract a base 10 exponent of the number,
2892 * the calculation below rounds down when converting
2893 * from base 2 to base 10 (multiply by log10(2) -
2894 * 0.3010, but 77/256 is 0.3008, so exp_b10 needs to
2895 * be increased. Note that the arithmetic shift
2896 * performs a floor() unlike C arithmetic - using a
2897 * C multiply would break the following for negative
2898 * exponents.
2900 (void)frexp(fp, &exp_b10); /* exponent to base 2 */
2902 exp_b10 = (exp_b10 * 77) >> 8; /* <= exponent to base 10 */
2904 /* Avoid underflow here. */
2905 base = png_pow10(exp_b10); /* May underflow */
2907 while (base < DBL_MIN || base < fp)
2909 /* And this may overflow. */
2910 double test = png_pow10(exp_b10+1);
2912 if (test <= DBL_MAX)
2913 ++exp_b10, base = test;
2915 else
2916 break;
2919 /* Normalize fp and correct exp_b10, after this fp is in the
2920 * range [.1,1) and exp_b10 is both the exponent and the digit
2921 * *before* which the decimal point should be inserted
2922 * (starting with 0 for the first digit). Note that this
2923 * works even if 10^exp_b10 is out of range because of the
2924 * test on DBL_MAX above.
2926 fp /= base;
2927 while (fp >= 1) fp /= 10, ++exp_b10;
2929 /* Because of the code above fp may, at this point, be
2930 * less than .1, this is ok because the code below can
2931 * handle the leading zeros this generates, so no attempt
2932 * is made to correct that here.
2936 unsigned int czero, clead, cdigits;
2937 char exponent[10];
2939 /* Allow up to two leading zeros - this will not lengthen
2940 * the number compared to using E-n.
2942 if (exp_b10 < 0 && exp_b10 > -3) /* PLUS 3 TOTAL 4 */
2944 czero = (unsigned int)(-exp_b10); /* PLUS 2 digits: TOTAL 3 */
2945 exp_b10 = 0; /* Dot added below before first output. */
2947 else
2948 czero = 0; /* No zeros to add */
2950 /* Generate the digit list, stripping trailing zeros and
2951 * inserting a '.' before a digit if the exponent is 0.
2953 clead = czero; /* Count of leading zeros */
2954 cdigits = 0; /* Count of digits in list. */
2958 double d;
2960 fp *= 10;
2961 /* Use modf here, not floor and subtract, so that
2962 * the separation is done in one step. At the end
2963 * of the loop don't break the number into parts so
2964 * that the final digit is rounded.
2966 if (cdigits+czero+1 < precision+clead)
2967 fp = modf(fp, &d);
2969 else
2971 d = floor(fp + .5);
2973 if (d > 9)
2975 /* Rounding up to 10, handle that here. */
2976 if (czero > 0)
2978 --czero, d = 1;
2979 if (cdigits == 0) --clead;
2981 else
2983 while (cdigits > 0 && d > 9)
2985 int ch = *--ascii;
2987 if (exp_b10 != (-1))
2988 ++exp_b10;
2990 else if (ch == 46)
2992 ch = *--ascii, ++size;
2993 /* Advance exp_b10 to '1', so that the
2994 * decimal point happens after the
2995 * previous digit.
2997 exp_b10 = 1;
3000 --cdigits;
3001 d = ch - 47; /* I.e. 1+(ch-48) */
3004 /* Did we reach the beginning? If so adjust the
3005 * exponent but take into account the leading
3006 * decimal point.
3008 if (d > 9) /* cdigits == 0 */
3010 if (exp_b10 == (-1))
3012 /* Leading decimal point (plus zeros?), if
3013 * we lose the decimal point here it must
3014 * be reentered below.
3016 int ch = *--ascii;
3018 if (ch == 46)
3019 ++size, exp_b10 = 1;
3021 /* Else lost a leading zero, so 'exp_b10' is
3022 * still ok at (-1)
3025 else
3026 ++exp_b10;
3028 /* In all cases we output a '1' */
3029 d = 1;
3033 fp = 0; /* Guarantees termination below. */
3036 if (d == 0)
3038 ++czero;
3039 if (cdigits == 0) ++clead;
3041 else
3043 /* Included embedded zeros in the digit count. */
3044 cdigits += czero - clead;
3045 clead = 0;
3047 while (czero > 0)
3049 /* exp_b10 == (-1) means we just output the decimal
3050 * place - after the DP don't adjust 'exp_b10' any
3051 * more!
3053 if (exp_b10 != (-1))
3055 if (exp_b10 == 0) *ascii++ = 46, --size;
3056 /* PLUS 1: TOTAL 4 */
3057 --exp_b10;
3059 *ascii++ = 48, --czero;
3062 if (exp_b10 != (-1))
3064 if (exp_b10 == 0)
3065 *ascii++ = 46, --size; /* counted above */
3067 --exp_b10;
3069 *ascii++ = (char)(48 + (int)d), ++cdigits;
3072 while (cdigits+czero < precision+clead && fp > DBL_MIN);
3074 /* The total output count (max) is now 4+precision */
3076 /* Check for an exponent, if we don't need one we are
3077 * done and just need to terminate the string. At
3078 * this point exp_b10==(-1) is effectively if flag - it got
3079 * to '-1' because of the decrement after outputting
3080 * the decimal point above (the exponent required is
3081 * *not* -1!)
3083 if (exp_b10 >= (-1) && exp_b10 <= 2)
3085 /* The following only happens if we didn't output the
3086 * leading zeros above for negative exponent, so this
3087 * doesn't add to the digit requirement. Note that the
3088 * two zeros here can only be output if the two leading
3089 * zeros were *not* output, so this doesn't increase
3090 * the output count.
3092 while (--exp_b10 >= 0) *ascii++ = 48;
3094 *ascii = 0;
3096 /* Total buffer requirement (including the '\0') is
3097 * 5+precision - see check at the start.
3099 return;
3102 /* Here if an exponent is required, adjust size for
3103 * the digits we output but did not count. The total
3104 * digit output here so far is at most 1+precision - no
3105 * decimal point and no leading or trailing zeros have
3106 * been output.
3108 size -= cdigits;
3110 *ascii++ = 69, --size; /* 'E': PLUS 1 TOTAL 2+precision */
3112 /* The following use of an unsigned temporary avoids ambiguities in
3113 * the signed arithmetic on exp_b10 and permits GCC at least to do
3114 * better optimization.
3117 unsigned int uexp_b10;
3119 if (exp_b10 < 0)
3121 *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */
3122 uexp_b10 = (unsigned int)(-exp_b10);
3125 else
3126 uexp_b10 = (unsigned int)exp_b10;
3128 cdigits = 0;
3130 while (uexp_b10 > 0)
3132 exponent[cdigits++] = (char)(48 + uexp_b10 % 10);
3133 uexp_b10 /= 10;
3137 /* Need another size check here for the exponent digits, so
3138 * this need not be considered above.
3140 if (size > cdigits)
3142 while (cdigits > 0) *ascii++ = exponent[--cdigits];
3144 *ascii = 0;
3146 return;
3150 else if (!(fp >= DBL_MIN))
3152 *ascii++ = 48; /* '0' */
3153 *ascii = 0;
3154 return;
3156 else
3158 *ascii++ = 105; /* 'i' */
3159 *ascii++ = 110; /* 'n' */
3160 *ascii++ = 102; /* 'f' */
3161 *ascii = 0;
3162 return;
3166 /* Here on buffer too small. */
3167 png_error(png_ptr, "ASCII conversion buffer too small");
3170 # endif /* FLOATING_POINT */
3172 # ifdef PNG_FIXED_POINT_SUPPORTED
3173 /* Function to format a fixed point value in ASCII.
3175 void /* PRIVATE */
3176 png_ascii_from_fixed(png_const_structrp png_ptr, png_charp ascii,
3177 png_size_t size, png_fixed_point fp)
3179 /* Require space for 10 decimal digits, a decimal point, a minus sign and a
3180 * trailing \0, 13 characters:
3182 if (size > 12)
3184 png_uint_32 num;
3186 /* Avoid overflow here on the minimum integer. */
3187 if (fp < 0)
3188 *ascii++ = 45, num = (png_uint_32)(-fp);
3189 else
3190 num = (png_uint_32)fp;
3192 if (num <= 0x80000000) /* else overflowed */
3194 unsigned int ndigits = 0, first = 16 /* flag value */;
3195 char digits[10];
3197 while (num)
3199 /* Split the low digit off num: */
3200 unsigned int tmp = num/10;
3201 num -= tmp*10;
3202 digits[ndigits++] = (char)(48 + num);
3203 /* Record the first non-zero digit, note that this is a number
3204 * starting at 1, it's not actually the array index.
3206 if (first == 16 && num > 0)
3207 first = ndigits;
3208 num = tmp;
3211 if (ndigits > 0)
3213 while (ndigits > 5) *ascii++ = digits[--ndigits];
3214 /* The remaining digits are fractional digits, ndigits is '5' or
3215 * smaller at this point. It is certainly not zero. Check for a
3216 * non-zero fractional digit:
3218 if (first <= 5)
3220 unsigned int i;
3221 *ascii++ = 46; /* decimal point */
3222 /* ndigits may be <5 for small numbers, output leading zeros
3223 * then ndigits digits to first:
3225 i = 5;
3226 while (ndigits < i) *ascii++ = 48, --i;
3227 while (ndigits >= first) *ascii++ = digits[--ndigits];
3228 /* Don't output the trailing zeros! */
3231 else
3232 *ascii++ = 48;
3234 /* And null terminate the string: */
3235 *ascii = 0;
3236 return;
3240 /* Here on buffer too small. */
3241 png_error(png_ptr, "ASCII conversion buffer too small");
3243 # endif /* FIXED_POINT */
3244 #endif /* SCAL */
3246 #if defined(PNG_FLOATING_POINT_SUPPORTED) && \
3247 !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \
3248 (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \
3249 defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \
3250 defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \
3251 (defined(PNG_sCAL_SUPPORTED) && \
3252 defined(PNG_FLOATING_ARITHMETIC_SUPPORTED))
3253 png_fixed_point
3254 png_fixed(png_const_structrp png_ptr, double fp, png_const_charp text)
3256 double r = floor(100000 * fp + .5);
3258 if (r > 2147483647. || r < -2147483648.)
3259 png_fixed_error(png_ptr, text);
3261 # ifndef PNG_ERROR_TEXT_SUPPORTED
3262 PNG_UNUSED(text)
3263 # endif
3265 return (png_fixed_point)r;
3267 #endif
3269 #if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_COLORSPACE_SUPPORTED) ||\
3270 defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED)
3271 /* muldiv functions */
3272 /* This API takes signed arguments and rounds the result to the nearest
3273 * integer (or, for a fixed point number - the standard argument - to
3274 * the nearest .00001). Overflow and divide by zero are signalled in
3275 * the result, a boolean - true on success, false on overflow.
3278 png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times,
3279 png_int_32 divisor)
3281 /* Return a * times / divisor, rounded. */
3282 if (divisor != 0)
3284 if (a == 0 || times == 0)
3286 *res = 0;
3287 return 1;
3289 else
3291 #ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
3292 double r = a;
3293 r *= times;
3294 r /= divisor;
3295 r = floor(r+.5);
3297 /* A png_fixed_point is a 32-bit integer. */
3298 if (r <= 2147483647. && r >= -2147483648.)
3300 *res = (png_fixed_point)r;
3301 return 1;
3303 #else
3304 int negative = 0;
3305 png_uint_32 A, T, D;
3306 png_uint_32 s16, s32, s00;
3308 if (a < 0)
3309 negative = 1, A = -a;
3310 else
3311 A = a;
3313 if (times < 0)
3314 negative = !negative, T = -times;
3315 else
3316 T = times;
3318 if (divisor < 0)
3319 negative = !negative, D = -divisor;
3320 else
3321 D = divisor;
3323 /* Following can't overflow because the arguments only
3324 * have 31 bits each, however the result may be 32 bits.
3326 s16 = (A >> 16) * (T & 0xffff) +
3327 (A & 0xffff) * (T >> 16);
3328 /* Can't overflow because the a*times bit is only 30
3329 * bits at most.
3331 s32 = (A >> 16) * (T >> 16) + (s16 >> 16);
3332 s00 = (A & 0xffff) * (T & 0xffff);
3334 s16 = (s16 & 0xffff) << 16;
3335 s00 += s16;
3337 if (s00 < s16)
3338 ++s32; /* carry */
3340 if (s32 < D) /* else overflow */
3342 /* s32.s00 is now the 64-bit product, do a standard
3343 * division, we know that s32 < D, so the maximum
3344 * required shift is 31.
3346 int bitshift = 32;
3347 png_fixed_point result = 0; /* NOTE: signed */
3349 while (--bitshift >= 0)
3351 png_uint_32 d32, d00;
3353 if (bitshift > 0)
3354 d32 = D >> (32-bitshift), d00 = D << bitshift;
3356 else
3357 d32 = 0, d00 = D;
3359 if (s32 > d32)
3361 if (s00 < d00) --s32; /* carry */
3362 s32 -= d32, s00 -= d00, result += 1<<bitshift;
3365 else
3366 if (s32 == d32 && s00 >= d00)
3367 s32 = 0, s00 -= d00, result += 1<<bitshift;
3370 /* Handle the rounding. */
3371 if (s00 >= (D >> 1))
3372 ++result;
3374 if (negative != 0)
3375 result = -result;
3377 /* Check for overflow. */
3378 if ((negative != 0 && result <= 0) ||
3379 (negative == 0 && result >= 0))
3381 *res = result;
3382 return 1;
3385 #endif
3389 return 0;
3391 #endif /* READ_GAMMA || INCH_CONVERSIONS */
3393 #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED)
3394 /* The following is for when the caller doesn't much care about the
3395 * result.
3397 png_fixed_point
3398 png_muldiv_warn(png_const_structrp png_ptr, png_fixed_point a, png_int_32 times,
3399 png_int_32 divisor)
3401 png_fixed_point result;
3403 if (png_muldiv(&result, a, times, divisor) != 0)
3404 return result;
3406 png_warning(png_ptr, "fixed point overflow ignored");
3407 return 0;
3409 #endif
3411 #ifdef PNG_GAMMA_SUPPORTED /* more fixed point functions for gamma */
3412 /* Calculate a reciprocal, return 0 on div-by-zero or overflow. */
3413 png_fixed_point
3414 png_reciprocal(png_fixed_point a)
3416 #ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
3417 double r = floor(1E10/a+.5);
3419 if (r <= 2147483647. && r >= -2147483648.)
3420 return (png_fixed_point)r;
3421 #else
3422 png_fixed_point res;
3424 if (png_muldiv(&res, 100000, 100000, a) != 0)
3425 return res;
3426 #endif
3428 return 0; /* error/overflow */
3431 /* This is the shared test on whether a gamma value is 'significant' - whether
3432 * it is worth doing gamma correction.
3434 int /* PRIVATE */
3435 png_gamma_significant(png_fixed_point gamma_val)
3437 return gamma_val < PNG_FP_1 - PNG_GAMMA_THRESHOLD_FIXED ||
3438 gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED;
3440 #endif
3442 #ifdef PNG_READ_GAMMA_SUPPORTED
3443 #ifdef PNG_16BIT_SUPPORTED
3444 /* A local convenience routine. */
3445 static png_fixed_point
3446 png_product2(png_fixed_point a, png_fixed_point b)
3448 /* The required result is 1/a * 1/b; the following preserves accuracy. */
3449 #ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
3450 double r = a * 1E-5;
3451 r *= b;
3452 r = floor(r+.5);
3454 if (r <= 2147483647. && r >= -2147483648.)
3455 return (png_fixed_point)r;
3456 #else
3457 png_fixed_point res;
3459 if (png_muldiv(&res, a, b, 100000) != 0)
3460 return res;
3461 #endif
3463 return 0; /* overflow */
3465 #endif /* 16BIT */
3467 /* The inverse of the above. */
3468 png_fixed_point
3469 png_reciprocal2(png_fixed_point a, png_fixed_point b)
3471 /* The required result is 1/a * 1/b; the following preserves accuracy. */
3472 #ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
3473 if (a != 0 && b != 0)
3475 double r = 1E15/a;
3476 r /= b;
3477 r = floor(r+.5);
3479 if (r <= 2147483647. && r >= -2147483648.)
3480 return (png_fixed_point)r;
3482 #else
3483 /* This may overflow because the range of png_fixed_point isn't symmetric,
3484 * but this API is only used for the product of file and screen gamma so it
3485 * doesn't matter that the smallest number it can produce is 1/21474, not
3486 * 1/100000
3488 png_fixed_point res = png_product2(a, b);
3490 if (res != 0)
3491 return png_reciprocal(res);
3492 #endif
3494 return 0; /* overflow */
3496 #endif /* READ_GAMMA */
3498 #ifdef PNG_READ_GAMMA_SUPPORTED /* gamma table code */
3499 #ifndef PNG_FLOATING_ARITHMETIC_SUPPORTED
3500 /* Fixed point gamma.
3502 * The code to calculate the tables used below can be found in the shell script
3503 * contrib/tools/intgamma.sh
3505 * To calculate gamma this code implements fast log() and exp() calls using only
3506 * fixed point arithmetic. This code has sufficient precision for either 8-bit
3507 * or 16-bit sample values.
3509 * The tables used here were calculated using simple 'bc' programs, but C double
3510 * precision floating point arithmetic would work fine.
3512 * 8-bit log table
3513 * This is a table of -log(value/255)/log(2) for 'value' in the range 128 to
3514 * 255, so it's the base 2 logarithm of a normalized 8-bit floating point
3515 * mantissa. The numbers are 32-bit fractions.
3517 static const png_uint_32
3518 png_8bit_l2[128] =
3520 4270715492U, 4222494797U, 4174646467U, 4127164793U, 4080044201U, 4033279239U,
3521 3986864580U, 3940795015U, 3895065449U, 3849670902U, 3804606499U, 3759867474U,
3522 3715449162U, 3671346997U, 3627556511U, 3584073329U, 3540893168U, 3498011834U,
3523 3455425220U, 3413129301U, 3371120137U, 3329393864U, 3287946700U, 3246774933U,
3524 3205874930U, 3165243125U, 3124876025U, 3084770202U, 3044922296U, 3005329011U,
3525 2965987113U, 2926893432U, 2888044853U, 2849438323U, 2811070844U, 2772939474U,
3526 2735041326U, 2697373562U, 2659933400U, 2622718104U, 2585724991U, 2548951424U,
3527 2512394810U, 2476052606U, 2439922311U, 2404001468U, 2368287663U, 2332778523U,
3528 2297471715U, 2262364947U, 2227455964U, 2192742551U, 2158222529U, 2123893754U,
3529 2089754119U, 2055801552U, 2022034013U, 1988449497U, 1955046031U, 1921821672U,
3530 1888774511U, 1855902668U, 1823204291U, 1790677560U, 1758320682U, 1726131893U,
3531 1694109454U, 1662251657U, 1630556815U, 1599023271U, 1567649391U, 1536433567U,
3532 1505374214U, 1474469770U, 1443718700U, 1413119487U, 1382670639U, 1352370686U,
3533 1322218179U, 1292211689U, 1262349810U, 1232631153U, 1203054352U, 1173618059U,
3534 1144320946U, 1115161701U, 1086139034U, 1057251672U, 1028498358U, 999877854U,
3535 971388940U, 943030410U, 914801076U, 886699767U, 858725327U, 830876614U,
3536 803152505U, 775551890U, 748073672U, 720716771U, 693480120U, 666362667U,
3537 639363374U, 612481215U, 585715177U, 559064263U, 532527486U, 506103872U,
3538 479792461U, 453592303U, 427502463U, 401522014U, 375650043U, 349885648U,
3539 324227938U, 298676034U, 273229066U, 247886176U, 222646516U, 197509248U,
3540 172473545U, 147538590U, 122703574U, 97967701U, 73330182U, 48790236U,
3541 24347096U, 0U
3543 #if 0
3544 /* The following are the values for 16-bit tables - these work fine for the
3545 * 8-bit conversions but produce very slightly larger errors in the 16-bit
3546 * log (about 1.2 as opposed to 0.7 absolute error in the final value). To
3547 * use these all the shifts below must be adjusted appropriately.
3549 65166, 64430, 63700, 62976, 62257, 61543, 60835, 60132, 59434, 58741, 58054,
3550 57371, 56693, 56020, 55352, 54689, 54030, 53375, 52726, 52080, 51439, 50803,
3551 50170, 49542, 48918, 48298, 47682, 47070, 46462, 45858, 45257, 44661, 44068,
3552 43479, 42894, 42312, 41733, 41159, 40587, 40020, 39455, 38894, 38336, 37782,
3553 37230, 36682, 36137, 35595, 35057, 34521, 33988, 33459, 32932, 32408, 31887,
3554 31369, 30854, 30341, 29832, 29325, 28820, 28319, 27820, 27324, 26830, 26339,
3555 25850, 25364, 24880, 24399, 23920, 23444, 22970, 22499, 22029, 21562, 21098,
3556 20636, 20175, 19718, 19262, 18808, 18357, 17908, 17461, 17016, 16573, 16132,
3557 15694, 15257, 14822, 14390, 13959, 13530, 13103, 12678, 12255, 11834, 11415,
3558 10997, 10582, 10168, 9756, 9346, 8937, 8531, 8126, 7723, 7321, 6921, 6523,
3559 6127, 5732, 5339, 4947, 4557, 4169, 3782, 3397, 3014, 2632, 2251, 1872, 1495,
3560 1119, 744, 372
3561 #endif
3564 static png_int_32
3565 png_log8bit(unsigned int x)
3567 unsigned int lg2 = 0;
3568 /* Each time 'x' is multiplied by 2, 1 must be subtracted off the final log,
3569 * because the log is actually negate that means adding 1. The final
3570 * returned value thus has the range 0 (for 255 input) to 7.994 (for 1
3571 * input), return -1 for the overflow (log 0) case, - so the result is
3572 * always at most 19 bits.
3574 if ((x &= 0xff) == 0)
3575 return -1;
3577 if ((x & 0xf0) == 0)
3578 lg2 = 4, x <<= 4;
3580 if ((x & 0xc0) == 0)
3581 lg2 += 2, x <<= 2;
3583 if ((x & 0x80) == 0)
3584 lg2 += 1, x <<= 1;
3586 /* result is at most 19 bits, so this cast is safe: */
3587 return (png_int_32)((lg2 << 16) + ((png_8bit_l2[x-128]+32768)>>16));
3590 /* The above gives exact (to 16 binary places) log2 values for 8-bit images,
3591 * for 16-bit images we use the most significant 8 bits of the 16-bit value to
3592 * get an approximation then multiply the approximation by a correction factor
3593 * determined by the remaining up to 8 bits. This requires an additional step
3594 * in the 16-bit case.
3596 * We want log2(value/65535), we have log2(v'/255), where:
3598 * value = v' * 256 + v''
3599 * = v' * f
3601 * So f is value/v', which is equal to (256+v''/v') since v' is in the range 128
3602 * to 255 and v'' is in the range 0 to 255 f will be in the range 256 to less
3603 * than 258. The final factor also needs to correct for the fact that our 8-bit
3604 * value is scaled by 255, whereas the 16-bit values must be scaled by 65535.
3606 * This gives a final formula using a calculated value 'x' which is value/v' and
3607 * scaling by 65536 to match the above table:
3609 * log2(x/257) * 65536
3611 * Since these numbers are so close to '1' we can use simple linear
3612 * interpolation between the two end values 256/257 (result -368.61) and 258/257
3613 * (result 367.179). The values used below are scaled by a further 64 to give
3614 * 16-bit precision in the interpolation:
3616 * Start (256): -23591
3617 * Zero (257): 0
3618 * End (258): 23499
3620 #ifdef PNG_16BIT_SUPPORTED
3621 static png_int_32
3622 png_log16bit(png_uint_32 x)
3624 unsigned int lg2 = 0;
3626 /* As above, but now the input has 16 bits. */
3627 if ((x &= 0xffff) == 0)
3628 return -1;
3630 if ((x & 0xff00) == 0)
3631 lg2 = 8, x <<= 8;
3633 if ((x & 0xf000) == 0)
3634 lg2 += 4, x <<= 4;
3636 if ((x & 0xc000) == 0)
3637 lg2 += 2, x <<= 2;
3639 if ((x & 0x8000) == 0)
3640 lg2 += 1, x <<= 1;
3642 /* Calculate the base logarithm from the top 8 bits as a 28-bit fractional
3643 * value.
3645 lg2 <<= 28;
3646 lg2 += (png_8bit_l2[(x>>8)-128]+8) >> 4;
3648 /* Now we need to interpolate the factor, this requires a division by the top
3649 * 8 bits. Do this with maximum precision.
3651 x = ((x << 16) + (x >> 9)) / (x >> 8);
3653 /* Since we divided by the top 8 bits of 'x' there will be a '1' at 1<<24,
3654 * the value at 1<<16 (ignoring this) will be 0 or 1; this gives us exactly
3655 * 16 bits to interpolate to get the low bits of the result. Round the
3656 * answer. Note that the end point values are scaled by 64 to retain overall
3657 * precision and that 'lg2' is current scaled by an extra 12 bits, so adjust
3658 * the overall scaling by 6-12. Round at every step.
3660 x -= 1U << 24;
3662 if (x <= 65536U) /* <= '257' */
3663 lg2 += ((23591U * (65536U-x)) + (1U << (16+6-12-1))) >> (16+6-12);
3665 else
3666 lg2 -= ((23499U * (x-65536U)) + (1U << (16+6-12-1))) >> (16+6-12);
3668 /* Safe, because the result can't have more than 20 bits: */
3669 return (png_int_32)((lg2 + 2048) >> 12);
3671 #endif /* 16BIT */
3673 /* The 'exp()' case must invert the above, taking a 20-bit fixed point
3674 * logarithmic value and returning a 16 or 8-bit number as appropriate. In
3675 * each case only the low 16 bits are relevant - the fraction - since the
3676 * integer bits (the top 4) simply determine a shift.
3678 * The worst case is the 16-bit distinction between 65535 and 65534. This
3679 * requires perhaps spurious accuracy in the decoding of the logarithm to
3680 * distinguish log2(65535/65534.5) - 10^-5 or 17 bits. There is little chance
3681 * of getting this accuracy in practice.
3683 * To deal with this the following exp() function works out the exponent of the
3684 * frational part of the logarithm by using an accurate 32-bit value from the
3685 * top four fractional bits then multiplying in the remaining bits.
3687 static const png_uint_32
3688 png_32bit_exp[16] =
3690 /* NOTE: the first entry is deliberately set to the maximum 32-bit value. */
3691 4294967295U, 4112874773U, 3938502376U, 3771522796U, 3611622603U, 3458501653U,
3692 3311872529U, 3171459999U, 3037000500U, 2908241642U, 2784941738U, 2666869345U,
3693 2553802834U, 2445529972U, 2341847524U, 2242560872U
3696 /* Adjustment table; provided to explain the numbers in the code below. */
3697 #if 0
3698 for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"}
3699 11 44937.64284865548751208448
3700 10 45180.98734845585101160448
3701 9 45303.31936980687359311872
3702 8 45364.65110595323018870784
3703 7 45395.35850361789624614912
3704 6 45410.72259715102037508096
3705 5 45418.40724413220722311168
3706 4 45422.25021786898173001728
3707 3 45424.17186732298419044352
3708 2 45425.13273269940811464704
3709 1 45425.61317555035558641664
3710 0 45425.85339951654943850496
3711 #endif
3713 static png_uint_32
3714 png_exp(png_fixed_point x)
3716 if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */
3718 /* Obtain a 4-bit approximation */
3719 png_uint_32 e = png_32bit_exp[(x >> 12) & 0x0f];
3721 /* Incorporate the low 12 bits - these decrease the returned value by
3722 * multiplying by a number less than 1 if the bit is set. The multiplier
3723 * is determined by the above table and the shift. Notice that the values
3724 * converge on 45426 and this is used to allow linear interpolation of the
3725 * low bits.
3727 if (x & 0x800)
3728 e -= (((e >> 16) * 44938U) + 16U) >> 5;
3730 if (x & 0x400)
3731 e -= (((e >> 16) * 45181U) + 32U) >> 6;
3733 if (x & 0x200)
3734 e -= (((e >> 16) * 45303U) + 64U) >> 7;
3736 if (x & 0x100)
3737 e -= (((e >> 16) * 45365U) + 128U) >> 8;
3739 if (x & 0x080)
3740 e -= (((e >> 16) * 45395U) + 256U) >> 9;
3742 if (x & 0x040)
3743 e -= (((e >> 16) * 45410U) + 512U) >> 10;
3745 /* And handle the low 6 bits in a single block. */
3746 e -= (((e >> 16) * 355U * (x & 0x3fU)) + 256U) >> 9;
3748 /* Handle the upper bits of x. */
3749 e >>= x >> 16;
3750 return e;
3753 /* Check for overflow */
3754 if (x <= 0)
3755 return png_32bit_exp[0];
3757 /* Else underflow */
3758 return 0;
3761 static png_byte
3762 png_exp8bit(png_fixed_point lg2)
3764 /* Get a 32-bit value: */
3765 png_uint_32 x = png_exp(lg2);
3767 /* Convert the 32-bit value to 0..255 by multiplying by 256-1. Note that the
3768 * second, rounding, step can't overflow because of the first, subtraction,
3769 * step.
3771 x -= x >> 8;
3772 return (png_byte)(((x + 0x7fffffU) >> 24) & 0xff);
3775 #ifdef PNG_16BIT_SUPPORTED
3776 static png_uint_16
3777 png_exp16bit(png_fixed_point lg2)
3779 /* Get a 32-bit value: */
3780 png_uint_32 x = png_exp(lg2);
3782 /* Convert the 32-bit value to 0..65535 by multiplying by 65536-1: */
3783 x -= x >> 16;
3784 return (png_uint_16)((x + 32767U) >> 16);
3786 #endif /* 16BIT */
3787 #endif /* FLOATING_ARITHMETIC */
3789 png_byte
3790 png_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val)
3792 if (value > 0 && value < 255)
3794 # ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
3795 /* 'value' is unsigned, ANSI-C90 requires the compiler to correctly
3796 * convert this to a floating point value. This includes values that
3797 * would overflow if 'value' were to be converted to 'int'.
3799 * Apparently GCC, however, does an intermediate conversion to (int)
3800 * on some (ARM) but not all (x86) platforms, possibly because of
3801 * hardware FP limitations. (E.g. if the hardware conversion always
3802 * assumes the integer register contains a signed value.) This results
3803 * in ANSI-C undefined behavior for large values.
3805 * Other implementations on the same machine might actually be ANSI-C90
3806 * conformant and therefore compile spurious extra code for the large
3807 * values.
3809 * We can be reasonably sure that an unsigned to float conversion
3810 * won't be faster than an int to float one. Therefore this code
3811 * assumes responsibility for the undefined behavior, which it knows
3812 * can't happen because of the check above.
3814 * Note the argument to this routine is an (unsigned int) because, on
3815 * 16-bit platforms, it is assigned a value which might be out of
3816 * range for an (int); that would result in undefined behavior in the
3817 * caller if the *argument* ('value') were to be declared (int).
3819 double r = floor(255*pow((int)/*SAFE*/value/255.,gamma_val*.00001)+.5);
3820 return (png_byte)r;
3821 # else
3822 png_int_32 lg2 = png_log8bit(value);
3823 png_fixed_point res;
3825 if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0)
3826 return png_exp8bit(res);
3828 /* Overflow. */
3829 value = 0;
3830 # endif
3833 return (png_byte)(value & 0xff);
3836 #ifdef PNG_16BIT_SUPPORTED
3837 png_uint_16
3838 png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val)
3840 if (value > 0 && value < 65535)
3842 # ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
3843 /* The same (unsigned int)->(double) constraints apply here as above,
3844 * however in this case the (unsigned int) to (int) conversion can
3845 * overflow on an ANSI-C90 compliant system so the cast needs to ensure
3846 * that this is not possible.
3848 double r = floor(65535*pow((png_int_32)value/65535.,
3849 gamma_val*.00001)+.5);
3850 return (png_uint_16)r;
3851 # else
3852 png_int_32 lg2 = png_log16bit(value);
3853 png_fixed_point res;
3855 if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0)
3856 return png_exp16bit(res);
3858 /* Overflow. */
3859 value = 0;
3860 # endif
3863 return (png_uint_16)value;
3865 #endif /* 16BIT */
3867 /* This does the right thing based on the bit_depth field of the
3868 * png_struct, interpreting values as 8-bit or 16-bit. While the result
3869 * is nominally a 16-bit value if bit depth is 8 then the result is
3870 * 8-bit (as are the arguments.)
3872 png_uint_16 /* PRIVATE */
3873 png_gamma_correct(png_structrp png_ptr, unsigned int value,
3874 png_fixed_point gamma_val)
3876 if (png_ptr->bit_depth == 8)
3877 return png_gamma_8bit_correct(value, gamma_val);
3879 #ifdef PNG_16BIT_SUPPORTED
3880 else
3881 return png_gamma_16bit_correct(value, gamma_val);
3882 #else
3883 /* should not reach this */
3884 return 0;
3885 #endif /* 16BIT */
3888 #ifdef PNG_16BIT_SUPPORTED
3889 /* Internal function to build a single 16-bit table - the table consists of
3890 * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount
3891 * to shift the input values right (or 16-number_of_signifiant_bits).
3893 * The caller is responsible for ensuring that the table gets cleaned up on
3894 * png_error (i.e. if one of the mallocs below fails) - i.e. the *table argument
3895 * should be somewhere that will be cleaned.
3897 static void
3898 png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable,
3899 PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
3901 /* Various values derived from 'shift': */
3902 PNG_CONST unsigned int num = 1U << (8U - shift);
3903 #ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
3904 /* CSE the division and work round wacky GCC warnings (see the comments
3905 * in png_gamma_8bit_correct for where these come from.)
3907 PNG_CONST double fmax = 1./(((png_int_32)1 << (16U - shift))-1);
3908 #endif
3909 PNG_CONST unsigned int max = (1U << (16U - shift))-1U;
3910 PNG_CONST unsigned int max_by_2 = 1U << (15U-shift);
3911 unsigned int i;
3913 png_uint_16pp table = *ptable =
3914 (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p)));
3916 for (i = 0; i < num; i++)
3918 png_uint_16p sub_table = table[i] =
3919 (png_uint_16p)png_malloc(png_ptr, 256 * (sizeof (png_uint_16)));
3921 /* The 'threshold' test is repeated here because it can arise for one of
3922 * the 16-bit tables even if the others don't hit it.
3924 if (png_gamma_significant(gamma_val) != 0)
3926 /* The old code would overflow at the end and this would cause the
3927 * 'pow' function to return a result >1, resulting in an
3928 * arithmetic error. This code follows the spec exactly; ig is
3929 * the recovered input sample, it always has 8-16 bits.
3931 * We want input * 65535/max, rounded, the arithmetic fits in 32
3932 * bits (unsigned) so long as max <= 32767.
3934 unsigned int j;
3935 for (j = 0; j < 256; j++)
3937 png_uint_32 ig = (j << (8-shift)) + i;
3938 # ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
3939 /* Inline the 'max' scaling operation: */
3940 /* See png_gamma_8bit_correct for why the cast to (int) is
3941 * required here.
3943 double d = floor(65535.*pow(ig*fmax, gamma_val*.00001)+.5);
3944 sub_table[j] = (png_uint_16)d;
3945 # else
3946 if (shift != 0)
3947 ig = (ig * 65535U + max_by_2)/max;
3949 sub_table[j] = png_gamma_16bit_correct(ig, gamma_val);
3950 # endif
3953 else
3955 /* We must still build a table, but do it the fast way. */
3956 unsigned int j;
3958 for (j = 0; j < 256; j++)
3960 png_uint_32 ig = (j << (8-shift)) + i;
3962 if (shift != 0)
3963 ig = (ig * 65535U + max_by_2)/max;
3965 sub_table[j] = (png_uint_16)ig;
3971 /* NOTE: this function expects the *inverse* of the overall gamma transformation
3972 * required.
3974 static void
3975 png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable,
3976 PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
3978 PNG_CONST unsigned int num = 1U << (8U - shift);
3979 PNG_CONST unsigned int max = (1U << (16U - shift))-1U;
3980 unsigned int i;
3981 png_uint_32 last;
3983 png_uint_16pp table = *ptable =
3984 (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p)));
3986 /* 'num' is the number of tables and also the number of low bits of low
3987 * bits of the input 16-bit value used to select a table. Each table is
3988 * itself indexed by the high 8 bits of the value.
3990 for (i = 0; i < num; i++)
3991 table[i] = (png_uint_16p)png_malloc(png_ptr,
3992 256 * (sizeof (png_uint_16)));
3994 /* 'gamma_val' is set to the reciprocal of the value calculated above, so
3995 * pow(out,g) is an *input* value. 'last' is the last input value set.
3997 * In the loop 'i' is used to find output values. Since the output is
3998 * 8-bit there are only 256 possible values. The tables are set up to
3999 * select the closest possible output value for each input by finding
4000 * the input value at the boundary between each pair of output values
4001 * and filling the table up to that boundary with the lower output
4002 * value.
4004 * The boundary values are 0.5,1.5..253.5,254.5. Since these are 9-bit
4005 * values the code below uses a 16-bit value in i; the values start at
4006 * 128.5 (for 0.5) and step by 257, for a total of 254 values (the last
4007 * entries are filled with 255). Start i at 128 and fill all 'last'
4008 * table entries <= 'max'
4010 last = 0;
4011 for (i = 0; i < 255; ++i) /* 8-bit output value */
4013 /* Find the corresponding maximum input value */
4014 png_uint_16 out = (png_uint_16)(i * 257U); /* 16-bit output value */
4016 /* Find the boundary value in 16 bits: */
4017 png_uint_32 bound = png_gamma_16bit_correct(out+128U, gamma_val);
4019 /* Adjust (round) to (16-shift) bits: */
4020 bound = (bound * max + 32768U)/65535U + 1U;
4022 while (last < bound)
4024 table[last & (0xffU >> shift)][last >> (8U - shift)] = out;
4025 last++;
4029 /* And fill in the final entries. */
4030 while (last < (num << 8))
4032 table[last & (0xff >> shift)][last >> (8U - shift)] = 65535U;
4033 last++;
4036 #endif /* 16BIT */
4038 /* Build a single 8-bit table: same as the 16-bit case but much simpler (and
4039 * typically much faster). Note that libpng currently does no sBIT processing
4040 * (apparently contrary to the spec) so a 256-entry table is always generated.
4042 static void
4043 png_build_8bit_table(png_structrp png_ptr, png_bytepp ptable,
4044 PNG_CONST png_fixed_point gamma_val)
4046 unsigned int i;
4047 png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256);
4049 if (png_gamma_significant(gamma_val) != 0)
4050 for (i=0; i<256; i++)
4051 table[i] = png_gamma_8bit_correct(i, gamma_val);
4053 else
4054 for (i=0; i<256; ++i)
4055 table[i] = (png_byte)(i & 0xff);
4058 /* Used from png_read_destroy and below to release the memory used by the gamma
4059 * tables.
4061 void /* PRIVATE */
4062 png_destroy_gamma_table(png_structrp png_ptr)
4064 png_free(png_ptr, png_ptr->gamma_table);
4065 png_ptr->gamma_table = NULL;
4067 #ifdef PNG_16BIT_SUPPORTED
4068 if (png_ptr->gamma_16_table != NULL)
4070 int i;
4071 int istop = (1 << (8 - png_ptr->gamma_shift));
4072 for (i = 0; i < istop; i++)
4074 png_free(png_ptr, png_ptr->gamma_16_table[i]);
4076 png_free(png_ptr, png_ptr->gamma_16_table);
4077 png_ptr->gamma_16_table = NULL;
4079 #endif /* 16BIT */
4081 #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
4082 defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
4083 defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
4084 png_free(png_ptr, png_ptr->gamma_from_1);
4085 png_ptr->gamma_from_1 = NULL;
4086 png_free(png_ptr, png_ptr->gamma_to_1);
4087 png_ptr->gamma_to_1 = NULL;
4089 #ifdef PNG_16BIT_SUPPORTED
4090 if (png_ptr->gamma_16_from_1 != NULL)
4092 int i;
4093 int istop = (1 << (8 - png_ptr->gamma_shift));
4094 for (i = 0; i < istop; i++)
4096 png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
4098 png_free(png_ptr, png_ptr->gamma_16_from_1);
4099 png_ptr->gamma_16_from_1 = NULL;
4101 if (png_ptr->gamma_16_to_1 != NULL)
4103 int i;
4104 int istop = (1 << (8 - png_ptr->gamma_shift));
4105 for (i = 0; i < istop; i++)
4107 png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
4109 png_free(png_ptr, png_ptr->gamma_16_to_1);
4110 png_ptr->gamma_16_to_1 = NULL;
4112 #endif /* 16BIT */
4113 #endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
4116 /* We build the 8- or 16-bit gamma tables here. Note that for 16-bit
4117 * tables, we don't make a full table if we are reducing to 8-bit in
4118 * the future. Note also how the gamma_16 tables are segmented so that
4119 * we don't need to allocate > 64K chunks for a full 16-bit table.
4121 void /* PRIVATE */
4122 png_build_gamma_table(png_structrp png_ptr, int bit_depth)
4124 png_debug(1, "in png_build_gamma_table");
4126 /* Remove any existing table; this copes with multiple calls to
4127 * png_read_update_info. The warning is because building the gamma tables
4128 * multiple times is a performance hit - it's harmless but the ability to
4129 * call png_read_update_info() multiple times is new in 1.5.6 so it seems
4130 * sensible to warn if the app introduces such a hit.
4132 if (png_ptr->gamma_table != NULL || png_ptr->gamma_16_table != NULL)
4134 png_warning(png_ptr, "gamma table being rebuilt");
4135 png_destroy_gamma_table(png_ptr);
4138 if (bit_depth <= 8)
4140 png_build_8bit_table(png_ptr, &png_ptr->gamma_table,
4141 png_ptr->screen_gamma > 0 ?
4142 png_reciprocal2(png_ptr->colorspace.gamma,
4143 png_ptr->screen_gamma) : PNG_FP_1);
4145 #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
4146 defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
4147 defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
4148 if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)
4150 png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1,
4151 png_reciprocal(png_ptr->colorspace.gamma));
4153 png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1,
4154 png_ptr->screen_gamma > 0 ?
4155 png_reciprocal(png_ptr->screen_gamma) :
4156 png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
4158 #endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
4160 #ifdef PNG_16BIT_SUPPORTED
4161 else
4163 png_byte shift, sig_bit;
4165 if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
4167 sig_bit = png_ptr->sig_bit.red;
4169 if (png_ptr->sig_bit.green > sig_bit)
4170 sig_bit = png_ptr->sig_bit.green;
4172 if (png_ptr->sig_bit.blue > sig_bit)
4173 sig_bit = png_ptr->sig_bit.blue;
4175 else
4176 sig_bit = png_ptr->sig_bit.gray;
4178 /* 16-bit gamma code uses this equation:
4180 * ov = table[(iv & 0xff) >> gamma_shift][iv >> 8]
4182 * Where 'iv' is the input color value and 'ov' is the output value -
4183 * pow(iv, gamma).
4185 * Thus the gamma table consists of up to 256 256-entry tables. The table
4186 * is selected by the (8-gamma_shift) most significant of the low 8 bits
4187 * of the color value then indexed by the upper 8 bits:
4189 * table[low bits][high 8 bits]
4191 * So the table 'n' corresponds to all those 'iv' of:
4193 * <all high 8-bit values><n << gamma_shift>..<(n+1 << gamma_shift)-1>
4196 if (sig_bit > 0 && sig_bit < 16U)
4197 /* shift == insignificant bits */
4198 shift = (png_byte)((16U - sig_bit) & 0xff);
4200 else
4201 shift = 0; /* keep all 16 bits */
4203 if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)
4205 /* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively
4206 * the significant bits in the *input* when the output will
4207 * eventually be 8 bits. By default it is 11.
4209 if (shift < (16U - PNG_MAX_GAMMA_8))
4210 shift = (16U - PNG_MAX_GAMMA_8);
4213 if (shift > 8U)
4214 shift = 8U; /* Guarantees at least one table! */
4216 png_ptr->gamma_shift = shift;
4218 /* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now
4219 * PNG_COMPOSE). This effectively smashed the background calculation for
4220 * 16-bit output because the 8-bit table assumes the result will be
4221 * reduced to 8 bits.
4223 if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)
4224 png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift,
4225 png_ptr->screen_gamma > 0 ? png_product2(png_ptr->colorspace.gamma,
4226 png_ptr->screen_gamma) : PNG_FP_1);
4228 else
4229 png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift,
4230 png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma,
4231 png_ptr->screen_gamma) : PNG_FP_1);
4233 #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
4234 defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
4235 defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
4236 if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)
4238 png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift,
4239 png_reciprocal(png_ptr->colorspace.gamma));
4241 /* Notice that the '16 from 1' table should be full precision, however
4242 * the lookup on this table still uses gamma_shift, so it can't be.
4243 * TODO: fix this.
4245 png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift,
4246 png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
4247 png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
4249 #endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
4251 #endif /* 16BIT */
4253 #endif /* READ_GAMMA */
4255 /* HARDWARE OR SOFTWARE OPTION SUPPORT */
4256 #ifdef PNG_SET_OPTION_SUPPORTED
4257 int PNGAPI
4258 png_set_option(png_structrp png_ptr, int option, int onoff)
4260 if (png_ptr != NULL && option >= 0 && option < PNG_OPTION_NEXT &&
4261 (option & 1) == 0)
4263 png_uint_32 mask = 3 << option;
4264 png_uint_32 setting = (2 + (onoff != 0)) << option;
4265 png_uint_32 current = png_ptr->options;
4267 png_ptr->options = (png_uint_32)(((current & ~mask) | setting) & 0xff);
4269 return (current & mask) >> option;
4272 return PNG_OPTION_INVALID;
4274 #endif
4276 /* sRGB support */
4277 #if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
4278 defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
4279 /* sRGB conversion tables; these are machine generated with the code in
4280 * contrib/tools/makesRGB.c. The actual sRGB transfer curve defined in the
4281 * specification (see the article at http://en.wikipedia.org/wiki/SRGB)
4282 * is used, not the gamma=1/2.2 approximation use elsewhere in libpng.
4283 * The sRGB to linear table is exact (to the nearest 16-bit linear fraction).
4284 * The inverse (linear to sRGB) table has accuracies as follows:
4286 * For all possible (255*65535+1) input values:
4288 * error: -0.515566 - 0.625971, 79441 (0.475369%) of readings inexact
4290 * For the input values corresponding to the 65536 16-bit values:
4292 * error: -0.513727 - 0.607759, 308 (0.469978%) of readings inexact
4294 * In all cases the inexact readings are only off by one.
4297 #ifdef PNG_SIMPLIFIED_READ_SUPPORTED
4298 /* The convert-to-sRGB table is only currently required for read. */
4299 const png_uint_16 png_sRGB_table[256] =
4301 0,20,40,60,80,99,119,139,
4302 159,179,199,219,241,264,288,313,
4303 340,367,396,427,458,491,526,562,
4304 599,637,677,718,761,805,851,898,
4305 947,997,1048,1101,1156,1212,1270,1330,
4306 1391,1453,1517,1583,1651,1720,1790,1863,
4307 1937,2013,2090,2170,2250,2333,2418,2504,
4308 2592,2681,2773,2866,2961,3058,3157,3258,
4309 3360,3464,3570,3678,3788,3900,4014,4129,
4310 4247,4366,4488,4611,4736,4864,4993,5124,
4311 5257,5392,5530,5669,5810,5953,6099,6246,
4312 6395,6547,6700,6856,7014,7174,7335,7500,
4313 7666,7834,8004,8177,8352,8528,8708,8889,
4314 9072,9258,9445,9635,9828,10022,10219,10417,
4315 10619,10822,11028,11235,11446,11658,11873,12090,
4316 12309,12530,12754,12980,13209,13440,13673,13909,
4317 14146,14387,14629,14874,15122,15371,15623,15878,
4318 16135,16394,16656,16920,17187,17456,17727,18001,
4319 18277,18556,18837,19121,19407,19696,19987,20281,
4320 20577,20876,21177,21481,21787,22096,22407,22721,
4321 23038,23357,23678,24002,24329,24658,24990,25325,
4322 25662,26001,26344,26688,27036,27386,27739,28094,
4323 28452,28813,29176,29542,29911,30282,30656,31033,
4324 31412,31794,32179,32567,32957,33350,33745,34143,
4325 34544,34948,35355,35764,36176,36591,37008,37429,
4326 37852,38278,38706,39138,39572,40009,40449,40891,
4327 41337,41785,42236,42690,43147,43606,44069,44534,
4328 45002,45473,45947,46423,46903,47385,47871,48359,
4329 48850,49344,49841,50341,50844,51349,51858,52369,
4330 52884,53401,53921,54445,54971,55500,56032,56567,
4331 57105,57646,58190,58737,59287,59840,60396,60955,
4332 61517,62082,62650,63221,63795,64372,64952,65535
4334 #endif /* SIMPLIFIED_READ */
4336 /* The base/delta tables are required for both read and write (but currently
4337 * only the simplified versions.)
4339 const png_uint_16 png_sRGB_base[512] =
4341 128,1782,3383,4644,5675,6564,7357,8074,
4342 8732,9346,9921,10463,10977,11466,11935,12384,
4343 12816,13233,13634,14024,14402,14769,15125,15473,
4344 15812,16142,16466,16781,17090,17393,17690,17981,
4345 18266,18546,18822,19093,19359,19621,19879,20133,
4346 20383,20630,20873,21113,21349,21583,21813,22041,
4347 22265,22487,22707,22923,23138,23350,23559,23767,
4348 23972,24175,24376,24575,24772,24967,25160,25352,
4349 25542,25730,25916,26101,26284,26465,26645,26823,
4350 27000,27176,27350,27523,27695,27865,28034,28201,
4351 28368,28533,28697,28860,29021,29182,29341,29500,
4352 29657,29813,29969,30123,30276,30429,30580,30730,
4353 30880,31028,31176,31323,31469,31614,31758,31902,
4354 32045,32186,32327,32468,32607,32746,32884,33021,
4355 33158,33294,33429,33564,33697,33831,33963,34095,
4356 34226,34357,34486,34616,34744,34873,35000,35127,
4357 35253,35379,35504,35629,35753,35876,35999,36122,
4358 36244,36365,36486,36606,36726,36845,36964,37083,
4359 37201,37318,37435,37551,37668,37783,37898,38013,
4360 38127,38241,38354,38467,38580,38692,38803,38915,
4361 39026,39136,39246,39356,39465,39574,39682,39790,
4362 39898,40005,40112,40219,40325,40431,40537,40642,
4363 40747,40851,40955,41059,41163,41266,41369,41471,
4364 41573,41675,41777,41878,41979,42079,42179,42279,
4365 42379,42478,42577,42676,42775,42873,42971,43068,
4366 43165,43262,43359,43456,43552,43648,43743,43839,
4367 43934,44028,44123,44217,44311,44405,44499,44592,
4368 44685,44778,44870,44962,45054,45146,45238,45329,
4369 45420,45511,45601,45692,45782,45872,45961,46051,
4370 46140,46229,46318,46406,46494,46583,46670,46758,
4371 46846,46933,47020,47107,47193,47280,47366,47452,
4372 47538,47623,47709,47794,47879,47964,48048,48133,
4373 48217,48301,48385,48468,48552,48635,48718,48801,
4374 48884,48966,49048,49131,49213,49294,49376,49458,
4375 49539,49620,49701,49782,49862,49943,50023,50103,
4376 50183,50263,50342,50422,50501,50580,50659,50738,
4377 50816,50895,50973,51051,51129,51207,51285,51362,
4378 51439,51517,51594,51671,51747,51824,51900,51977,
4379 52053,52129,52205,52280,52356,52432,52507,52582,
4380 52657,52732,52807,52881,52956,53030,53104,53178,
4381 53252,53326,53400,53473,53546,53620,53693,53766,
4382 53839,53911,53984,54056,54129,54201,54273,54345,
4383 54417,54489,54560,54632,54703,54774,54845,54916,
4384 54987,55058,55129,55199,55269,55340,55410,55480,
4385 55550,55620,55689,55759,55828,55898,55967,56036,
4386 56105,56174,56243,56311,56380,56448,56517,56585,
4387 56653,56721,56789,56857,56924,56992,57059,57127,
4388 57194,57261,57328,57395,57462,57529,57595,57662,
4389 57728,57795,57861,57927,57993,58059,58125,58191,
4390 58256,58322,58387,58453,58518,58583,58648,58713,
4391 58778,58843,58908,58972,59037,59101,59165,59230,
4392 59294,59358,59422,59486,59549,59613,59677,59740,
4393 59804,59867,59930,59993,60056,60119,60182,60245,
4394 60308,60370,60433,60495,60558,60620,60682,60744,
4395 60806,60868,60930,60992,61054,61115,61177,61238,
4396 61300,61361,61422,61483,61544,61605,61666,61727,
4397 61788,61848,61909,61969,62030,62090,62150,62211,
4398 62271,62331,62391,62450,62510,62570,62630,62689,
4399 62749,62808,62867,62927,62986,63045,63104,63163,
4400 63222,63281,63340,63398,63457,63515,63574,63632,
4401 63691,63749,63807,63865,63923,63981,64039,64097,
4402 64155,64212,64270,64328,64385,64443,64500,64557,
4403 64614,64672,64729,64786,64843,64900,64956,65013,
4404 65070,65126,65183,65239,65296,65352,65409,65465
4407 const png_byte png_sRGB_delta[512] =
4409 207,201,158,129,113,100,90,82,77,72,68,64,61,59,56,54,
4410 52,50,49,47,46,45,43,42,41,40,39,39,38,37,36,36,
4411 35,34,34,33,33,32,32,31,31,30,30,30,29,29,28,28,
4412 28,27,27,27,27,26,26,26,25,25,25,25,24,24,24,24,
4413 23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21,
4414 21,20,20,20,20,20,20,20,20,19,19,19,19,19,19,19,
4415 19,18,18,18,18,18,18,18,18,18,18,17,17,17,17,17,
4416 17,17,17,17,17,17,16,16,16,16,16,16,16,16,16,16,
4417 16,16,16,16,15,15,15,15,15,15,15,15,15,15,15,15,
4418 15,15,15,15,14,14,14,14,14,14,14,14,14,14,14,14,
4419 14,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13,
4420 13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,
4421 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
4422 12,12,12,12,12,12,12,12,12,12,12,12,11,11,11,11,
4423 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
4424 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
4425 11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
4426 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
4427 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
4428 10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4429 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4430 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4431 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4432 9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4433 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4434 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4435 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4436 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4437 8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,
4438 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
4439 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
4440 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
4442 #endif /* SIMPLIFIED READ/WRITE sRGB support */
4444 /* SIMPLIFIED READ/WRITE SUPPORT */
4445 #if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
4446 defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
4447 static int
4448 png_image_free_function(png_voidp argument)
4450 png_imagep image = png_voidcast(png_imagep, argument);
4451 png_controlp cp = image->opaque;
4452 png_control c;
4454 /* Double check that we have a png_ptr - it should be impossible to get here
4455 * without one.
4457 if (cp->png_ptr == NULL)
4458 return 0;
4460 /* First free any data held in the control structure. */
4461 # ifdef PNG_STDIO_SUPPORTED
4462 if (cp->owned_file != 0)
4464 FILE *fp = png_voidcast(FILE*, cp->png_ptr->io_ptr);
4465 cp->owned_file = 0;
4467 /* Ignore errors here. */
4468 if (fp != NULL)
4470 cp->png_ptr->io_ptr = NULL;
4471 (void)fclose(fp);
4474 # endif
4476 /* Copy the control structure so that the original, allocated, version can be
4477 * safely freed. Notice that a png_error here stops the remainder of the
4478 * cleanup, but this is probably fine because that would indicate bad memory
4479 * problems anyway.
4481 c = *cp;
4482 image->opaque = &c;
4483 png_free(c.png_ptr, cp);
4485 /* Then the structures, calling the correct API. */
4486 if (c.for_write != 0)
4488 # ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
4489 png_destroy_write_struct(&c.png_ptr, &c.info_ptr);
4490 # else
4491 png_error(c.png_ptr, "simplified write not supported");
4492 # endif
4494 else
4496 # ifdef PNG_SIMPLIFIED_READ_SUPPORTED
4497 png_destroy_read_struct(&c.png_ptr, &c.info_ptr, NULL);
4498 # else
4499 png_error(c.png_ptr, "simplified read not supported");
4500 # endif
4503 /* Success. */
4504 return 1;
4507 void PNGAPI
4508 png_image_free(png_imagep image)
4510 /* Safely call the real function, but only if doing so is safe at this point
4511 * (if not inside an error handling context). Otherwise assume
4512 * png_safe_execute will call this API after the return.
4514 if (image != NULL && image->opaque != NULL &&
4515 image->opaque->error_buf == NULL)
4517 /* Ignore errors here: */
4518 (void)png_safe_execute(image, png_image_free_function, image);
4519 image->opaque = NULL;
4523 int /* PRIVATE */
4524 png_image_error(png_imagep image, png_const_charp error_message)
4526 /* Utility to log an error. */
4527 png_safecat(image->message, (sizeof image->message), 0, error_message);
4528 image->warning_or_error |= PNG_IMAGE_ERROR;
4529 png_image_free(image);
4530 return 0;
4533 #endif /* SIMPLIFIED READ/WRITE */
4534 #endif /* READ || WRITE */