src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
author prr
Tue, 31 Jul 2018 14:03:39 -0700
changeset 51304 66d9993dd4ad
parent 48280 791d551bcdb8
child 57618 53154e45385a
permissions -rw-r--r--
8208353: Upgrade JDK 11 to libpng 1.6.35 Reviewed-by: jdv, kaddepalli
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     6
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     7
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     8
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     9
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    22
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    23
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
/* pngread.c - read a PNG file
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
 * This file is available under and governed by the GNU General Public
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
 * License version 2 only, as published by the Free Software Foundation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
 * However, the following notice accompanied the original version of this
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
 * file and, per its terms, should not be removed:
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
 *
51304
66d9993dd4ad 8208353: Upgrade JDK 11 to libpng 1.6.35
prr
parents: 48280
diff changeset
    32
 * Last changed in libpng 1.6.35 [July 15, 2018]
66d9993dd4ad 8208353: Upgrade JDK 11 to libpng 1.6.35
prr
parents: 48280
diff changeset
    33
 * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
 *
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    37
 * This code is released under the libpng license.
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    38
 * For conditions of distribution and use, see the disclaimer
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    39
 * and license in png.h
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    40
 *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
 * This file contains routines that an application calls directly to
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
 * read a PNG file or stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    45
#include "pngpriv.h"
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    46
#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    47
#  include <errno.h>
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    48
#endif
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    50
#ifdef PNG_READ_SUPPORTED
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
/* Create a PNG structure for reading, and allocate any memory needed. */
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    53
PNG_FUNCTION(png_structp,PNGAPI
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    54
png_create_read_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    55
    png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
{
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    57
#ifndef PNG_USER_MEM_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    58
   png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
    59
        error_fn, warn_fn, NULL, NULL, NULL);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    60
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    61
   return png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
    62
        warn_fn, NULL, NULL, NULL);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    65
/* Alternate create PNG structure for reading, and allocate any memory
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    66
 * needed.
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    67
 */
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    68
PNG_FUNCTION(png_structp,PNGAPI
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    69
png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    70
    png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
    71
    png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
{
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    73
   png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
    74
       error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    75
#endif /* USER_MEM */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    76
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    77
   if (png_ptr != NULL)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
   {
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    79
      png_ptr->mode = PNG_IS_READ_STRUCT;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    80
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    81
      /* Added in libpng-1.6.0; this can be used to detect a read structure if
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    82
       * required (it will be zero in a write structure.)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    83
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    84
#     ifdef PNG_SEQUENTIAL_READ_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    85
         png_ptr->IDAT_read_size = PNG_IDAT_READ_SIZE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    86
#     endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    87
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    88
#     ifdef PNG_BENIGN_READ_ERRORS_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    89
         png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    90
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    91
         /* In stable builds only warn if an application error can be completely
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    92
          * handled.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    93
          */
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
    94
#        if PNG_RELEASE_BUILD
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    95
            png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    96
#        endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    97
#     endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    98
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
    99
      /* TODO: delay this, it can be done in png_init_io (if the app doesn't
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   100
       * do it itself) avoiding setting the default function if it is not
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   101
       * required.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   102
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   103
      png_set_read_fn(png_ptr, NULL, NULL);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
   }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   106
   return png_ptr;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   110
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
/* Read the information before the actual image data.  This has been
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
 * changed in v0.90 to allow reading a file that already has the magic
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
 * bytes read from the stream.  You can tell libpng how many bytes have
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
 * been read from the beginning of the stream (up to the maximum of 8)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
 * via png_set_sig_bytes(), and we will only check the remaining bytes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
 * here.  The application can then have access to the signature bytes we
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
 * read if it is determined that this isn't a valid PNG file.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
void PNGAPI
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   120
png_read_info(png_structrp png_ptr, png_inforp info_ptr)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
{
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   122
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   123
   int keep;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   124
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   125
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   126
   png_debug(1, "in png_read_info");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   128
   if (png_ptr == NULL || info_ptr == NULL)
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   129
      return;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   131
   /* Read and check the PNG file signature. */
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   132
   png_read_sig(png_ptr, info_ptr);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   134
   for (;;)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
   {
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   136
      png_uint_32 length = png_read_chunk_header(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   137
      png_uint_32 chunk_name = png_ptr->chunk_name;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   138
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   139
      /* IDAT logic needs to happen here to simplify getting the two flags
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   140
       * right.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   141
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   142
      if (chunk_name == png_IDAT)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   143
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   144
         if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   145
            png_chunk_error(png_ptr, "Missing IHDR before IDAT");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   146
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   147
         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   148
             (png_ptr->mode & PNG_HAVE_PLTE) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   149
            png_chunk_error(png_ptr, "Missing PLTE before IDAT");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   150
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   151
         else if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   152
            png_chunk_benign_error(png_ptr, "Too many IDATs found");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   153
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   154
         png_ptr->mode |= PNG_HAVE_IDAT;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   155
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   156
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   157
      else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   158
      {
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   159
         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   160
         png_ptr->mode |= PNG_AFTER_IDAT;
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   161
      }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
      /* This should be a binary subdivision search or a hash for
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
       * matching the chunk name rather than a linear search.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
       */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   166
      if (chunk_name == png_IHDR)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
         png_handle_IHDR(png_ptr, info_ptr, length);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   168
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   169
      else if (chunk_name == png_IEND)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
         png_handle_IEND(png_ptr, info_ptr, length);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   171
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   173
      else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
      {
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   175
         png_handle_unknown(png_ptr, info_ptr, length, keep);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   176
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   177
         if (chunk_name == png_PLTE)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
            png_ptr->mode |= PNG_HAVE_PLTE;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   179
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   180
         else if (chunk_name == png_IDAT)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
         {
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   182
            png_ptr->idat_size = 0; /* It has been consumed */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
#endif
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   187
      else if (chunk_name == png_PLTE)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
         png_handle_PLTE(png_ptr, info_ptr, length);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   189
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   190
      else if (chunk_name == png_IDAT)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
         png_ptr->idat_size = length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
         break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
      }
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   195
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   196
#ifdef PNG_READ_bKGD_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   197
      else if (chunk_name == png_bKGD)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
         png_handle_bKGD(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   200
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   201
#ifdef PNG_READ_cHRM_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   202
      else if (chunk_name == png_cHRM)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
         png_handle_cHRM(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   205
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   206
#ifdef PNG_READ_eXIf_SUPPORTED
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   207
      else if (chunk_name == png_eXIf)
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   208
         png_handle_eXIf(png_ptr, info_ptr, length);
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   209
#endif
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   210
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   211
#ifdef PNG_READ_gAMA_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   212
      else if (chunk_name == png_gAMA)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
         png_handle_gAMA(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   215
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   216
#ifdef PNG_READ_hIST_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   217
      else if (chunk_name == png_hIST)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
         png_handle_hIST(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   220
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   221
#ifdef PNG_READ_oFFs_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   222
      else if (chunk_name == png_oFFs)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
         png_handle_oFFs(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   225
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   226
#ifdef PNG_READ_pCAL_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   227
      else if (chunk_name == png_pCAL)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
         png_handle_pCAL(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   230
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   231
#ifdef PNG_READ_sCAL_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   232
      else if (chunk_name == png_sCAL)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
         png_handle_sCAL(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   235
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   236
#ifdef PNG_READ_pHYs_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   237
      else if (chunk_name == png_pHYs)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
         png_handle_pHYs(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   240
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   241
#ifdef PNG_READ_sBIT_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   242
      else if (chunk_name == png_sBIT)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
         png_handle_sBIT(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   245
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   246
#ifdef PNG_READ_sRGB_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   247
      else if (chunk_name == png_sRGB)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
         png_handle_sRGB(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   250
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   251
#ifdef PNG_READ_iCCP_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   252
      else if (chunk_name == png_iCCP)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
         png_handle_iCCP(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   255
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   256
#ifdef PNG_READ_sPLT_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   257
      else if (chunk_name == png_sPLT)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
         png_handle_sPLT(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   260
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   261
#ifdef PNG_READ_tEXt_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   262
      else if (chunk_name == png_tEXt)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
         png_handle_tEXt(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   265
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   266
#ifdef PNG_READ_tIME_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   267
      else if (chunk_name == png_tIME)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
         png_handle_tIME(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   270
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   271
#ifdef PNG_READ_tRNS_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   272
      else if (chunk_name == png_tRNS)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
         png_handle_tRNS(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   275
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   276
#ifdef PNG_READ_zTXt_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   277
      else if (chunk_name == png_zTXt)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
         png_handle_zTXt(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   280
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   281
#ifdef PNG_READ_iTXt_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   282
      else if (chunk_name == png_iTXt)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
         png_handle_iTXt(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   285
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
      else
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   287
         png_handle_unknown(png_ptr, info_ptr, length,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   288
             PNG_HANDLE_CHUNK_AS_DEFAULT);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
   }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
}
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   291
#endif /* SEQUENTIAL_READ */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   293
/* Optional call to update the users info_ptr structure */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
void PNGAPI
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   295
png_read_update_info(png_structrp png_ptr, png_inforp info_ptr)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
{
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   297
   png_debug(1, "in png_read_update_info");
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   298
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   299
   if (png_ptr != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   300
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   301
      if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   302
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   303
         png_read_start_row(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   304
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   305
#        ifdef PNG_READ_TRANSFORMS_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   306
            png_read_transform_info(png_ptr, info_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   307
#        else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   308
            PNG_UNUSED(info_ptr)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   309
#        endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   310
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   311
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   312
      /* New in 1.6.0 this avoids the bug of doing the initializations twice */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   313
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   314
         png_app_error(png_ptr,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   315
             "png_read_update_info/png_start_read_image: duplicate call");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   316
   }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   319
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
/* Initialize palette, background, etc, after transformations
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
 * are set, but before any reading takes place.  This allows
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
 * the user to obtain a gamma-corrected palette, for example.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
 * If the user doesn't call this, we will do it ourselves.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
void PNGAPI
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   326
png_start_read_image(png_structrp png_ptr)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
{
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   328
   png_debug(1, "in png_start_read_image");
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   329
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   330
   if (png_ptr != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   331
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   332
      if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   333
         png_read_start_row(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   334
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   335
      /* New in 1.6.0 this avoids the bug of doing the initializations twice */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   336
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   337
         png_app_error(png_ptr,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   338
             "png_start_read_image/png_read_update_info: duplicate call");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   339
   }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
}
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   341
#endif /* SEQUENTIAL_READ */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   343
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   344
#ifdef PNG_MNG_FEATURES_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   345
/* Undoes intrapixel differencing,
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   346
 * NOTE: this is apparently only supported in the 'sequential' reader.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   347
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   348
static void
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   349
png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
{
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   351
   png_debug(1, "in png_do_read_intrapixel");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   352
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   353
   if (
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   354
       (row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   355
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   356
      int bytes_per_pixel;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   357
      png_uint_32 row_width = row_info->width;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   358
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   359
      if (row_info->bit_depth == 8)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   360
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   361
         png_bytep rp;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   362
         png_uint_32 i;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   363
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   364
         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   365
            bytes_per_pixel = 3;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   366
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   367
         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   368
            bytes_per_pixel = 4;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   369
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   370
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   371
            return;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   372
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   373
         for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   374
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   375
            *(rp) = (png_byte)((256 + *rp + *(rp + 1)) & 0xff);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   376
            *(rp+2) = (png_byte)((256 + *(rp + 2) + *(rp + 1)) & 0xff);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   377
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   378
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   379
      else if (row_info->bit_depth == 16)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   380
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   381
         png_bytep rp;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   382
         png_uint_32 i;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   383
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   384
         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   385
            bytes_per_pixel = 6;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   386
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   387
         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   388
            bytes_per_pixel = 8;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   389
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   390
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   391
            return;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   392
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   393
         for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   394
         {
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   395
            png_uint_32 s0   = (png_uint_32)(*(rp    ) << 8) | *(rp + 1);
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   396
            png_uint_32 s1   = (png_uint_32)(*(rp + 2) << 8) | *(rp + 3);
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   397
            png_uint_32 s2   = (png_uint_32)(*(rp + 4) << 8) | *(rp + 5);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   398
            png_uint_32 red  = (s0 + s1 + 65536) & 0xffff;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   399
            png_uint_32 blue = (s2 + s1 + 65536) & 0xffff;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   400
            *(rp    ) = (png_byte)((red >> 8) & 0xff);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   401
            *(rp + 1) = (png_byte)(red & 0xff);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   402
            *(rp + 4) = (png_byte)((blue >> 8) & 0xff);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   403
            *(rp + 5) = (png_byte)(blue & 0xff);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   404
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   405
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   406
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   407
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   408
#endif /* MNG_FEATURES */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   409
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   410
void PNGAPI
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   411
png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   412
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   413
   png_row_info row_info;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   414
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   415
   if (png_ptr == NULL)
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   416
      return;
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   417
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   418
   png_debug2(1, "in png_read_row (row %lu, pass %d)",
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   419
       (unsigned long)png_ptr->row_number, png_ptr->pass);
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   420
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   421
   /* png_read_start_row sets the information (in particular iwidth) for this
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   422
    * interlace pass.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   423
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   424
   if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
      png_read_start_row(png_ptr);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   426
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   427
   /* 1.5.6: row_info moved out of png_struct to a local here. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   428
   row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   429
   row_info.color_type = png_ptr->color_type;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   430
   row_info.bit_depth = png_ptr->bit_depth;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   431
   row_info.channels = png_ptr->channels;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   432
   row_info.pixel_depth = png_ptr->pixel_depth;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   433
   row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   434
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   435
#ifdef PNG_WARNINGS_SUPPORTED
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
   if (png_ptr->row_number == 0 && png_ptr->pass == 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
   {
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   438
   /* Check for transforms that have been set but were defined out */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   440
   if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   441
      png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   443
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   445
   if ((png_ptr->transformations & PNG_FILLER) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   446
      png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   448
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   449
#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   450
    !defined(PNG_READ_PACKSWAP_SUPPORTED)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   451
   if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   452
      png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   454
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   456
   if ((png_ptr->transformations & PNG_PACK) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   457
      png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   459
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   461
   if ((png_ptr->transformations & PNG_SHIFT) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   462
      png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   464
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   466
   if ((png_ptr->transformations & PNG_BGR) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   467
      png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   469
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   471
   if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   472
      png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
   }
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   475
#endif /* WARNINGS */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   477
#ifdef PNG_READ_INTERLACING_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   478
   /* If interlaced and we do not need a new row, combine row and return.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   479
    * Notice that the pixels we have from previous rows have been transformed
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   480
    * already; we can only combine like with like (transformed or
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   481
    * untransformed) and, because of the libpng API for interlaced images, this
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   482
    * means we must transform before de-interlacing.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   483
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   484
   if (png_ptr->interlaced != 0 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   485
       (png_ptr->transformations & PNG_INTERLACE) != 0)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
   {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
      switch (png_ptr->pass)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
         case 0:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
            if (png_ptr->row_number & 0x07)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
               if (dsp_row != NULL)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   493
                  png_combine_row(png_ptr, dsp_row, 1/*display*/);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
               png_read_finish_row(png_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
               return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
            break;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   498
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
         case 1:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
            if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   501
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
               if (dsp_row != NULL)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   503
                  png_combine_row(png_ptr, dsp_row, 1/*display*/);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   504
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
               png_read_finish_row(png_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
               return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
            break;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   509
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
         case 2:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
            if ((png_ptr->row_number & 0x07) != 4)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
               if (dsp_row != NULL && (png_ptr->row_number & 4))
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   514
                  png_combine_row(png_ptr, dsp_row, 1/*display*/);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   515
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
               png_read_finish_row(png_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
               return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
            break;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   520
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
         case 3:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
            if ((png_ptr->row_number & 3) || png_ptr->width < 3)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
               if (dsp_row != NULL)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   525
                  png_combine_row(png_ptr, dsp_row, 1/*display*/);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   526
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
               png_read_finish_row(png_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
               return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
            break;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   531
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
         case 4:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
            if ((png_ptr->row_number & 3) != 2)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
               if (dsp_row != NULL && (png_ptr->row_number & 2))
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   536
                  png_combine_row(png_ptr, dsp_row, 1/*display*/);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   537
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
               png_read_finish_row(png_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
               return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
            break;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   542
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
         case 5:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
            if ((png_ptr->row_number & 1) || png_ptr->width < 2)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
               if (dsp_row != NULL)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   547
                  png_combine_row(png_ptr, dsp_row, 1/*display*/);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   548
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
               png_read_finish_row(png_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
               return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
            break;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   553
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   554
         default:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
         case 6:
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   556
            if ((png_ptr->row_number & 1) == 0)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
               png_read_finish_row(png_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
               return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
   }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   566
   if ((png_ptr->mode & PNG_HAVE_IDAT) == 0)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
      png_error(png_ptr, "Invalid attempt to read row data");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   568
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   569
   /* Fill the row with IDAT data: */
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   570
   png_ptr->row_buf[0]=255; /* to force error if no data was found */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   571
   png_read_IDAT_data(png_ptr, png_ptr->row_buf, row_info.rowbytes + 1);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   572
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   573
   if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
   {
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   575
      if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   576
         png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   577
             png_ptr->prev_row + 1, png_ptr->row_buf[0]);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   578
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   579
         png_error(png_ptr, "bad adaptive filter value");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   580
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   581
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   582
   /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   583
    * 1.5.6, while the buffer really is this big in current versions of libpng
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   584
    * it may not be in the future, so this was changed just to copy the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   585
    * interlaced count:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   586
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   587
   memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   589
#ifdef PNG_MNG_FEATURES_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   590
   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   591
       (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
   {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
      /* Intrapixel differencing */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   594
      png_do_read_intrapixel(&row_info, png_ptr->row_buf + 1);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
   }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   598
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   599
   if (png_ptr->transformations)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   600
      png_do_read_transformations(png_ptr, &row_info);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   601
#endif
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   603
   /* The transformed pixel depth should match the depth now in row_info. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   604
   if (png_ptr->transformed_pixel_depth == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   605
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   606
      png_ptr->transformed_pixel_depth = row_info.pixel_depth;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   607
      if (row_info.pixel_depth > png_ptr->maximum_pixel_depth)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   608
         png_error(png_ptr, "sequential row overflow");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   609
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   610
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   611
   else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   612
      png_error(png_ptr, "internal sequential row size calculation error");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   613
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   614
#ifdef PNG_READ_INTERLACING_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   615
   /* Expand interlaced rows to full size */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   616
   if (png_ptr->interlaced != 0 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   617
      (png_ptr->transformations & PNG_INTERLACE) != 0)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
   {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
      if (png_ptr->pass < 6)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   620
         png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   621
             png_ptr->transformations);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
      if (dsp_row != NULL)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   624
         png_combine_row(png_ptr, dsp_row, 1/*display*/);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   625
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
      if (row != NULL)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   627
         png_combine_row(png_ptr, row, 0/*row*/);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
   }
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   629
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
   else
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
   {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
      if (row != NULL)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   634
         png_combine_row(png_ptr, row, -1/*ignored*/);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   635
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
      if (dsp_row != NULL)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   637
         png_combine_row(png_ptr, dsp_row, -1/*ignored*/);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
   }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
   png_read_finish_row(png_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
   if (png_ptr->read_row_fn != NULL)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
      (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   643
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
}
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   645
#endif /* SEQUENTIAL_READ */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   647
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
/* Read one or more rows of image data.  If the image is interlaced,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
 * and png_set_interlace_handling() has been called, the rows need to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
 * contain the contents of the rows from the previous pass.  If the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
 * image has alpha or transparency, and png_handle_alpha()[*] has been
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
 * called, the rows contents must be initialized to the contents of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
 * screen.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
 * "row" holds the actual image, and pixels are placed in it
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
 * as they arrive.  If the image is displayed after each pass, it will
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
 * appear to "sparkle" in.  "display_row" can be used to display a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
 * "chunky" progressive image, with finer detail added as it becomes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
 * available.  If you do not want this "chunky" display, you may pass
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
 * NULL for display_row.  If you do not want the sparkle display, and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
 * you have not called png_handle_alpha(), you may pass NULL for rows.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
 * If you have called png_handle_alpha(), and the image has either an
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
 * alpha channel or a transparency chunk, you must provide a buffer for
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
 * rows.  In this case, you do not have to provide a display_row buffer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
 * also, but you may.  If the image is not interlaced, or if you have
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
 * not called png_set_interlace_handling(), the display_row buffer will
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
 * be ignored, so pass NULL to it.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
 * [*] png_handle_alpha() does not exist yet, as of this version of libpng
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
void PNGAPI
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   673
png_read_rows(png_structrp png_ptr, png_bytepp row,
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   674
    png_bytepp display_row, png_uint_32 num_rows)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
   png_uint_32 i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
   png_bytepp rp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
   png_bytepp dp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   680
   png_debug(1, "in png_read_rows");
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   681
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   682
   if (png_ptr == NULL)
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   683
      return;
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   684
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
   rp = row;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
   dp = display_row;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
   if (rp != NULL && dp != NULL)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
      for (i = 0; i < num_rows; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
         png_bytep rptr = *rp++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
         png_bytep dptr = *dp++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
         png_read_row(png_ptr, rptr, dptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
      }
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   695
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   696
   else if (rp != NULL)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
      for (i = 0; i < num_rows; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
         png_bytep rptr = *rp;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   700
         png_read_row(png_ptr, rptr, NULL);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
         rp++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
      }
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   703
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   704
   else if (dp != NULL)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
      for (i = 0; i < num_rows; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
         png_bytep dptr = *dp;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   708
         png_read_row(png_ptr, NULL, dptr);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
         dp++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
}
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   712
#endif /* SEQUENTIAL_READ */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   714
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
/* Read the entire image.  If the image has an alpha channel or a tRNS
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
 * chunk, and you have called png_handle_alpha()[*], you will need to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
 * initialize the image to the current image that PNG will be overlaying.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
 * We set the num_rows again here, in case it was incorrectly set in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
 * png_read_start_row() by a call to png_read_update_info() or
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
 * png_start_read_image() if png_set_interlace_handling() wasn't called
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
 * prior to either of these functions like it should have been.  You can
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
 * only call this function once.  If you desire to have an image for
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
 * each pass of a interlaced image, use png_read_rows() instead.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
 * [*] png_handle_alpha() does not exist yet, as of this version of libpng
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
void PNGAPI
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   728
png_read_image(png_structrp png_ptr, png_bytepp image)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
{
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   730
   png_uint_32 i, image_height;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
   int pass, j;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
   png_bytepp rp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   734
   png_debug(1, "in png_read_image");
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   735
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   736
   if (png_ptr == NULL)
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   737
      return;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
#ifdef PNG_READ_INTERLACING_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   740
   if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   741
   {
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   742
      pass = png_set_interlace_handling(png_ptr);
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   743
      /* And make sure transforms are initialized. */
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   744
      png_start_read_image(png_ptr);
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   745
   }
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   746
   else
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   747
   {
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   748
      if (png_ptr->interlaced != 0 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   749
          (png_ptr->transformations & PNG_INTERLACE) == 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   750
      {
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   751
         /* Caller called png_start_read_image or png_read_update_info without
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   752
          * first turning on the PNG_INTERLACE transform.  We can fix this here,
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   753
          * but the caller should do it!
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   754
          */
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   755
         png_warning(png_ptr, "Interlace handling should be turned on when "
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   756
             "using png_read_image");
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   757
         /* Make sure this is set correctly */
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   758
         png_ptr->num_rows = png_ptr->height;
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   759
      }
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   760
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   761
      /* Obtain the pass number, which also turns on the PNG_INTERLACE flag in
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   762
       * the above error case.
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   763
       */
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   764
      pass = png_set_interlace_handling(png_ptr);
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   765
   }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
#else
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
   if (png_ptr->interlaced)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
      png_error(png_ptr,
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   769
          "Cannot read interlaced image -- interlace handler disabled");
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   770
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   771
   pass = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
   image_height=png_ptr->height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
   for (j = 0; j < pass; j++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
   {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
      rp = image;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
      for (i = 0; i < image_height; i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
      {
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   781
         png_read_row(png_ptr, *rp, NULL);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   782
         rp++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
   }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   785
}
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   786
#endif /* SEQUENTIAL_READ */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   788
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
/* Read the end of the PNG file.  Will not read past the end of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
 * file, will verify the end is accurate, and will read any comments
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
 * or time information at the end of the file, if info is not NULL.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
void PNGAPI
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   794
png_read_end(png_structrp png_ptr, png_inforp info_ptr)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
{
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   796
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   797
   int keep;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   798
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   799
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   800
   png_debug(1, "in png_read_end");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   801
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   802
   if (png_ptr == NULL)
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   803
      return;
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   804
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   805
   /* If png_read_end is called in the middle of reading the rows there may
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   806
    * still be pending IDAT data and an owned zstream.  Deal with this here.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   807
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   808
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   809
   if (png_chunk_unknown_handling(png_ptr, png_IDAT) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   810
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   811
      png_read_finish_IDAT(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   812
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   813
#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   814
   /* Report invalid palette index; added at libng-1.5.10 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   815
   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   816
       png_ptr->num_palette_max > png_ptr->num_palette)
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   817
      png_benign_error(png_ptr, "Read palette index exceeding num_palette");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   818
#endif
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   819
90ce3da70b43 Initial load
duke
parents:
diff changeset
   820
   do
90ce3da70b43 Initial load
duke
parents:
diff changeset
   821
   {
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   822
      png_uint_32 length = png_read_chunk_header(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   823
      png_uint_32 chunk_name = png_ptr->chunk_name;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   824
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   825
      if (chunk_name != png_IDAT)
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   826
         png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   827
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   828
      if (chunk_name == png_IEND)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   829
         png_handle_IEND(png_ptr, info_ptr, length);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   830
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   831
      else if (chunk_name == png_IHDR)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   832
         png_handle_IHDR(png_ptr, info_ptr, length);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   833
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   834
      else if (info_ptr == NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   835
         png_crc_finish(png_ptr, length);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   838
      else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   839
      {
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   840
         if (chunk_name == png_IDAT)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
         {
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   842
            if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   843
                || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   844
               png_benign_error(png_ptr, ".Too many IDATs found");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
         }
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   846
         png_handle_unknown(png_ptr, info_ptr, length, keep);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   847
         if (chunk_name == png_PLTE)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
            png_ptr->mode |= PNG_HAVE_PLTE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   851
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   852
      else if (chunk_name == png_IDAT)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
      {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
         /* Zero length IDATs are legal after the last IDAT has been
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   855
          * read, but not after other chunks have been read.  1.6 does not
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   856
          * always read all the deflate data; specifically it cannot be relied
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   857
          * upon to read the Adler32 at the end.  If it doesn't ignore IDAT
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   858
          * chunks which are longer than zero as well:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
          */
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   860
         if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   861
             || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
   862
            png_benign_error(png_ptr, "..Too many IDATs found");
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   863
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
         png_crc_finish(png_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
      }
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   866
      else if (chunk_name == png_PLTE)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
         png_handle_PLTE(png_ptr, info_ptr, length);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   868
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   869
#ifdef PNG_READ_bKGD_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   870
      else if (chunk_name == png_bKGD)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
         png_handle_bKGD(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   873
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   874
#ifdef PNG_READ_cHRM_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   875
      else if (chunk_name == png_cHRM)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
         png_handle_cHRM(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   878
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   879
#ifdef PNG_READ_eXIf_SUPPORTED
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   880
      else if (chunk_name == png_eXIf)
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   881
         png_handle_eXIf(png_ptr, info_ptr, length);
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   882
#endif
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
   883
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   884
#ifdef PNG_READ_gAMA_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   885
      else if (chunk_name == png_gAMA)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   886
         png_handle_gAMA(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   887
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   888
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   889
#ifdef PNG_READ_hIST_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   890
      else if (chunk_name == png_hIST)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   891
         png_handle_hIST(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   892
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   893
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   894
#ifdef PNG_READ_oFFs_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   895
      else if (chunk_name == png_oFFs)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   896
         png_handle_oFFs(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   897
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   898
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   899
#ifdef PNG_READ_pCAL_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   900
      else if (chunk_name == png_pCAL)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   901
         png_handle_pCAL(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   902
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   903
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   904
#ifdef PNG_READ_sCAL_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   905
      else if (chunk_name == png_sCAL)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   906
         png_handle_sCAL(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   907
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   908
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   909
#ifdef PNG_READ_pHYs_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   910
      else if (chunk_name == png_pHYs)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   911
         png_handle_pHYs(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   912
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   913
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   914
#ifdef PNG_READ_sBIT_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   915
      else if (chunk_name == png_sBIT)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   916
         png_handle_sBIT(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   917
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   918
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   919
#ifdef PNG_READ_sRGB_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   920
      else if (chunk_name == png_sRGB)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   921
         png_handle_sRGB(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   922
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   923
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   924
#ifdef PNG_READ_iCCP_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   925
      else if (chunk_name == png_iCCP)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   926
         png_handle_iCCP(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   927
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   928
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   929
#ifdef PNG_READ_sPLT_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   930
      else if (chunk_name == png_sPLT)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   931
         png_handle_sPLT(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   932
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   933
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   934
#ifdef PNG_READ_tEXt_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   935
      else if (chunk_name == png_tEXt)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   936
         png_handle_tEXt(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   937
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   938
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   939
#ifdef PNG_READ_tIME_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   940
      else if (chunk_name == png_tIME)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   941
         png_handle_tIME(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   942
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   943
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   944
#ifdef PNG_READ_tRNS_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   945
      else if (chunk_name == png_tRNS)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   946
         png_handle_tRNS(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   947
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   948
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   949
#ifdef PNG_READ_zTXt_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   950
      else if (chunk_name == png_zTXt)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   951
         png_handle_zTXt(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   952
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   953
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   954
#ifdef PNG_READ_iTXt_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   955
      else if (chunk_name == png_iTXt)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   956
         png_handle_iTXt(png_ptr, info_ptr, length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   957
#endif
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
   958
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
      else
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   960
         png_handle_unknown(png_ptr, info_ptr, length,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
   961
             PNG_HANDLE_CHUNK_AS_DEFAULT);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   962
   } while ((png_ptr->mode & PNG_HAVE_IEND) == 0);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   963
}
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   964
#endif /* SEQUENTIAL_READ */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   965
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   966
/* Free all memory used in the read struct */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   967
static void
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   968
png_read_destroy(png_structrp png_ptr)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   969
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   970
   png_debug(1, "in png_read_destroy");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   971
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   972
#ifdef PNG_READ_GAMMA_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   973
   png_destroy_gamma_table(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   974
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   975
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   976
   png_free(png_ptr, png_ptr->big_row_buf);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   977
   png_ptr->big_row_buf = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   978
   png_free(png_ptr, png_ptr->big_prev_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   979
   png_ptr->big_prev_row = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   980
   png_free(png_ptr, png_ptr->read_buffer);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   981
   png_ptr->read_buffer = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   982
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   983
#ifdef PNG_READ_QUANTIZE_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   984
   png_free(png_ptr, png_ptr->palette_lookup);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   985
   png_ptr->palette_lookup = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   986
   png_free(png_ptr, png_ptr->quantize_index);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   987
   png_ptr->quantize_index = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   988
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   989
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   990
   if ((png_ptr->free_me & PNG_FREE_PLTE) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   991
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   992
      png_zfree(png_ptr, png_ptr->palette);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   993
      png_ptr->palette = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   994
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   995
   png_ptr->free_me &= ~PNG_FREE_PLTE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   996
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   997
#if defined(PNG_tRNS_SUPPORTED) || \
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   998
    defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
   999
   if ((png_ptr->free_me & PNG_FREE_TRNS) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1000
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1001
      png_free(png_ptr, png_ptr->trans_alpha);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1002
      png_ptr->trans_alpha = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1003
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1004
   png_ptr->free_me &= ~PNG_FREE_TRNS;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1005
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1006
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1007
   inflateEnd(&png_ptr->zstream);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1008
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1009
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1010
   png_free(png_ptr, png_ptr->save_buffer);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1011
   png_ptr->save_buffer = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1012
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1013
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1014
#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) && \
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1015
   defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1016
   png_free(png_ptr, png_ptr->unknown_chunk.data);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1017
   png_ptr->unknown_chunk.data = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1018
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1019
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1020
#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1021
   png_free(png_ptr, png_ptr->chunk_list);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1022
   png_ptr->chunk_list = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1023
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1024
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1025
   /* NOTE: the 'setjmp' buffer may still be allocated and the memory and error
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1026
    * callbacks are still set at this point.  They are required to complete the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1027
    * destruction of the png_struct itself.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1028
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1029
}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1031
/* Free all memory used by the read */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
void PNGAPI
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1034
    png_infopp end_info_ptr_ptr)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1035
{
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1036
   png_structrp png_ptr = NULL;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1037
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1038
   png_debug(1, "in png_destroy_read_struct");
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1039
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1040
   if (png_ptr_ptr != NULL)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1041
      png_ptr = *png_ptr_ptr;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1042
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1043
   if (png_ptr == NULL)
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1044
      return;
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1045
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1046
   /* libpng 1.6.0: use the API to destroy info structs to ensure consistent
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1047
    * behavior.  Prior to 1.6.0 libpng did extra 'info' destruction in this API.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1048
    * The extra was, apparently, unnecessary yet this hides memory leak bugs.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1049
    */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1050
   png_destroy_info_struct(png_ptr, end_info_ptr_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1051
   png_destroy_info_struct(png_ptr, info_ptr_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1052
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1053
   *png_ptr_ptr = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1054
   png_read_destroy(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1055
   png_destroy_png_struct(png_ptr);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1056
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1057
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1058
void PNGAPI
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1059
png_set_read_status_fn(png_structrp png_ptr, png_read_status_ptr read_row_fn)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1060
{
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1061
   if (png_ptr == NULL)
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1062
      return;
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1063
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1064
   png_ptr->read_row_fn = read_row_fn;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1065
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1066
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1067
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1068
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1069
#ifdef PNG_INFO_IMAGE_SUPPORTED
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1070
void PNGAPI
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1071
png_read_png(png_structrp png_ptr, png_inforp info_ptr,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1072
    int transforms, voidp params)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1073
{
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1074
   if (png_ptr == NULL || info_ptr == NULL)
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1075
      return;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1076
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1077
   /* png_read_info() gives us all of the information from the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1078
    * PNG file before the first IDAT (image data chunk).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1079
    */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1080
   png_read_info(png_ptr, info_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1081
   if (info_ptr->height > PNG_UINT_32_MAX/(sizeof (png_bytep)))
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1082
      png_error(png_ptr, "Image is too high to process with png_read_png()");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1083
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1084
   /* -------------- image transformations start here ------------------- */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1085
   /* libpng 1.6.10: add code to cause a png_app_error if a selected TRANSFORM
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1086
    * is not implemented.  This will only happen in de-configured (non-default)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1087
    * libpng builds.  The results can be unexpected - png_read_png may return
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1088
    * short or mal-formed rows because the transform is skipped.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1089
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1090
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1091
   /* Tell libpng to strip 16-bit/color files down to 8 bits per color.
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1092
    */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1093
   if ((transforms & PNG_TRANSFORM_SCALE_16) != 0)
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  1094
      /* Added at libpng-1.5.4. "strip_16" produces the same result that it
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  1095
       * did in earlier versions, while "scale_16" is now more accurate.
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  1096
       */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1097
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1098
      png_set_scale_16(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1099
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1100
      png_app_error(png_ptr, "PNG_TRANSFORM_SCALE_16 not supported");
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1101
#endif
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1102
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1103
   /* If both SCALE and STRIP are required pngrtran will effectively cancel the
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1104
    * latter by doing SCALE first.  This is ok and allows apps not to check for
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1105
    * which is supported to get the right answer.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1106
    */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1107
   if ((transforms & PNG_TRANSFORM_STRIP_16) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1108
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1109
      png_set_strip_16(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1110
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1111
      png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_16 not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1112
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1113
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1114
   /* Strip alpha bytes from the input data without combining with
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1115
    * the background (not recommended).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1116
    */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1117
   if ((transforms & PNG_TRANSFORM_STRIP_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1118
#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1119
      png_set_strip_alpha(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1120
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1121
      png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_ALPHA not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1122
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1123
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1124
   /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1125
    * byte into separate bytes (useful for paletted and grayscale images).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1126
    */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1127
   if ((transforms & PNG_TRANSFORM_PACKING) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1128
#ifdef PNG_READ_PACK_SUPPORTED
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1129
      png_set_packing(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1130
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1131
      png_app_error(png_ptr, "PNG_TRANSFORM_PACKING not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1132
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1133
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1134
   /* Change the order of packed pixels to least significant bit first
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1135
    * (not useful if you are using png_set_packing).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1136
    */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1137
   if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1138
#ifdef PNG_READ_PACKSWAP_SUPPORTED
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1139
      png_set_packswap(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1140
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1141
      png_app_error(png_ptr, "PNG_TRANSFORM_PACKSWAP not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1142
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1143
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1144
   /* Expand paletted colors into true RGB triplets
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1145
    * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1146
    * Expand paletted or RGB images with transparency to full alpha
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1147
    * channels so the data will be available as RGBA quartets.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1148
    */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1149
   if ((transforms & PNG_TRANSFORM_EXPAND) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1150
#ifdef PNG_READ_EXPAND_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1151
      png_set_expand(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1152
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1153
      png_app_error(png_ptr, "PNG_TRANSFORM_EXPAND not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1154
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1155
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1156
   /* We don't handle background color or gamma transformation or quantizing.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1157
    */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1158
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1159
   /* Invert monochrome files to have 0 as white and 1 as black
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1160
    */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1161
   if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1162
#ifdef PNG_READ_INVERT_SUPPORTED
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1163
      png_set_invert_mono(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1164
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1165
      png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_MONO not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1166
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1167
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1168
   /* If you want to shift the pixel values from the range [0,255] or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1169
    * [0,65535] to the original [0,7] or [0,31], or whatever range the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1170
    * colors were originally in:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1171
    */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1172
   if ((transforms & PNG_TRANSFORM_SHIFT) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1173
#ifdef PNG_READ_SHIFT_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1174
      if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1175
         png_set_shift(png_ptr, &info_ptr->sig_bit);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1176
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1177
      png_app_error(png_ptr, "PNG_TRANSFORM_SHIFT not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1178
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1179
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1180
   /* Flip the RGB pixels to BGR (or RGBA to BGRA) */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1181
   if ((transforms & PNG_TRANSFORM_BGR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1182
#ifdef PNG_READ_BGR_SUPPORTED
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1183
      png_set_bgr(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1184
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1185
      png_app_error(png_ptr, "PNG_TRANSFORM_BGR not supported");
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1186
#endif
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1187
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1188
   /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1189
   if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1190
#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1191
      png_set_swap_alpha(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1192
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1193
      png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ALPHA not supported");
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1194
#endif
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1195
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1196
   /* Swap bytes of 16-bit files to least significant byte first */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1197
   if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1198
#ifdef PNG_READ_SWAP_SUPPORTED
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1199
      png_set_swap(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1200
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1201
      png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ENDIAN not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1202
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1203
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1204
/* Added at libpng-1.2.41 */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1205
   /* Invert the alpha channel from opacity to transparency */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1206
   if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1207
#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1208
      png_set_invert_alpha(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1209
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1210
      png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_ALPHA not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1211
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1212
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1213
/* Added at libpng-1.2.41 */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1214
   /* Expand grayscale image to RGB */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1215
   if ((transforms & PNG_TRANSFORM_GRAY_TO_RGB) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1216
#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1217
      png_set_gray_to_rgb(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1218
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1219
      png_app_error(png_ptr, "PNG_TRANSFORM_GRAY_TO_RGB not supported");
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1220
#endif
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1221
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1222
/* Added at libpng-1.5.4 */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1223
   if ((transforms & PNG_TRANSFORM_EXPAND_16) != 0)
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1224
#ifdef PNG_READ_EXPAND_16_SUPPORTED
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1225
      png_set_expand_16(png_ptr);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1226
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1227
      png_app_error(png_ptr, "PNG_TRANSFORM_EXPAND_16 not supported");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1228
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1229
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1230
   /* We don't handle adding filler bytes */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1231
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1232
   /* We use png_read_image and rely on that for interlace handling, but we also
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1233
    * call png_read_update_info therefore must turn on interlace handling now:
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1234
    */
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1235
   (void)png_set_interlace_handling(png_ptr);
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1236
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1237
   /* Optional call to gamma correct and add the background to the palette
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1238
    * and update info structure.  REQUIRED if you are expecting libpng to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1239
    * update the palette for you (i.e., you selected such a transform above).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1240
    */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1241
   png_read_update_info(png_ptr, info_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1242
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1243
   /* -------------- image transformations end here ------------------- */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1244
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1245
   png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1246
   if (info_ptr->row_pointers == NULL)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1247
   {
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1248
      png_uint_32 iptr;
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1249
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1250
      info_ptr->row_pointers = png_voidcast(png_bytepp, png_malloc(png_ptr,
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1251
          info_ptr->height * (sizeof (png_bytep))));
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1252
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1253
      for (iptr=0; iptr<info_ptr->height; iptr++)
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1254
         info_ptr->row_pointers[iptr] = NULL;
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1255
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1256
      info_ptr->free_me |= PNG_FREE_ROWS;
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1257
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1258
      for (iptr = 0; iptr < info_ptr->height; iptr++)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1259
         info_ptr->row_pointers[iptr] = png_voidcast(png_bytep,
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  1260
             png_malloc(png_ptr, info_ptr->rowbytes));
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1261
   }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1262
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1263
   png_read_image(png_ptr, info_ptr->row_pointers);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1264
   info_ptr->valid |= PNG_INFO_IDAT;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1265
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1266
   /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1267
   png_read_end(png_ptr, info_ptr);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1268
10576
db3409425573 7088287: libpng need to be updated.
bae
parents: 5506
diff changeset
  1269
   PNG_UNUSED(params)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1270
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1271
#endif /* INFO_IMAGE */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1272
#endif /* SEQUENTIAL_READ */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1273
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1274
#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1275
/* SIMPLIFIED READ
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1276
 *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1277
 * This code currently relies on the sequential reader, though it could easily
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1278
 * be made to work with the progressive one.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1279
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1280
/* Arguments to png_image_finish_read: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1281
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1282
/* Encoding of PNG data (used by the color-map code) */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1283
#  define P_NOTSET  0 /* File encoding not yet known */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1284
#  define P_sRGB    1 /* 8-bit encoded to sRGB gamma */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1285
#  define P_LINEAR  2 /* 16-bit linear: not encoded, NOT pre-multiplied! */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1286
#  define P_FILE    3 /* 8-bit encoded to file gamma, not sRGB or linear */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1287
#  define P_LINEAR8 4 /* 8-bit linear: only from a file value */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1288
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1289
/* Color-map processing: after libpng has run on the PNG image further
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1290
 * processing may be needed to convert the data to color-map indices.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1291
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1292
#define PNG_CMAP_NONE      0
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1293
#define PNG_CMAP_GA        1 /* Process GA data to a color-map with alpha */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1294
#define PNG_CMAP_TRANS     2 /* Process GA data to a background index */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1295
#define PNG_CMAP_RGB       3 /* Process RGB data */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1296
#define PNG_CMAP_RGB_ALPHA 4 /* Process RGBA data */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1297
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1298
/* The following document where the background is for each processing case. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1299
#define PNG_CMAP_NONE_BACKGROUND      256
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1300
#define PNG_CMAP_GA_BACKGROUND        231
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1301
#define PNG_CMAP_TRANS_BACKGROUND     254
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1302
#define PNG_CMAP_RGB_BACKGROUND       256
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1303
#define PNG_CMAP_RGB_ALPHA_BACKGROUND 216
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1304
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1305
typedef struct
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1306
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1307
   /* Arguments: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1308
   png_imagep image;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1309
   png_voidp  buffer;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1310
   png_int_32 row_stride;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1311
   png_voidp  colormap;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1312
   png_const_colorp background;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1313
   /* Local variables: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1314
   png_voidp       local_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1315
   png_voidp       first_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1316
   ptrdiff_t       row_bytes;           /* step between rows */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1317
   int             file_encoding;       /* E_ values above */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1318
   png_fixed_point gamma_to_linear;     /* For P_FILE, reciprocal of gamma */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1319
   int             colormap_processing; /* PNG_CMAP_ values above */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1320
} png_image_read_control;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1321
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1322
/* Do all the *safe* initialization - 'safe' means that png_error won't be
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1323
 * called, so setting up the jmp_buf is not required.  This means that anything
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1324
 * called from here must *not* call png_malloc - it has to call png_malloc_warn
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1325
 * instead so that control is returned safely back to this routine.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1326
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1327
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1328
png_image_read_init(png_imagep image)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1329
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1330
   if (image->opaque == NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1331
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1332
      png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, image,
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1333
          png_safe_error, png_safe_warning);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1334
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1335
      /* And set the rest of the structure to NULL to ensure that the various
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1336
       * fields are consistent.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1337
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1338
      memset(image, 0, (sizeof *image));
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1339
      image->version = PNG_IMAGE_VERSION;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1340
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1341
      if (png_ptr != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1342
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1343
         png_infop info_ptr = png_create_info_struct(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1344
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1345
         if (info_ptr != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1346
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1347
            png_controlp control = png_voidcast(png_controlp,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1348
                png_malloc_warn(png_ptr, (sizeof *control)));
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1349
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1350
            if (control != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1351
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1352
               memset(control, 0, (sizeof *control));
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1353
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1354
               control->png_ptr = png_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1355
               control->info_ptr = info_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1356
               control->for_write = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1357
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1358
               image->opaque = control;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1359
               return 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1360
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1361
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1362
            /* Error clean up */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1363
            png_destroy_info_struct(png_ptr, &info_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1364
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1365
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1366
         png_destroy_read_struct(&png_ptr, NULL, NULL);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1367
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1368
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1369
      return png_image_error(image, "png_image_read: out of memory");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1370
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1371
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1372
   return png_image_error(image, "png_image_read: opaque pointer not NULL");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1373
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1374
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1375
/* Utility to find the base format of a PNG file from a png_struct. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1376
static png_uint_32
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1377
png_image_format(png_structrp png_ptr)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1378
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1379
   png_uint_32 format = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1380
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1381
   if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1382
      format |= PNG_FORMAT_FLAG_COLOR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1383
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1384
   if ((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1385
      format |= PNG_FORMAT_FLAG_ALPHA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1386
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1387
   /* Use png_ptr here, not info_ptr, because by examination png_handle_tRNS
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1388
    * sets the png_struct fields; that's all we are interested in here.  The
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1389
    * precise interaction with an app call to png_set_tRNS and PNG file reading
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1390
    * is unclear.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1391
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1392
   else if (png_ptr->num_trans > 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1393
      format |= PNG_FORMAT_FLAG_ALPHA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1394
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1395
   if (png_ptr->bit_depth == 16)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1396
      format |= PNG_FORMAT_FLAG_LINEAR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1397
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1398
   if ((png_ptr->color_type & PNG_COLOR_MASK_PALETTE) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1399
      format |= PNG_FORMAT_FLAG_COLORMAP;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1400
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1401
   return format;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1402
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1403
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1404
/* Is the given gamma significantly different from sRGB?  The test is the same
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1405
 * one used in pngrtran.c when deciding whether to do gamma correction.  The
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1406
 * arithmetic optimizes the division by using the fact that the inverse of the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1407
 * file sRGB gamma is 2.2
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1408
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1409
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1410
png_gamma_not_sRGB(png_fixed_point g)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1411
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1412
   if (g < PNG_FP_1)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1413
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1414
      /* An uninitialized gamma is assumed to be sRGB for the simplified API. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1415
      if (g == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1416
         return 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1417
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1418
      return png_gamma_significant((g * 11 + 2)/5 /* i.e. *2.2, rounded */);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1419
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1420
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1421
   return 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1422
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1423
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1424
/* Do the main body of a 'png_image_begin_read' function; read the PNG file
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1425
 * header and fill in all the information.  This is executed in a safe context,
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1426
 * unlike the init routine above.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1427
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1428
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1429
png_image_read_header(png_voidp argument)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1430
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1431
   png_imagep image = png_voidcast(png_imagep, argument);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1432
   png_structrp png_ptr = image->opaque->png_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1433
   png_inforp info_ptr = image->opaque->info_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1434
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1435
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1436
   png_set_benign_errors(png_ptr, 1/*warn*/);
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1437
#endif
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1438
   png_read_info(png_ptr, info_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1439
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1440
   /* Do this the fast way; just read directly out of png_struct. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1441
   image->width = png_ptr->width;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1442
   image->height = png_ptr->height;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1443
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1444
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1445
      png_uint_32 format = png_image_format(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1446
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1447
      image->format = format;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1448
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1449
#ifdef PNG_COLORSPACE_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1450
      /* Does the colorspace match sRGB?  If there is no color endpoint
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1451
       * (colorant) information assume yes, otherwise require the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1452
       * 'ENDPOINTS_MATCHP_sRGB' colorspace flag to have been set.  If the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1453
       * colorspace has been determined to be invalid ignore it.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1454
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1455
      if ((format & PNG_FORMAT_FLAG_COLOR) != 0 && ((png_ptr->colorspace.flags
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1456
         & (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB|
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1457
            PNG_COLORSPACE_INVALID)) == PNG_COLORSPACE_HAVE_ENDPOINTS))
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1458
         image->flags |= PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1459
#endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1460
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1461
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1462
   /* We need the maximum number of entries regardless of the format the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1463
    * application sets here.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1464
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1465
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1466
      png_uint_32 cmap_entries;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1467
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1468
      switch (png_ptr->color_type)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1469
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1470
         case PNG_COLOR_TYPE_GRAY:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1471
            cmap_entries = 1U << png_ptr->bit_depth;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1472
            break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1473
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1474
         case PNG_COLOR_TYPE_PALETTE:
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1475
            cmap_entries = (png_uint_32)png_ptr->num_palette;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1476
            break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1477
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1478
         default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1479
            cmap_entries = 256;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1480
            break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1481
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1482
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1483
      if (cmap_entries > 256)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1484
         cmap_entries = 256;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1485
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1486
      image->colormap_entries = cmap_entries;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1487
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1488
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1489
   return 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1490
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1491
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1492
#ifdef PNG_STDIO_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1493
int PNGAPI
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1494
png_image_begin_read_from_stdio(png_imagep image, FILE* file)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1495
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1496
   if (image != NULL && image->version == PNG_IMAGE_VERSION)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1497
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1498
      if (file != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1499
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1500
         if (png_image_read_init(image) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1501
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1502
            /* This is slightly evil, but png_init_io doesn't do anything other
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1503
             * than this and we haven't changed the standard IO functions so
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1504
             * this saves a 'safe' function.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1505
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1506
            image->opaque->png_ptr->io_ptr = file;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1507
            return png_safe_execute(image, png_image_read_header, image);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1508
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1509
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1510
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1511
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1512
         return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1513
             "png_image_begin_read_from_stdio: invalid argument");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1514
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1515
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1516
   else if (image != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1517
      return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1518
          "png_image_begin_read_from_stdio: incorrect PNG_IMAGE_VERSION");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1519
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1520
   return 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1521
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1522
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1523
int PNGAPI
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1524
png_image_begin_read_from_file(png_imagep image, const char *file_name)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1525
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1526
   if (image != NULL && image->version == PNG_IMAGE_VERSION)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1527
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1528
      if (file_name != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1529
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1530
         FILE *fp = fopen(file_name, "rb");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1531
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1532
         if (fp != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1533
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1534
            if (png_image_read_init(image) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1535
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1536
               image->opaque->png_ptr->io_ptr = fp;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1537
               image->opaque->owned_file = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1538
               return png_safe_execute(image, png_image_read_header, image);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1539
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1540
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1541
            /* Clean up: just the opened file. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1542
            (void)fclose(fp);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1543
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1544
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1545
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1546
            return png_image_error(image, strerror(errno));
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1547
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1548
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1549
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1550
         return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1551
             "png_image_begin_read_from_file: invalid argument");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1552
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1553
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1554
   else if (image != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1555
      return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1556
          "png_image_begin_read_from_file: incorrect PNG_IMAGE_VERSION");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1557
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1558
   return 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1559
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1560
#endif /* STDIO */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1561
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1562
static void PNGCBAPI
51304
66d9993dd4ad 8208353: Upgrade JDK 11 to libpng 1.6.35
prr
parents: 48280
diff changeset
  1563
png_image_memory_read(png_structp png_ptr, png_bytep out, size_t need)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1564
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1565
   if (png_ptr != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1566
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1567
      png_imagep image = png_voidcast(png_imagep, png_ptr->io_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1568
      if (image != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1569
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1570
         png_controlp cp = image->opaque;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1571
         if (cp != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1572
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1573
            png_const_bytep memory = cp->memory;
51304
66d9993dd4ad 8208353: Upgrade JDK 11 to libpng 1.6.35
prr
parents: 48280
diff changeset
  1574
            size_t size = cp->size;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1575
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1576
            if (memory != NULL && size >= need)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1577
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1578
               memcpy(out, memory, need);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1579
               cp->memory = memory + need;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1580
               cp->size = size - need;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1581
               return;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1582
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1583
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1584
            png_error(png_ptr, "read beyond end of data");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1585
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1586
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1587
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1588
      png_error(png_ptr, "invalid memory read");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1589
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1590
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1591
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1592
int PNGAPI png_image_begin_read_from_memory(png_imagep image,
51304
66d9993dd4ad 8208353: Upgrade JDK 11 to libpng 1.6.35
prr
parents: 48280
diff changeset
  1593
    png_const_voidp memory, size_t size)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1594
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1595
   if (image != NULL && image->version == PNG_IMAGE_VERSION)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1596
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1597
      if (memory != NULL && size > 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1598
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1599
         if (png_image_read_init(image) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1600
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1601
            /* Now set the IO functions to read from the memory buffer and
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1602
             * store it into io_ptr.  Again do this in-place to avoid calling a
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1603
             * libpng function that requires error handling.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1604
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1605
            image->opaque->memory = png_voidcast(png_const_bytep, memory);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1606
            image->opaque->size = size;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1607
            image->opaque->png_ptr->io_ptr = image;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1608
            image->opaque->png_ptr->read_data_fn = png_image_memory_read;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1609
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1610
            return png_safe_execute(image, png_image_read_header, image);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1611
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1612
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1613
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1614
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1615
         return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1616
             "png_image_begin_read_from_memory: invalid argument");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1617
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1618
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1619
   else if (image != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1620
      return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1621
          "png_image_begin_read_from_memory: incorrect PNG_IMAGE_VERSION");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1622
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1623
   return 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1624
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1625
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1626
/* Utility function to skip chunks that are not used by the simplified image
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1627
 * read functions and an appropriate macro to call it.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1628
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1629
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1630
static void
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1631
png_image_skip_unused_chunks(png_structrp png_ptr)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1632
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1633
   /* Prepare the reader to ignore all recognized chunks whose data will not
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1634
    * be used, i.e., all chunks recognized by libpng except for those
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1635
    * involved in basic image reading:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1636
    *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1637
    *    IHDR, PLTE, IDAT, IEND
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1638
    *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1639
    * Or image data handling:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1640
    *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1641
    *    tRNS, bKGD, gAMA, cHRM, sRGB, [iCCP] and sBIT.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1642
    *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1643
    * This provides a small performance improvement and eliminates any
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1644
    * potential vulnerability to security problems in the unused chunks.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1645
    *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1646
    * At present the iCCP chunk data isn't used, so iCCP chunk can be ignored
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1647
    * too.  This allows the simplified API to be compiled without iCCP support,
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1648
    * however if the support is there the chunk is still checked to detect
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1649
    * errors (which are unfortunately quite common.)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1650
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1651
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1652
         static PNG_CONST png_byte chunks_to_process[] = {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1653
            98,  75,  71,  68, '\0',  /* bKGD */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1654
            99,  72,  82,  77, '\0',  /* cHRM */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1655
           103,  65,  77,  65, '\0',  /* gAMA */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1656
#        ifdef PNG_READ_iCCP_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1657
           105,  67,  67,  80, '\0',  /* iCCP */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1658
#        endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1659
           115,  66,  73,  84, '\0',  /* sBIT */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1660
           115,  82,  71,  66, '\0',  /* sRGB */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1661
           };
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1662
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1663
       /* Ignore unknown chunks and all other chunks except for the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1664
        * IHDR, PLTE, tRNS, IDAT, and IEND chunks.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1665
        */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1666
       png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_NEVER,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1667
           NULL, -1);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1668
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1669
       /* But do not ignore image data handling chunks */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1670
       png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_AS_DEFAULT,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1671
           chunks_to_process, (int)/*SAFE*/(sizeof chunks_to_process)/5);
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1672
   }
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1673
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1674
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1675
#  define PNG_SKIP_CHUNKS(p) png_image_skip_unused_chunks(p)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1676
#else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1677
#  define PNG_SKIP_CHUNKS(p) ((void)0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1678
#endif /* HANDLE_AS_UNKNOWN */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1679
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1680
/* The following macro gives the exact rounded answer for all values in the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1681
 * range 0..255 (it actually divides by 51.2, but the rounding still generates
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1682
 * the correct numbers 0..5
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1683
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1684
#define PNG_DIV51(v8) (((v8) * 5 + 130) >> 8)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1685
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1686
/* Utility functions to make particular color-maps */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1687
static void
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1688
set_file_encoding(png_image_read_control *display)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1689
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1690
   png_fixed_point g = display->image->opaque->png_ptr->colorspace.gamma;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1691
   if (png_gamma_significant(g) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1692
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1693
      if (png_gamma_not_sRGB(g) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1694
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1695
         display->file_encoding = P_FILE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1696
         display->gamma_to_linear = png_reciprocal(g);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1697
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1698
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1699
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1700
         display->file_encoding = P_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1701
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1702
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1703
   else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1704
      display->file_encoding = P_LINEAR8;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1705
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1706
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1707
static unsigned int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1708
decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1709
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1710
   if (encoding == P_FILE) /* double check */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1711
      encoding = display->file_encoding;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1712
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1713
   if (encoding == P_NOTSET) /* must be the file encoding */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1714
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1715
      set_file_encoding(display);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1716
      encoding = display->file_encoding;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1717
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1718
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1719
   switch (encoding)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1720
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1721
      case P_FILE:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1722
         value = png_gamma_16bit_correct(value*257, display->gamma_to_linear);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1723
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1724
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1725
      case P_sRGB:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1726
         value = png_sRGB_table[value];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1727
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1728
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1729
      case P_LINEAR:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1730
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1731
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1732
      case P_LINEAR8:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1733
         value *= 257;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1734
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1735
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  1736
#ifdef __GNUC__
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1737
      default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1738
         png_error(display->image->opaque->png_ptr,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1739
             "unexpected encoding (internal error)");
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  1740
#endif
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1741
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1742
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1743
   return value;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1744
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1745
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1746
static png_uint_32
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1747
png_colormap_compose(png_image_read_control *display,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1748
    png_uint_32 foreground, int foreground_encoding, png_uint_32 alpha,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1749
    png_uint_32 background, int encoding)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1750
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1751
   /* The file value is composed on the background, the background has the given
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1752
    * encoding and so does the result, the file is encoded with P_FILE and the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1753
    * file and alpha are 8-bit values.  The (output) encoding will always be
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1754
    * P_LINEAR or P_sRGB.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1755
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1756
   png_uint_32 f = decode_gamma(display, foreground, foreground_encoding);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1757
   png_uint_32 b = decode_gamma(display, background, encoding);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1758
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1759
   /* The alpha is always an 8-bit value (it comes from the palette), the value
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1760
    * scaled by 255 is what PNG_sRGB_FROM_LINEAR requires.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1761
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1762
   f = f * alpha + b * (255-alpha);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1763
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1764
   if (encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1765
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1766
      /* Scale to 65535; divide by 255, approximately (in fact this is extremely
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1767
       * accurate, it divides by 255.00000005937181414556, with no overflow.)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1768
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1769
      f *= 257; /* Now scaled by 65535 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1770
      f += f >> 16;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1771
      f = (f+32768) >> 16;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1772
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1773
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1774
   else /* P_sRGB */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1775
      f = PNG_sRGB_FROM_LINEAR(f);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1776
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1777
   return f;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1778
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1779
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1780
/* NOTE: P_LINEAR values to this routine must be 16-bit, but P_FILE values must
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1781
 * be 8-bit.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1782
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1783
static void
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1784
png_create_colormap_entry(png_image_read_control *display,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1785
    png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1786
    png_uint_32 alpha, int encoding)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1787
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1788
   png_imagep image = display->image;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1789
   const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) != 0 ?
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1790
       P_LINEAR : P_sRGB;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1791
   const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 &&
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  1792
       (red != green || green != blue);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1793
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1794
   if (ip > 255)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1795
      png_error(image->opaque->png_ptr, "color-map index out of range");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1796
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1797
   /* Update the cache with whether the file gamma is significantly different
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1798
    * from sRGB.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1799
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1800
   if (encoding == P_FILE)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1801
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1802
      if (display->file_encoding == P_NOTSET)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1803
         set_file_encoding(display);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1804
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1805
      /* Note that the cached value may be P_FILE too, but if it is then the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1806
       * gamma_to_linear member has been set.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1807
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1808
      encoding = display->file_encoding;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1809
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1810
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1811
   if (encoding == P_FILE)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1812
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1813
      png_fixed_point g = display->gamma_to_linear;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1814
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1815
      red = png_gamma_16bit_correct(red*257, g);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1816
      green = png_gamma_16bit_correct(green*257, g);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1817
      blue = png_gamma_16bit_correct(blue*257, g);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1818
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1819
      if (convert_to_Y != 0 || output_encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1820
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1821
         alpha *= 257;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1822
         encoding = P_LINEAR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1823
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1824
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1825
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1826
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1827
         red = PNG_sRGB_FROM_LINEAR(red * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1828
         green = PNG_sRGB_FROM_LINEAR(green * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1829
         blue = PNG_sRGB_FROM_LINEAR(blue * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1830
         encoding = P_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1831
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1832
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1833
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1834
   else if (encoding == P_LINEAR8)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1835
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1836
      /* This encoding occurs quite frequently in test cases because PngSuite
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1837
       * includes a gAMA 1.0 chunk with most images.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1838
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1839
      red *= 257;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1840
      green *= 257;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1841
      blue *= 257;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1842
      alpha *= 257;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1843
      encoding = P_LINEAR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1844
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1845
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1846
   else if (encoding == P_sRGB &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1847
       (convert_to_Y  != 0 || output_encoding == P_LINEAR))
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1848
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1849
      /* The values are 8-bit sRGB values, but must be converted to 16-bit
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1850
       * linear.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1851
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1852
      red = png_sRGB_table[red];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1853
      green = png_sRGB_table[green];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1854
      blue = png_sRGB_table[blue];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1855
      alpha *= 257;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1856
      encoding = P_LINEAR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1857
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1858
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1859
   /* This is set if the color isn't gray but the output is. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1860
   if (encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1861
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1862
      if (convert_to_Y != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1863
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1864
         /* NOTE: these values are copied from png_do_rgb_to_gray */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1865
         png_uint_32 y = (png_uint_32)6968 * red  + (png_uint_32)23434 * green +
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1866
            (png_uint_32)2366 * blue;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1867
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1868
         if (output_encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1869
            y = (y + 16384) >> 15;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1870
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1871
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1872
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1873
            /* y is scaled by 32768, we need it scaled by 255: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1874
            y = (y + 128) >> 8;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1875
            y *= 255;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1876
            y = PNG_sRGB_FROM_LINEAR((y + 64) >> 7);
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  1877
            alpha = PNG_DIV257(alpha);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1878
            encoding = P_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1879
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1880
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1881
         blue = red = green = y;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1882
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1883
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1884
      else if (output_encoding == P_sRGB)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1885
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1886
         red = PNG_sRGB_FROM_LINEAR(red * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1887
         green = PNG_sRGB_FROM_LINEAR(green * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1888
         blue = PNG_sRGB_FROM_LINEAR(blue * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1889
         alpha = PNG_DIV257(alpha);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1890
         encoding = P_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1891
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1892
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1893
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1894
   if (encoding != output_encoding)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1895
      png_error(image->opaque->png_ptr, "bad encoding (internal error)");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1896
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1897
   /* Store the value. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1898
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1899
#     ifdef PNG_FORMAT_AFIRST_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1900
         const int afirst = (image->format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1901
            (image->format & PNG_FORMAT_FLAG_ALPHA) != 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1902
#     else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1903
#        define afirst 0
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1904
#     endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1905
#     ifdef PNG_FORMAT_BGR_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1906
         const int bgr = (image->format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1907
#     else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1908
#        define bgr 0
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1909
#     endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1910
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1911
      if (output_encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1912
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1913
         png_uint_16p entry = png_voidcast(png_uint_16p, display->colormap);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1914
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1915
         entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1916
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1917
         /* The linear 16-bit values must be pre-multiplied by the alpha channel
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1918
          * value, if less than 65535 (this is, effectively, composite on black
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1919
          * if the alpha channel is removed.)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1920
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1921
         switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format))
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1922
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1923
            case 4:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1924
               entry[afirst ? 0 : 3] = (png_uint_16)alpha;
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  1925
               /* FALLTHROUGH */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1926
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1927
            case 3:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1928
               if (alpha < 65535)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1929
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1930
                  if (alpha > 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1931
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1932
                     blue = (blue * alpha + 32767U)/65535U;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1933
                     green = (green * alpha + 32767U)/65535U;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1934
                     red = (red * alpha + 32767U)/65535U;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1935
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1936
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1937
                  else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1938
                     red = green = blue = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1939
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1940
               entry[afirst + (2 ^ bgr)] = (png_uint_16)blue;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1941
               entry[afirst + 1] = (png_uint_16)green;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1942
               entry[afirst + bgr] = (png_uint_16)red;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1943
               break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1944
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1945
            case 2:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1946
               entry[1 ^ afirst] = (png_uint_16)alpha;
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  1947
               /* FALLTHROUGH */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1948
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1949
            case 1:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1950
               if (alpha < 65535)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1951
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1952
                  if (alpha > 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1953
                     green = (green * alpha + 32767U)/65535U;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1954
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1955
                  else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1956
                     green = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1957
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1958
               entry[afirst] = (png_uint_16)green;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1959
               break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1960
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1961
            default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1962
               break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1963
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1964
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1965
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1966
      else /* output encoding is P_sRGB */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1967
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1968
         png_bytep entry = png_voidcast(png_bytep, display->colormap);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1969
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1970
         entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1971
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1972
         switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format))
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1973
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1974
            case 4:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1975
               entry[afirst ? 0 : 3] = (png_byte)alpha;
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  1976
               /* FALLTHROUGH */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1977
            case 3:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1978
               entry[afirst + (2 ^ bgr)] = (png_byte)blue;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1979
               entry[afirst + 1] = (png_byte)green;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1980
               entry[afirst + bgr] = (png_byte)red;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1981
               break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1982
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1983
            case 2:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1984
               entry[1 ^ afirst] = (png_byte)alpha;
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  1985
               /* FALLTHROUGH */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1986
            case 1:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1987
               entry[afirst] = (png_byte)green;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1988
               break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1989
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1990
            default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1991
               break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1992
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1993
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1994
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1995
#     ifdef afirst
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1996
#        undef afirst
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1997
#     endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1998
#     ifdef bgr
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  1999
#        undef bgr
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2000
#     endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2001
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2002
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2003
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2004
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2005
make_gray_file_colormap(png_image_read_control *display)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2006
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2007
   unsigned int i;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2008
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2009
   for (i=0; i<256; ++i)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2010
      png_create_colormap_entry(display, i, i, i, i, 255, P_FILE);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2011
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2012
   return (int)i;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2013
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2014
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2015
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2016
make_gray_colormap(png_image_read_control *display)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2017
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2018
   unsigned int i;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2019
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2020
   for (i=0; i<256; ++i)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2021
      png_create_colormap_entry(display, i, i, i, i, 255, P_sRGB);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2022
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2023
   return (int)i;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2024
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2025
#define PNG_GRAY_COLORMAP_ENTRIES 256
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2026
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2027
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2028
make_ga_colormap(png_image_read_control *display)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2029
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2030
   unsigned int i, a;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2031
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2032
   /* Alpha is retained, the output will be a color-map with entries
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2033
    * selected by six levels of alpha.  One transparent entry, 6 gray
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2034
    * levels for all the intermediate alpha values, leaving 230 entries
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2035
    * for the opaque grays.  The color-map entries are the six values
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2036
    * [0..5]*51, the GA processing uses PNG_DIV51(value) to find the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2037
    * relevant entry.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2038
    *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2039
    * if (alpha > 229) // opaque
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2040
    * {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2041
    *    // The 231 entries are selected to make the math below work:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2042
    *    base = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2043
    *    entry = (231 * gray + 128) >> 8;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2044
    * }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2045
    * else if (alpha < 26) // transparent
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2046
    * {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2047
    *    base = 231;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2048
    *    entry = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2049
    * }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2050
    * else // partially opaque
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2051
    * {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2052
    *    base = 226 + 6 * PNG_DIV51(alpha);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2053
    *    entry = PNG_DIV51(gray);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2054
    * }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2055
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2056
   i = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2057
   while (i < 231)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2058
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2059
      unsigned int gray = (i * 256 + 115) / 231;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2060
      png_create_colormap_entry(display, i++, gray, gray, gray, 255, P_sRGB);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2061
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2062
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2063
   /* 255 is used here for the component values for consistency with the code
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2064
    * that undoes premultiplication in pngwrite.c.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2065
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2066
   png_create_colormap_entry(display, i++, 255, 255, 255, 0, P_sRGB);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2067
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2068
   for (a=1; a<5; ++a)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2069
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2070
      unsigned int g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2071
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2072
      for (g=0; g<6; ++g)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2073
         png_create_colormap_entry(display, i++, g*51, g*51, g*51, a*51,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2074
             P_sRGB);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2075
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2076
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2077
   return (int)i;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2078
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2079
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2080
#define PNG_GA_COLORMAP_ENTRIES 256
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2081
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2082
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2083
make_rgb_colormap(png_image_read_control *display)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2084
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2085
   unsigned int i, r;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2086
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2087
   /* Build a 6x6x6 opaque RGB cube */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2088
   for (i=r=0; r<6; ++r)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2089
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2090
      unsigned int g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2091
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2092
      for (g=0; g<6; ++g)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2093
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2094
         unsigned int b;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2095
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2096
         for (b=0; b<6; ++b)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2097
            png_create_colormap_entry(display, i++, r*51, g*51, b*51, 255,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2098
                P_sRGB);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2099
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2100
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2101
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2102
   return (int)i;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2103
}
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2104
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2105
#define PNG_RGB_COLORMAP_ENTRIES 216
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2106
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2107
/* Return a palette index to the above palette given three 8-bit sRGB values. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2108
#define PNG_RGB_INDEX(r,g,b) \
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2109
   ((png_byte)(6 * (6 * PNG_DIV51(r) + PNG_DIV51(g)) + PNG_DIV51(b)))
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2110
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2111
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2112
png_image_read_colormap(png_voidp argument)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2113
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2114
   png_image_read_control *display =
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2115
      png_voidcast(png_image_read_control*, argument);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2116
   const png_imagep image = display->image;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2117
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2118
   const png_structrp png_ptr = image->opaque->png_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2119
   const png_uint_32 output_format = image->format;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2120
   const int output_encoding = (output_format & PNG_FORMAT_FLAG_LINEAR) != 0 ?
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2121
      P_LINEAR : P_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2122
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2123
   unsigned int cmap_entries;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2124
   unsigned int output_processing;        /* Output processing option */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2125
   unsigned int data_encoding = P_NOTSET; /* Encoding libpng must produce */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2126
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2127
   /* Background information; the background color and the index of this color
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2128
    * in the color-map if it exists (else 256).
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2129
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2130
   unsigned int background_index = 256;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2131
   png_uint_32 back_r, back_g, back_b;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2132
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2133
   /* Flags to accumulate things that need to be done to the input. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2134
   int expand_tRNS = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2135
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2136
   /* Exclude the NYI feature of compositing onto a color-mapped buffer; it is
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2137
    * very difficult to do, the results look awful, and it is difficult to see
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2138
    * what possible use it is because the application can't control the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2139
    * color-map.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2140
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2141
   if (((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0 ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2142
         png_ptr->num_trans > 0) /* alpha in input */ &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2143
      ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0) /* no alpha in output */)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2144
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2145
      if (output_encoding == P_LINEAR) /* compose on black */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2146
         back_b = back_g = back_r = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2147
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2148
      else if (display->background == NULL /* no way to remove it */)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2149
         png_error(png_ptr,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2150
             "background color must be supplied to remove alpha/transparency");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2151
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2152
      /* Get a copy of the background color (this avoids repeating the checks
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2153
       * below.)  The encoding is 8-bit sRGB or 16-bit linear, depending on the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2154
       * output format.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2155
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2156
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2157
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2158
         back_g = display->background->green;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2159
         if ((output_format & PNG_FORMAT_FLAG_COLOR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2160
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2161
            back_r = display->background->red;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2162
            back_b = display->background->blue;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2163
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2164
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2165
            back_b = back_r = back_g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2166
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2167
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2168
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2169
   else if (output_encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2170
      back_b = back_r = back_g = 65535;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2171
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2172
   else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2173
      back_b = back_r = back_g = 255;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2174
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2175
   /* Default the input file gamma if required - this is necessary because
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2176
    * libpng assumes that if no gamma information is present the data is in the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2177
    * output format, but the simplified API deduces the gamma from the input
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2178
    * format.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2179
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2180
   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2181
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2182
      /* Do this directly, not using the png_colorspace functions, to ensure
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2183
       * that it happens even if the colorspace is invalid (though probably if
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2184
       * it is the setting will be ignored)  Note that the same thing can be
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2185
       * achieved at the application interface with png_set_gAMA.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2186
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2187
      if (png_ptr->bit_depth == 16 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2188
         (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2189
         png_ptr->colorspace.gamma = PNG_GAMMA_LINEAR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2190
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2191
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2192
         png_ptr->colorspace.gamma = PNG_GAMMA_sRGB_INVERSE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2193
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2194
      png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2195
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2196
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2197
   /* Decide what to do based on the PNG color type of the input data.  The
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2198
    * utility function png_create_colormap_entry deals with most aspects of the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2199
    * output transformations; this code works out how to produce bytes of
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2200
    * color-map entries from the original format.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2201
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2202
   switch (png_ptr->color_type)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2203
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2204
      case PNG_COLOR_TYPE_GRAY:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2205
         if (png_ptr->bit_depth <= 8)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2206
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2207
            /* There at most 256 colors in the output, regardless of
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2208
             * transparency.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2209
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2210
            unsigned int step, i, val, trans = 256/*ignore*/, back_alpha = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2211
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2212
            cmap_entries = 1U << png_ptr->bit_depth;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2213
            if (cmap_entries > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2214
               png_error(png_ptr, "gray[8] color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2215
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2216
            step = 255 / (cmap_entries - 1);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2217
            output_processing = PNG_CMAP_NONE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2218
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2219
            /* If there is a tRNS chunk then this either selects a transparent
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2220
             * value or, if the output has no alpha, the background color.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2221
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2222
            if (png_ptr->num_trans > 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2223
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2224
               trans = png_ptr->trans_color.gray;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2225
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2226
               if ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2227
                  back_alpha = output_encoding == P_LINEAR ? 65535 : 255;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2228
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2229
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2230
            /* png_create_colormap_entry just takes an RGBA and writes the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2231
             * corresponding color-map entry using the format from 'image',
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2232
             * including the required conversion to sRGB or linear as
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2233
             * appropriate.  The input values are always either sRGB (if the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2234
             * gamma correction flag is 0) or 0..255 scaled file encoded values
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2235
             * (if the function must gamma correct them).
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2236
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2237
            for (i=val=0; i<cmap_entries; ++i, val += step)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2238
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2239
               /* 'i' is a file value.  While this will result in duplicated
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2240
                * entries for 8-bit non-sRGB encoded files it is necessary to
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2241
                * have non-gamma corrected values to do tRNS handling.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2242
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2243
               if (i != trans)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2244
                  png_create_colormap_entry(display, i, val, val, val, 255,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2245
                      P_FILE/*8-bit with file gamma*/);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2246
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2247
               /* Else this entry is transparent.  The colors don't matter if
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2248
                * there is an alpha channel (back_alpha == 0), but it does no
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2249
                * harm to pass them in; the values are not set above so this
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2250
                * passes in white.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2251
                *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2252
                * NOTE: this preserves the full precision of the application
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2253
                * supplied background color when it is used.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2254
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2255
               else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2256
                  png_create_colormap_entry(display, i, back_r, back_g, back_b,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2257
                      back_alpha, output_encoding);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2258
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2259
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2260
            /* We need libpng to preserve the original encoding. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2261
            data_encoding = P_FILE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2262
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2263
            /* The rows from libpng, while technically gray values, are now also
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2264
             * color-map indices; however, they may need to be expanded to 1
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2265
             * byte per pixel.  This is what png_set_packing does (i.e., it
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2266
             * unpacks the bit values into bytes.)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2267
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2268
            if (png_ptr->bit_depth < 8)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2269
               png_set_packing(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2270
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2271
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2272
         else /* bit depth is 16 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2273
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2274
            /* The 16-bit input values can be converted directly to 8-bit gamma
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2275
             * encoded values; however, if a tRNS chunk is present 257 color-map
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2276
             * entries are required.  This means that the extra entry requires
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2277
             * special processing; add an alpha channel, sacrifice gray level
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2278
             * 254 and convert transparent (alpha==0) entries to that.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2279
             *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2280
             * Use libpng to chop the data to 8 bits.  Convert it to sRGB at the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2281
             * same time to minimize quality loss.  If a tRNS chunk is present
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2282
             * this means libpng must handle it too; otherwise it is impossible
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2283
             * to do the exact match on the 16-bit value.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2284
             *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2285
             * If the output has no alpha channel *and* the background color is
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2286
             * gray then it is possible to let libpng handle the substitution by
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2287
             * ensuring that the corresponding gray level matches the background
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2288
             * color exactly.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2289
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2290
            data_encoding = P_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2291
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2292
            if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2293
               png_error(png_ptr, "gray[16] color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2294
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2295
            cmap_entries = (unsigned int)make_gray_colormap(display);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2296
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2297
            if (png_ptr->num_trans > 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2298
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2299
               unsigned int back_alpha;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2300
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2301
               if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2302
                  back_alpha = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2303
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2304
               else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2305
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2306
                  if (back_r == back_g && back_g == back_b)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2307
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2308
                     /* Background is gray; no special processing will be
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2309
                      * required.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2310
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2311
                     png_color_16 c;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2312
                     png_uint_32 gray = back_g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2313
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2314
                     if (output_encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2315
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2316
                        gray = PNG_sRGB_FROM_LINEAR(gray * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2317
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2318
                        /* And make sure the corresponding palette entry
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2319
                         * matches.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2320
                         */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2321
                        png_create_colormap_entry(display, gray, back_g, back_g,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2322
                            back_g, 65535, P_LINEAR);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2323
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2324
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2325
                     /* The background passed to libpng, however, must be the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2326
                      * sRGB value.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2327
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2328
                     c.index = 0; /*unused*/
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2329
                     c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2330
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2331
                     /* NOTE: does this work without expanding tRNS to alpha?
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2332
                      * It should be the color->gray case below apparently
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2333
                      * doesn't.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2334
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2335
                     png_set_background_fixed(png_ptr, &c,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2336
                         PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2337
                         0/*gamma: not used*/);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2338
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2339
                     output_processing = PNG_CMAP_NONE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2340
                     break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2341
                  }
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2342
#ifdef __COVERITY__
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2343
                 /* Coverity claims that output_encoding cannot be 2 (P_LINEAR)
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2344
                  * here.
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2345
                  */
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2346
                  back_alpha = 255;
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2347
#else
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2348
                  back_alpha = output_encoding == P_LINEAR ? 65535 : 255;
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2349
#endif
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2350
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2351
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2352
               /* output_processing means that the libpng-processed row will be
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2353
                * 8-bit GA and it has to be processing to single byte color-map
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2354
                * values.  Entry 254 is replaced by either a completely
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2355
                * transparent entry or by the background color at full
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2356
                * precision (and the background color is not a simple gray
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2357
                * level in this case.)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2358
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2359
               expand_tRNS = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2360
               output_processing = PNG_CMAP_TRANS;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2361
               background_index = 254;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2362
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2363
               /* And set (overwrite) color-map entry 254 to the actual
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2364
                * background color at full precision.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2365
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2366
               png_create_colormap_entry(display, 254, back_r, back_g, back_b,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2367
                   back_alpha, output_encoding);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2368
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2369
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2370
            else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2371
               output_processing = PNG_CMAP_NONE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2372
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2373
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2374
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2375
      case PNG_COLOR_TYPE_GRAY_ALPHA:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2376
         /* 8-bit or 16-bit PNG with two channels - gray and alpha.  A minimum
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2377
          * of 65536 combinations.  If, however, the alpha channel is to be
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2378
          * removed there are only 256 possibilities if the background is gray.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2379
          * (Otherwise there is a subset of the 65536 possibilities defined by
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2380
          * the triangle between black, white and the background color.)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2381
          *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2382
          * Reduce 16-bit files to 8-bit and sRGB encode the result.  No need to
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2383
          * worry about tRNS matching - tRNS is ignored if there is an alpha
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2384
          * channel.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2385
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2386
         data_encoding = P_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2387
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2388
         if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2389
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2390
            if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2391
               png_error(png_ptr, "gray+alpha color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2392
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2393
            cmap_entries = (unsigned int)make_ga_colormap(display);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2394
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2395
            background_index = PNG_CMAP_GA_BACKGROUND;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2396
            output_processing = PNG_CMAP_GA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2397
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2398
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2399
         else /* alpha is removed */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2400
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2401
            /* Alpha must be removed as the PNG data is processed when the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2402
             * background is a color because the G and A channels are
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2403
             * independent and the vector addition (non-parallel vectors) is a
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2404
             * 2-D problem.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2405
             *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2406
             * This can be reduced to the same algorithm as above by making a
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2407
             * colormap containing gray levels (for the opaque grays), a
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2408
             * background entry (for a transparent pixel) and a set of four six
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2409
             * level color values, one set for each intermediate alpha value.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2410
             * See the comments in make_ga_colormap for how this works in the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2411
             * per-pixel processing.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2412
             *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2413
             * If the background is gray, however, we only need a 256 entry gray
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2414
             * level color map.  It is sufficient to make the entry generated
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2415
             * for the background color be exactly the color specified.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2416
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2417
            if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0 ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2418
               (back_r == back_g && back_g == back_b))
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2419
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2420
               /* Background is gray; no special processing will be required. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2421
               png_color_16 c;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2422
               png_uint_32 gray = back_g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2423
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2424
               if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2425
                  png_error(png_ptr, "gray-alpha color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2426
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2427
               cmap_entries = (unsigned int)make_gray_colormap(display);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2428
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2429
               if (output_encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2430
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2431
                  gray = PNG_sRGB_FROM_LINEAR(gray * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2432
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2433
                  /* And make sure the corresponding palette entry matches. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2434
                  png_create_colormap_entry(display, gray, back_g, back_g,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2435
                      back_g, 65535, P_LINEAR);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2436
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2437
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2438
               /* The background passed to libpng, however, must be the sRGB
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2439
                * value.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2440
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2441
               c.index = 0; /*unused*/
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2442
               c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2443
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2444
               png_set_background_fixed(png_ptr, &c,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2445
                   PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2446
                   0/*gamma: not used*/);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2447
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2448
               output_processing = PNG_CMAP_NONE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2449
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2450
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2451
            else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2452
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2453
               png_uint_32 i, a;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2454
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2455
               /* This is the same as png_make_ga_colormap, above, except that
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2456
                * the entries are all opaque.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2457
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2458
               if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2459
                  png_error(png_ptr, "ga-alpha color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2460
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2461
               i = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2462
               while (i < 231)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2463
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2464
                  png_uint_32 gray = (i * 256 + 115) / 231;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2465
                  png_create_colormap_entry(display, i++, gray, gray, gray,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2466
                      255, P_sRGB);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2467
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2468
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2469
               /* NOTE: this preserves the full precision of the application
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2470
                * background color.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2471
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2472
               background_index = i;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2473
               png_create_colormap_entry(display, i++, back_r, back_g, back_b,
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2474
#ifdef __COVERITY__
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2475
                   /* Coverity claims that output_encoding
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2476
                    * cannot be 2 (P_LINEAR) here.
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2477
                    */ 255U,
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2478
#else
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2479
                    output_encoding == P_LINEAR ? 65535U : 255U,
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2480
#endif
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2481
                    output_encoding);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2482
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2483
               /* For non-opaque input composite on the sRGB background - this
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2484
                * requires inverting the encoding for each component.  The input
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2485
                * is still converted to the sRGB encoding because this is a
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2486
                * reasonable approximate to the logarithmic curve of human
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2487
                * visual sensitivity, at least over the narrow range which PNG
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2488
                * represents.  Consequently 'G' is always sRGB encoded, while
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2489
                * 'A' is linear.  We need the linear background colors.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2490
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2491
               if (output_encoding == P_sRGB) /* else already linear */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2492
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2493
                  /* This may produce a value not exactly matching the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2494
                   * background, but that's ok because these numbers are only
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2495
                   * used when alpha != 0
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2496
                   */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2497
                  back_r = png_sRGB_table[back_r];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2498
                  back_g = png_sRGB_table[back_g];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2499
                  back_b = png_sRGB_table[back_b];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2500
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2501
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2502
               for (a=1; a<5; ++a)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2503
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2504
                  unsigned int g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2505
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2506
                  /* PNG_sRGB_FROM_LINEAR expects a 16-bit linear value scaled
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2507
                   * by an 8-bit alpha value (0..255).
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2508
                   */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2509
                  png_uint_32 alpha = 51 * a;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2510
                  png_uint_32 back_rx = (255-alpha) * back_r;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2511
                  png_uint_32 back_gx = (255-alpha) * back_g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2512
                  png_uint_32 back_bx = (255-alpha) * back_b;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2513
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2514
                  for (g=0; g<6; ++g)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2515
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2516
                     png_uint_32 gray = png_sRGB_table[g*51] * alpha;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2517
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2518
                     png_create_colormap_entry(display, i++,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2519
                         PNG_sRGB_FROM_LINEAR(gray + back_rx),
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2520
                         PNG_sRGB_FROM_LINEAR(gray + back_gx),
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2521
                         PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, P_sRGB);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2522
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2523
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2524
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2525
               cmap_entries = i;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2526
               output_processing = PNG_CMAP_GA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2527
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2528
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2529
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2530
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2531
      case PNG_COLOR_TYPE_RGB:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2532
      case PNG_COLOR_TYPE_RGB_ALPHA:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2533
         /* Exclude the case where the output is gray; we can always handle this
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2534
          * with the cases above.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2535
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2536
         if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2537
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2538
            /* The color-map will be grayscale, so we may as well convert the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2539
             * input RGB values to a simple grayscale and use the grayscale
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2540
             * code above.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2541
             *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2542
             * NOTE: calling this apparently damages the recognition of the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2543
             * transparent color in background color handling; call
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2544
             * png_set_tRNS_to_alpha before png_set_background_fixed.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2545
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2546
            png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, -1,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2547
                -1);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2548
            data_encoding = P_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2549
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2550
            /* The output will now be one or two 8-bit gray or gray+alpha
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2551
             * channels.  The more complex case arises when the input has alpha.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2552
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2553
            if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2554
               png_ptr->num_trans > 0) &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2555
               (output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2556
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2557
               /* Both input and output have an alpha channel, so no background
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2558
                * processing is required; just map the GA bytes to the right
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2559
                * color-map entry.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2560
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2561
               expand_tRNS = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2562
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2563
               if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2564
                  png_error(png_ptr, "rgb[ga] color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2565
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2566
               cmap_entries = (unsigned int)make_ga_colormap(display);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2567
               background_index = PNG_CMAP_GA_BACKGROUND;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2568
               output_processing = PNG_CMAP_GA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2569
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2570
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2571
            else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2572
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2573
               /* Either the input or the output has no alpha channel, so there
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2574
                * will be no non-opaque pixels in the color-map; it will just be
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2575
                * grayscale.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2576
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2577
               if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2578
                  png_error(png_ptr, "rgb[gray] color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2579
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2580
               /* Ideally this code would use libpng to do the gamma correction,
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2581
                * but if an input alpha channel is to be removed we will hit the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2582
                * libpng bug in gamma+compose+rgb-to-gray (the double gamma
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2583
                * correction bug).  Fix this by dropping the gamma correction in
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2584
                * this case and doing it in the palette; this will result in
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2585
                * duplicate palette entries, but that's better than the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2586
                * alternative of double gamma correction.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2587
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2588
               if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2589
                  png_ptr->num_trans > 0) &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2590
                  png_gamma_not_sRGB(png_ptr->colorspace.gamma) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2591
               {
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2592
                  cmap_entries = (unsigned int)make_gray_file_colormap(display);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2593
                  data_encoding = P_FILE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2594
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2595
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2596
               else
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2597
                  cmap_entries = (unsigned int)make_gray_colormap(display);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2598
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2599
               /* But if the input has alpha or transparency it must be removed
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2600
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2601
               if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2602
                  png_ptr->num_trans > 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2603
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2604
                  png_color_16 c;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2605
                  png_uint_32 gray = back_g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2606
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2607
                  /* We need to ensure that the application background exists in
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2608
                   * the colormap and that completely transparent pixels map to
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2609
                   * it.  Achieve this simply by ensuring that the entry
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2610
                   * selected for the background really is the background color.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2611
                   */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2612
                  if (data_encoding == P_FILE) /* from the fixup above */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2613
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2614
                     /* The app supplied a gray which is in output_encoding, we
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2615
                      * need to convert it to a value of the input (P_FILE)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2616
                      * encoding then set this palette entry to the required
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2617
                      * output encoding.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2618
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2619
                     if (output_encoding == P_sRGB)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2620
                        gray = png_sRGB_table[gray]; /* now P_LINEAR */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2621
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2622
                     gray = PNG_DIV257(png_gamma_16bit_correct(gray,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2623
                         png_ptr->colorspace.gamma)); /* now P_FILE */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2624
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2625
                     /* And make sure the corresponding palette entry contains
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2626
                      * exactly the required sRGB value.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2627
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2628
                     png_create_colormap_entry(display, gray, back_g, back_g,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2629
                         back_g, 0/*unused*/, output_encoding);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2630
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2631
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2632
                  else if (output_encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2633
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2634
                     gray = PNG_sRGB_FROM_LINEAR(gray * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2635
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2636
                     /* And make sure the corresponding palette entry matches.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2637
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2638
                     png_create_colormap_entry(display, gray, back_g, back_g,
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2639
                        back_g, 0/*unused*/, P_LINEAR);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2640
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2641
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2642
                  /* The background passed to libpng, however, must be the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2643
                   * output (normally sRGB) value.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2644
                   */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2645
                  c.index = 0; /*unused*/
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2646
                  c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2647
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2648
                  /* NOTE: the following is apparently a bug in libpng. Without
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2649
                   * it the transparent color recognition in
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2650
                   * png_set_background_fixed seems to go wrong.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2651
                   */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2652
                  expand_tRNS = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2653
                  png_set_background_fixed(png_ptr, &c,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2654
                      PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2655
                      0/*gamma: not used*/);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2656
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2657
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2658
               output_processing = PNG_CMAP_NONE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2659
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2660
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2661
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2662
         else /* output is color */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2663
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2664
            /* We could use png_quantize here so long as there is no transparent
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2665
             * color or alpha; png_quantize ignores alpha.  Easier overall just
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2666
             * to do it once and using PNG_DIV51 on the 6x6x6 reduced RGB cube.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2667
             * Consequently we always want libpng to produce sRGB data.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2668
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2669
            data_encoding = P_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2670
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2671
            /* Is there any transparency or alpha? */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2672
            if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2673
               png_ptr->num_trans > 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2674
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2675
               /* Is there alpha in the output too?  If so all four channels are
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2676
                * processed into a special RGB cube with alpha support.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2677
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2678
               if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2679
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2680
                  png_uint_32 r;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2681
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2682
                  if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2683
                     png_error(png_ptr, "rgb+alpha color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2684
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2685
                  cmap_entries = (unsigned int)make_rgb_colormap(display);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2686
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2687
                  /* Add a transparent entry. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2688
                  png_create_colormap_entry(display, cmap_entries, 255, 255,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2689
                      255, 0, P_sRGB);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2690
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2691
                  /* This is stored as the background index for the processing
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2692
                   * algorithm.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2693
                   */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2694
                  background_index = cmap_entries++;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2695
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2696
                  /* Add 27 r,g,b entries each with alpha 0.5. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2697
                  for (r=0; r<256; r = (r << 1) | 0x7f)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2698
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2699
                     png_uint_32 g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2700
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2701
                     for (g=0; g<256; g = (g << 1) | 0x7f)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2702
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2703
                        png_uint_32 b;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2704
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2705
                        /* This generates components with the values 0, 127 and
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2706
                         * 255
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2707
                         */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2708
                        for (b=0; b<256; b = (b << 1) | 0x7f)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2709
                           png_create_colormap_entry(display, cmap_entries++,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2710
                               r, g, b, 128, P_sRGB);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2711
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2712
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2713
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2714
                  expand_tRNS = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2715
                  output_processing = PNG_CMAP_RGB_ALPHA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2716
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2717
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2718
               else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2719
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2720
                  /* Alpha/transparency must be removed.  The background must
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2721
                   * exist in the color map (achieved by setting adding it after
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2722
                   * the 666 color-map).  If the standard processing code will
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2723
                   * pick up this entry automatically that's all that is
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2724
                   * required; libpng can be called to do the background
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2725
                   * processing.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2726
                   */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2727
                  unsigned int sample_size =
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2728
                     PNG_IMAGE_SAMPLE_SIZE(output_format);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2729
                  png_uint_32 r, g, b; /* sRGB background */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2730
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2731
                  if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2732
                     png_error(png_ptr, "rgb-alpha color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2733
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2734
                  cmap_entries = (unsigned int)make_rgb_colormap(display);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2735
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2736
                  png_create_colormap_entry(display, cmap_entries, back_r,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2737
                      back_g, back_b, 0/*unused*/, output_encoding);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2738
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2739
                  if (output_encoding == P_LINEAR)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2740
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2741
                     r = PNG_sRGB_FROM_LINEAR(back_r * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2742
                     g = PNG_sRGB_FROM_LINEAR(back_g * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2743
                     b = PNG_sRGB_FROM_LINEAR(back_b * 255);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2744
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2745
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2746
                  else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2747
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2748
                     r = back_r;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2749
                     g = back_g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2750
                     b = back_g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2751
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2752
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2753
                  /* Compare the newly-created color-map entry with the one the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2754
                   * PNG_CMAP_RGB algorithm will use.  If the two entries don't
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2755
                   * match, add the new one and set this as the background
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2756
                   * index.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2757
                   */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2758
                  if (memcmp((png_const_bytep)display->colormap +
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2759
                      sample_size * cmap_entries,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2760
                      (png_const_bytep)display->colormap +
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2761
                          sample_size * PNG_RGB_INDEX(r,g,b),
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2762
                     sample_size) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2763
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2764
                     /* The background color must be added. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2765
                     background_index = cmap_entries++;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2766
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2767
                     /* Add 27 r,g,b entries each with created by composing with
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2768
                      * the background at alpha 0.5.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2769
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2770
                     for (r=0; r<256; r = (r << 1) | 0x7f)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2771
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2772
                        for (g=0; g<256; g = (g << 1) | 0x7f)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2773
                        {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2774
                           /* This generates components with the values 0, 127
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2775
                            * and 255
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2776
                            */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2777
                           for (b=0; b<256; b = (b << 1) | 0x7f)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2778
                              png_create_colormap_entry(display, cmap_entries++,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2779
                                  png_colormap_compose(display, r, P_sRGB, 128,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2780
                                      back_r, output_encoding),
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2781
                                  png_colormap_compose(display, g, P_sRGB, 128,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2782
                                      back_g, output_encoding),
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2783
                                  png_colormap_compose(display, b, P_sRGB, 128,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2784
                                      back_b, output_encoding),
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2785
                                  0/*unused*/, output_encoding);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2786
                        }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2787
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2788
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2789
                     expand_tRNS = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2790
                     output_processing = PNG_CMAP_RGB_ALPHA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2791
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2792
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2793
                  else /* background color is in the standard color-map */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2794
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2795
                     png_color_16 c;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2796
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2797
                     c.index = 0; /*unused*/
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2798
                     c.red = (png_uint_16)back_r;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2799
                     c.gray = c.green = (png_uint_16)back_g;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2800
                     c.blue = (png_uint_16)back_b;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2801
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2802
                     png_set_background_fixed(png_ptr, &c,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2803
                         PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2804
                         0/*gamma: not used*/);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2805
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2806
                     output_processing = PNG_CMAP_RGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2807
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2808
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2809
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2810
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2811
            else /* no alpha or transparency in the input */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2812
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2813
               /* Alpha in the output is irrelevant, simply map the opaque input
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2814
                * pixels to the 6x6x6 color-map.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2815
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2816
               if (PNG_RGB_COLORMAP_ENTRIES > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2817
                  png_error(png_ptr, "rgb color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2818
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2819
               cmap_entries = (unsigned int)make_rgb_colormap(display);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2820
               output_processing = PNG_CMAP_RGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2821
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2822
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2823
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2824
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2825
      case PNG_COLOR_TYPE_PALETTE:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2826
         /* It's already got a color-map.  It may be necessary to eliminate the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2827
          * tRNS entries though.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2828
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2829
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2830
            unsigned int num_trans = png_ptr->num_trans;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2831
            png_const_bytep trans = num_trans > 0 ? png_ptr->trans_alpha : NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2832
            png_const_colorp colormap = png_ptr->palette;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2833
            const int do_background = trans != NULL &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2834
               (output_format & PNG_FORMAT_FLAG_ALPHA) == 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2835
            unsigned int i;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2836
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2837
            /* Just in case: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2838
            if (trans == NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2839
               num_trans = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2840
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2841
            output_processing = PNG_CMAP_NONE;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2842
            data_encoding = P_FILE; /* Don't change from color-map indices */
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2843
            cmap_entries = (unsigned int)png_ptr->num_palette;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2844
            if (cmap_entries > 256)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2845
               cmap_entries = 256;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2846
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2847
            if (cmap_entries > (unsigned int)image->colormap_entries)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2848
               png_error(png_ptr, "palette color-map: too few entries");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2849
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2850
            for (i=0; i < cmap_entries; ++i)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2851
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2852
               if (do_background != 0 && i < num_trans && trans[i] < 255)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2853
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2854
                  if (trans[i] == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2855
                     png_create_colormap_entry(display, i, back_r, back_g,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2856
                         back_b, 0, output_encoding);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2857
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2858
                  else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2859
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2860
                     /* Must compose the PNG file color in the color-map entry
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2861
                      * on the sRGB color in 'back'.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2862
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2863
                     png_create_colormap_entry(display, i,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2864
                         png_colormap_compose(display, colormap[i].red,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2865
                             P_FILE, trans[i], back_r, output_encoding),
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2866
                         png_colormap_compose(display, colormap[i].green,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2867
                             P_FILE, trans[i], back_g, output_encoding),
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2868
                         png_colormap_compose(display, colormap[i].blue,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2869
                             P_FILE, trans[i], back_b, output_encoding),
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2870
                         output_encoding == P_LINEAR ? trans[i] * 257U :
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2871
                             trans[i],
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2872
                         output_encoding);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2873
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2874
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2875
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2876
               else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2877
                  png_create_colormap_entry(display, i, colormap[i].red,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2878
                      colormap[i].green, colormap[i].blue,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2879
                      i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2880
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2881
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2882
            /* The PNG data may have indices packed in fewer than 8 bits, it
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2883
             * must be expanded if so.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2884
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2885
            if (png_ptr->bit_depth < 8)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2886
               png_set_packing(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2887
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2888
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2889
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2890
      default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2891
         png_error(png_ptr, "invalid PNG color type");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2892
         /*NOT REACHED*/
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2893
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2894
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2895
   /* Now deal with the output processing */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2896
   if (expand_tRNS != 0 && png_ptr->num_trans > 0 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2897
       (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2898
      png_set_tRNS_to_alpha(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2899
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2900
   switch (data_encoding)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2901
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2902
      case P_sRGB:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2903
         /* Change to 8-bit sRGB */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2904
         png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, PNG_GAMMA_sRGB);
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  2905
         /* FALLTHROUGH */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2906
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2907
      case P_FILE:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2908
         if (png_ptr->bit_depth > 8)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2909
            png_set_scale_16(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2910
         break;
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2911
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2912
#ifdef __GNUC__
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2913
      default:
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2914
         png_error(png_ptr, "bad data option (internal error)");
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  2915
#endif
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2916
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2917
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2918
   if (cmap_entries > 256 || cmap_entries > image->colormap_entries)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2919
      png_error(png_ptr, "color map overflow (BAD internal error)");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2920
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2921
   image->colormap_entries = cmap_entries;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2922
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2923
   /* Double check using the recorded background index */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2924
   switch (output_processing)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2925
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2926
      case PNG_CMAP_NONE:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2927
         if (background_index != PNG_CMAP_NONE_BACKGROUND)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2928
            goto bad_background;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2929
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2930
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2931
      case PNG_CMAP_GA:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2932
         if (background_index != PNG_CMAP_GA_BACKGROUND)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2933
            goto bad_background;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2934
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2935
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2936
      case PNG_CMAP_TRANS:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2937
         if (background_index >= cmap_entries ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2938
            background_index != PNG_CMAP_TRANS_BACKGROUND)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2939
            goto bad_background;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2940
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2941
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2942
      case PNG_CMAP_RGB:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2943
         if (background_index != PNG_CMAP_RGB_BACKGROUND)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2944
            goto bad_background;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2945
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2946
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2947
      case PNG_CMAP_RGB_ALPHA:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2948
         if (background_index != PNG_CMAP_RGB_ALPHA_BACKGROUND)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2949
            goto bad_background;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2950
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2951
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2952
      default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2953
         png_error(png_ptr, "bad processing option (internal error)");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2954
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2955
      bad_background:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2956
         png_error(png_ptr, "bad background index (internal error)");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2957
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2958
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2959
   display->colormap_processing = (int)output_processing;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2960
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2961
   return 1/*ok*/;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2962
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2963
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2964
/* The final part of the color-map read called from png_image_finish_read. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2965
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2966
png_image_read_and_map(png_voidp argument)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2967
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2968
   png_image_read_control *display = png_voidcast(png_image_read_control*,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  2969
       argument);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2970
   png_imagep image = display->image;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2971
   png_structrp png_ptr = image->opaque->png_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2972
   int passes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2973
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2974
   /* Called when the libpng data must be transformed into the color-mapped
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2975
    * form.  There is a local row buffer in display->local and this routine must
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2976
    * do the interlace handling.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2977
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2978
   switch (png_ptr->interlaced)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2979
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2980
      case PNG_INTERLACE_NONE:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2981
         passes = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2982
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2983
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2984
      case PNG_INTERLACE_ADAM7:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2985
         passes = PNG_INTERLACE_ADAM7_PASSES;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2986
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2987
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2988
      default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2989
         png_error(png_ptr, "unknown interlace type");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2990
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2991
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2992
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2993
      png_uint_32  height = image->height;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2994
      png_uint_32  width = image->width;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2995
      int          proc = display->colormap_processing;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2996
      png_bytep    first_row = png_voidcast(png_bytep, display->first_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2997
      ptrdiff_t    step_row = display->row_bytes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2998
      int pass;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  2999
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3000
      for (pass = 0; pass < passes; ++pass)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3001
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3002
         unsigned int     startx, stepx, stepy;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3003
         png_uint_32      y;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3004
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3005
         if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3006
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3007
            /* The row may be empty for a short image: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3008
            if (PNG_PASS_COLS(width, pass) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3009
               continue;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3010
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3011
            startx = PNG_PASS_START_COL(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3012
            stepx = PNG_PASS_COL_OFFSET(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3013
            y = PNG_PASS_START_ROW(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3014
            stepy = PNG_PASS_ROW_OFFSET(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3015
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3016
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3017
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3018
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3019
            y = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3020
            startx = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3021
            stepx = stepy = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3022
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3023
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3024
         for (; y<height; y += stepy)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3025
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3026
            png_bytep inrow = png_voidcast(png_bytep, display->local_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3027
            png_bytep outrow = first_row + y * step_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3028
            png_const_bytep end_row = outrow + width;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3029
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3030
            /* Read read the libpng data into the temporary buffer. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3031
            png_read_row(png_ptr, inrow, NULL);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3032
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3033
            /* Now process the row according to the processing option, note
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3034
             * that the caller verifies that the format of the libpng output
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3035
             * data is as required.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3036
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3037
            outrow += startx;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3038
            switch (proc)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3039
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3040
               case PNG_CMAP_GA:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3041
                  for (; outrow < end_row; outrow += stepx)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3042
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3043
                     /* The data is always in the PNG order */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3044
                     unsigned int gray = *inrow++;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3045
                     unsigned int alpha = *inrow++;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3046
                     unsigned int entry;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3047
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3048
                     /* NOTE: this code is copied as a comment in
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3049
                      * make_ga_colormap above.  Please update the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3050
                      * comment if you change this code!
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3051
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3052
                     if (alpha > 229) /* opaque */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3053
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3054
                        entry = (231 * gray + 128) >> 8;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3055
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3056
                     else if (alpha < 26) /* transparent */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3057
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3058
                        entry = 231;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3059
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3060
                     else /* partially opaque */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3061
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3062
                        entry = 226 + 6 * PNG_DIV51(alpha) + PNG_DIV51(gray);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3063
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3064
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3065
                     *outrow = (png_byte)entry;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3066
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3067
                  break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3068
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3069
               case PNG_CMAP_TRANS:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3070
                  for (; outrow < end_row; outrow += stepx)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3071
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3072
                     png_byte gray = *inrow++;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3073
                     png_byte alpha = *inrow++;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3074
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3075
                     if (alpha == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3076
                        *outrow = PNG_CMAP_TRANS_BACKGROUND;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3077
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3078
                     else if (gray != PNG_CMAP_TRANS_BACKGROUND)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3079
                        *outrow = gray;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3080
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3081
                     else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3082
                        *outrow = (png_byte)(PNG_CMAP_TRANS_BACKGROUND+1);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3083
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3084
                  break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3085
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3086
               case PNG_CMAP_RGB:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3087
                  for (; outrow < end_row; outrow += stepx)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3088
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3089
                     *outrow = PNG_RGB_INDEX(inrow[0], inrow[1], inrow[2]);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3090
                     inrow += 3;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3091
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3092
                  break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3093
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3094
               case PNG_CMAP_RGB_ALPHA:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3095
                  for (; outrow < end_row; outrow += stepx)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3096
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3097
                     unsigned int alpha = inrow[3];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3098
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3099
                     /* Because the alpha entries only hold alpha==0.5 values
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3100
                      * split the processing at alpha==0.25 (64) and 0.75
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3101
                      * (196).
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3102
                      */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3103
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3104
                     if (alpha >= 196)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3105
                        *outrow = PNG_RGB_INDEX(inrow[0], inrow[1],
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3106
                            inrow[2]);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3107
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3108
                     else if (alpha < 64)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3109
                        *outrow = PNG_CMAP_RGB_ALPHA_BACKGROUND;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3110
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3111
                     else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3112
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3113
                        /* Likewise there are three entries for each of r, g
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3114
                         * and b.  We could select the entry by popcount on
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3115
                         * the top two bits on those architectures that
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3116
                         * support it, this is what the code below does,
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3117
                         * crudely.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3118
                         */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3119
                        unsigned int back_i = PNG_CMAP_RGB_ALPHA_BACKGROUND+1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3120
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3121
                        /* Here are how the values map:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3122
                         *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3123
                         * 0x00 .. 0x3f -> 0
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3124
                         * 0x40 .. 0xbf -> 1
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3125
                         * 0xc0 .. 0xff -> 2
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3126
                         *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3127
                         * So, as above with the explicit alpha checks, the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3128
                         * breakpoints are at 64 and 196.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3129
                         */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3130
                        if (inrow[0] & 0x80) back_i += 9; /* red */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3131
                        if (inrow[0] & 0x40) back_i += 9;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3132
                        if (inrow[0] & 0x80) back_i += 3; /* green */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3133
                        if (inrow[0] & 0x40) back_i += 3;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3134
                        if (inrow[0] & 0x80) back_i += 1; /* blue */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3135
                        if (inrow[0] & 0x40) back_i += 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3136
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3137
                        *outrow = (png_byte)back_i;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3138
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3139
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3140
                     inrow += 4;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3141
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3142
                  break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3143
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3144
               default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3145
                  break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3146
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3147
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3148
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3149
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3150
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3151
   return 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3152
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3153
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3154
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3155
png_image_read_colormapped(png_voidp argument)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3156
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3157
   png_image_read_control *display = png_voidcast(png_image_read_control*,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3158
       argument);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3159
   png_imagep image = display->image;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3160
   png_controlp control = image->opaque;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3161
   png_structrp png_ptr = control->png_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3162
   png_inforp info_ptr = control->info_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3163
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3164
   int passes = 0; /* As a flag */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3165
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3166
   PNG_SKIP_CHUNKS(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3167
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3168
   /* Update the 'info' structure and make sure the result is as required; first
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3169
    * make sure to turn on the interlace handling if it will be required
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3170
    * (because it can't be turned on *after* the call to png_read_update_info!)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3171
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3172
   if (display->colormap_processing == PNG_CMAP_NONE)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3173
      passes = png_set_interlace_handling(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3174
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3175
   png_read_update_info(png_ptr, info_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3176
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3177
   /* The expected output can be deduced from the colormap_processing option. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3178
   switch (display->colormap_processing)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3179
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3180
      case PNG_CMAP_NONE:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3181
         /* Output must be one channel and one byte per pixel, the output
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3182
          * encoding can be anything.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3183
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3184
         if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3185
            info_ptr->color_type == PNG_COLOR_TYPE_GRAY) &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3186
            info_ptr->bit_depth == 8)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3187
            break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3188
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3189
         goto bad_output;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3190
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3191
      case PNG_CMAP_TRANS:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3192
      case PNG_CMAP_GA:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3193
         /* Output must be two channels and the 'G' one must be sRGB, the latter
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3194
          * can be checked with an exact number because it should have been set
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3195
          * to this number above!
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3196
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3197
         if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3198
            info_ptr->bit_depth == 8 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3199
            png_ptr->screen_gamma == PNG_GAMMA_sRGB &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3200
            image->colormap_entries == 256)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3201
            break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3202
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3203
         goto bad_output;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3204
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3205
      case PNG_CMAP_RGB:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3206
         /* Output must be 8-bit sRGB encoded RGB */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3207
         if (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3208
            info_ptr->bit_depth == 8 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3209
            png_ptr->screen_gamma == PNG_GAMMA_sRGB &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3210
            image->colormap_entries == 216)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3211
            break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3212
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3213
         goto bad_output;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3214
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3215
      case PNG_CMAP_RGB_ALPHA:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3216
         /* Output must be 8-bit sRGB encoded RGBA */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3217
         if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3218
            info_ptr->bit_depth == 8 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3219
            png_ptr->screen_gamma == PNG_GAMMA_sRGB &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3220
            image->colormap_entries == 244 /* 216 + 1 + 27 */)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3221
            break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3222
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  3223
         goto bad_output;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3224
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3225
      default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3226
      bad_output:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3227
         png_error(png_ptr, "bad color-map processing (internal error)");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3228
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3229
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3230
   /* Now read the rows.  Do this here if it is possible to read directly into
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3231
    * the output buffer, otherwise allocate a local row buffer of the maximum
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3232
    * size libpng requires and call the relevant processing routine safely.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3233
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3234
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3235
      png_voidp first_row = display->buffer;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3236
      ptrdiff_t row_bytes = display->row_stride;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3237
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3238
      /* The following expression is designed to work correctly whether it gives
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3239
       * a signed or an unsigned result.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3240
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3241
      if (row_bytes < 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3242
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3243
         char *ptr = png_voidcast(char*, first_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3244
         ptr += (image->height-1) * (-row_bytes);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3245
         first_row = png_voidcast(png_voidp, ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3246
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3247
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3248
      display->first_row = first_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3249
      display->row_bytes = row_bytes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3250
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3251
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3252
   if (passes == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3253
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3254
      int result;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3255
      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3256
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3257
      display->local_row = row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3258
      result = png_safe_execute(image, png_image_read_and_map, display);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3259
      display->local_row = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3260
      png_free(png_ptr, row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3261
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3262
      return result;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3263
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3264
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3265
   else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3266
   {
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3267
      png_alloc_size_t row_bytes = (png_alloc_size_t)display->row_bytes;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3268
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3269
      while (--passes >= 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3270
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3271
         png_uint_32      y = image->height;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3272
         png_bytep        row = png_voidcast(png_bytep, display->first_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3273
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3274
         for (; y > 0; --y)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3275
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3276
            png_read_row(png_ptr, row, NULL);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3277
            row += row_bytes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3278
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3279
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3280
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3281
      return 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3282
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3283
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3284
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3285
/* Just the row reading part of png_image_read. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3286
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3287
png_image_read_composite(png_voidp argument)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3288
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3289
   png_image_read_control *display = png_voidcast(png_image_read_control*,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3290
       argument);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3291
   png_imagep image = display->image;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3292
   png_structrp png_ptr = image->opaque->png_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3293
   int passes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3294
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3295
   switch (png_ptr->interlaced)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3296
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3297
      case PNG_INTERLACE_NONE:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3298
         passes = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3299
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3300
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3301
      case PNG_INTERLACE_ADAM7:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3302
         passes = PNG_INTERLACE_ADAM7_PASSES;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3303
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3304
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3305
      default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3306
         png_error(png_ptr, "unknown interlace type");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3307
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3308
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3309
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3310
      png_uint_32  height = image->height;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3311
      png_uint_32  width = image->width;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3312
      ptrdiff_t    step_row = display->row_bytes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3313
      unsigned int channels =
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  3314
          (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3315
      int pass;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3316
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3317
      for (pass = 0; pass < passes; ++pass)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3318
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3319
         unsigned int     startx, stepx, stepy;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3320
         png_uint_32      y;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3321
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3322
         if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3323
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3324
            /* The row may be empty for a short image: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3325
            if (PNG_PASS_COLS(width, pass) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3326
               continue;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3327
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3328
            startx = PNG_PASS_START_COL(pass) * channels;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3329
            stepx = PNG_PASS_COL_OFFSET(pass) * channels;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3330
            y = PNG_PASS_START_ROW(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3331
            stepy = PNG_PASS_ROW_OFFSET(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3332
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3333
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3334
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3335
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3336
            y = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3337
            startx = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3338
            stepx = channels;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3339
            stepy = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3340
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3341
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3342
         for (; y<height; y += stepy)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3343
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3344
            png_bytep inrow = png_voidcast(png_bytep, display->local_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3345
            png_bytep outrow;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3346
            png_const_bytep end_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3347
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3348
            /* Read the row, which is packed: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3349
            png_read_row(png_ptr, inrow, NULL);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3350
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3351
            outrow = png_voidcast(png_bytep, display->first_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3352
            outrow += y * step_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3353
            end_row = outrow + width * channels;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3354
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3355
            /* Now do the composition on each pixel in this row. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3356
            outrow += startx;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3357
            for (; outrow < end_row; outrow += stepx)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3358
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3359
               png_byte alpha = inrow[channels];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3360
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3361
               if (alpha > 0) /* else no change to the output */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3362
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3363
                  unsigned int c;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3364
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3365
                  for (c=0; c<channels; ++c)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3366
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3367
                     png_uint_32 component = inrow[c];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3368
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3369
                     if (alpha < 255) /* else just use component */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3370
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3371
                        /* This is PNG_OPTIMIZED_ALPHA, the component value
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3372
                         * is a linear 8-bit value.  Combine this with the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3373
                         * current outrow[c] value which is sRGB encoded.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3374
                         * Arithmetic here is 16-bits to preserve the output
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3375
                         * values correctly.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3376
                         */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3377
                        component *= 257*255; /* =65535 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3378
                        component += (255-alpha)*png_sRGB_table[outrow[c]];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3379
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3380
                        /* So 'component' is scaled by 255*65535 and is
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3381
                         * therefore appropriate for the sRGB to linear
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3382
                         * conversion table.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3383
                         */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3384
                        component = PNG_sRGB_FROM_LINEAR(component);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3385
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3386
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3387
                     outrow[c] = (png_byte)component;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3388
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3389
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3390
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3391
               inrow += channels+1; /* components and alpha channel */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3392
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3393
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3394
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3395
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3396
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3397
   return 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3398
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3399
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3400
/* The do_local_background case; called when all the following transforms are to
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3401
 * be done:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3402
 *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3403
 * PNG_RGB_TO_GRAY
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3404
 * PNG_COMPOSITE
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3405
 * PNG_GAMMA
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3406
 *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3407
 * This is a work-around for the fact that both the PNG_RGB_TO_GRAY and
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3408
 * PNG_COMPOSITE code performs gamma correction, so we get double gamma
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3409
 * correction.  The fix-up is to prevent the PNG_COMPOSITE operation from
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3410
 * happening inside libpng, so this routine sees an 8 or 16-bit gray+alpha
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3411
 * row and handles the removal or pre-multiplication of the alpha channel.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3412
 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3413
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3414
png_image_read_background(png_voidp argument)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3415
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3416
   png_image_read_control *display = png_voidcast(png_image_read_control*,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3417
       argument);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3418
   png_imagep image = display->image;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3419
   png_structrp png_ptr = image->opaque->png_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3420
   png_inforp info_ptr = image->opaque->info_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3421
   png_uint_32 height = image->height;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3422
   png_uint_32 width = image->width;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3423
   int pass, passes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3424
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3425
   /* Double check the convoluted logic below.  We expect to get here with
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3426
    * libpng doing rgb to gray and gamma correction but background processing
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3427
    * left to the png_image_read_background function.  The rows libpng produce
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3428
    * might be 8 or 16-bit but should always have two channels; gray plus alpha.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3429
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3430
   if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3431
      png_error(png_ptr, "lost rgb to gray");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3432
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3433
   if ((png_ptr->transformations & PNG_COMPOSE) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3434
      png_error(png_ptr, "unexpected compose");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3435
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3436
   if (png_get_channels(png_ptr, info_ptr) != 2)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3437
      png_error(png_ptr, "lost/gained channels");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3438
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3439
   /* Expect the 8-bit case to always remove the alpha channel */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3440
   if ((image->format & PNG_FORMAT_FLAG_LINEAR) == 0 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3441
      (image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3442
      png_error(png_ptr, "unexpected 8-bit transformation");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3443
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3444
   switch (png_ptr->interlaced)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3445
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3446
      case PNG_INTERLACE_NONE:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3447
         passes = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3448
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3449
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3450
      case PNG_INTERLACE_ADAM7:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3451
         passes = PNG_INTERLACE_ADAM7_PASSES;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3452
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3453
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3454
      default:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3455
         png_error(png_ptr, "unknown interlace type");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3456
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3457
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3458
   /* Use direct access to info_ptr here because otherwise the simplified API
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3459
    * would require PNG_EASY_ACCESS_SUPPORTED (just for this.)  Note this is
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3460
    * checking the value after libpng expansions, not the original value in the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3461
    * PNG.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3462
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3463
   switch (info_ptr->bit_depth)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3464
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3465
      case 8:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3466
         /* 8-bit sRGB gray values with an alpha channel; the alpha channel is
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3467
          * to be removed by composing on a background: either the row if
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3468
          * display->background is NULL or display->background->green if not.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3469
          * Unlike the code above ALPHA_OPTIMIZED has *not* been done.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3470
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3471
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3472
            png_bytep first_row = png_voidcast(png_bytep, display->first_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3473
            ptrdiff_t step_row = display->row_bytes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3474
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3475
            for (pass = 0; pass < passes; ++pass)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3476
            {
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3477
               png_bytep row = png_voidcast(png_bytep, display->first_row);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3478
               unsigned int     startx, stepx, stepy;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3479
               png_uint_32      y;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3480
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3481
               if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3482
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3483
                  /* The row may be empty for a short image: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3484
                  if (PNG_PASS_COLS(width, pass) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3485
                     continue;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3486
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3487
                  startx = PNG_PASS_START_COL(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3488
                  stepx = PNG_PASS_COL_OFFSET(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3489
                  y = PNG_PASS_START_ROW(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3490
                  stepy = PNG_PASS_ROW_OFFSET(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3491
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3492
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3493
               else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3494
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3495
                  y = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3496
                  startx = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3497
                  stepx = stepy = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3498
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3499
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3500
               if (display->background == NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3501
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3502
                  for (; y<height; y += stepy)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3503
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3504
                     png_bytep inrow = png_voidcast(png_bytep,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3505
                         display->local_row);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3506
                     png_bytep outrow = first_row + y * step_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3507
                     png_const_bytep end_row = outrow + width;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3508
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3509
                     /* Read the row, which is packed: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3510
                     png_read_row(png_ptr, inrow, NULL);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3511
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3512
                     /* Now do the composition on each pixel in this row. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3513
                     outrow += startx;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3514
                     for (; outrow < end_row; outrow += stepx)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3515
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3516
                        png_byte alpha = inrow[1];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3517
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3518
                        if (alpha > 0) /* else no change to the output */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3519
                        {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3520
                           png_uint_32 component = inrow[0];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3521
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3522
                           if (alpha < 255) /* else just use component */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3523
                           {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3524
                              /* Since PNG_OPTIMIZED_ALPHA was not set it is
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3525
                               * necessary to invert the sRGB transfer
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3526
                               * function and multiply the alpha out.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3527
                               */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3528
                              component = png_sRGB_table[component] * alpha;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3529
                              component += png_sRGB_table[outrow[0]] *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3530
                                 (255-alpha);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3531
                              component = PNG_sRGB_FROM_LINEAR(component);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3532
                           }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3533
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3534
                           outrow[0] = (png_byte)component;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3535
                        }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3536
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3537
                        inrow += 2; /* gray and alpha channel */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3538
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3539
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3540
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3541
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3542
               else /* constant background value */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3543
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3544
                  png_byte background8 = display->background->green;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3545
                  png_uint_16 background = png_sRGB_table[background8];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3546
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3547
                  for (; y<height; y += stepy)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3548
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3549
                     png_bytep inrow = png_voidcast(png_bytep,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3550
                         display->local_row);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3551
                     png_bytep outrow = first_row + y * step_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3552
                     png_const_bytep end_row = outrow + width;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3553
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3554
                     /* Read the row, which is packed: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3555
                     png_read_row(png_ptr, inrow, NULL);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3556
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3557
                     /* Now do the composition on each pixel in this row. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3558
                     outrow += startx;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3559
                     for (; outrow < end_row; outrow += stepx)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3560
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3561
                        png_byte alpha = inrow[1];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3562
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3563
                        if (alpha > 0) /* else use background */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3564
                        {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3565
                           png_uint_32 component = inrow[0];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3566
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3567
                           if (alpha < 255) /* else just use component */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3568
                           {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3569
                              component = png_sRGB_table[component] * alpha;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3570
                              component += background * (255-alpha);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3571
                              component = PNG_sRGB_FROM_LINEAR(component);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3572
                           }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3573
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3574
                           outrow[0] = (png_byte)component;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3575
                        }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3576
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3577
                        else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3578
                           outrow[0] = background8;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3579
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3580
                        inrow += 2; /* gray and alpha channel */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3581
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3582
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3583
                     row += display->row_bytes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3584
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3585
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3586
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3587
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3588
         break;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3589
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3590
      case 16:
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3591
         /* 16-bit linear with pre-multiplied alpha; the pre-multiplication must
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3592
          * still be done and, maybe, the alpha channel removed.  This code also
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3593
          * handles the alpha-first option.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3594
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3595
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3596
            png_uint_16p first_row = png_voidcast(png_uint_16p,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3597
                display->first_row);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3598
            /* The division by two is safe because the caller passed in a
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3599
             * stride which was multiplied by 2 (below) to get row_bytes.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3600
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3601
            ptrdiff_t    step_row = display->row_bytes / 2;
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3602
            unsigned int preserve_alpha = (image->format &
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3603
                PNG_FORMAT_FLAG_ALPHA) != 0;
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3604
            unsigned int outchannels = 1U+preserve_alpha;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3605
            int swap_alpha = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3606
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3607
#           ifdef PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3608
               if (preserve_alpha != 0 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3609
                   (image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3610
                  swap_alpha = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3611
#           endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3612
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3613
            for (pass = 0; pass < passes; ++pass)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3614
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3615
               unsigned int     startx, stepx, stepy;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3616
               png_uint_32      y;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3617
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3618
               /* The 'x' start and step are adjusted to output components here.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3619
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3620
               if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3621
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3622
                  /* The row may be empty for a short image: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3623
                  if (PNG_PASS_COLS(width, pass) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3624
                     continue;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3625
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3626
                  startx = PNG_PASS_START_COL(pass) * outchannels;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3627
                  stepx = PNG_PASS_COL_OFFSET(pass) * outchannels;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3628
                  y = PNG_PASS_START_ROW(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3629
                  stepy = PNG_PASS_ROW_OFFSET(pass);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3630
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3631
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3632
               else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3633
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3634
                  y = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3635
                  startx = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3636
                  stepx = outchannels;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3637
                  stepy = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3638
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3639
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3640
               for (; y<height; y += stepy)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3641
               {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3642
                  png_const_uint_16p inrow;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3643
                  png_uint_16p outrow = first_row + y*step_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3644
                  png_uint_16p end_row = outrow + width * outchannels;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3645
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3646
                  /* Read the row, which is packed: */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3647
                  png_read_row(png_ptr, png_voidcast(png_bytep,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3648
                      display->local_row), NULL);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3649
                  inrow = png_voidcast(png_const_uint_16p, display->local_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3650
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3651
                  /* Now do the pre-multiplication on each pixel in this row.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3652
                   */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3653
                  outrow += startx;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3654
                  for (; outrow < end_row; outrow += stepx)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3655
                  {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3656
                     png_uint_32 component = inrow[0];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3657
                     png_uint_16 alpha = inrow[1];
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3658
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3659
                     if (alpha > 0) /* else 0 */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3660
                     {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3661
                        if (alpha < 65535) /* else just use component */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3662
                        {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3663
                           component *= alpha;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3664
                           component += 32767;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3665
                           component /= 65535;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3666
                        }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3667
                     }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3668
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3669
                     else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3670
                        component = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3671
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3672
                     outrow[swap_alpha] = (png_uint_16)component;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3673
                     if (preserve_alpha != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3674
                        outrow[1 ^ swap_alpha] = alpha;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3675
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3676
                     inrow += 2; /* components and alpha channel */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3677
                  }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3678
               }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3679
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3680
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3681
         break;
35296
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  3682
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  3683
#ifdef __GNUC__
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  3684
      default:
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  3685
         png_error(png_ptr, "unexpected bit depth");
659e92aaf7f4 8143941: Update splashscreen displays
azvegint
parents: 29913
diff changeset
  3686
#endif
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3687
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3688
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3689
   return 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3690
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3691
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3692
/* The guts of png_image_finish_read as a png_safe_execute callback. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3693
static int
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3694
png_image_read_direct(png_voidp argument)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3695
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3696
   png_image_read_control *display = png_voidcast(png_image_read_control*,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3697
       argument);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3698
   png_imagep image = display->image;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3699
   png_structrp png_ptr = image->opaque->png_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3700
   png_inforp info_ptr = image->opaque->info_ptr;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3701
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3702
   png_uint_32 format = image->format;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3703
   int linear = (format & PNG_FORMAT_FLAG_LINEAR) != 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3704
   int do_local_compose = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3705
   int do_local_background = 0; /* to avoid double gamma correction bug */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3706
   int passes = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3707
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3708
   /* Add transforms to ensure the correct output format is produced then check
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3709
    * that the required implementation support is there.  Always expand; always
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3710
    * need 8 bits minimum, no palette and expanded tRNS.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3711
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3712
   png_set_expand(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3713
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3714
   /* Now check the format to see if it was modified. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3715
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3716
      png_uint_32 base_format = png_image_format(png_ptr) &
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3717
         ~PNG_FORMAT_FLAG_COLORMAP /* removed by png_set_expand */;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3718
      png_uint_32 change = format ^ base_format;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3719
      png_fixed_point output_gamma;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3720
      int mode; /* alpha mode */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3721
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3722
      /* Do this first so that we have a record if rgb to gray is happening. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3723
      if ((change & PNG_FORMAT_FLAG_COLOR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3724
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3725
         /* gray<->color transformation required. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3726
         if ((format & PNG_FORMAT_FLAG_COLOR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3727
            png_set_gray_to_rgb(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3728
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3729
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3730
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3731
            /* libpng can't do both rgb to gray and
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3732
             * background/pre-multiplication if there is also significant gamma
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3733
             * correction, because both operations require linear colors and
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3734
             * the code only supports one transform doing the gamma correction.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3735
             * Handle this by doing the pre-multiplication or background
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3736
             * operation in this code, if necessary.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3737
             *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3738
             * TODO: fix this by rewriting pngrtran.c (!)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3739
             *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3740
             * For the moment (given that fixing this in pngrtran.c is an
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3741
             * enormous change) 'do_local_background' is used to indicate that
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3742
             * the problem exists.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3743
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3744
            if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3745
               do_local_background = 1/*maybe*/;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3746
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3747
            png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3748
                PNG_RGB_TO_GRAY_DEFAULT, PNG_RGB_TO_GRAY_DEFAULT);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3749
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3750
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3751
         change &= ~PNG_FORMAT_FLAG_COLOR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3752
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3753
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3754
      /* Set the gamma appropriately, linear for 16-bit input, sRGB otherwise.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3755
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3756
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3757
         png_fixed_point input_gamma_default;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3758
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3759
         if ((base_format & PNG_FORMAT_FLAG_LINEAR) != 0 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3760
             (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3761
            input_gamma_default = PNG_GAMMA_LINEAR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3762
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3763
            input_gamma_default = PNG_DEFAULT_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3764
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3765
         /* Call png_set_alpha_mode to set the default for the input gamma; the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3766
          * output gamma is set by a second call below.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3767
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3768
         png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, input_gamma_default);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3769
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3770
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3771
      if (linear != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3772
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3773
         /* If there *is* an alpha channel in the input it must be multiplied
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3774
          * out; use PNG_ALPHA_STANDARD, otherwise just use PNG_ALPHA_PNG.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3775
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3776
         if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3777
            mode = PNG_ALPHA_STANDARD; /* associated alpha */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3778
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3779
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3780
            mode = PNG_ALPHA_PNG;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3781
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3782
         output_gamma = PNG_GAMMA_LINEAR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3783
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3784
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3785
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3786
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3787
         mode = PNG_ALPHA_PNG;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3788
         output_gamma = PNG_DEFAULT_sRGB;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3789
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3790
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  3791
      if ((change & PNG_FORMAT_FLAG_ASSOCIATED_ALPHA) != 0)
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  3792
      {
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  3793
         mode = PNG_ALPHA_OPTIMIZED;
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  3794
         change &= ~PNG_FORMAT_FLAG_ASSOCIATED_ALPHA;
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  3795
      }
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  3796
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3797
      /* If 'do_local_background' is set check for the presence of gamma
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3798
       * correction; this is part of the work-round for the libpng bug
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3799
       * described above.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3800
       *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3801
       * TODO: fix libpng and remove this.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3802
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3803
      if (do_local_background != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3804
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3805
         png_fixed_point gtest;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3806
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3807
         /* This is 'png_gamma_threshold' from pngrtran.c; the test used for
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3808
          * gamma correction, the screen gamma hasn't been set on png_struct
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3809
          * yet; it's set below.  png_struct::gamma, however, is set to the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3810
          * final value.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3811
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3812
         if (png_muldiv(&gtest, output_gamma, png_ptr->colorspace.gamma,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3813
             PNG_FP_1) != 0 && png_gamma_significant(gtest) == 0)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3814
            do_local_background = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3815
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3816
         else if (mode == PNG_ALPHA_STANDARD)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3817
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3818
            do_local_background = 2/*required*/;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3819
            mode = PNG_ALPHA_PNG; /* prevent libpng doing it */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3820
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3821
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3822
         /* else leave as 1 for the checks below */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3823
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3824
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3825
      /* If the bit-depth changes then handle that here. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3826
      if ((change & PNG_FORMAT_FLAG_LINEAR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3827
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3828
         if (linear != 0 /*16-bit output*/)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3829
            png_set_expand_16(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3830
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3831
         else /* 8-bit output */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3832
            png_set_scale_16(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3833
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3834
         change &= ~PNG_FORMAT_FLAG_LINEAR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3835
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3836
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3837
      /* Now the background/alpha channel changes. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3838
      if ((change & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3839
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3840
         /* Removing an alpha channel requires composition for the 8-bit
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3841
          * formats; for the 16-bit it is already done, above, by the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3842
          * pre-multiplication and the channel just needs to be stripped.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3843
          */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3844
         if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3845
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3846
            /* If RGB->gray is happening the alpha channel must be left and the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3847
             * operation completed locally.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3848
             *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3849
             * TODO: fix libpng and remove this.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3850
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3851
            if (do_local_background != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3852
               do_local_background = 2/*required*/;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3853
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3854
            /* 16-bit output: just remove the channel */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3855
            else if (linear != 0) /* compose on black (well, pre-multiply) */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3856
               png_set_strip_alpha(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3857
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3858
            /* 8-bit output: do an appropriate compose */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3859
            else if (display->background != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3860
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3861
               png_color_16 c;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3862
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3863
               c.index = 0; /*unused*/
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3864
               c.red = display->background->red;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3865
               c.green = display->background->green;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3866
               c.blue = display->background->blue;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3867
               c.gray = display->background->green;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3868
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3869
               /* This is always an 8-bit sRGB value, using the 'green' channel
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3870
                * for gray is much better than calculating the luminance here;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3871
                * we can get off-by-one errors in that calculation relative to
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3872
                * the app expectations and that will show up in transparent
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3873
                * pixels.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3874
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3875
               png_set_background_fixed(png_ptr, &c,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3876
                   PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  3877
                   0/*gamma: not used*/);
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3878
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3879
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3880
            else /* compose on row: implemented below. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3881
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3882
               do_local_compose = 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3883
               /* This leaves the alpha channel in the output, so it has to be
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3884
                * removed by the code below.  Set the encoding to the 'OPTIMIZE'
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3885
                * one so the code only has to hack on the pixels that require
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3886
                * composition.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3887
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3888
               mode = PNG_ALPHA_OPTIMIZED;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3889
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3890
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3891
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3892
         else /* output needs an alpha channel */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3893
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3894
            /* This is tricky because it happens before the swap operation has
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3895
             * been accomplished; however, the swap does *not* swap the added
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3896
             * alpha channel (weird API), so it must be added in the correct
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3897
             * place.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3898
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3899
            png_uint_32 filler; /* opaque filler */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3900
            int where;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3901
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3902
            if (linear != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3903
               filler = 65535;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3904
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3905
            else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3906
               filler = 255;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3907
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3908
#ifdef PNG_FORMAT_AFIRST_SUPPORTED
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3909
            if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3910
            {
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3911
               where = PNG_FILLER_BEFORE;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3912
               change &= ~PNG_FORMAT_FLAG_AFIRST;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3913
            }
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3914
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3915
            else
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3916
#endif
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  3917
            where = PNG_FILLER_AFTER;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3918
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3919
            png_set_add_alpha(png_ptr, filler, where);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3920
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3921
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3922
         /* This stops the (irrelevant) call to swap_alpha below. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3923
         change &= ~PNG_FORMAT_FLAG_ALPHA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3924
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3925
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3926
      /* Now set the alpha mode correctly; this is always done, even if there is
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3927
       * no alpha channel in either the input or the output because it correctly
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3928
       * sets the output gamma.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3929
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3930
      png_set_alpha_mode_fixed(png_ptr, mode, output_gamma);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3931
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3932
#     ifdef PNG_FORMAT_BGR_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3933
         if ((change & PNG_FORMAT_FLAG_BGR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3934
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3935
            /* Check only the output format; PNG is never BGR; don't do this if
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3936
             * the output is gray, but fix up the 'format' value in that case.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3937
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3938
            if ((format & PNG_FORMAT_FLAG_COLOR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3939
               png_set_bgr(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3940
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3941
            else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3942
               format &= ~PNG_FORMAT_FLAG_BGR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3943
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3944
            change &= ~PNG_FORMAT_FLAG_BGR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3945
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3946
#     endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3947
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3948
#     ifdef PNG_FORMAT_AFIRST_SUPPORTED
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3949
         if ((change & PNG_FORMAT_FLAG_AFIRST) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3950
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3951
            /* Only relevant if there is an alpha channel - it's particularly
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3952
             * important to handle this correctly because do_local_compose may
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3953
             * be set above and then libpng will keep the alpha channel for this
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3954
             * code to remove.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3955
             */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3956
            if ((format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3957
            {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3958
               /* Disable this if doing a local background,
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3959
                * TODO: remove this when local background is no longer required.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3960
                */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3961
               if (do_local_background != 2)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3962
                  png_set_swap_alpha(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3963
            }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3964
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3965
            else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3966
               format &= ~PNG_FORMAT_FLAG_AFIRST;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3967
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3968
            change &= ~PNG_FORMAT_FLAG_AFIRST;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3969
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3970
#     endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3971
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3972
      /* If the *output* is 16-bit then we need to check for a byte-swap on this
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3973
       * architecture.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3974
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3975
      if (linear != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3976
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3977
         PNG_CONST png_uint_16 le = 0x0001;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3978
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3979
         if ((*(png_const_bytep) & le) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3980
            png_set_swap(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3981
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3982
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3983
      /* If change is not now 0 some transformation is missing - error out. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3984
      if (change != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3985
         png_error(png_ptr, "png_read_image: unsupported transformation");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3986
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3987
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3988
   PNG_SKIP_CHUNKS(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3989
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3990
   /* Update the 'info' structure and make sure the result is as required; first
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3991
    * make sure to turn on the interlace handling if it will be required
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3992
    * (because it can't be turned on *after* the call to png_read_update_info!)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3993
    *
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3994
    * TODO: remove the do_local_background fixup below.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3995
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3996
   if (do_local_compose == 0 && do_local_background != 2)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3997
      passes = png_set_interlace_handling(png_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3998
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  3999
   png_read_update_info(png_ptr, info_ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4000
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4001
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4002
      png_uint_32 info_format = 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4003
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4004
      if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4005
         info_format |= PNG_FORMAT_FLAG_COLOR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4006
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4007
      if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4008
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4009
         /* do_local_compose removes this channel below. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4010
         if (do_local_compose == 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4011
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4012
            /* do_local_background does the same if required. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4013
            if (do_local_background != 2 ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4014
               (format & PNG_FORMAT_FLAG_ALPHA) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4015
               info_format |= PNG_FORMAT_FLAG_ALPHA;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4016
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4017
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4018
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4019
      else if (do_local_compose != 0) /* internal error */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4020
         png_error(png_ptr, "png_image_read: alpha channel lost");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4021
48280
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  4022
      if ((format & PNG_FORMAT_FLAG_ASSOCIATED_ALPHA) != 0) {
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  4023
         info_format |= PNG_FORMAT_FLAG_ASSOCIATED_ALPHA;
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  4024
      }
791d551bcdb8 8183960: Upgrade to libpng 1.6.34
prr
parents: 47216
diff changeset
  4025
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4026
      if (info_ptr->bit_depth == 16)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4027
         info_format |= PNG_FORMAT_FLAG_LINEAR;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4028
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4029
#ifdef PNG_FORMAT_BGR_SUPPORTED
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4030
      if ((png_ptr->transformations & PNG_BGR) != 0)
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4031
         info_format |= PNG_FORMAT_FLAG_BGR;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4032
#endif
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4033
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4034
#ifdef PNG_FORMAT_AFIRST_SUPPORTED
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4035
         if (do_local_background == 2)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4036
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4037
            if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4038
               info_format |= PNG_FORMAT_FLAG_AFIRST;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4039
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4040
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4041
         if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0 ||
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4042
            ((png_ptr->transformations & PNG_ADD_ALPHA) != 0 &&
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4043
            (png_ptr->flags & PNG_FLAG_FILLER_AFTER) == 0))
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4044
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4045
            if (do_local_background == 2)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4046
               png_error(png_ptr, "unexpected alpha swap transformation");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4047
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4048
            info_format |= PNG_FORMAT_FLAG_AFIRST;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4049
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4050
#     endif
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4051
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4052
      /* This is actually an internal error. */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4053
      if (info_format != format)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4054
         png_error(png_ptr, "png_read_image: invalid transformations");
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4055
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4056
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4057
   /* Now read the rows.  If do_local_compose is set then it is necessary to use
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4058
    * a local row buffer.  The output will be GA, RGBA or BGRA and must be
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4059
    * converted to G, RGB or BGR as appropriate.  The 'local_row' member of the
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4060
    * display acts as a flag.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4061
    */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4062
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4063
      png_voidp first_row = display->buffer;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4064
      ptrdiff_t row_bytes = display->row_stride;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4065
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4066
      if (linear != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4067
         row_bytes *= 2;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4068
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4069
      /* The following expression is designed to work correctly whether it gives
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4070
       * a signed or an unsigned result.
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4071
       */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4072
      if (row_bytes < 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4073
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4074
         char *ptr = png_voidcast(char*, first_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4075
         ptr += (image->height-1) * (-row_bytes);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4076
         first_row = png_voidcast(png_voidp, ptr);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4077
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4078
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4079
      display->first_row = first_row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4080
      display->row_bytes = row_bytes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4081
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4082
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4083
   if (do_local_compose != 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4084
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4085
      int result;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4086
      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4087
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4088
      display->local_row = row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4089
      result = png_safe_execute(image, png_image_read_composite, display);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4090
      display->local_row = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4091
      png_free(png_ptr, row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4092
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4093
      return result;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4094
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4095
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4096
   else if (do_local_background == 2)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4097
   {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4098
      int result;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4099
      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4100
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4101
      display->local_row = row;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4102
      result = png_safe_execute(image, png_image_read_background, display);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4103
      display->local_row = NULL;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4104
      png_free(png_ptr, row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4105
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4106
      return result;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4107
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4108
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4109
   else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4110
   {
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4111
      png_alloc_size_t row_bytes = (png_alloc_size_t)display->row_bytes;
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4112
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4113
      while (--passes >= 0)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4114
      {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4115
         png_uint_32      y = image->height;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4116
         png_bytep        row = png_voidcast(png_bytep, display->first_row);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4117
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4118
         for (; y > 0; --y)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4119
         {
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4120
            png_read_row(png_ptr, row, NULL);
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4121
            row += row_bytes;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4122
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4123
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4124
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4125
      return 1;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4126
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4127
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4128
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4129
int PNGAPI
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4130
png_image_finish_read(png_imagep image, png_const_colorp background,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4131
    void *buffer, png_int_32 row_stride, void *colormap)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4132
{
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4133
   if (image != NULL && image->version == PNG_IMAGE_VERSION)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4134
   {
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4135
      /* Check for row_stride overflow.  This check is not performed on the
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4136
       * original PNG format because it may not occur in the output PNG format
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4137
       * and libpng deals with the issues of reading the original.
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4138
       */
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4139
      const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4140
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4141
      /* The following checks just the 'row_stride' calculation to ensure it
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4142
       * fits in a signed 32-bit value.  Because channels/components can be
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4143
       * either 1 or 2 bytes in size the length of a row can still overflow 32
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4144
       * bits; this is just to verify that the 'row_stride' argument can be
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4145
       * represented.
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4146
       */
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4147
      if (image->width <= 0x7fffffffU/channels) /* no overflow */
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4148
      {
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4149
         png_uint_32 check;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4150
         const png_uint_32 png_row_stride = image->width * channels;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4151
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4152
         if (row_stride == 0)
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4153
            row_stride = (png_int_32)/*SAFE*/png_row_stride;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4154
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4155
         if (row_stride < 0)
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4156
            check = (png_uint_32)(-row_stride);
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4157
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4158
         else
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4159
            check = (png_uint_32)row_stride;
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4160
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4161
         /* This verifies 'check', the absolute value of the actual stride
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4162
          * passed in and detects overflow in the application calculation (i.e.
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4163
          * if the app did actually pass in a non-zero 'row_stride'.
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4164
          */
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4165
         if (image->opaque != NULL && buffer != NULL && check >= png_row_stride)
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4166
         {
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4167
            /* Now check for overflow of the image buffer calculation; this
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4168
             * limits the whole image size to 32 bits for API compatibility with
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4169
             * the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4170
             *
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4171
             * The PNG_IMAGE_BUFFER_SIZE macro is:
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4172
             *
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4173
             *    (PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)*height*(row_stride))
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4174
             *
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4175
             * And the component size is always 1 or 2, so make sure that the
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4176
             * number of *bytes* that the application is saying are available
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4177
             * does actually fit into a 32-bit number.
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4178
             *
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4179
             * NOTE: this will be changed in 1.7 because PNG_IMAGE_BUFFER_SIZE
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4180
             * will be changed to use png_alloc_size_t; bigger images can be
51304
66d9993dd4ad 8208353: Upgrade JDK 11 to libpng 1.6.35
prr
parents: 48280
diff changeset
  4181
             * accommodated on 64-bit systems.
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4182
             */
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4183
            if (image->height <=
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4184
                0xffffffffU/PNG_IMAGE_PIXEL_COMPONENT_SIZE(image->format)/check)
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4185
            {
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4186
               if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4187
                  (image->colormap_entries > 0 && colormap != NULL))
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4188
               {
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4189
                  int result;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4190
                  png_image_read_control display;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4191
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4192
                  memset(&display, 0, (sizeof display));
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4193
                  display.image = image;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4194
                  display.buffer = buffer;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4195
                  display.row_stride = row_stride;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4196
                  display.colormap = colormap;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4197
                  display.background = background;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4198
                  display.local_row = NULL;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4199
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4200
                  /* Choose the correct 'end' routine; for the color-map case
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4201
                   * all the setup has already been done.
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4202
                   */
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4203
                  if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4204
                     result =
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4205
                         png_safe_execute(image,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4206
                             png_image_read_colormap, &display) &&
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4207
                             png_safe_execute(image,
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4208
                             png_image_read_colormapped, &display);
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4209
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4210
                  else
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4211
                     result =
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4212
                        png_safe_execute(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4213
                            png_image_read_direct, &display);
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4214
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4215
                  png_image_free(image);
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4216
                  return result;
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4217
               }
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4218
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4219
               else
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4220
                  return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4221
                      "png_image_finish_read[color-map]: no color-map");
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4222
            }
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4223
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4224
            else
40436
94ae0ede53a5 8155690: Update libPNG library to the latest up-to-date
azvegint
parents: 35296
diff changeset
  4225
               return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4226
                   "png_image_finish_read: image too large");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4227
         }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4228
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4229
         else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4230
            return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4231
                "png_image_finish_read: invalid argument");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4232
      }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4233
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4234
      else
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4235
         return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4236
             "png_image_finish_read: row_stride too large");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4237
   }
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4238
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4239
   else if (image != NULL)
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4240
      return png_image_error(image,
43321
2b8d397c03a4 8167228: Update to libpng 1.6.28
prr
parents: 40436
diff changeset
  4241
          "png_image_finish_read: damaged PNG_IMAGE_VERSION");
29913
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4242
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4243
   return 0;
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4244
}
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4245
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4246
#endif /* SIMPLIFIED_READ */
95258013e132 8069198: Upgrade image library
azvegint
parents: 25859
diff changeset
  4247
#endif /* READ */