symbian-qemu-0.9.1-12/libpng-1.2.32/pngread.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 
       
     2 /* pngread.c - read a PNG file
       
     3  *
       
     4  * Last changed in libpng 1.2.30 [August 15, 2008]
       
     5  * For conditions of distribution and use, see copyright notice in png.h
       
     6  * Copyright (c) 1998-2008 Glenn Randers-Pehrson
       
     7  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
       
     8  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
       
     9  *
       
    10  * This file contains routines that an application calls directly to
       
    11  * read a PNG file or stream.
       
    12  */
       
    13 
       
    14 #define PNG_INTERNAL
       
    15 #include "png.h"
       
    16 #if defined(PNG_READ_SUPPORTED)
       
    17 
       
    18 /* Create a PNG structure for reading, and allocate any memory needed. */
       
    19 png_structp PNGAPI
       
    20 png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr,
       
    21    png_error_ptr error_fn, png_error_ptr warn_fn)
       
    22 {
       
    23 
       
    24 #ifdef PNG_USER_MEM_SUPPORTED
       
    25    return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
       
    26       warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL));
       
    27 }
       
    28 
       
    29 /* Alternate create PNG structure for reading, and allocate any memory needed. */
       
    30 png_structp PNGAPI
       
    31 png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
       
    32    png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
       
    33    png_malloc_ptr malloc_fn, png_free_ptr free_fn)
       
    34 {
       
    35 #endif /* PNG_USER_MEM_SUPPORTED */
       
    36 
       
    37 #ifdef PNG_SETJMP_SUPPORTED
       
    38    volatile
       
    39 #endif
       
    40    png_structp png_ptr;
       
    41 
       
    42 #ifdef PNG_SETJMP_SUPPORTED
       
    43 #ifdef USE_FAR_KEYWORD
       
    44    jmp_buf jmpbuf;
       
    45 #endif
       
    46 #endif
       
    47 
       
    48    int i;
       
    49 
       
    50    png_debug(1, "in png_create_read_struct\n");
       
    51 #ifdef PNG_USER_MEM_SUPPORTED
       
    52    png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
       
    53       (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
       
    54 #else
       
    55    png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
       
    56 #endif
       
    57    if (png_ptr == NULL)
       
    58       return (NULL);
       
    59 
       
    60    /* added at libpng-1.2.6 */
       
    61 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
       
    62    png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
       
    63    png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
       
    64 #endif
       
    65 
       
    66 #ifdef PNG_SETJMP_SUPPORTED
       
    67 #ifdef USE_FAR_KEYWORD
       
    68    if (setjmp(jmpbuf))
       
    69 #else
       
    70    if (setjmp(png_ptr->jmpbuf))
       
    71 #endif
       
    72    {
       
    73       png_free(png_ptr, png_ptr->zbuf);
       
    74       png_ptr->zbuf = NULL;
       
    75 #ifdef PNG_USER_MEM_SUPPORTED
       
    76       png_destroy_struct_2((png_voidp)png_ptr,
       
    77          (png_free_ptr)free_fn, (png_voidp)mem_ptr);
       
    78 #else
       
    79       png_destroy_struct((png_voidp)png_ptr);
       
    80 #endif
       
    81       return (NULL);
       
    82    }
       
    83 #ifdef USE_FAR_KEYWORD
       
    84    png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
       
    85 #endif
       
    86 #endif
       
    87 
       
    88 #ifdef PNG_USER_MEM_SUPPORTED
       
    89    png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
       
    90 #endif
       
    91 
       
    92    png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
       
    93 
       
    94    if (user_png_ver)
       
    95    {
       
    96      i = 0;
       
    97      do
       
    98      {
       
    99        if (user_png_ver[i] != png_libpng_ver[i])
       
   100           png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
       
   101      } while (png_libpng_ver[i++]);
       
   102    }
       
   103    else
       
   104         png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
       
   105    
       
   106 
       
   107    if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
       
   108    {
       
   109      /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
       
   110       * we must recompile any applications that use any older library version.
       
   111       * For versions after libpng 1.0, we will be compatible, so we need
       
   112       * only check the first digit.
       
   113       */
       
   114      if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
       
   115          (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
       
   116          (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
       
   117      {
       
   118 #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
       
   119         char msg[80];
       
   120         if (user_png_ver)
       
   121         {
       
   122           png_snprintf(msg, 80,
       
   123              "Application was compiled with png.h from libpng-%.20s",
       
   124              user_png_ver);
       
   125           png_warning(png_ptr, msg);
       
   126         }
       
   127         png_snprintf(msg, 80,
       
   128              "Application  is  running with png.c from libpng-%.20s",
       
   129            png_libpng_ver);
       
   130         png_warning(png_ptr, msg);
       
   131 #endif
       
   132 #ifdef PNG_ERROR_NUMBERS_SUPPORTED
       
   133         png_ptr->flags = 0;
       
   134 #endif
       
   135         png_error(png_ptr,
       
   136            "Incompatible libpng version in application and library");
       
   137      }
       
   138    }
       
   139 
       
   140    /* initialize zbuf - compression buffer */
       
   141    png_ptr->zbuf_size = PNG_ZBUF_SIZE;
       
   142    png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
       
   143      (png_uint_32)png_ptr->zbuf_size);
       
   144    png_ptr->zstream.zalloc = png_zalloc;
       
   145    png_ptr->zstream.zfree = png_zfree;
       
   146    png_ptr->zstream.opaque = (voidpf)png_ptr;
       
   147 
       
   148    switch (inflateInit(&png_ptr->zstream))
       
   149    {
       
   150      case Z_OK: /* Do nothing */ break;
       
   151      case Z_MEM_ERROR:
       
   152      case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break;
       
   153      case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break;
       
   154      default: png_error(png_ptr, "Unknown zlib error");
       
   155    }
       
   156 
       
   157    png_ptr->zstream.next_out = png_ptr->zbuf;
       
   158    png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
       
   159 
       
   160    png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
       
   161 
       
   162 #ifdef PNG_SETJMP_SUPPORTED
       
   163 /* Applications that neglect to set up their own setjmp() and then encounter
       
   164    a png_error() will longjmp here.  Since the jmpbuf is then meaningless we
       
   165    abort instead of returning. */
       
   166 #ifdef USE_FAR_KEYWORD
       
   167    if (setjmp(jmpbuf))
       
   168       PNG_ABORT();
       
   169    png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
       
   170 #else
       
   171    if (setjmp(png_ptr->jmpbuf))
       
   172       PNG_ABORT();
       
   173 #endif
       
   174 #endif
       
   175    return (png_ptr);
       
   176 }
       
   177 
       
   178 #if defined(PNG_1_0_X) || defined(PNG_1_2_X)
       
   179 /* Initialize PNG structure for reading, and allocate any memory needed.
       
   180    This interface is deprecated in favour of the png_create_read_struct(),
       
   181    and it will disappear as of libpng-1.3.0. */
       
   182 #undef png_read_init
       
   183 void PNGAPI
       
   184 png_read_init(png_structp png_ptr)
       
   185 {
       
   186    /* We only come here via pre-1.0.7-compiled applications */
       
   187    png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0);
       
   188 }
       
   189 
       
   190 void PNGAPI
       
   191 png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,
       
   192    png_size_t png_struct_size, png_size_t png_info_size)
       
   193 {
       
   194    /* We only come here via pre-1.0.12-compiled applications */
       
   195    if (png_ptr == NULL) return;
       
   196 #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
       
   197    if (png_sizeof(png_struct) > png_struct_size ||
       
   198       png_sizeof(png_info) > png_info_size)
       
   199    {
       
   200       char msg[80];
       
   201       png_ptr->warning_fn = NULL;
       
   202       if (user_png_ver)
       
   203       {
       
   204         png_snprintf(msg, 80,
       
   205            "Application was compiled with png.h from libpng-%.20s",
       
   206            user_png_ver);
       
   207         png_warning(png_ptr, msg);
       
   208       }
       
   209       png_snprintf(msg, 80,
       
   210          "Application  is  running with png.c from libpng-%.20s",
       
   211          png_libpng_ver);
       
   212       png_warning(png_ptr, msg);
       
   213    }
       
   214 #endif
       
   215    if (png_sizeof(png_struct) > png_struct_size)
       
   216      {
       
   217        png_ptr->error_fn = NULL;
       
   218 #ifdef PNG_ERROR_NUMBERS_SUPPORTED
       
   219        png_ptr->flags = 0;
       
   220 #endif
       
   221        png_error(png_ptr,
       
   222        "The png struct allocated by the application for reading is too small.");
       
   223      }
       
   224    if (png_sizeof(png_info) > png_info_size)
       
   225      {
       
   226        png_ptr->error_fn = NULL;
       
   227 #ifdef PNG_ERROR_NUMBERS_SUPPORTED
       
   228        png_ptr->flags = 0;
       
   229 #endif
       
   230        png_error(png_ptr,
       
   231          "The info struct allocated by application for reading is too small.");
       
   232      }
       
   233    png_read_init_3(&png_ptr, user_png_ver, png_struct_size);
       
   234 }
       
   235 #endif /* PNG_1_0_X || PNG_1_2_X */
       
   236 
       
   237 void PNGAPI
       
   238 png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
       
   239    png_size_t png_struct_size)
       
   240 {
       
   241 #ifdef PNG_SETJMP_SUPPORTED
       
   242    jmp_buf tmp_jmp;  /* to save current jump buffer */
       
   243 #endif
       
   244 
       
   245    int i = 0;
       
   246 
       
   247    png_structp png_ptr=*ptr_ptr;
       
   248 
       
   249    if (png_ptr == NULL) return;
       
   250 
       
   251    do
       
   252    {
       
   253      if (user_png_ver[i] != png_libpng_ver[i])
       
   254      {
       
   255 #ifdef PNG_LEGACY_SUPPORTED
       
   256        png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
       
   257 #else
       
   258        png_ptr->warning_fn = NULL;
       
   259        png_warning(png_ptr,
       
   260         "Application uses deprecated png_read_init() and should be recompiled.");
       
   261        break;
       
   262 #endif
       
   263      }
       
   264    } while (png_libpng_ver[i++]);
       
   265 
       
   266    png_debug(1, "in png_read_init_3\n");
       
   267 
       
   268 #ifdef PNG_SETJMP_SUPPORTED
       
   269    /* save jump buffer and error functions */
       
   270    png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
       
   271 #endif
       
   272 
       
   273    if (png_sizeof(png_struct) > png_struct_size)
       
   274    {
       
   275       png_destroy_struct(png_ptr);
       
   276       *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
       
   277       png_ptr = *ptr_ptr;
       
   278    }
       
   279 
       
   280    /* reset all variables to 0 */
       
   281    png_memset(png_ptr, 0, png_sizeof(png_struct));
       
   282 
       
   283 #ifdef PNG_SETJMP_SUPPORTED
       
   284    /* restore jump buffer */
       
   285    png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
       
   286 #endif
       
   287 
       
   288    /* added at libpng-1.2.6 */
       
   289 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
       
   290    png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
       
   291    png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
       
   292 #endif
       
   293 
       
   294    /* initialize zbuf - compression buffer */
       
   295    png_ptr->zbuf_size = PNG_ZBUF_SIZE;
       
   296    png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
       
   297      (png_uint_32)png_ptr->zbuf_size);
       
   298    png_ptr->zstream.zalloc = png_zalloc;
       
   299    png_ptr->zstream.zfree = png_zfree;
       
   300    png_ptr->zstream.opaque = (voidpf)png_ptr;
       
   301 
       
   302    switch (inflateInit(&png_ptr->zstream))
       
   303    {
       
   304      case Z_OK: /* Do nothing */ break;
       
   305      case Z_MEM_ERROR:
       
   306      case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory"); break;
       
   307      case Z_VERSION_ERROR: png_error(png_ptr, "zlib version"); break;
       
   308      default: png_error(png_ptr, "Unknown zlib error");
       
   309    }
       
   310 
       
   311    png_ptr->zstream.next_out = png_ptr->zbuf;
       
   312    png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
       
   313 
       
   314    png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
       
   315 }
       
   316 
       
   317 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
       
   318 /* Read the information before the actual image data.  This has been
       
   319  * changed in v0.90 to allow reading a file that already has the magic
       
   320  * bytes read from the stream.  You can tell libpng how many bytes have
       
   321  * been read from the beginning of the stream (up to the maximum of 8)
       
   322  * via png_set_sig_bytes(), and we will only check the remaining bytes
       
   323  * here.  The application can then have access to the signature bytes we
       
   324  * read if it is determined that this isn't a valid PNG file.
       
   325  */
       
   326 void PNGAPI
       
   327 png_read_info(png_structp png_ptr, png_infop info_ptr)
       
   328 {
       
   329    if (png_ptr == NULL || info_ptr == NULL) return;
       
   330    png_debug(1, "in png_read_info\n");
       
   331    /* If we haven't checked all of the PNG signature bytes, do so now. */
       
   332    if (png_ptr->sig_bytes < 8)
       
   333    {
       
   334       png_size_t num_checked = png_ptr->sig_bytes,
       
   335                  num_to_check = 8 - num_checked;
       
   336 
       
   337       png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);
       
   338       png_ptr->sig_bytes = 8;
       
   339 
       
   340       if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
       
   341       {
       
   342          if (num_checked < 4 &&
       
   343              png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
       
   344             png_error(png_ptr, "Not a PNG file");
       
   345          else
       
   346             png_error(png_ptr, "PNG file corrupted by ASCII conversion");
       
   347       }
       
   348       if (num_checked < 3)
       
   349          png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
       
   350    }
       
   351 
       
   352    for (;;)
       
   353    {
       
   354 #ifdef PNG_USE_LOCAL_ARRAYS
       
   355       PNG_CONST PNG_IHDR;
       
   356       PNG_CONST PNG_IDAT;
       
   357       PNG_CONST PNG_IEND;
       
   358       PNG_CONST PNG_PLTE;
       
   359 #if defined(PNG_READ_bKGD_SUPPORTED)
       
   360       PNG_CONST PNG_bKGD;
       
   361 #endif
       
   362 #if defined(PNG_READ_cHRM_SUPPORTED)
       
   363       PNG_CONST PNG_cHRM;
       
   364 #endif
       
   365 #if defined(PNG_READ_gAMA_SUPPORTED)
       
   366       PNG_CONST PNG_gAMA;
       
   367 #endif
       
   368 #if defined(PNG_READ_hIST_SUPPORTED)
       
   369       PNG_CONST PNG_hIST;
       
   370 #endif
       
   371 #if defined(PNG_READ_iCCP_SUPPORTED)
       
   372       PNG_CONST PNG_iCCP;
       
   373 #endif
       
   374 #if defined(PNG_READ_iTXt_SUPPORTED)
       
   375       PNG_CONST PNG_iTXt;
       
   376 #endif
       
   377 #if defined(PNG_READ_oFFs_SUPPORTED)
       
   378       PNG_CONST PNG_oFFs;
       
   379 #endif
       
   380 #if defined(PNG_READ_pCAL_SUPPORTED)
       
   381       PNG_CONST PNG_pCAL;
       
   382 #endif
       
   383 #if defined(PNG_READ_pHYs_SUPPORTED)
       
   384       PNG_CONST PNG_pHYs;
       
   385 #endif
       
   386 #if defined(PNG_READ_sBIT_SUPPORTED)
       
   387       PNG_CONST PNG_sBIT;
       
   388 #endif
       
   389 #if defined(PNG_READ_sCAL_SUPPORTED)
       
   390       PNG_CONST PNG_sCAL;
       
   391 #endif
       
   392 #if defined(PNG_READ_sPLT_SUPPORTED)
       
   393       PNG_CONST PNG_sPLT;
       
   394 #endif
       
   395 #if defined(PNG_READ_sRGB_SUPPORTED)
       
   396       PNG_CONST PNG_sRGB;
       
   397 #endif
       
   398 #if defined(PNG_READ_tEXt_SUPPORTED)
       
   399       PNG_CONST PNG_tEXt;
       
   400 #endif
       
   401 #if defined(PNG_READ_tIME_SUPPORTED)
       
   402       PNG_CONST PNG_tIME;
       
   403 #endif
       
   404 #if defined(PNG_READ_tRNS_SUPPORTED)
       
   405       PNG_CONST PNG_tRNS;
       
   406 #endif
       
   407 #if defined(PNG_READ_zTXt_SUPPORTED)
       
   408       PNG_CONST PNG_zTXt;
       
   409 #endif
       
   410 #endif /* PNG_USE_LOCAL_ARRAYS */
       
   411       png_uint_32 length = png_read_chunk_header(png_ptr);
       
   412       PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
       
   413 
       
   414       /* This should be a binary subdivision search or a hash for
       
   415        * matching the chunk name rather than a linear search.
       
   416        */
       
   417       if (!png_memcmp(chunk_name, png_IDAT, 4))
       
   418         if (png_ptr->mode & PNG_AFTER_IDAT)
       
   419           png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
       
   420 
       
   421       if (!png_memcmp(chunk_name, png_IHDR, 4))
       
   422          png_handle_IHDR(png_ptr, info_ptr, length);
       
   423       else if (!png_memcmp(chunk_name, png_IEND, 4))
       
   424          png_handle_IEND(png_ptr, info_ptr, length);
       
   425 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
       
   426       else if (png_handle_as_unknown(png_ptr, chunk_name))
       
   427       {
       
   428          if (!png_memcmp(chunk_name, png_IDAT, 4))
       
   429             png_ptr->mode |= PNG_HAVE_IDAT;
       
   430          png_handle_unknown(png_ptr, info_ptr, length);
       
   431          if (!png_memcmp(chunk_name, png_PLTE, 4))
       
   432             png_ptr->mode |= PNG_HAVE_PLTE;
       
   433          else if (!png_memcmp(chunk_name, png_IDAT, 4))
       
   434          {
       
   435             if (!(png_ptr->mode & PNG_HAVE_IHDR))
       
   436                png_error(png_ptr, "Missing IHDR before IDAT");
       
   437             else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
       
   438                      !(png_ptr->mode & PNG_HAVE_PLTE))
       
   439                png_error(png_ptr, "Missing PLTE before IDAT");
       
   440             break;
       
   441          }
       
   442       }
       
   443 #endif
       
   444       else if (!png_memcmp(chunk_name, png_PLTE, 4))
       
   445          png_handle_PLTE(png_ptr, info_ptr, length);
       
   446       else if (!png_memcmp(chunk_name, png_IDAT, 4))
       
   447       {
       
   448          if (!(png_ptr->mode & PNG_HAVE_IHDR))
       
   449             png_error(png_ptr, "Missing IHDR before IDAT");
       
   450          else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
       
   451                   !(png_ptr->mode & PNG_HAVE_PLTE))
       
   452             png_error(png_ptr, "Missing PLTE before IDAT");
       
   453 
       
   454          png_ptr->idat_size = length;
       
   455          png_ptr->mode |= PNG_HAVE_IDAT;
       
   456          break;
       
   457       }
       
   458 #if defined(PNG_READ_bKGD_SUPPORTED)
       
   459       else if (!png_memcmp(chunk_name, png_bKGD, 4))
       
   460          png_handle_bKGD(png_ptr, info_ptr, length);
       
   461 #endif
       
   462 #if defined(PNG_READ_cHRM_SUPPORTED)
       
   463       else if (!png_memcmp(chunk_name, png_cHRM, 4))
       
   464          png_handle_cHRM(png_ptr, info_ptr, length);
       
   465 #endif
       
   466 #if defined(PNG_READ_gAMA_SUPPORTED)
       
   467       else if (!png_memcmp(chunk_name, png_gAMA, 4))
       
   468          png_handle_gAMA(png_ptr, info_ptr, length);
       
   469 #endif
       
   470 #if defined(PNG_READ_hIST_SUPPORTED)
       
   471       else if (!png_memcmp(chunk_name, png_hIST, 4))
       
   472          png_handle_hIST(png_ptr, info_ptr, length);
       
   473 #endif
       
   474 #if defined(PNG_READ_oFFs_SUPPORTED)
       
   475       else if (!png_memcmp(chunk_name, png_oFFs, 4))
       
   476          png_handle_oFFs(png_ptr, info_ptr, length);
       
   477 #endif
       
   478 #if defined(PNG_READ_pCAL_SUPPORTED)
       
   479       else if (!png_memcmp(chunk_name, png_pCAL, 4))
       
   480          png_handle_pCAL(png_ptr, info_ptr, length);
       
   481 #endif
       
   482 #if defined(PNG_READ_sCAL_SUPPORTED)
       
   483       else if (!png_memcmp(chunk_name, png_sCAL, 4))
       
   484          png_handle_sCAL(png_ptr, info_ptr, length);
       
   485 #endif
       
   486 #if defined(PNG_READ_pHYs_SUPPORTED)
       
   487       else if (!png_memcmp(chunk_name, png_pHYs, 4))
       
   488          png_handle_pHYs(png_ptr, info_ptr, length);
       
   489 #endif
       
   490 #if defined(PNG_READ_sBIT_SUPPORTED)
       
   491       else if (!png_memcmp(chunk_name, png_sBIT, 4))
       
   492          png_handle_sBIT(png_ptr, info_ptr, length);
       
   493 #endif
       
   494 #if defined(PNG_READ_sRGB_SUPPORTED)
       
   495       else if (!png_memcmp(chunk_name, png_sRGB, 4))
       
   496          png_handle_sRGB(png_ptr, info_ptr, length);
       
   497 #endif
       
   498 #if defined(PNG_READ_iCCP_SUPPORTED)
       
   499       else if (!png_memcmp(chunk_name, png_iCCP, 4))
       
   500          png_handle_iCCP(png_ptr, info_ptr, length);
       
   501 #endif
       
   502 #if defined(PNG_READ_sPLT_SUPPORTED)
       
   503       else if (!png_memcmp(chunk_name, png_sPLT, 4))
       
   504          png_handle_sPLT(png_ptr, info_ptr, length);
       
   505 #endif
       
   506 #if defined(PNG_READ_tEXt_SUPPORTED)
       
   507       else if (!png_memcmp(chunk_name, png_tEXt, 4))
       
   508          png_handle_tEXt(png_ptr, info_ptr, length);
       
   509 #endif
       
   510 #if defined(PNG_READ_tIME_SUPPORTED)
       
   511       else if (!png_memcmp(chunk_name, png_tIME, 4))
       
   512          png_handle_tIME(png_ptr, info_ptr, length);
       
   513 #endif
       
   514 #if defined(PNG_READ_tRNS_SUPPORTED)
       
   515       else if (!png_memcmp(chunk_name, png_tRNS, 4))
       
   516          png_handle_tRNS(png_ptr, info_ptr, length);
       
   517 #endif
       
   518 #if defined(PNG_READ_zTXt_SUPPORTED)
       
   519       else if (!png_memcmp(chunk_name, png_zTXt, 4))
       
   520          png_handle_zTXt(png_ptr, info_ptr, length);
       
   521 #endif
       
   522 #if defined(PNG_READ_iTXt_SUPPORTED)
       
   523       else if (!png_memcmp(chunk_name, png_iTXt, 4))
       
   524          png_handle_iTXt(png_ptr, info_ptr, length);
       
   525 #endif
       
   526       else
       
   527          png_handle_unknown(png_ptr, info_ptr, length);
       
   528    }
       
   529 }
       
   530 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
       
   531 
       
   532 /* optional call to update the users info_ptr structure */
       
   533 void PNGAPI
       
   534 png_read_update_info(png_structp png_ptr, png_infop info_ptr)
       
   535 {
       
   536    png_debug(1, "in png_read_update_info\n");
       
   537    if (png_ptr == NULL) return;
       
   538    if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
       
   539       png_read_start_row(png_ptr);
       
   540    else
       
   541       png_warning(png_ptr,
       
   542       "Ignoring extra png_read_update_info() call; row buffer not reallocated");
       
   543    png_read_transform_info(png_ptr, info_ptr);
       
   544 }
       
   545 
       
   546 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
       
   547 /* Initialize palette, background, etc, after transformations
       
   548  * are set, but before any reading takes place.  This allows
       
   549  * the user to obtain a gamma-corrected palette, for example.
       
   550  * If the user doesn't call this, we will do it ourselves.
       
   551  */
       
   552 void PNGAPI
       
   553 png_start_read_image(png_structp png_ptr)
       
   554 {
       
   555    png_debug(1, "in png_start_read_image\n");
       
   556    if (png_ptr == NULL) return;
       
   557    if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
       
   558       png_read_start_row(png_ptr);
       
   559 }
       
   560 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
       
   561 
       
   562 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
       
   563 void PNGAPI
       
   564 png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
       
   565 {
       
   566 #ifdef PNG_USE_LOCAL_ARRAYS
       
   567    PNG_CONST PNG_IDAT;
       
   568    PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
       
   569       0xff};
       
   570    PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
       
   571 #endif
       
   572    int ret;
       
   573    if (png_ptr == NULL) return;
       
   574    png_debug2(1, "in png_read_row (row %lu, pass %d)\n",
       
   575       png_ptr->row_number, png_ptr->pass);
       
   576    if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
       
   577       png_read_start_row(png_ptr);
       
   578    if (png_ptr->row_number == 0 && png_ptr->pass == 0)
       
   579    {
       
   580    /* check for transforms that have been set but were defined out */
       
   581 #if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
       
   582    if (png_ptr->transformations & PNG_INVERT_MONO)
       
   583       png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined.");
       
   584 #endif
       
   585 #if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)
       
   586    if (png_ptr->transformations & PNG_FILLER)
       
   587       png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined.");
       
   588 #endif
       
   589 #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && !defined(PNG_READ_PACKSWAP_SUPPORTED)
       
   590    if (png_ptr->transformations & PNG_PACKSWAP)
       
   591       png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined.");
       
   592 #endif
       
   593 #if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)
       
   594    if (png_ptr->transformations & PNG_PACK)
       
   595       png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined.");
       
   596 #endif
       
   597 #if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)
       
   598    if (png_ptr->transformations & PNG_SHIFT)
       
   599       png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined.");
       
   600 #endif
       
   601 #if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)
       
   602    if (png_ptr->transformations & PNG_BGR)
       
   603       png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined.");
       
   604 #endif
       
   605 #if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)
       
   606    if (png_ptr->transformations & PNG_SWAP_BYTES)
       
   607       png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined.");
       
   608 #endif
       
   609    }
       
   610 
       
   611 #if defined(PNG_READ_INTERLACING_SUPPORTED)
       
   612    /* if interlaced and we do not need a new row, combine row and return */
       
   613    if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
       
   614    {
       
   615       switch (png_ptr->pass)
       
   616       {
       
   617          case 0:
       
   618             if (png_ptr->row_number & 0x07)
       
   619             {
       
   620                if (dsp_row != NULL)
       
   621                   png_combine_row(png_ptr, dsp_row,
       
   622                      png_pass_dsp_mask[png_ptr->pass]);
       
   623                png_read_finish_row(png_ptr);
       
   624                return;
       
   625             }
       
   626             break;
       
   627          case 1:
       
   628             if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
       
   629             {
       
   630                if (dsp_row != NULL)
       
   631                   png_combine_row(png_ptr, dsp_row,
       
   632                      png_pass_dsp_mask[png_ptr->pass]);
       
   633                png_read_finish_row(png_ptr);
       
   634                return;
       
   635             }
       
   636             break;
       
   637          case 2:
       
   638             if ((png_ptr->row_number & 0x07) != 4)
       
   639             {
       
   640                if (dsp_row != NULL && (png_ptr->row_number & 4))
       
   641                   png_combine_row(png_ptr, dsp_row,
       
   642                      png_pass_dsp_mask[png_ptr->pass]);
       
   643                png_read_finish_row(png_ptr);
       
   644                return;
       
   645             }
       
   646             break;
       
   647          case 3:
       
   648             if ((png_ptr->row_number & 3) || png_ptr->width < 3)
       
   649             {
       
   650                if (dsp_row != NULL)
       
   651                   png_combine_row(png_ptr, dsp_row,
       
   652                      png_pass_dsp_mask[png_ptr->pass]);
       
   653                png_read_finish_row(png_ptr);
       
   654                return;
       
   655             }
       
   656             break;
       
   657          case 4:
       
   658             if ((png_ptr->row_number & 3) != 2)
       
   659             {
       
   660                if (dsp_row != NULL && (png_ptr->row_number & 2))
       
   661                   png_combine_row(png_ptr, dsp_row,
       
   662                      png_pass_dsp_mask[png_ptr->pass]);
       
   663                png_read_finish_row(png_ptr);
       
   664                return;
       
   665             }
       
   666             break;
       
   667          case 5:
       
   668             if ((png_ptr->row_number & 1) || png_ptr->width < 2)
       
   669             {
       
   670                if (dsp_row != NULL)
       
   671                   png_combine_row(png_ptr, dsp_row,
       
   672                      png_pass_dsp_mask[png_ptr->pass]);
       
   673                png_read_finish_row(png_ptr);
       
   674                return;
       
   675             }
       
   676             break;
       
   677          case 6:
       
   678             if (!(png_ptr->row_number & 1))
       
   679             {
       
   680                png_read_finish_row(png_ptr);
       
   681                return;
       
   682             }
       
   683             break;
       
   684       }
       
   685    }
       
   686 #endif
       
   687 
       
   688    if (!(png_ptr->mode & PNG_HAVE_IDAT))
       
   689       png_error(png_ptr, "Invalid attempt to read row data");
       
   690 
       
   691    png_ptr->zstream.next_out = png_ptr->row_buf;
       
   692    png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
       
   693    do
       
   694    {
       
   695       if (!(png_ptr->zstream.avail_in))
       
   696       {
       
   697          while (!png_ptr->idat_size)
       
   698          {
       
   699             png_crc_finish(png_ptr, 0);
       
   700 
       
   701             png_ptr->idat_size = png_read_chunk_header(png_ptr);
       
   702             if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
       
   703                png_error(png_ptr, "Not enough image data");
       
   704          }
       
   705          png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
       
   706          png_ptr->zstream.next_in = png_ptr->zbuf;
       
   707          if (png_ptr->zbuf_size > png_ptr->idat_size)
       
   708             png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;
       
   709          png_crc_read(png_ptr, png_ptr->zbuf,
       
   710             (png_size_t)png_ptr->zstream.avail_in);
       
   711          png_ptr->idat_size -= png_ptr->zstream.avail_in;
       
   712       }
       
   713       ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
       
   714       if (ret == Z_STREAM_END)
       
   715       {
       
   716          if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in ||
       
   717             png_ptr->idat_size)
       
   718             png_error(png_ptr, "Extra compressed data");
       
   719          png_ptr->mode |= PNG_AFTER_IDAT;
       
   720          png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
       
   721          break;
       
   722       }
       
   723       if (ret != Z_OK)
       
   724          png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
       
   725                    "Decompression error");
       
   726 
       
   727    } while (png_ptr->zstream.avail_out);
       
   728 
       
   729    png_ptr->row_info.color_type = png_ptr->color_type;
       
   730    png_ptr->row_info.width = png_ptr->iwidth;
       
   731    png_ptr->row_info.channels = png_ptr->channels;
       
   732    png_ptr->row_info.bit_depth = png_ptr->bit_depth;
       
   733    png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
       
   734    png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
       
   735        png_ptr->row_info.width);
       
   736 
       
   737    if (png_ptr->row_buf[0])
       
   738    png_read_filter_row(png_ptr, &(png_ptr->row_info),
       
   739       png_ptr->row_buf + 1, png_ptr->prev_row + 1,
       
   740       (int)(png_ptr->row_buf[0]));
       
   741 
       
   742    png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
       
   743       png_ptr->rowbytes + 1);
       
   744 
       
   745 #if defined(PNG_MNG_FEATURES_SUPPORTED)
       
   746    if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
       
   747       (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
       
   748    {
       
   749       /* Intrapixel differencing */
       
   750       png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
       
   751    }
       
   752 #endif
       
   753 
       
   754 
       
   755    if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
       
   756       png_do_read_transformations(png_ptr);
       
   757 
       
   758 #if defined(PNG_READ_INTERLACING_SUPPORTED)
       
   759    /* blow up interlaced rows to full size */
       
   760    if (png_ptr->interlaced &&
       
   761       (png_ptr->transformations & PNG_INTERLACE))
       
   762    {
       
   763       if (png_ptr->pass < 6)
       
   764 /*       old interface (pre-1.0.9):
       
   765          png_do_read_interlace(&(png_ptr->row_info),
       
   766             png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
       
   767  */
       
   768          png_do_read_interlace(png_ptr);
       
   769 
       
   770       if (dsp_row != NULL)
       
   771          png_combine_row(png_ptr, dsp_row,
       
   772             png_pass_dsp_mask[png_ptr->pass]);
       
   773       if (row != NULL)
       
   774          png_combine_row(png_ptr, row,
       
   775             png_pass_mask[png_ptr->pass]);
       
   776    }
       
   777    else
       
   778 #endif
       
   779    {
       
   780       if (row != NULL)
       
   781          png_combine_row(png_ptr, row, 0xff);
       
   782       if (dsp_row != NULL)
       
   783          png_combine_row(png_ptr, dsp_row, 0xff);
       
   784    }
       
   785    png_read_finish_row(png_ptr);
       
   786 
       
   787    if (png_ptr->read_row_fn != NULL)
       
   788       (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
       
   789 }
       
   790 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
       
   791 
       
   792 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
       
   793 /* Read one or more rows of image data.  If the image is interlaced,
       
   794  * and png_set_interlace_handling() has been called, the rows need to
       
   795  * contain the contents of the rows from the previous pass.  If the
       
   796  * image has alpha or transparency, and png_handle_alpha()[*] has been
       
   797  * called, the rows contents must be initialized to the contents of the
       
   798  * screen.
       
   799  *
       
   800  * "row" holds the actual image, and pixels are placed in it
       
   801  * as they arrive.  If the image is displayed after each pass, it will
       
   802  * appear to "sparkle" in.  "display_row" can be used to display a
       
   803  * "chunky" progressive image, with finer detail added as it becomes
       
   804  * available.  If you do not want this "chunky" display, you may pass
       
   805  * NULL for display_row.  If you do not want the sparkle display, and
       
   806  * you have not called png_handle_alpha(), you may pass NULL for rows.
       
   807  * If you have called png_handle_alpha(), and the image has either an
       
   808  * alpha channel or a transparency chunk, you must provide a buffer for
       
   809  * rows.  In this case, you do not have to provide a display_row buffer
       
   810  * also, but you may.  If the image is not interlaced, or if you have
       
   811  * not called png_set_interlace_handling(), the display_row buffer will
       
   812  * be ignored, so pass NULL to it.
       
   813  *
       
   814  * [*] png_handle_alpha() does not exist yet, as of this version of libpng
       
   815  */
       
   816 
       
   817 void PNGAPI
       
   818 png_read_rows(png_structp png_ptr, png_bytepp row,
       
   819    png_bytepp display_row, png_uint_32 num_rows)
       
   820 {
       
   821    png_uint_32 i;
       
   822    png_bytepp rp;
       
   823    png_bytepp dp;
       
   824 
       
   825    png_debug(1, "in png_read_rows\n");
       
   826    if (png_ptr == NULL) return;
       
   827    rp = row;
       
   828    dp = display_row;
       
   829    if (rp != NULL && dp != NULL)
       
   830       for (i = 0; i < num_rows; i++)
       
   831       {
       
   832          png_bytep rptr = *rp++;
       
   833          png_bytep dptr = *dp++;
       
   834 
       
   835          png_read_row(png_ptr, rptr, dptr);
       
   836       }
       
   837    else if (rp != NULL)
       
   838       for (i = 0; i < num_rows; i++)
       
   839       {
       
   840          png_bytep rptr = *rp;
       
   841          png_read_row(png_ptr, rptr, png_bytep_NULL);
       
   842          rp++;
       
   843       }
       
   844    else if (dp != NULL)
       
   845       for (i = 0; i < num_rows; i++)
       
   846       {
       
   847          png_bytep dptr = *dp;
       
   848          png_read_row(png_ptr, png_bytep_NULL, dptr);
       
   849          dp++;
       
   850       }
       
   851 }
       
   852 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
       
   853 
       
   854 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
       
   855 /* Read the entire image.  If the image has an alpha channel or a tRNS
       
   856  * chunk, and you have called png_handle_alpha()[*], you will need to
       
   857  * initialize the image to the current image that PNG will be overlaying.
       
   858  * We set the num_rows again here, in case it was incorrectly set in
       
   859  * png_read_start_row() by a call to png_read_update_info() or
       
   860  * png_start_read_image() if png_set_interlace_handling() wasn't called
       
   861  * prior to either of these functions like it should have been.  You can
       
   862  * only call this function once.  If you desire to have an image for
       
   863  * each pass of a interlaced image, use png_read_rows() instead.
       
   864  *
       
   865  * [*] png_handle_alpha() does not exist yet, as of this version of libpng
       
   866  */
       
   867 void PNGAPI
       
   868 png_read_image(png_structp png_ptr, png_bytepp image)
       
   869 {
       
   870    png_uint_32 i, image_height;
       
   871    int pass, j;
       
   872    png_bytepp rp;
       
   873 
       
   874    png_debug(1, "in png_read_image\n");
       
   875    if (png_ptr == NULL) return;
       
   876 
       
   877 #ifdef PNG_READ_INTERLACING_SUPPORTED
       
   878    pass = png_set_interlace_handling(png_ptr);
       
   879 #else
       
   880    if (png_ptr->interlaced)
       
   881       png_error(png_ptr,
       
   882         "Cannot read interlaced image -- interlace handler disabled.");
       
   883    pass = 1;
       
   884 #endif
       
   885 
       
   886 
       
   887    image_height=png_ptr->height;
       
   888    png_ptr->num_rows = image_height; /* Make sure this is set correctly */
       
   889 
       
   890    for (j = 0; j < pass; j++)
       
   891    {
       
   892       rp = image;
       
   893       for (i = 0; i < image_height; i++)
       
   894       {
       
   895          png_read_row(png_ptr, *rp, png_bytep_NULL);
       
   896          rp++;
       
   897       }
       
   898    }
       
   899 }
       
   900 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
       
   901 
       
   902 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
       
   903 /* Read the end of the PNG file.  Will not read past the end of the
       
   904  * file, will verify the end is accurate, and will read any comments
       
   905  * or time information at the end of the file, if info is not NULL.
       
   906  */
       
   907 void PNGAPI
       
   908 png_read_end(png_structp png_ptr, png_infop info_ptr)
       
   909 {
       
   910    png_debug(1, "in png_read_end\n");
       
   911    if (png_ptr == NULL) return;
       
   912    png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
       
   913 
       
   914    do
       
   915    {
       
   916 #ifdef PNG_USE_LOCAL_ARRAYS
       
   917       PNG_CONST PNG_IHDR;
       
   918       PNG_CONST PNG_IDAT;
       
   919       PNG_CONST PNG_IEND;
       
   920       PNG_CONST PNG_PLTE;
       
   921 #if defined(PNG_READ_bKGD_SUPPORTED)
       
   922       PNG_CONST PNG_bKGD;
       
   923 #endif
       
   924 #if defined(PNG_READ_cHRM_SUPPORTED)
       
   925       PNG_CONST PNG_cHRM;
       
   926 #endif
       
   927 #if defined(PNG_READ_gAMA_SUPPORTED)
       
   928       PNG_CONST PNG_gAMA;
       
   929 #endif
       
   930 #if defined(PNG_READ_hIST_SUPPORTED)
       
   931       PNG_CONST PNG_hIST;
       
   932 #endif
       
   933 #if defined(PNG_READ_iCCP_SUPPORTED)
       
   934       PNG_CONST PNG_iCCP;
       
   935 #endif
       
   936 #if defined(PNG_READ_iTXt_SUPPORTED)
       
   937       PNG_CONST PNG_iTXt;
       
   938 #endif
       
   939 #if defined(PNG_READ_oFFs_SUPPORTED)
       
   940       PNG_CONST PNG_oFFs;
       
   941 #endif
       
   942 #if defined(PNG_READ_pCAL_SUPPORTED)
       
   943       PNG_CONST PNG_pCAL;
       
   944 #endif
       
   945 #if defined(PNG_READ_pHYs_SUPPORTED)
       
   946       PNG_CONST PNG_pHYs;
       
   947 #endif
       
   948 #if defined(PNG_READ_sBIT_SUPPORTED)
       
   949       PNG_CONST PNG_sBIT;
       
   950 #endif
       
   951 #if defined(PNG_READ_sCAL_SUPPORTED)
       
   952       PNG_CONST PNG_sCAL;
       
   953 #endif
       
   954 #if defined(PNG_READ_sPLT_SUPPORTED)
       
   955       PNG_CONST PNG_sPLT;
       
   956 #endif
       
   957 #if defined(PNG_READ_sRGB_SUPPORTED)
       
   958       PNG_CONST PNG_sRGB;
       
   959 #endif
       
   960 #if defined(PNG_READ_tEXt_SUPPORTED)
       
   961       PNG_CONST PNG_tEXt;
       
   962 #endif
       
   963 #if defined(PNG_READ_tIME_SUPPORTED)
       
   964       PNG_CONST PNG_tIME;
       
   965 #endif
       
   966 #if defined(PNG_READ_tRNS_SUPPORTED)
       
   967       PNG_CONST PNG_tRNS;
       
   968 #endif
       
   969 #if defined(PNG_READ_zTXt_SUPPORTED)
       
   970       PNG_CONST PNG_zTXt;
       
   971 #endif
       
   972 #endif /* PNG_USE_LOCAL_ARRAYS */
       
   973       png_uint_32 length = png_read_chunk_header(png_ptr);
       
   974       PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
       
   975 
       
   976       if (!png_memcmp(chunk_name, png_IHDR, 4))
       
   977          png_handle_IHDR(png_ptr, info_ptr, length);
       
   978       else if (!png_memcmp(chunk_name, png_IEND, 4))
       
   979          png_handle_IEND(png_ptr, info_ptr, length);
       
   980 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
       
   981       else if (png_handle_as_unknown(png_ptr, chunk_name))
       
   982       {
       
   983          if (!png_memcmp(chunk_name, png_IDAT, 4))
       
   984          {
       
   985             if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
       
   986                png_error(png_ptr, "Too many IDAT's found");
       
   987          }
       
   988          png_handle_unknown(png_ptr, info_ptr, length);
       
   989          if (!png_memcmp(chunk_name, png_PLTE, 4))
       
   990             png_ptr->mode |= PNG_HAVE_PLTE;
       
   991       }
       
   992 #endif
       
   993       else if (!png_memcmp(chunk_name, png_IDAT, 4))
       
   994       {
       
   995          /* Zero length IDATs are legal after the last IDAT has been
       
   996           * read, but not after other chunks have been read.
       
   997           */
       
   998          if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
       
   999             png_error(png_ptr, "Too many IDAT's found");
       
  1000          png_crc_finish(png_ptr, length);
       
  1001       }
       
  1002       else if (!png_memcmp(chunk_name, png_PLTE, 4))
       
  1003          png_handle_PLTE(png_ptr, info_ptr, length);
       
  1004 #if defined(PNG_READ_bKGD_SUPPORTED)
       
  1005       else if (!png_memcmp(chunk_name, png_bKGD, 4))
       
  1006          png_handle_bKGD(png_ptr, info_ptr, length);
       
  1007 #endif
       
  1008 #if defined(PNG_READ_cHRM_SUPPORTED)
       
  1009       else if (!png_memcmp(chunk_name, png_cHRM, 4))
       
  1010          png_handle_cHRM(png_ptr, info_ptr, length);
       
  1011 #endif
       
  1012 #if defined(PNG_READ_gAMA_SUPPORTED)
       
  1013       else if (!png_memcmp(chunk_name, png_gAMA, 4))
       
  1014          png_handle_gAMA(png_ptr, info_ptr, length);
       
  1015 #endif
       
  1016 #if defined(PNG_READ_hIST_SUPPORTED)
       
  1017       else if (!png_memcmp(chunk_name, png_hIST, 4))
       
  1018          png_handle_hIST(png_ptr, info_ptr, length);
       
  1019 #endif
       
  1020 #if defined(PNG_READ_oFFs_SUPPORTED)
       
  1021       else if (!png_memcmp(chunk_name, png_oFFs, 4))
       
  1022          png_handle_oFFs(png_ptr, info_ptr, length);
       
  1023 #endif
       
  1024 #if defined(PNG_READ_pCAL_SUPPORTED)
       
  1025       else if (!png_memcmp(chunk_name, png_pCAL, 4))
       
  1026          png_handle_pCAL(png_ptr, info_ptr, length);
       
  1027 #endif
       
  1028 #if defined(PNG_READ_sCAL_SUPPORTED)
       
  1029       else if (!png_memcmp(chunk_name, png_sCAL, 4))
       
  1030          png_handle_sCAL(png_ptr, info_ptr, length);
       
  1031 #endif
       
  1032 #if defined(PNG_READ_pHYs_SUPPORTED)
       
  1033       else if (!png_memcmp(chunk_name, png_pHYs, 4))
       
  1034          png_handle_pHYs(png_ptr, info_ptr, length);
       
  1035 #endif
       
  1036 #if defined(PNG_READ_sBIT_SUPPORTED)
       
  1037       else if (!png_memcmp(chunk_name, png_sBIT, 4))
       
  1038          png_handle_sBIT(png_ptr, info_ptr, length);
       
  1039 #endif
       
  1040 #if defined(PNG_READ_sRGB_SUPPORTED)
       
  1041       else if (!png_memcmp(chunk_name, png_sRGB, 4))
       
  1042          png_handle_sRGB(png_ptr, info_ptr, length);
       
  1043 #endif
       
  1044 #if defined(PNG_READ_iCCP_SUPPORTED)
       
  1045       else if (!png_memcmp(chunk_name, png_iCCP, 4))
       
  1046          png_handle_iCCP(png_ptr, info_ptr, length);
       
  1047 #endif
       
  1048 #if defined(PNG_READ_sPLT_SUPPORTED)
       
  1049       else if (!png_memcmp(chunk_name, png_sPLT, 4))
       
  1050          png_handle_sPLT(png_ptr, info_ptr, length);
       
  1051 #endif
       
  1052 #if defined(PNG_READ_tEXt_SUPPORTED)
       
  1053       else if (!png_memcmp(chunk_name, png_tEXt, 4))
       
  1054          png_handle_tEXt(png_ptr, info_ptr, length);
       
  1055 #endif
       
  1056 #if defined(PNG_READ_tIME_SUPPORTED)
       
  1057       else if (!png_memcmp(chunk_name, png_tIME, 4))
       
  1058          png_handle_tIME(png_ptr, info_ptr, length);
       
  1059 #endif
       
  1060 #if defined(PNG_READ_tRNS_SUPPORTED)
       
  1061       else if (!png_memcmp(chunk_name, png_tRNS, 4))
       
  1062          png_handle_tRNS(png_ptr, info_ptr, length);
       
  1063 #endif
       
  1064 #if defined(PNG_READ_zTXt_SUPPORTED)
       
  1065       else if (!png_memcmp(chunk_name, png_zTXt, 4))
       
  1066          png_handle_zTXt(png_ptr, info_ptr, length);
       
  1067 #endif
       
  1068 #if defined(PNG_READ_iTXt_SUPPORTED)
       
  1069       else if (!png_memcmp(chunk_name, png_iTXt, 4))
       
  1070          png_handle_iTXt(png_ptr, info_ptr, length);
       
  1071 #endif
       
  1072       else
       
  1073          png_handle_unknown(png_ptr, info_ptr, length);
       
  1074    } while (!(png_ptr->mode & PNG_HAVE_IEND));
       
  1075 }
       
  1076 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
       
  1077 
       
  1078 /* free all memory used by the read */
       
  1079 void PNGAPI
       
  1080 png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
       
  1081    png_infopp end_info_ptr_ptr)
       
  1082 {
       
  1083    png_structp png_ptr = NULL;
       
  1084    png_infop info_ptr = NULL, end_info_ptr = NULL;
       
  1085 #ifdef PNG_USER_MEM_SUPPORTED
       
  1086    png_free_ptr free_fn = NULL;
       
  1087    png_voidp mem_ptr = NULL;
       
  1088 #endif
       
  1089 
       
  1090    png_debug(1, "in png_destroy_read_struct\n");
       
  1091    if (png_ptr_ptr != NULL)
       
  1092       png_ptr = *png_ptr_ptr;
       
  1093    if (png_ptr == NULL)
       
  1094       return;
       
  1095 
       
  1096 #ifdef PNG_USER_MEM_SUPPORTED
       
  1097    free_fn = png_ptr->free_fn;
       
  1098    mem_ptr = png_ptr->mem_ptr;
       
  1099 #endif
       
  1100 
       
  1101    if (info_ptr_ptr != NULL)
       
  1102       info_ptr = *info_ptr_ptr;
       
  1103 
       
  1104    if (end_info_ptr_ptr != NULL)
       
  1105       end_info_ptr = *end_info_ptr_ptr;
       
  1106 
       
  1107    png_read_destroy(png_ptr, info_ptr, end_info_ptr);
       
  1108 
       
  1109    if (info_ptr != NULL)
       
  1110    {
       
  1111 #if defined(PNG_TEXT_SUPPORTED)
       
  1112       png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1);
       
  1113 #endif
       
  1114 
       
  1115 #ifdef PNG_USER_MEM_SUPPORTED
       
  1116       png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn,
       
  1117           (png_voidp)mem_ptr);
       
  1118 #else
       
  1119       png_destroy_struct((png_voidp)info_ptr);
       
  1120 #endif
       
  1121       *info_ptr_ptr = NULL;
       
  1122    }
       
  1123 
       
  1124    if (end_info_ptr != NULL)
       
  1125    {
       
  1126 #if defined(PNG_READ_TEXT_SUPPORTED)
       
  1127       png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1);
       
  1128 #endif
       
  1129 #ifdef PNG_USER_MEM_SUPPORTED
       
  1130       png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn,
       
  1131          (png_voidp)mem_ptr);
       
  1132 #else
       
  1133       png_destroy_struct((png_voidp)end_info_ptr);
       
  1134 #endif
       
  1135       *end_info_ptr_ptr = NULL;
       
  1136    }
       
  1137 
       
  1138    if (png_ptr != NULL)
       
  1139    {
       
  1140 #ifdef PNG_USER_MEM_SUPPORTED
       
  1141       png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
       
  1142           (png_voidp)mem_ptr);
       
  1143 #else
       
  1144       png_destroy_struct((png_voidp)png_ptr);
       
  1145 #endif
       
  1146       *png_ptr_ptr = NULL;
       
  1147    }
       
  1148 }
       
  1149 
       
  1150 /* free all memory used by the read (old method) */
       
  1151 void /* PRIVATE */
       
  1152 png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)
       
  1153 {
       
  1154 #ifdef PNG_SETJMP_SUPPORTED
       
  1155    jmp_buf tmp_jmp;
       
  1156 #endif
       
  1157    png_error_ptr error_fn;
       
  1158    png_error_ptr warning_fn;
       
  1159    png_voidp error_ptr;
       
  1160 #ifdef PNG_USER_MEM_SUPPORTED
       
  1161    png_free_ptr free_fn;
       
  1162 #endif
       
  1163 
       
  1164    png_debug(1, "in png_read_destroy\n");
       
  1165    if (info_ptr != NULL)
       
  1166       png_info_destroy(png_ptr, info_ptr);
       
  1167 
       
  1168    if (end_info_ptr != NULL)
       
  1169       png_info_destroy(png_ptr, end_info_ptr);
       
  1170 
       
  1171    png_free(png_ptr, png_ptr->zbuf);
       
  1172    png_free(png_ptr, png_ptr->big_row_buf);
       
  1173    png_free(png_ptr, png_ptr->prev_row);
       
  1174    png_free(png_ptr, png_ptr->chunkdata);
       
  1175 #if defined(PNG_READ_DITHER_SUPPORTED)
       
  1176    png_free(png_ptr, png_ptr->palette_lookup);
       
  1177    png_free(png_ptr, png_ptr->dither_index);
       
  1178 #endif
       
  1179 #if defined(PNG_READ_GAMMA_SUPPORTED)
       
  1180    png_free(png_ptr, png_ptr->gamma_table);
       
  1181 #endif
       
  1182 #if defined(PNG_READ_BACKGROUND_SUPPORTED)
       
  1183    png_free(png_ptr, png_ptr->gamma_from_1);
       
  1184    png_free(png_ptr, png_ptr->gamma_to_1);
       
  1185 #endif
       
  1186 #ifdef PNG_FREE_ME_SUPPORTED
       
  1187    if (png_ptr->free_me & PNG_FREE_PLTE)
       
  1188       png_zfree(png_ptr, png_ptr->palette);
       
  1189    png_ptr->free_me &= ~PNG_FREE_PLTE;
       
  1190 #else
       
  1191    if (png_ptr->flags & PNG_FLAG_FREE_PLTE)
       
  1192       png_zfree(png_ptr, png_ptr->palette);
       
  1193    png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
       
  1194 #endif
       
  1195 #if defined(PNG_tRNS_SUPPORTED) || \
       
  1196     defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
       
  1197 #ifdef PNG_FREE_ME_SUPPORTED
       
  1198    if (png_ptr->free_me & PNG_FREE_TRNS)
       
  1199       png_free(png_ptr, png_ptr->trans);
       
  1200    png_ptr->free_me &= ~PNG_FREE_TRNS;
       
  1201 #else
       
  1202    if (png_ptr->flags & PNG_FLAG_FREE_TRNS)
       
  1203       png_free(png_ptr, png_ptr->trans);
       
  1204    png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
       
  1205 #endif
       
  1206 #endif
       
  1207 #if defined(PNG_READ_hIST_SUPPORTED)
       
  1208 #ifdef PNG_FREE_ME_SUPPORTED
       
  1209    if (png_ptr->free_me & PNG_FREE_HIST)
       
  1210       png_free(png_ptr, png_ptr->hist);
       
  1211    png_ptr->free_me &= ~PNG_FREE_HIST;
       
  1212 #else
       
  1213    if (png_ptr->flags & PNG_FLAG_FREE_HIST)
       
  1214       png_free(png_ptr, png_ptr->hist);
       
  1215    png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
       
  1216 #endif
       
  1217 #endif
       
  1218 #if defined(PNG_READ_GAMMA_SUPPORTED)
       
  1219    if (png_ptr->gamma_16_table != NULL)
       
  1220    {
       
  1221       int i;
       
  1222       int istop = (1 << (8 - png_ptr->gamma_shift));
       
  1223       for (i = 0; i < istop; i++)
       
  1224       {
       
  1225          png_free(png_ptr, png_ptr->gamma_16_table[i]);
       
  1226       }
       
  1227    png_free(png_ptr, png_ptr->gamma_16_table);
       
  1228    }
       
  1229 #if defined(PNG_READ_BACKGROUND_SUPPORTED)
       
  1230    if (png_ptr->gamma_16_from_1 != NULL)
       
  1231    {
       
  1232       int i;
       
  1233       int istop = (1 << (8 - png_ptr->gamma_shift));
       
  1234       for (i = 0; i < istop; i++)
       
  1235       {
       
  1236          png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
       
  1237       }
       
  1238    png_free(png_ptr, png_ptr->gamma_16_from_1);
       
  1239    }
       
  1240    if (png_ptr->gamma_16_to_1 != NULL)
       
  1241    {
       
  1242       int i;
       
  1243       int istop = (1 << (8 - png_ptr->gamma_shift));
       
  1244       for (i = 0; i < istop; i++)
       
  1245       {
       
  1246          png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
       
  1247       }
       
  1248    png_free(png_ptr, png_ptr->gamma_16_to_1);
       
  1249    }
       
  1250 #endif
       
  1251 #endif
       
  1252 #if defined(PNG_TIME_RFC1123_SUPPORTED)
       
  1253    png_free(png_ptr, png_ptr->time_buffer);
       
  1254 #endif
       
  1255 
       
  1256    inflateEnd(&png_ptr->zstream);
       
  1257 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
       
  1258    png_free(png_ptr, png_ptr->save_buffer);
       
  1259 #endif
       
  1260 
       
  1261 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
       
  1262 #ifdef PNG_TEXT_SUPPORTED
       
  1263    png_free(png_ptr, png_ptr->current_text);
       
  1264 #endif /* PNG_TEXT_SUPPORTED */
       
  1265 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
       
  1266 
       
  1267    /* Save the important info out of the png_struct, in case it is
       
  1268     * being used again.
       
  1269     */
       
  1270 #ifdef PNG_SETJMP_SUPPORTED
       
  1271    png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
       
  1272 #endif
       
  1273 
       
  1274    error_fn = png_ptr->error_fn;
       
  1275    warning_fn = png_ptr->warning_fn;
       
  1276    error_ptr = png_ptr->error_ptr;
       
  1277 #ifdef PNG_USER_MEM_SUPPORTED
       
  1278    free_fn = png_ptr->free_fn;
       
  1279 #endif
       
  1280 
       
  1281    png_memset(png_ptr, 0, png_sizeof(png_struct));
       
  1282 
       
  1283    png_ptr->error_fn = error_fn;
       
  1284    png_ptr->warning_fn = warning_fn;
       
  1285    png_ptr->error_ptr = error_ptr;
       
  1286 #ifdef PNG_USER_MEM_SUPPORTED
       
  1287    png_ptr->free_fn = free_fn;
       
  1288 #endif
       
  1289 
       
  1290 #ifdef PNG_SETJMP_SUPPORTED
       
  1291    png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
       
  1292 #endif
       
  1293 
       
  1294 }
       
  1295 
       
  1296 void PNGAPI
       
  1297 png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)
       
  1298 {
       
  1299    if (png_ptr == NULL) return;
       
  1300    png_ptr->read_row_fn = read_row_fn;
       
  1301 }
       
  1302 
       
  1303 
       
  1304 #ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
       
  1305 #if defined(PNG_INFO_IMAGE_SUPPORTED)
       
  1306 void PNGAPI
       
  1307 png_read_png(png_structp png_ptr, png_infop info_ptr,
       
  1308                            int transforms,
       
  1309                            voidp params)
       
  1310 {
       
  1311    int row;
       
  1312 
       
  1313    if (png_ptr == NULL) return;
       
  1314 #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
       
  1315    /* invert the alpha channel from opacity to transparency
       
  1316     */
       
  1317    if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
       
  1318        png_set_invert_alpha(png_ptr);
       
  1319 #endif
       
  1320 
       
  1321    /* png_read_info() gives us all of the information from the
       
  1322     * PNG file before the first IDAT (image data chunk).
       
  1323     */
       
  1324    png_read_info(png_ptr, info_ptr);
       
  1325    if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
       
  1326       png_error(png_ptr, "Image is too high to process with png_read_png()");
       
  1327 
       
  1328    /* -------------- image transformations start here ------------------- */
       
  1329 
       
  1330 #if defined(PNG_READ_16_TO_8_SUPPORTED)
       
  1331    /* tell libpng to strip 16 bit/color files down to 8 bits per color
       
  1332     */
       
  1333    if (transforms & PNG_TRANSFORM_STRIP_16)
       
  1334        png_set_strip_16(png_ptr);
       
  1335 #endif
       
  1336 
       
  1337 #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
       
  1338    /* Strip alpha bytes from the input data without combining with
       
  1339     * the background (not recommended).
       
  1340     */
       
  1341    if (transforms & PNG_TRANSFORM_STRIP_ALPHA)
       
  1342        png_set_strip_alpha(png_ptr);
       
  1343 #endif
       
  1344 
       
  1345 #if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED)
       
  1346    /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single
       
  1347     * byte into separate bytes (useful for paletted and grayscale images).
       
  1348     */
       
  1349    if (transforms & PNG_TRANSFORM_PACKING)
       
  1350        png_set_packing(png_ptr);
       
  1351 #endif
       
  1352 
       
  1353 #if defined(PNG_READ_PACKSWAP_SUPPORTED)
       
  1354    /* Change the order of packed pixels to least significant bit first
       
  1355     * (not useful if you are using png_set_packing).
       
  1356     */
       
  1357    if (transforms & PNG_TRANSFORM_PACKSWAP)
       
  1358        png_set_packswap(png_ptr);
       
  1359 #endif
       
  1360 
       
  1361 #if defined(PNG_READ_EXPAND_SUPPORTED)
       
  1362    /* Expand paletted colors into true RGB triplets
       
  1363     * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel
       
  1364     * Expand paletted or RGB images with transparency to full alpha
       
  1365     * channels so the data will be available as RGBA quartets.
       
  1366     */
       
  1367    if (transforms & PNG_TRANSFORM_EXPAND)
       
  1368        if ((png_ptr->bit_depth < 8) ||
       
  1369            (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
       
  1370            (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
       
  1371          png_set_expand(png_ptr);
       
  1372 #endif
       
  1373 
       
  1374    /* We don't handle background color or gamma transformation or dithering.
       
  1375     */
       
  1376 
       
  1377 #if defined(PNG_READ_INVERT_SUPPORTED)
       
  1378    /* invert monochrome files to have 0 as white and 1 as black
       
  1379     */
       
  1380    if (transforms & PNG_TRANSFORM_INVERT_MONO)
       
  1381        png_set_invert_mono(png_ptr);
       
  1382 #endif
       
  1383 
       
  1384 #if defined(PNG_READ_SHIFT_SUPPORTED)
       
  1385    /* If you want to shift the pixel values from the range [0,255] or
       
  1386     * [0,65535] to the original [0,7] or [0,31], or whatever range the
       
  1387     * colors were originally in:
       
  1388     */
       
  1389    if ((transforms & PNG_TRANSFORM_SHIFT)
       
  1390        && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
       
  1391    {
       
  1392       png_color_8p sig_bit;
       
  1393 
       
  1394       png_get_sBIT(png_ptr, info_ptr, &sig_bit);
       
  1395       png_set_shift(png_ptr, sig_bit);
       
  1396    }
       
  1397 #endif
       
  1398 
       
  1399 #if defined(PNG_READ_BGR_SUPPORTED)
       
  1400    /* flip the RGB pixels to BGR (or RGBA to BGRA)
       
  1401     */
       
  1402    if (transforms & PNG_TRANSFORM_BGR)
       
  1403        png_set_bgr(png_ptr);
       
  1404 #endif
       
  1405 
       
  1406 #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
       
  1407    /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR)
       
  1408     */
       
  1409    if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
       
  1410        png_set_swap_alpha(png_ptr);
       
  1411 #endif
       
  1412 
       
  1413 #if defined(PNG_READ_SWAP_SUPPORTED)
       
  1414    /* swap bytes of 16 bit files to least significant byte first
       
  1415     */
       
  1416    if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
       
  1417        png_set_swap(png_ptr);
       
  1418 #endif
       
  1419 
       
  1420    /* We don't handle adding filler bytes */
       
  1421 
       
  1422    /* Optional call to gamma correct and add the background to the palette
       
  1423     * and update info structure.  REQUIRED if you are expecting libpng to
       
  1424     * update the palette for you (i.e., you selected such a transform above).
       
  1425     */
       
  1426    png_read_update_info(png_ptr, info_ptr);
       
  1427 
       
  1428    /* -------------- image transformations end here ------------------- */
       
  1429 
       
  1430 #ifdef PNG_FREE_ME_SUPPORTED
       
  1431    png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
       
  1432 #endif
       
  1433    if (info_ptr->row_pointers == NULL)
       
  1434    {
       
  1435       info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr,
       
  1436          info_ptr->height * png_sizeof(png_bytep));
       
  1437 #ifdef PNG_FREE_ME_SUPPORTED
       
  1438       info_ptr->free_me |= PNG_FREE_ROWS;
       
  1439 #endif
       
  1440       for (row = 0; row < (int)info_ptr->height; row++)
       
  1441       {
       
  1442          info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr,
       
  1443             png_get_rowbytes(png_ptr, info_ptr));
       
  1444       }
       
  1445    }
       
  1446 
       
  1447    png_read_image(png_ptr, info_ptr->row_pointers);
       
  1448    info_ptr->valid |= PNG_INFO_IDAT;
       
  1449 
       
  1450    /* read rest of file, and get additional chunks in info_ptr - REQUIRED */
       
  1451    png_read_end(png_ptr, info_ptr);
       
  1452 
       
  1453    transforms = transforms; /* quiet compiler warnings */
       
  1454    params = params;
       
  1455 
       
  1456 }
       
  1457 #endif /* PNG_INFO_IMAGE_SUPPORTED */
       
  1458 #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
       
  1459 #endif /* PNG_READ_SUPPORTED */