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