Blame gtkmm-osx/libpng-1.2.5/pngtest.c

darco 56a656
darco 56a656
/* pngtest.c - a simple test program to test libpng
darco 56a656
 *
darco 56a656
 * libpng 1.2.5 - October 3, 2002
darco 56a656
 * For conditions of distribution and use, see copyright notice in png.h
darco 56a656
 * Copyright (c) 1998-2002 Glenn Randers-Pehrson
darco 56a656
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
darco 56a656
 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
darco 56a656
 *
darco 56a656
 * This program reads in a PNG image, writes it out again, and then
darco 56a656
 * compares the two files.  If the files are identical, this shows that
darco 56a656
 * the basic chunk handling, filtering, and (de)compression code is working
darco 56a656
 * properly.  It does not currently test all of the transforms, although
darco 56a656
 * it probably should.
darco 56a656
 *
darco 56a656
 * The program will report "FAIL" in certain legitimate cases:
darco 56a656
 * 1) when the compression level or filter selection method is changed.
darco 56a656
 * 2) when the maximum IDAT size (PNG_ZBUF_SIZE in pngconf.h) is not 8192.
darco 56a656
 * 3) unknown unsafe-to-copy ancillary chunks or unknown critical chunks
darco 56a656
 *    exist in the input file.
darco 56a656
 * 4) others not listed here...
darco 56a656
 * In these cases, it is best to check with another tool such as "pngcheck"
darco 56a656
 * to see what the differences between the two files are.
darco 56a656
 *
darco 56a656
 * If a filename is given on the command-line, then this file is used
darco 56a656
 * for the input, rather than the default "pngtest.png".  This allows
darco 56a656
 * testing a wide variety of files easily.  You can also test a number
darco 56a656
 * of files at once by typing "pngtest -m file1.png file2.png ..."
darco 56a656
 */
darco 56a656
darco 56a656
#if defined(_WIN32_WCE)
darco 56a656
#  if _WIN32_WCE < 211
darco 56a656
     __error__ (f|w)printf functions are not supported on old WindowsCE.;
darco 56a656
#  endif
darco 56a656
#  include <windows.h></windows.h>
darco 56a656
#  include <stdlib.h></stdlib.h>
darco 56a656
#  define READFILE(file, data, length, check) \
darco 56a656
     if (ReadFile(file, data, length, &check,NULL)) check = 0
darco 56a656
#  define WRITEFILE(file, data, length, check)) \
darco 56a656
     if (WriteFile(file, data, length, &check, NULL)) check = 0
darco 56a656
#  define FCLOSE(file) CloseHandle(file)
darco 56a656
#else
darco 56a656
#  include <stdio.h></stdio.h>
darco 56a656
#  include <stdlib.h></stdlib.h>
darco 56a656
#  include <assert.h></assert.h>
darco 56a656
#  define READFILE(file, data, length, check) \
darco 56a656
     check=(png_size_t)fread(data,(png_size_t)1,length,file)
darco 56a656
#  define WRITEFILE(file, data, length, check) \
darco 56a656
     check=(png_size_t)fwrite(data,(png_size_t)1, length, file)
darco 56a656
#  define FCLOSE(file) fclose(file)
darco 56a656
#endif
darco 56a656
darco 56a656
#if defined(PNG_NO_STDIO)
darco 56a656
#  if defined(_WIN32_WCE)
darco 56a656
     typedef HANDLE                png_FILE_p;
darco 56a656
#  else
darco 56a656
     typedef FILE                * png_FILE_p;
darco 56a656
#  endif
darco 56a656
#endif
darco 56a656
darco 56a656
/* Makes pngtest verbose so we can find problems (needs to be before png.h) */
darco 56a656
#ifndef PNG_DEBUG
darco 56a656
#  define PNG_DEBUG 0
darco 56a656
#endif
darco 56a656
darco 56a656
#if !PNG_DEBUG
darco 56a656
#  define SINGLE_ROWBUF_ALLOC  /* makes buffer overruns easier to nail */
darco 56a656
#endif
darco 56a656
darco 56a656
/* Turn on CPU timing
darco 56a656
#define PNGTEST_TIMING
darco 56a656
*/
darco 56a656
darco 56a656
#ifdef PNG_NO_FLOATING_POINT_SUPPORTED
darco 56a656
#undef PNGTEST_TIMING
darco 56a656
#endif
darco 56a656
darco 56a656
#ifdef PNGTEST_TIMING
darco 56a656
static float t_start, t_stop, t_decode, t_encode, t_misc;
darco 56a656
#include <time.h></time.h>
darco 56a656
#endif
darco 56a656
darco 56a656
#include "png.h"
darco 56a656
darco 56a656
/* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */
darco 56a656
#ifndef png_jmpbuf
darco 56a656
#  define png_jmpbuf(png_ptr) png_ptr->jmpbuf
darco 56a656
#endif
darco 56a656
darco 56a656
#ifdef PNGTEST_TIMING
darco 56a656
static float t_start, t_stop, t_decode, t_encode, t_misc;
darco 56a656
#if !defined(PNG_tIME_SUPPORTED)
darco 56a656
#include <time.h></time.h>
darco 56a656
#endif
darco 56a656
#endif
darco 56a656
darco 56a656
#if defined(PNG_TIME_RFC1123_SUPPORTED)
darco 56a656
static int tIME_chunk_present=0;
darco 56a656
static char tIME_string[30] = "no tIME chunk present in file";
darco 56a656
#endif
darco 56a656
darco 56a656
static int verbose = 0;
darco 56a656
darco 56a656
int test_one_file PNGARG((PNG_CONST char *inname, PNG_CONST char *outname));
darco 56a656
darco 56a656
#ifdef __TURBOC__
darco 56a656
#include <mem.h></mem.h>
darco 56a656
#endif
darco 56a656
darco 56a656
/* defined so I can write to a file on gui/windowing platforms */
darco 56a656
/*  #define STDERR stderr  */
darco 56a656
#define STDERR stdout   /* for DOS */
darco 56a656
darco 56a656
/* example of using row callbacks to make a simple progress meter */
darco 56a656
static int status_pass=1;
darco 56a656
static int status_dots_requested=0;
darco 56a656
static int status_dots=1;
darco 56a656
darco 56a656
void
darco 56a656
#ifdef PNG_1_0_X
darco 56a656
PNGAPI
darco 56a656
#endif
darco 56a656
read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass);
darco 56a656
void
darco 56a656
#ifdef PNG_1_0_X
darco 56a656
PNGAPI
darco 56a656
#endif
darco 56a656
read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
darco 56a656
{
darco 56a656
    if(png_ptr == NULL || row_number > PNG_MAX_UINT) return;
darco 56a656
    if(status_pass != pass)
darco 56a656
    {
darco 56a656
       fprintf(stdout,"\n Pass %d: ",pass);
darco 56a656
       status_pass = pass;
darco 56a656
       status_dots = 31;
darco 56a656
    }
darco 56a656
    status_dots--;
darco 56a656
    if(status_dots == 0)
darco 56a656
    {
darco 56a656
       fprintf(stdout, "\n         ");
darco 56a656
       status_dots=30;
darco 56a656
    }
darco 56a656
    fprintf(stdout, "r");
darco 56a656
}
darco 56a656
darco 56a656
void
darco 56a656
#ifdef PNG_1_0_X
darco 56a656
PNGAPI
darco 56a656
#endif
darco 56a656
write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass);
darco 56a656
void
darco 56a656
#ifdef PNG_1_0_X
darco 56a656
PNGAPI
darco 56a656
#endif
darco 56a656
write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
darco 56a656
{
darco 56a656
    if(png_ptr == NULL || row_number > PNG_MAX_UINT || pass > 7) return;
darco 56a656
    fprintf(stdout, "w");
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
darco 56a656
/* Example of using user transform callback (we don't transform anything,
darco 56a656
   but merely examine the row filters.  We set this to 256 rather than
darco 56a656
   5 in case illegal filter values are present.) */
darco 56a656
static png_uint_32 filters_used[256];
darco 56a656
void
darco 56a656
#ifdef PNG_1_0_X
darco 56a656
PNGAPI
darco 56a656
#endif
darco 56a656
count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data);
darco 56a656
void
darco 56a656
#ifdef PNG_1_0_X
darco 56a656
PNGAPI
darco 56a656
#endif
darco 56a656
count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data)
darco 56a656
{
darco 56a656
    if(png_ptr != NULL && row_info != NULL)
darco 56a656
      ++filters_used[*(data-1)];
darco 56a656
}
darco 56a656
#endif
darco 56a656
darco 56a656
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
darco 56a656
/* example of using user transform callback (we don't transform anything,
darco 56a656
   but merely count the zero samples) */
darco 56a656
darco 56a656
static png_uint_32 zero_samples;
darco 56a656
darco 56a656
void
darco 56a656
#ifdef PNG_1_0_X
darco 56a656
PNGAPI
darco 56a656
#endif
darco 56a656
count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data);
darco 56a656
void
darco 56a656
#ifdef PNG_1_0_X
darco 56a656
PNGAPI
darco 56a656
#endif
darco 56a656
count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data)
darco 56a656
{
darco 56a656
   png_bytep dp = data;
darco 56a656
   if(png_ptr == NULL)return;
darco 56a656
darco 56a656
   /* contents of row_info:
darco 56a656
    *  png_uint_32 width      width of row
darco 56a656
    *  png_uint_32 rowbytes   number of bytes in row
darco 56a656
    *  png_byte color_type    color type of pixels
darco 56a656
    *  png_byte bit_depth     bit depth of samples
darco 56a656
    *  png_byte channels      number of channels (1-4)
darco 56a656
    *  png_byte pixel_depth   bits per pixel (depth*channels)
darco 56a656
    */
darco 56a656
darco 56a656
darco 56a656
    /* counts the number of zero samples (or zero pixels if color_type is 3 */
darco 56a656
darco 56a656
    if(row_info->color_type == 0 || row_info->color_type == 3)
darco 56a656
    {
darco 56a656
       int pos=0;
darco 56a656
       png_uint_32 n, nstop;
darco 56a656
       for (n=0, nstop=row_info->width; n
darco 56a656
       {
darco 56a656
          if(row_info->bit_depth == 1)
darco 56a656
          {
darco 56a656
             if(((*dp << pos++ ) & 0x80) == 0) zero_samples++;
darco 56a656
             if(pos == 8)
darco 56a656
             {
darco 56a656
                pos = 0;
darco 56a656
                dp++;
darco 56a656
             }
darco 56a656
          }
darco 56a656
          if(row_info->bit_depth == 2)
darco 56a656
          {
darco 56a656
             if(((*dp << (pos+=2)) & 0xc0) == 0) zero_samples++;
darco 56a656
             if(pos == 8)
darco 56a656
             {
darco 56a656
                pos = 0;
darco 56a656
                dp++;
darco 56a656
             }
darco 56a656
          }
darco 56a656
          if(row_info->bit_depth == 4)
darco 56a656
          {
darco 56a656
             if(((*dp << (pos+=4)) & 0xf0) == 0) zero_samples++;
darco 56a656
             if(pos == 8)
darco 56a656
             {
darco 56a656
                pos = 0;
darco 56a656
                dp++;
darco 56a656
             }
darco 56a656
          }
darco 56a656
          if(row_info->bit_depth == 8)
darco 56a656
             if(*dp++ == 0) zero_samples++;
darco 56a656
          if(row_info->bit_depth == 16)
darco 56a656
          {
darco 56a656
             if((*dp | *(dp+1)) == 0) zero_samples++;
darco 56a656
             dp+=2;
darco 56a656
          }
darco 56a656
       }
darco 56a656
    }
darco 56a656
    else /* other color types */
darco 56a656
    {
darco 56a656
       png_uint_32 n, nstop;
darco 56a656
       int channel;
darco 56a656
       int color_channels = row_info->channels;
darco 56a656
       if(row_info->color_type > 3)color_channels--;
darco 56a656
darco 56a656
       for (n=0, nstop=row_info->width; n
darco 56a656
       {
darco 56a656
          for (channel = 0; channel < color_channels; channel++)
darco 56a656
          {
darco 56a656
             if(row_info->bit_depth == 8)
darco 56a656
                if(*dp++ == 0) zero_samples++;
darco 56a656
             if(row_info->bit_depth == 16)
darco 56a656
             {
darco 56a656
                if((*dp | *(dp+1)) == 0) zero_samples++;
darco 56a656
                dp+=2;
darco 56a656
             }
darco 56a656
          }
darco 56a656
          if(row_info->color_type > 3)
darco 56a656
          {
darco 56a656
             dp++;
darco 56a656
             if(row_info->bit_depth == 16)dp++;
darco 56a656
          }
darco 56a656
       }
darco 56a656
    }
darco 56a656
}
darco 56a656
#endif /* PNG_WRITE_USER_TRANSFORM_SUPPORTED */
darco 56a656
darco 56a656
static int wrote_question = 0;
darco 56a656
darco 56a656
#if defined(PNG_NO_STDIO)
darco 56a656
/* START of code to validate stdio-free compilation */
darco 56a656
/* These copies of the default read/write functions come from pngrio.c and */
darco 56a656
/* pngwio.c.  They allow "don't include stdio" testing of the library. */
darco 56a656
/* This is the function that does the actual reading of data.  If you are
darco 56a656
   not reading from a standard C stream, you should create a replacement
darco 56a656
   read_data function and use it at run time with png_set_read_fn(), rather
darco 56a656
   than changing the library. */
darco 56a656
darco 56a656
#ifndef USE_FAR_KEYWORD
darco 56a656
static void
darco 56a656
pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
darco 56a656
{
darco 56a656
   png_size_t check;
darco 56a656
darco 56a656
   /* fread() returns 0 on error, so it is OK to store this in a png_size_t
darco 56a656
    * instead of an int, which is what fread() actually returns.
darco 56a656
    */
darco 56a656
   READFILE((png_FILE_p)png_ptr->io_ptr, data, length, check);
darco 56a656
darco 56a656
   if (check != length)
darco 56a656
   {
darco 56a656
      png_error(png_ptr, "Read Error!");
darco 56a656
   }
darco 56a656
}
darco 56a656
#else
darco 56a656
/* this is the model-independent version. Since the standard I/O library
darco 56a656
   can't handle far buffers in the medium and small models, we have to copy
darco 56a656
   the data.
darco 56a656
*/
darco 56a656
darco 56a656
#define NEAR_BUF_SIZE 1024
darco 56a656
#define MIN(a,b) (a <= b ? a : b)
darco 56a656
darco 56a656
static void
darco 56a656
pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
darco 56a656
{
darco 56a656
   int check;
darco 56a656
   png_byte *n_data;
darco 56a656
   png_FILE_p io_ptr;
darco 56a656
darco 56a656
   /* Check if data really is near. If so, use usual code. */
darco 56a656
   n_data = (png_byte *)CVT_PTR_NOCHECK(data);
darco 56a656
   io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
darco 56a656
   if ((png_bytep)n_data == data)
darco 56a656
   {
darco 56a656
      READFILE(io_ptr, n_data, length, check);
darco 56a656
   }
darco 56a656
   else
darco 56a656
   {
darco 56a656
      png_byte buf[NEAR_BUF_SIZE];
darco 56a656
      png_size_t read, remaining, err;
darco 56a656
      check = 0;
darco 56a656
      remaining = length;
darco 56a656
      do
darco 56a656
      {
darco 56a656
         read = MIN(NEAR_BUF_SIZE, remaining);
darco 56a656
         READFILE(io_ptr, buf, 1, err);
darco 56a656
         png_memcpy(data, buf, read); /* copy far buffer to near buffer */
darco 56a656
         if(err != read)
darco 56a656
            break;
darco 56a656
         else
darco 56a656
            check += err;
darco 56a656
         data += read;
darco 56a656
         remaining -= read;
darco 56a656
      }
darco 56a656
      while (remaining != 0);
darco 56a656
   }
darco 56a656
   if (check != length)
darco 56a656
   {
darco 56a656
      png_error(png_ptr, "read Error");
darco 56a656
   }
darco 56a656
}
darco 56a656
#endif /* USE_FAR_KEYWORD */
darco 56a656
darco 56a656
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
darco 56a656
static void
darco 56a656
pngtest_flush(png_structp png_ptr)
darco 56a656
{
darco 56a656
#if !defined(_WIN32_WCE)
darco 56a656
   png_FILE_p io_ptr;
darco 56a656
   io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
darco 56a656
   if (io_ptr != NULL)
darco 56a656
      fflush(io_ptr);
darco 56a656
#endif
darco 56a656
}
darco 56a656
#endif
darco 56a656
darco 56a656
/* This is the function that does the actual writing of data.  If you are
darco 56a656
   not writing to a standard C stream, you should create a replacement
darco 56a656
   write_data function and use it at run time with png_set_write_fn(), rather
darco 56a656
   than changing the library. */
darco 56a656
#ifndef USE_FAR_KEYWORD
darco 56a656
static void
darco 56a656
pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
darco 56a656
{
darco 56a656
   png_uint_32 check;
darco 56a656
darco 56a656
   WRITEFILE((png_FILE_p)png_ptr->io_ptr,  data, length, check);
darco 56a656
   if (check != length)
darco 56a656
   {
darco 56a656
      png_error(png_ptr, "Write Error");
darco 56a656
   }
darco 56a656
}
darco 56a656
#else
darco 56a656
/* this is the model-independent version. Since the standard I/O library
darco 56a656
   can't handle far buffers in the medium and small models, we have to copy
darco 56a656
   the data.
darco 56a656
*/
darco 56a656
darco 56a656
#define NEAR_BUF_SIZE 1024
darco 56a656
#define MIN(a,b) (a <= b ? a : b)
darco 56a656
darco 56a656
static void
darco 56a656
pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
darco 56a656
{
darco 56a656
   png_uint_32 check;
darco 56a656
   png_byte *near_data;  /* Needs to be "png_byte *" instead of "png_bytep" */
darco 56a656
   png_FILE_p io_ptr;
darco 56a656
darco 56a656
   /* Check if data really is near. If so, use usual code. */
darco 56a656
   near_data = (png_byte *)CVT_PTR_NOCHECK(data);
darco 56a656
   io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
darco 56a656
   if ((png_bytep)near_data == data)
darco 56a656
   {
darco 56a656
      WRITEFILE(io_ptr, near_data, length, check);
darco 56a656
   }
darco 56a656
   else
darco 56a656
   {
darco 56a656
      png_byte buf[NEAR_BUF_SIZE];
darco 56a656
      png_size_t written, remaining, err;
darco 56a656
      check = 0;
darco 56a656
      remaining = length;
darco 56a656
      do
darco 56a656
      {
darco 56a656
         written = MIN(NEAR_BUF_SIZE, remaining);
darco 56a656
         png_memcpy(buf, data, written); /* copy far buffer to near buffer */
darco 56a656
         WRITEFILE(io_ptr, buf, written, err);
darco 56a656
         if (err != written)
darco 56a656
            break;
darco 56a656
         else
darco 56a656
            check += err;
darco 56a656
         data += written;
darco 56a656
         remaining -= written;
darco 56a656
      }
darco 56a656
      while (remaining != 0);
darco 56a656
   }
darco 56a656
   if (check != length)
darco 56a656
   {
darco 56a656
      png_error(png_ptr, "Write Error");
darco 56a656
   }
darco 56a656
}
darco 56a656
darco 56a656
#endif /* USE_FAR_KEYWORD */
darco 56a656
darco 56a656
/* This function is called when there is a warning, but the library thinks
darco 56a656
 * it can continue anyway.  Replacement functions don't have to do anything
darco 56a656
 * here if you don't want to.  In the default configuration, png_ptr is
darco 56a656
 * not used, but it is passed in case it may be useful.
darco 56a656
 */
darco 56a656
static void
darco 56a656
pngtest_warning(png_structp png_ptr, png_const_charp message)
darco 56a656
{
darco 56a656
   PNG_CONST char *name = "UNKNOWN (ERROR!)";
darco 56a656
   if (png_ptr != NULL && png_ptr->error_ptr != NULL)
darco 56a656
      name = png_ptr->error_ptr;
darco 56a656
   fprintf(STDERR, "%s: libpng warning: %s\n", name, message);
darco 56a656
}
darco 56a656
darco 56a656
/* This is the default error handling function.  Note that replacements for
darco 56a656
 * this function MUST NOT RETURN, or the program will likely crash.  This
darco 56a656
 * function is used by default, or if the program supplies NULL for the
darco 56a656
 * error function pointer in png_set_error_fn().
darco 56a656
 */
darco 56a656
static void
darco 56a656
pngtest_error(png_structp png_ptr, png_const_charp message)
darco 56a656
{
darco 56a656
   pngtest_warning(png_ptr, message);
darco 56a656
   /* We can return because png_error calls the default handler, which is
darco 56a656
    * actually OK in this case. */
darco 56a656
}
darco 56a656
#endif /* PNG_NO_STDIO */
darco 56a656
/* END of code to validate stdio-free compilation */
darco 56a656
darco 56a656
/* START of code to validate memory allocation and deallocation */
darco 56a656
#ifdef PNG_USER_MEM_SUPPORTED
darco 56a656
darco 56a656
/* Allocate memory.  For reasonable files, size should never exceed
darco 56a656
   64K.  However, zlib may allocate more then 64K if you don't tell
darco 56a656
   it not to.  See zconf.h and png.h for more information.  zlib does
darco 56a656
   need to allocate exactly 64K, so whatever you call here must
darco 56a656
   have the ability to do that.
darco 56a656
darco 56a656
   This piece of code can be compiled to validate max 64K allocations
darco 56a656
   by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K. */
darco 56a656
typedef struct memory_information
darco 56a656
{
darco 56a656
   png_uint_32               size;
darco 56a656
   png_voidp                 pointer;
darco 56a656
   struct memory_information FAR *next;
darco 56a656
} memory_information;
darco 56a656
typedef memory_information FAR *memory_infop;
darco 56a656
darco 56a656
static memory_infop pinformation = NULL;
darco 56a656
static int current_allocation = 0;
darco 56a656
static int maximum_allocation = 0;
darco 56a656
static int total_allocation = 0;
darco 56a656
static int num_allocations = 0;
darco 56a656
darco 56a656
png_voidp png_debug_malloc PNGARG((png_structp png_ptr, png_uint_32 size));
darco 56a656
void png_debug_free PNGARG((png_structp png_ptr, png_voidp ptr));
darco 56a656
darco 56a656
png_voidp
darco 56a656
png_debug_malloc(png_structp png_ptr, png_uint_32 size)
darco 56a656
{
darco 56a656
darco 56a656
   /* png_malloc has already tested for NULL; png_create_struct calls
darco 56a656
      png_debug_malloc directly, with png_ptr == NULL which is OK */
darco 56a656
darco 56a656
   if (size == 0)
darco 56a656
      return (NULL);
darco 56a656
darco 56a656
   /* This calls the library allocator twice, once to get the requested
darco 56a656
      buffer and once to get a new free list entry. */
darco 56a656
   {
darco 56a656
      memory_infop pinfo = (memory_infop)png_malloc_default(png_ptr,
darco 56a656
         (png_uint_32)sizeof *pinfo);
darco 56a656
      pinfo->size = size;
darco 56a656
      current_allocation += size;
darco 56a656
      total_allocation += size;
darco 56a656
      num_allocations ++;
darco 56a656
      if (current_allocation > maximum_allocation)
darco 56a656
         maximum_allocation = current_allocation;
darco 56a656
      pinfo->pointer = (png_voidp)png_malloc_default(png_ptr, size);
darco 56a656
      pinfo->next = pinformation;
darco 56a656
      pinformation = pinfo;
darco 56a656
      /* Make sure the caller isn't assuming zeroed memory. */
darco 56a656
      png_memset(pinfo->pointer, 0xdd, pinfo->size);
darco 56a656
#if PNG_DEBUG
darco 56a656
      if(verbose)
darco 56a656
         printf("png_malloc %lu bytes at %x\n",size,pinfo->pointer);
darco 56a656
#endif
darco 56a656
      assert(pinfo->size != 12345678);
darco 56a656
      return (png_voidp)(pinfo->pointer);
darco 56a656
   }
darco 56a656
}
darco 56a656
darco 56a656
/* Free a pointer.  It is removed from the list at the same time. */
darco 56a656
void
darco 56a656
png_debug_free(png_structp png_ptr, png_voidp ptr)
darco 56a656
{
darco 56a656
   if (png_ptr == NULL)
darco 56a656
      fprintf(STDERR, "NULL pointer to png_debug_free.\n");
darco 56a656
   if (ptr == 0)
darco 56a656
   {
darco 56a656
#if 0 /* This happens all the time. */
darco 56a656
      fprintf(STDERR, "WARNING: freeing NULL pointer\n");
darco 56a656
#endif
darco 56a656
      return;
darco 56a656
   }
darco 56a656
darco 56a656
   /* Unlink the element from the list. */
darco 56a656
   {
darco 56a656
      memory_infop FAR *ppinfo = &pinformation;
darco 56a656
      for (;;)
darco 56a656
      {
darco 56a656
         memory_infop pinfo = *ppinfo;
darco 56a656
         if (pinfo->pointer == ptr)
darco 56a656
         {
darco 56a656
            *ppinfo = pinfo->next;
darco 56a656
            current_allocation -= pinfo->size;
darco 56a656
            if (current_allocation < 0)
darco 56a656
               fprintf(STDERR, "Duplicate free of memory\n");
darco 56a656
            /* We must free the list element too, but first kill
darco 56a656
               the memory that is to be freed. */
darco 56a656
            png_memset(ptr, 0x55, pinfo->size);
darco 56a656
            png_free_default(png_ptr, pinfo);
darco 56a656
            pinfo=NULL;
darco 56a656
            break;
darco 56a656
         }
darco 56a656
         if (pinfo->next == NULL)
darco 56a656
         {
darco 56a656
            fprintf(STDERR, "Pointer %x not found\n", (unsigned int)ptr);
darco 56a656
            break;
darco 56a656
         }
darco 56a656
         ppinfo = &pinfo->next;
darco 56a656
      }
darco 56a656
   }
darco 56a656
darco 56a656
   /* Finally free the data. */
darco 56a656
#if PNG_DEBUG
darco 56a656
   if(verbose)
darco 56a656
      printf("Freeing %x\n",ptr);
darco 56a656
#endif
darco 56a656
   png_free_default(png_ptr, ptr);
darco 56a656
   ptr=NULL;
darco 56a656
}
darco 56a656
#endif /* PNG_USER_MEM_SUPPORTED */
darco 56a656
/* END of code to test memory allocation/deallocation */
darco 56a656
darco 56a656
/* Test one file */
darco 56a656
int
darco 56a656
test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
darco 56a656
{
darco 56a656
   static png_FILE_p fpin;
darco 56a656
   static png_FILE_p fpout;  /* "static" prevents setjmp corruption */
darco 56a656
   png_structp read_ptr;
darco 56a656
   png_infop read_info_ptr, end_info_ptr;
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
   png_structp write_ptr;
darco 56a656
   png_infop write_info_ptr;
darco 56a656
   png_infop write_end_info_ptr;
darco 56a656
#else
darco 56a656
   png_structp write_ptr = NULL;
darco 56a656
   png_infop write_info_ptr = NULL;
darco 56a656
   png_infop write_end_info_ptr = NULL;
darco 56a656
#endif
darco 56a656
   png_bytep row_buf;
darco 56a656
   png_uint_32 y;
darco 56a656
   png_uint_32 width, height;
darco 56a656
   int num_pass, pass;
darco 56a656
   int bit_depth, color_type;
darco 56a656
#ifdef PNG_SETJMP_SUPPORTED
darco 56a656
#ifdef USE_FAR_KEYWORD
darco 56a656
   jmp_buf jmpbuf;
darco 56a656
#endif
darco 56a656
#endif
darco 56a656
darco 56a656
#if defined(_WIN32_WCE)
darco 56a656
   TCHAR path[MAX_PATH];
darco 56a656
#endif
darco 56a656
   char inbuf[256], outbuf[256];
darco 56a656
darco 56a656
   row_buf = NULL;
darco 56a656
darco 56a656
#if defined(_WIN32_WCE)
darco 56a656
   MultiByteToWideChar(CP_ACP, 0, inname, -1, path, MAX_PATH);
darco 56a656
   if ((fpin = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
darco 56a656
#else
darco 56a656
   if ((fpin = fopen(inname, "rb")) == NULL)
darco 56a656
#endif
darco 56a656
   {
darco 56a656
      fprintf(STDERR, "Could not find input file %s\n", inname);
darco 56a656
      return (1);
darco 56a656
   }
darco 56a656
darco 56a656
#if defined(_WIN32_WCE)
darco 56a656
   MultiByteToWideChar(CP_ACP, 0, outname, -1, path, MAX_PATH);
darco 56a656
   if ((fpout = CreateFile(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL)) == INVALID_HANDLE_VALUE)
darco 56a656
#else
darco 56a656
   if ((fpout = fopen(outname, "wb")) == NULL)
darco 56a656
#endif
darco 56a656
   {
darco 56a656
      fprintf(STDERR, "Could not open output file %s\n", outname);
darco 56a656
      FCLOSE(fpin);
darco 56a656
      return (1);
darco 56a656
   }
darco 56a656
darco 56a656
   png_debug(0, "Allocating read and write structures\n");
darco 56a656
#ifdef PNG_USER_MEM_SUPPORTED
darco 56a656
   read_ptr = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
darco 56a656
      png_error_ptr_NULL, png_error_ptr_NULL, png_voidp_NULL,
darco 56a656
      (png_malloc_ptr)png_debug_malloc, (png_free_ptr)png_debug_free);
darco 56a656
#else
darco 56a656
   read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
darco 56a656
      png_error_ptr_NULL, png_error_ptr_NULL);
darco 56a656
#endif
darco 56a656
#if defined(PNG_NO_STDIO)
darco 56a656
   png_set_error_fn(read_ptr, (png_voidp)inname, pngtest_error,
darco 56a656
       pngtest_warning);
darco 56a656
#endif
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
#ifdef PNG_USER_MEM_SUPPORTED
darco 56a656
   write_ptr = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
darco 56a656
      png_error_ptr_NULL, png_error_ptr_NULL, png_voidp_NULL,
darco 56a656
      (png_malloc_ptr)png_debug_malloc, (png_free_ptr)png_debug_free);
darco 56a656
#else
darco 56a656
   write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
darco 56a656
      png_error_ptr_NULL, png_error_ptr_NULL);
darco 56a656
#endif
darco 56a656
#if defined(PNG_NO_STDIO)
darco 56a656
   png_set_error_fn(write_ptr, (png_voidp)inname, pngtest_error,
darco 56a656
       pngtest_warning);
darco 56a656
#endif
darco 56a656
#endif
darco 56a656
   png_debug(0, "Allocating read_info, write_info and end_info structures\n");
darco 56a656
   read_info_ptr = png_create_info_struct(read_ptr);
darco 56a656
   end_info_ptr = png_create_info_struct(read_ptr);
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
   write_info_ptr = png_create_info_struct(write_ptr);
darco 56a656
   write_end_info_ptr = png_create_info_struct(write_ptr);
darco 56a656
#endif
darco 56a656
darco 56a656
#ifdef PNG_SETJMP_SUPPORTED
darco 56a656
   png_debug(0, "Setting jmpbuf for read struct\n");
darco 56a656
#ifdef USE_FAR_KEYWORD
darco 56a656
   if (setjmp(jmpbuf))
darco 56a656
#else
darco 56a656
   if (setjmp(png_jmpbuf(read_ptr)))
darco 56a656
#endif
darco 56a656
   {
darco 56a656
      fprintf(STDERR, "%s -> %s: libpng read error\n", inname, outname);
darco 56a656
      if (row_buf)
darco 56a656
         png_free(read_ptr, row_buf);
darco 56a656
      png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
      png_destroy_info_struct(write_ptr, &write_end_info_ptr);
darco 56a656
      png_destroy_write_struct(&write_ptr, &write_info_ptr);
darco 56a656
#endif
darco 56a656
      FCLOSE(fpin);
darco 56a656
      FCLOSE(fpout);
darco 56a656
      return (1);
darco 56a656
   }
darco 56a656
#ifdef USE_FAR_KEYWORD
darco 56a656
   png_memcpy(png_jmpbuf(read_ptr),jmpbuf,sizeof(jmp_buf));
darco 56a656
#endif
darco 56a656
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
   png_debug(0, "Setting jmpbuf for write struct\n");
darco 56a656
#ifdef USE_FAR_KEYWORD
darco 56a656
   if (setjmp(jmpbuf))
darco 56a656
#else
darco 56a656
   if (setjmp(png_jmpbuf(write_ptr)))
darco 56a656
#endif
darco 56a656
   {
darco 56a656
      fprintf(STDERR, "%s -> %s: libpng write error\n", inname, outname);
darco 56a656
      png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
darco 56a656
      png_destroy_info_struct(write_ptr, &write_end_info_ptr);
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
      png_destroy_write_struct(&write_ptr, &write_info_ptr);
darco 56a656
#endif
darco 56a656
      FCLOSE(fpin);
darco 56a656
      FCLOSE(fpout);
darco 56a656
      return (1);
darco 56a656
   }
darco 56a656
#ifdef USE_FAR_KEYWORD
darco 56a656
   png_memcpy(png_jmpbuf(write_ptr),jmpbuf,sizeof(jmp_buf));
darco 56a656
#endif
darco 56a656
#endif
darco 56a656
#endif
darco 56a656
darco 56a656
   png_debug(0, "Initializing input and output streams\n");
darco 56a656
#if !defined(PNG_NO_STDIO)
darco 56a656
   png_init_io(read_ptr, fpin);
darco 56a656
#  ifdef PNG_WRITE_SUPPORTED
darco 56a656
   png_init_io(write_ptr, fpout);
darco 56a656
#  endif
darco 56a656
#else
darco 56a656
   png_set_read_fn(read_ptr, (png_voidp)fpin, pngtest_read_data);
darco 56a656
#  ifdef PNG_WRITE_SUPPORTED
darco 56a656
   png_set_write_fn(write_ptr, (png_voidp)fpout,  pngtest_write_data,
darco 56a656
#    if defined(PNG_WRITE_FLUSH_SUPPORTED)
darco 56a656
      pngtest_flush);
darco 56a656
#    else
darco 56a656
      NULL);
darco 56a656
#    endif
darco 56a656
#  endif
darco 56a656
#endif
darco 56a656
   if(status_dots_requested == 1)
darco 56a656
   {
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
      png_set_write_status_fn(write_ptr, write_row_callback);
darco 56a656
#endif
darco 56a656
      png_set_read_status_fn(read_ptr, read_row_callback);
darco 56a656
   }
darco 56a656
   else
darco 56a656
   {
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
      png_set_write_status_fn(write_ptr, png_write_status_ptr_NULL);
darco 56a656
#endif
darco 56a656
      png_set_read_status_fn(read_ptr, png_read_status_ptr_NULL);
darco 56a656
   }
darco 56a656
darco 56a656
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
darco 56a656
   {
darco 56a656
     int i;
darco 56a656
     for(i=0; i<256; i++)
darco 56a656
        filters_used[i]=0;
darco 56a656
     png_set_read_user_transform_fn(read_ptr, count_filters);
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
darco 56a656
   zero_samples=0;
darco 56a656
   png_set_write_user_transform_fn(write_ptr, count_zero_samples);
darco 56a656
#endif
darco 56a656
darco 56a656
#define HANDLE_CHUNK_IF_SAFE      2
darco 56a656
#define HANDLE_CHUNK_ALWAYS       3
darco 56a656
#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
darco 56a656
   png_set_keep_unknown_chunks(read_ptr, HANDLE_CHUNK_ALWAYS,
darco 56a656
      png_bytep_NULL, 0);
darco 56a656
#endif
darco 56a656
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
darco 56a656
   png_set_keep_unknown_chunks(write_ptr, HANDLE_CHUNK_IF_SAFE,
darco 56a656
      png_bytep_NULL, 0);
darco 56a656
#endif
darco 56a656
darco 56a656
   png_debug(0, "Reading info struct\n");
darco 56a656
   png_read_info(read_ptr, read_info_ptr);
darco 56a656
darco 56a656
   png_debug(0, "Transferring info struct\n");
darco 56a656
   {
darco 56a656
      int interlace_type, compression_type, filter_type;
darco 56a656
darco 56a656
      if (png_get_IHDR(read_ptr, read_info_ptr, &width, &height, &bit_depth,
darco 56a656
          &color_type, &interlace_type, &compression_type, &filter_type))
darco 56a656
      {
darco 56a656
         png_set_IHDR(write_ptr, write_info_ptr, width, height, bit_depth,
darco 56a656
#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
darco 56a656
            color_type, interlace_type, compression_type, filter_type);
darco 56a656
#else
darco 56a656
            color_type, PNG_INTERLACE_NONE, compression_type, filter_type);
darco 56a656
#endif
darco 56a656
      }
darco 56a656
   }
darco 56a656
#if defined(PNG_FIXED_POINT_SUPPORTED)
darco 56a656
#if defined(PNG_cHRM_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
darco 56a656
         blue_y;
darco 56a656
      if (png_get_cHRM_fixed(read_ptr, read_info_ptr, &white_x, &white_y, &red_x,
darco 56a656
         &red_y, &green_x, &green_y, &blue_x, &blue_y))
darco 56a656
      {
darco 56a656
         png_set_cHRM_fixed(write_ptr, write_info_ptr, white_x, white_y, red_x,
darco 56a656
            red_y, green_x, green_y, blue_x, blue_y);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_gAMA_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_fixed_point gamma;
darco 56a656
darco 56a656
      if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma))
darco 56a656
      {
darco 56a656
         png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#else /* Use floating point versions */
darco 56a656
#if defined(PNG_FLOATING_POINT_SUPPORTED)
darco 56a656
#if defined(PNG_cHRM_SUPPORTED)
darco 56a656
   {
darco 56a656
      double white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
darco 56a656
         blue_y;
darco 56a656
      if (png_get_cHRM(read_ptr, read_info_ptr, &white_x, &white_y, &red_x,
darco 56a656
         &red_y, &green_x, &green_y, &blue_x, &blue_y))
darco 56a656
      {
darco 56a656
         png_set_cHRM(write_ptr, write_info_ptr, white_x, white_y, red_x,
darco 56a656
            red_y, green_x, green_y, blue_x, blue_y);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_gAMA_SUPPORTED)
darco 56a656
   {
darco 56a656
      double gamma;
darco 56a656
darco 56a656
      if (png_get_gAMA(read_ptr, read_info_ptr, &gamma))
darco 56a656
      {
darco 56a656
         png_set_gAMA(write_ptr, write_info_ptr, gamma);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#endif /* floating point */
darco 56a656
#endif /* fixed point */
darco 56a656
#if defined(PNG_iCCP_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_charp name;
darco 56a656
      png_charp profile;
darco 56a656
      png_uint_32 proflen;
darco 56a656
      int compression_type;
darco 56a656
darco 56a656
      if (png_get_iCCP(read_ptr, read_info_ptr, &name, &compression_type,
darco 56a656
                      &profile, &proflen))
darco 56a656
      {
darco 56a656
         png_set_iCCP(write_ptr, write_info_ptr, name, compression_type,
darco 56a656
                      profile, proflen);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_sRGB_SUPPORTED)
darco 56a656
   {
darco 56a656
      int intent;
darco 56a656
darco 56a656
      if (png_get_sRGB(read_ptr, read_info_ptr, &intent))
darco 56a656
      {
darco 56a656
         png_set_sRGB(write_ptr, write_info_ptr, intent);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
   {
darco 56a656
      png_colorp palette;
darco 56a656
      int num_palette;
darco 56a656
darco 56a656
      if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette))
darco 56a656
      {
darco 56a656
         png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#if defined(PNG_bKGD_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_color_16p background;
darco 56a656
darco 56a656
      if (png_get_bKGD(read_ptr, read_info_ptr, &background))
darco 56a656
      {
darco 56a656
         png_set_bKGD(write_ptr, write_info_ptr, background);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_hIST_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_uint_16p hist;
darco 56a656
darco 56a656
      if (png_get_hIST(read_ptr, read_info_ptr, &hist))
darco 56a656
      {
darco 56a656
         png_set_hIST(write_ptr, write_info_ptr, hist);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_oFFs_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_int_32 offset_x, offset_y;
darco 56a656
      int unit_type;
darco 56a656
darco 56a656
      if (png_get_oFFs(read_ptr, read_info_ptr,&offset_x,&offset_y,&unit_type))
darco 56a656
      {
darco 56a656
         png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_pCAL_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_charp purpose, units;
darco 56a656
      png_charpp params;
darco 56a656
      png_int_32 X0, X1;
darco 56a656
      int type, nparams;
darco 56a656
darco 56a656
      if (png_get_pCAL(read_ptr, read_info_ptr, &purpose, &X0, &X1, &type,
darco 56a656
         &nparams, &units, ¶ms))
darco 56a656
      {
darco 56a656
         png_set_pCAL(write_ptr, write_info_ptr, purpose, X0, X1, type,
darco 56a656
            nparams, units, params);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_pHYs_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_uint_32 res_x, res_y;
darco 56a656
      int unit_type;
darco 56a656
darco 56a656
      if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y, &unit_type))
darco 56a656
      {
darco 56a656
         png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_sBIT_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_color_8p sig_bit;
darco 56a656
darco 56a656
      if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit))
darco 56a656
      {
darco 56a656
         png_set_sBIT(write_ptr, write_info_ptr, sig_bit);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_sCAL_SUPPORTED)
darco 56a656
#ifdef PNG_FLOATING_POINT_SUPPORTED
darco 56a656
   {
darco 56a656
      int unit;
darco 56a656
      double scal_width, scal_height;
darco 56a656
darco 56a656
      if (png_get_sCAL(read_ptr, read_info_ptr, &unit, &scal_width,
darco 56a656
         &scal_height))
darco 56a656
      {
darco 56a656
         png_set_sCAL(write_ptr, write_info_ptr, unit, scal_width, scal_height);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#else
darco 56a656
#ifdef PNG_FIXED_POINT_SUPPORTED
darco 56a656
   {
darco 56a656
      int unit;
darco 56a656
      png_charp scal_width, scal_height;
darco 56a656
darco 56a656
      if (png_get_sCAL_s(read_ptr, read_info_ptr, &unit, &scal_width,
darco 56a656
          &scal_height))
darco 56a656
      {
darco 56a656
         png_set_sCAL_s(write_ptr, write_info_ptr, unit, scal_width, scal_height);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#endif
darco 56a656
#endif
darco 56a656
#if defined(PNG_TEXT_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_textp text_ptr;
darco 56a656
      int num_text;
darco 56a656
darco 56a656
      if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0)
darco 56a656
      {
darco 56a656
         png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks\n", num_text);
darco 56a656
         png_set_text(write_ptr, write_info_ptr, text_ptr, num_text);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_tIME_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_timep mod_time;
darco 56a656
darco 56a656
      if (png_get_tIME(read_ptr, read_info_ptr, &mod_time))
darco 56a656
      {
darco 56a656
         png_set_tIME(write_ptr, write_info_ptr, mod_time);
darco 56a656
#if defined(PNG_TIME_RFC1123_SUPPORTED)
darco 56a656
         /* we have to use png_strcpy instead of "=" because the string
darco 56a656
            pointed to by png_convert_to_rfc1123() gets free'ed before
darco 56a656
            we use it */
darco 56a656
         png_strcpy(tIME_string,png_convert_to_rfc1123(read_ptr, mod_time));
darco 56a656
         tIME_chunk_present++;
darco 56a656
#endif /* PNG_TIME_RFC1123_SUPPORTED */
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_tRNS_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_bytep trans;
darco 56a656
      int num_trans;
darco 56a656
      png_color_16p trans_values;
darco 56a656
darco 56a656
      if (png_get_tRNS(read_ptr, read_info_ptr, &trans, &num_trans,
darco 56a656
         &trans_values))
darco 56a656
      {
darco 56a656
         png_set_tRNS(write_ptr, write_info_ptr, trans, num_trans,
darco 56a656
            trans_values);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_unknown_chunkp unknowns;
darco 56a656
      int num_unknowns = (int)png_get_unknown_chunks(read_ptr, read_info_ptr,
darco 56a656
         &unknowns);
darco 56a656
      if (num_unknowns)
darco 56a656
      {
darco 56a656
         png_size_t i;
darco 56a656
         png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns,
darco 56a656
           num_unknowns);
darco 56a656
         /* copy the locations from the read_info_ptr.  The automatically
darco 56a656
            generated locations in write_info_ptr are wrong because we
darco 56a656
            haven't written anything yet */
darco 56a656
         for (i = 0; i < (png_size_t)num_unknowns; i++)
darco 56a656
           png_set_unknown_chunk_location(write_ptr, write_info_ptr, i,
darco 56a656
             unknowns[i].location);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
   png_debug(0, "\nWriting info struct\n");
darco 56a656
darco 56a656
/* If we wanted, we could write info in two steps:
darco 56a656
   png_write_info_before_PLTE(write_ptr, write_info_ptr);
darco 56a656
 */
darco 56a656
   png_write_info(write_ptr, write_info_ptr);
darco 56a656
#endif
darco 56a656
darco 56a656
#ifdef SINGLE_ROWBUF_ALLOC
darco 56a656
   png_debug(0, "\nAllocating row buffer...");
darco 56a656
   row_buf = (png_bytep)png_malloc(read_ptr,
darco 56a656
      png_get_rowbytes(read_ptr, read_info_ptr));
darco 56a656
   png_debug1(0, "0x%08lx\n\n", (unsigned long)row_buf);
darco 56a656
#endif /* SINGLE_ROWBUF_ALLOC */
darco 56a656
   png_debug(0, "Writing row data\n");
darco 56a656
darco 56a656
#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
darco 56a656
  defined(PNG_WRITE_INTERLACING_SUPPORTED)
darco 56a656
   num_pass = png_set_interlace_handling(read_ptr);
darco 56a656
#  ifdef PNG_WRITE_SUPPORTED
darco 56a656
   png_set_interlace_handling(write_ptr);
darco 56a656
#  endif
darco 56a656
#else
darco 56a656
   num_pass=1;
darco 56a656
#endif
darco 56a656
darco 56a656
#ifdef PNGTEST_TIMING
darco 56a656
   t_stop = (float)clock();
darco 56a656
   t_misc += (t_stop - t_start);
darco 56a656
   t_start = t_stop;
darco 56a656
#endif
darco 56a656
   for (pass = 0; pass < num_pass; pass++)
darco 56a656
   {
darco 56a656
      png_debug1(0, "Writing row data for pass %d\n",pass);
darco 56a656
      for (y = 0; y < height; y++)
darco 56a656
      {
darco 56a656
#ifndef SINGLE_ROWBUF_ALLOC
darco 56a656
         png_debug2(0, "\nAllocating row buffer (pass %d, y = %ld)...", pass,y);
darco 56a656
         row_buf = (png_bytep)png_malloc(read_ptr,
darco 56a656
            png_get_rowbytes(read_ptr, read_info_ptr));
darco 56a656
         png_debug2(0, "0x%08lx (%ld bytes)\n", (unsigned long)row_buf,
darco 56a656
            png_get_rowbytes(read_ptr, read_info_ptr));
darco 56a656
#endif /* !SINGLE_ROWBUF_ALLOC */
darco 56a656
         png_read_rows(read_ptr, (png_bytepp)&row_buf, png_bytepp_NULL, 1);
darco 56a656
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
#ifdef PNGTEST_TIMING
darco 56a656
         t_stop = (float)clock();
darco 56a656
         t_decode += (t_stop - t_start);
darco 56a656
         t_start = t_stop;
darco 56a656
#endif
darco 56a656
         png_write_rows(write_ptr, (png_bytepp)&row_buf, 1);
darco 56a656
#ifdef PNGTEST_TIMING
darco 56a656
         t_stop = (float)clock();
darco 56a656
         t_encode += (t_stop - t_start);
darco 56a656
         t_start = t_stop;
darco 56a656
#endif
darco 56a656
#endif /* PNG_WRITE_SUPPORTED */
darco 56a656
darco 56a656
#ifndef SINGLE_ROWBUF_ALLOC
darco 56a656
         png_debug2(0, "Freeing row buffer (pass %d, y = %ld)\n\n", pass, y);
darco 56a656
         png_free(read_ptr, row_buf);
darco 56a656
#endif /* !SINGLE_ROWBUF_ALLOC */
darco 56a656
      }
darco 56a656
   }
darco 56a656
darco 56a656
#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
darco 56a656
   png_free_data(read_ptr, read_info_ptr, PNG_FREE_UNKN, -1);
darco 56a656
#endif
darco 56a656
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
darco 56a656
   png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1);
darco 56a656
#endif
darco 56a656
darco 56a656
   png_debug(0, "Reading and writing end_info data\n");
darco 56a656
darco 56a656
   png_read_end(read_ptr, end_info_ptr);
darco 56a656
#if defined(PNG_TEXT_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_textp text_ptr;
darco 56a656
      int num_text;
darco 56a656
darco 56a656
      if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0)
darco 56a656
      {
darco 56a656
         png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks\n", num_text);
darco 56a656
         png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_tIME_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_timep mod_time;
darco 56a656
darco 56a656
      if (png_get_tIME(read_ptr, end_info_ptr, &mod_time))
darco 56a656
      {
darco 56a656
         png_set_tIME(write_ptr, write_end_info_ptr, mod_time);
darco 56a656
#if defined(PNG_TIME_RFC1123_SUPPORTED)
darco 56a656
         /* we have to use png_strcpy instead of "=" because the string
darco 56a656
            pointed to by png_convert_to_rfc1123() gets free'ed before
darco 56a656
            we use it */
darco 56a656
         png_strcpy(tIME_string,png_convert_to_rfc1123(read_ptr, mod_time));
darco 56a656
         tIME_chunk_present++;
darco 56a656
#endif /* PNG_TIME_RFC1123_SUPPORTED */
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
darco 56a656
   {
darco 56a656
      png_unknown_chunkp unknowns;
darco 56a656
      int num_unknowns;
darco 56a656
      num_unknowns = (int)png_get_unknown_chunks(read_ptr, end_info_ptr,
darco 56a656
         &unknowns);
darco 56a656
      if (num_unknowns)
darco 56a656
      {
darco 56a656
         png_size_t i;
darco 56a656
         png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns,
darco 56a656
           num_unknowns);
darco 56a656
         /* copy the locations from the read_info_ptr.  The automatically
darco 56a656
            generated locations in write_end_info_ptr are wrong because we
darco 56a656
            haven't written the end_info yet */
darco 56a656
         for (i = 0; i < (png_size_t)num_unknowns; i++)
darco 56a656
           png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i,
darco 56a656
             unknowns[i].location);
darco 56a656
      }
darco 56a656
   }
darco 56a656
#endif
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
   png_write_end(write_ptr, write_end_info_ptr);
darco 56a656
#endif
darco 56a656
darco 56a656
#ifdef PNG_EASY_ACCESS_SUPPORTED
darco 56a656
   if(verbose)
darco 56a656
   {
darco 56a656
      png_uint_32 iwidth, iheight;
darco 56a656
      iwidth = png_get_image_width(write_ptr, write_info_ptr);
darco 56a656
      iheight = png_get_image_height(write_ptr, write_info_ptr);
darco 56a656
      fprintf(STDERR, "Image width = %lu, height = %lu\n",
darco 56a656
         iwidth, iheight);
darco 56a656
   }
darco 56a656
#endif
darco 56a656
darco 56a656
   png_debug(0, "Destroying data structs\n");
darco 56a656
#ifdef SINGLE_ROWBUF_ALLOC
darco 56a656
   png_debug(1, "destroying row_buf for read_ptr\n");
darco 56a656
   png_free(read_ptr, row_buf);
darco 56a656
   row_buf=NULL;
darco 56a656
#endif /* SINGLE_ROWBUF_ALLOC */
darco 56a656
   png_debug(1, "destroying read_ptr, read_info_ptr, end_info_ptr\n");
darco 56a656
   png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
darco 56a656
#ifdef PNG_WRITE_SUPPORTED
darco 56a656
   png_debug(1, "destroying write_end_info_ptr\n");
darco 56a656
   png_destroy_info_struct(write_ptr, &write_end_info_ptr);
darco 56a656
   png_debug(1, "destroying write_ptr, write_info_ptr\n");
darco 56a656
   png_destroy_write_struct(&write_ptr, &write_info_ptr);
darco 56a656
#endif
darco 56a656
   png_debug(0, "Destruction complete.\n");
darco 56a656
darco 56a656
   FCLOSE(fpin);
darco 56a656
   FCLOSE(fpout);
darco 56a656
darco 56a656
   png_debug(0, "Opening files for comparison\n");
darco 56a656
#if defined(_WIN32_WCE)
darco 56a656
   MultiByteToWideChar(CP_ACP, 0, inname, -1, path, MAX_PATH);
darco 56a656
   if ((fpin = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
darco 56a656
#else
darco 56a656
   if ((fpin = fopen(inname, "rb")) == NULL)
darco 56a656
#endif
darco 56a656
   {
darco 56a656
      fprintf(STDERR, "Could not find file %s\n", inname);
darco 56a656
      return (1);
darco 56a656
   }
darco 56a656
darco 56a656
#if defined(_WIN32_WCE)
darco 56a656
   MultiByteToWideChar(CP_ACP, 0, outname, -1, path, MAX_PATH);
darco 56a656
   if ((fpout = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
darco 56a656
#else
darco 56a656
   if ((fpout = fopen(outname, "rb")) == NULL)
darco 56a656
#endif
darco 56a656
   {
darco 56a656
      fprintf(STDERR, "Could not find file %s\n", outname);
darco 56a656
      FCLOSE(fpin);
darco 56a656
      return (1);
darco 56a656
   }
darco 56a656
darco 56a656
   for(;;)
darco 56a656
   {
darco 56a656
      png_size_t num_in, num_out;
darco 56a656
darco 56a656
      READFILE(fpin, inbuf, 1, num_in);
darco 56a656
      READFILE(fpout, outbuf, 1, num_out);
darco 56a656
darco 56a656
      if (num_in != num_out)
darco 56a656
      {
darco 56a656
         fprintf(STDERR, "\nFiles %s and %s are of a different size\n",
darco 56a656
                 inname, outname);
darco 56a656
         if(wrote_question == 0)
darco 56a656
         {
darco 56a656
            fprintf(STDERR,
darco 56a656
         "   Was %s written with the same maximum IDAT chunk size (%d bytes),",
darco 56a656
              inname,PNG_ZBUF_SIZE);
darco 56a656
            fprintf(STDERR,
darco 56a656
              "\n   filtering heuristic (libpng default), compression");
darco 56a656
            fprintf(STDERR,
darco 56a656
              " level (zlib default),\n   and zlib version (%s)?\n\n",
darco 56a656
              ZLIB_VERSION);
darco 56a656
            wrote_question=1;
darco 56a656
         }
darco 56a656
         FCLOSE(fpin);
darco 56a656
         FCLOSE(fpout);
darco 56a656
         return (0);
darco 56a656
      }
darco 56a656
darco 56a656
      if (!num_in)
darco 56a656
         break;
darco 56a656
darco 56a656
      if (png_memcmp(inbuf, outbuf, num_in))
darco 56a656
      {
darco 56a656
         fprintf(STDERR, "\nFiles %s and %s are different\n", inname, outname);
darco 56a656
         if(wrote_question == 0)
darco 56a656
         {
darco 56a656
            fprintf(STDERR,
darco 56a656
         "   Was %s written with the same maximum IDAT chunk size (%d bytes),",
darco 56a656
                 inname,PNG_ZBUF_SIZE);
darco 56a656
            fprintf(STDERR,
darco 56a656
              "\n   filtering heuristic (libpng default), compression");
darco 56a656
            fprintf(STDERR,
darco 56a656
              " level (zlib default),\n   and zlib version (%s)?\n\n",
darco 56a656
              ZLIB_VERSION);
darco 56a656
            wrote_question=1;
darco 56a656
         }
darco 56a656
         FCLOSE(fpin);
darco 56a656
         FCLOSE(fpout);
darco 56a656
         return (0);
darco 56a656
      }
darco 56a656
   }
darco 56a656
darco 56a656
   FCLOSE(fpin);
darco 56a656
   FCLOSE(fpout);
darco 56a656
darco 56a656
   return (0);
darco 56a656
}
darco 56a656
darco 56a656
/* input and output filenames */
darco 56a656
#ifdef RISCOS
darco 56a656
static PNG_CONST char *inname = "pngtest/png";
darco 56a656
static PNG_CONST char *outname = "pngout/png";
darco 56a656
#else
darco 56a656
static PNG_CONST char *inname = "pngtest.png";
darco 56a656
static PNG_CONST char *outname = "pngout.png";
darco 56a656
#endif
darco 56a656
darco 56a656
int
darco 56a656
main(int argc, char *argv[])
darco 56a656
{
darco 56a656
   int multiple = 0;
darco 56a656
   int ierror = 0;
darco 56a656
darco 56a656
   fprintf(STDERR, "Testing libpng version %s\n", PNG_LIBPNG_VER_STRING);
darco 56a656
   fprintf(STDERR, "   with zlib   version %s\n", ZLIB_VERSION);
darco 56a656
   fprintf(STDERR,"%s",png_get_copyright(NULL));
darco 56a656
   /* Show the version of libpng used in building the library */
darco 56a656
   fprintf(STDERR," library (%lu):%s", png_access_version_number(),
darco 56a656
      png_get_header_version(NULL));
darco 56a656
   /* Show the version of libpng used in building the application */
darco 56a656
   fprintf(STDERR," pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER,
darco 56a656
      PNG_HEADER_VERSION_STRING);
darco 56a656
   fprintf(STDERR," sizeof(png_struct)=%ld, sizeof(png_info)=%ld\n",
darco 56a656
                    (long)sizeof(png_struct), (long)sizeof(png_info));
darco 56a656
darco 56a656
   /* Do some consistency checking on the memory allocation settings, I'm
darco 56a656
      not sure this matters, but it is nice to know, the first of these
darco 56a656
      tests should be impossible because of the way the macros are set
darco 56a656
      in pngconf.h */
darco 56a656
#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)
darco 56a656
      fprintf(STDERR, " NOTE: Zlib compiled for max 64k, libpng not\n");
darco 56a656
#endif
darco 56a656
   /* I think the following can happen. */
darco 56a656
#if !defined(MAXSEG_64K) && defined(PNG_MAX_MALLOC_64K)
darco 56a656
      fprintf(STDERR, " NOTE: libpng compiled for max 64k, zlib not\n");
darco 56a656
#endif
darco 56a656
darco 56a656
   if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING))
darco 56a656
   {
darco 56a656
      fprintf(STDERR,
darco 56a656
         "Warning: versions are different between png.h and png.c\n");
darco 56a656
      fprintf(STDERR, "  png.h version: %s\n", PNG_LIBPNG_VER_STRING);
darco 56a656
      fprintf(STDERR, "  png.c version: %s\n\n", png_libpng_ver);
darco 56a656
      ++ierror;
darco 56a656
   }
darco 56a656
darco 56a656
   if (argc > 1)
darco 56a656
   {
darco 56a656
      if (strcmp(argv[1], "-m") == 0)
darco 56a656
      {
darco 56a656
         multiple = 1;
darco 56a656
         status_dots_requested = 0;
darco 56a656
      }
darco 56a656
      else if (strcmp(argv[1], "-mv") == 0 ||
darco 56a656
               strcmp(argv[1], "-vm") == 0 )
darco 56a656
      {
darco 56a656
         multiple = 1;
darco 56a656
         verbose = 1;
darco 56a656
         status_dots_requested = 1;
darco 56a656
      }
darco 56a656
      else if (strcmp(argv[1], "-v") == 0)
darco 56a656
      {
darco 56a656
         verbose = 1;
darco 56a656
         status_dots_requested = 1;
darco 56a656
         inname = argv[2];
darco 56a656
      }
darco 56a656
      else
darco 56a656
      {
darco 56a656
         inname = argv[1];
darco 56a656
         status_dots_requested = 0;
darco 56a656
      }
darco 56a656
   }
darco 56a656
darco 56a656
   if (!multiple && argc == 3+verbose)
darco 56a656
     outname = argv[2+verbose];
darco 56a656
darco 56a656
   if ((!multiple && argc > 3+verbose) || (multiple && argc < 2))
darco 56a656
   {
darco 56a656
     fprintf(STDERR,
darco 56a656
       "usage: %s [infile.png] [outfile.png]\n\t%s -m {infile.png}\n",
darco 56a656
        argv[0], argv[0]);
darco 56a656
     fprintf(STDERR,
darco 56a656
       "  reads/writes one PNG file (without -m) or multiple files (-m)\n");
darco 56a656
     fprintf(STDERR,
darco 56a656
       "  with -m %s is used as a temporary file\n", outname);
darco 56a656
     exit(1);
darco 56a656
   }
darco 56a656
darco 56a656
   if (multiple)
darco 56a656
   {
darco 56a656
      int i;
darco 56a656
#ifdef PNG_USER_MEM_SUPPORTED
darco 56a656
      int allocation_now = current_allocation;
darco 56a656
#endif
darco 56a656
      for (i=2; i
darco 56a656
      {
darco 56a656
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
darco 56a656
         int k;
darco 56a656
#endif
darco 56a656
         int kerror;
darco 56a656
         fprintf(STDERR, "Testing %s:",argv[i]);
darco 56a656
         kerror = test_one_file(argv[i], outname);
darco 56a656
         if (kerror == 0)
darco 56a656
         {
darco 56a656
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
darco 56a656
            fprintf(STDERR, "\n PASS (%lu zero samples)\n",zero_samples);
darco 56a656
#else
darco 56a656
            fprintf(STDERR, " PASS\n");
darco 56a656
#endif
darco 56a656
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
darco 56a656
            for (k=0; k<256; k++)
darco 56a656
               if(filters_used[k])
darco 56a656
                  fprintf(STDERR, " Filter %d was used %lu times\n",
darco 56a656
                     k,filters_used[k]);
darco 56a656
#endif
darco 56a656
#if defined(PNG_TIME_RFC1123_SUPPORTED)
darco 56a656
         if(tIME_chunk_present != 0)
darco 56a656
            fprintf(STDERR, " tIME = %s\n",tIME_string);
darco 56a656
         tIME_chunk_present = 0;
darco 56a656
#endif /* PNG_TIME_RFC1123_SUPPORTED */
darco 56a656
         }
darco 56a656
         else
darco 56a656
         {
darco 56a656
            fprintf(STDERR, " FAIL\n");
darco 56a656
            ierror += kerror;
darco 56a656
         }
darco 56a656
#ifdef PNG_USER_MEM_SUPPORTED
darco 56a656
         if (allocation_now != current_allocation)
darco 56a656
            fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
darco 56a656
               current_allocation-allocation_now);
darco 56a656
         if (current_allocation != 0)
darco 56a656
         {
darco 56a656
            memory_infop pinfo = pinformation;
darco 56a656
darco 56a656
            fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n",
darco 56a656
               current_allocation);
darco 56a656
            while (pinfo != NULL)
darco 56a656
            {
darco 56a656
               fprintf(STDERR, " %lu bytes at %x\n", pinfo->size, 
darco 56a656
                 (unsigned int) pinfo->pointer);
darco 56a656
               pinfo = pinfo->next;
darco 56a656
            }
darco 56a656
         }
darco 56a656
#endif
darco 56a656
      }
darco 56a656
#ifdef PNG_USER_MEM_SUPPORTED
darco 56a656
         fprintf(STDERR, " Current memory allocation: %10d bytes\n",
darco 56a656
            current_allocation);
darco 56a656
         fprintf(STDERR, " Maximum memory allocation: %10d bytes\n",
darco 56a656
            maximum_allocation);
darco 56a656
         fprintf(STDERR, " Total   memory allocation: %10d bytes\n",
darco 56a656
            total_allocation);
darco 56a656
         fprintf(STDERR, "     Number of allocations: %10d\n",
darco 56a656
            num_allocations);
darco 56a656
#endif
darco 56a656
   }
darco 56a656
   else
darco 56a656
   {
darco 56a656
      int i;
darco 56a656
      for (i=0; i<3; ++i)
darco 56a656
      {
darco 56a656
         int kerror;
darco 56a656
#ifdef PNG_USER_MEM_SUPPORTED
darco 56a656
         int allocation_now = current_allocation;
darco 56a656
#endif
darco 56a656
         if (i == 1) status_dots_requested = 1;
darco 56a656
         else if(verbose == 0)status_dots_requested = 0;
darco 56a656
         if (i == 0 || verbose == 1 || ierror != 0)
darco 56a656
            fprintf(STDERR, "Testing %s:",inname);
darco 56a656
         kerror = test_one_file(inname, outname);
darco 56a656
         if(kerror == 0)
darco 56a656
         {
darco 56a656
            if(verbose == 1 || i == 2)
darco 56a656
            {
darco 56a656
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
darco 56a656
                int k;
darco 56a656
#endif
darco 56a656
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
darco 56a656
                fprintf(STDERR, "\n PASS (%lu zero samples)\n",zero_samples);
darco 56a656
#else
darco 56a656
                fprintf(STDERR, " PASS\n");
darco 56a656
#endif
darco 56a656
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
darco 56a656
                for (k=0; k<256; k++)
darco 56a656
                   if(filters_used[k])
darco 56a656
                      fprintf(STDERR, " Filter %d was used %lu times\n",
darco 56a656
                         k,filters_used[k]);
darco 56a656
#endif
darco 56a656
#if defined(PNG_TIME_RFC1123_SUPPORTED)
darco 56a656
             if(tIME_chunk_present != 0)
darco 56a656
                fprintf(STDERR, " tIME = %s\n",tIME_string);
darco 56a656
#endif /* PNG_TIME_RFC1123_SUPPORTED */
darco 56a656
            }
darco 56a656
         }
darco 56a656
         else
darco 56a656
         {
darco 56a656
            if(verbose == 0 && i != 2)
darco 56a656
               fprintf(STDERR, "Testing %s:",inname);
darco 56a656
            fprintf(STDERR, " FAIL\n");
darco 56a656
            ierror += kerror;
darco 56a656
         }
darco 56a656
#ifdef PNG_USER_MEM_SUPPORTED
darco 56a656
         if (allocation_now != current_allocation)
darco 56a656
             fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
darco 56a656
               current_allocation-allocation_now);
darco 56a656
         if (current_allocation != 0)
darco 56a656
         {
darco 56a656
             memory_infop pinfo = pinformation;
darco 56a656
darco 56a656
             fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n",
darco 56a656
                current_allocation);
darco 56a656
             while (pinfo != NULL)
darco 56a656
             {
darco 56a656
                fprintf(STDERR," %lu bytes at %x\n",
darco 56a656
                   pinfo->size, (unsigned int)pinfo->pointer);
darco 56a656
                pinfo = pinfo->next;
darco 56a656
             }
darco 56a656
          }
darco 56a656
#endif
darco 56a656
       }
darco 56a656
#ifdef PNG_USER_MEM_SUPPORTED
darco 56a656
       fprintf(STDERR, " Current memory allocation: %10d bytes\n",
darco 56a656
          current_allocation);
darco 56a656
       fprintf(STDERR, " Maximum memory allocation: %10d bytes\n",
darco 56a656
          maximum_allocation);
darco 56a656
       fprintf(STDERR, " Total   memory allocation: %10d bytes\n",
darco 56a656
          total_allocation);
darco 56a656
       fprintf(STDERR, "     Number of allocations: %10d\n",
darco 56a656
            num_allocations);
darco 56a656
#endif
darco 56a656
   }
darco 56a656
darco 56a656
#ifdef PNGTEST_TIMING
darco 56a656
   t_stop = (float)clock();
darco 56a656
   t_misc += (t_stop - t_start);
darco 56a656
   t_start = t_stop;
darco 56a656
   fprintf(STDERR," CPU time used = %.3f seconds",
darco 56a656
      (t_misc+t_decode+t_encode)/(float)CLOCKS_PER_SEC);
darco 56a656
   fprintf(STDERR," (decoding %.3f,\n",
darco 56a656
      t_decode/(float)CLOCKS_PER_SEC);
darco 56a656
   fprintf(STDERR,"        encoding %.3f ,",
darco 56a656
      t_encode/(float)CLOCKS_PER_SEC);
darco 56a656
   fprintf(STDERR," other %.3f seconds)\n\n",
darco 56a656
      t_misc/(float)CLOCKS_PER_SEC);
darco 56a656
#endif
darco 56a656
darco 56a656
   if (ierror == 0)
darco 56a656
      fprintf(STDERR, "libpng passes test\n");
darco 56a656
   else
darco 56a656
      fprintf(STDERR, "libpng FAILS test\n");
darco 56a656
   return (int)(ierror != 0);
darco 56a656
}
darco 56a656
darco 56a656
/* Generate a compiler error if there is an old png.h in the search path. */
darco 56a656
typedef version_1_2_5 your_png_h_is_not_version_1_2_5;