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