1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngtest.c - a simple test program to test libpng
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
4851c67770f9cebece9c79e914a54c348f539a512Matt Sarett * Last changed in libpng 1.6.25 [September 1, 2016]
57a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
9a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This code is released under the libpng license.
10a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * For conditions of distribution and use, see the disclaimer
11a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * and license in png.h
12a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott *
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * This program reads in a PNG image, writes it out again, and then
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * compares the two files.  If the files are identical, this shows that
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the basic chunk handling, filtering, and (de)compression code is working
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * properly.  It does not currently test all of the transforms, although
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it probably should.
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * The program will report "FAIL" in certain legitimate cases:
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 1) when the compression level or filter selection method is changed.
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 2) when the maximum IDAT size (PNG_ZBUF_SIZE in pngconf.h) is not 8192.
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 3) unknown unsafe-to-copy ancillary chunks or unknown critical chunks
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *    exist in the input file.
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 4) others not listed here...
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * In these cases, it is best to check with another tool such as "pngcheck"
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * to see what the differences between the two files are.
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * If a filename is given on the command-line, then this file is used
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * for the input, rather than the default "pngtest.png".  This allows
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * testing a wide variety of files easily.  You can also test a number
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * of files at once by typing "pngtest -m file1.png file2.png ..."
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
34b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define _POSIX_SOURCE 1
35b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
36b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#include <stdio.h>
37b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#include <stdlib.h>
38b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#include <string.h>
39b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
40b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Defined so I can write to a file on gui/windowing platforms */
41b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/*  #define STDERR stderr  */
42b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define STDERR stdout   /* For DOS */
43b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h"
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
46851c67770f9cebece9c79e914a54c348f539a512Matt Sarett/* 1.6.1 added support for the configure test harness, which uses 77 to indicate
47851c67770f9cebece9c79e914a54c348f539a512Matt Sarett * a skipped test, in earlier versions we need to succeed on a skipped test, so:
48851c67770f9cebece9c79e914a54c348f539a512Matt Sarett */
49851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#if PNG_LIBPNG_VER >= 10601 && defined(HAVE_CONFIG_H)
50851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#  define SKIP 77
51851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#else
52851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#  define SKIP 0
53851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#endif
54851c67770f9cebece9c79e914a54c348f539a512Matt Sarett
55b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Known chunks that exist in pngtest.png must be supported or pngtest will fail
56b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * simply as a result of re-ordering them.  This may be fixed in 1.7
57b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari *
58b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * pngtest allocates a single row buffer for each row and overwrites it,
59b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * therefore if the write side doesn't support the writing of interlaced images
60b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * nothing can be done for an interlaced image (and the code below will fail
61b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * horribly trying to write extra data after writing garbage).
62b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
63b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if defined PNG_READ_SUPPORTED && /* else nothing can be done */\
64b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_bKGD_SUPPORTED &&\
65b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_cHRM_SUPPORTED &&\
66b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_gAMA_SUPPORTED &&\
67b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_oFFs_SUPPORTED &&\
68b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_pCAL_SUPPORTED &&\
69b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_pHYs_SUPPORTED &&\
70b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_sBIT_SUPPORTED &&\
71b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_sCAL_SUPPORTED &&\
72b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_sRGB_SUPPORTED &&\
7306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   defined PNG_READ_sPLT_SUPPORTED &&\
74b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_tEXt_SUPPORTED &&\
75b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_tIME_SUPPORTED &&\
76b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   defined PNG_READ_zTXt_SUPPORTED &&\
7706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   (defined PNG_WRITE_INTERLACING_SUPPORTED || PNG_LIBPNG_VER >= 10700)
78b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari
79b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_ZLIB_HEADER
80b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  include PNG_ZLIB_HEADER /* defined by pnglibconf.h from 1.7 */
81b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#else
82b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  include "zlib.h"
83b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
84b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
85b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Copied from pngpriv.h but only used in error messages below. */
86b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifndef PNG_ZBUF_SIZE
87b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define PNG_ZBUF_SIZE 8192
88b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
89b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define FCLOSE(file) fclose(file)
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifndef PNG_STDIO_SUPPORTED
92b50c217251b086440efcdb273c22f86a06c80cbaChris Craiktypedef FILE                * png_FILE_p;
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
95b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Makes pngtest verbose so we can find problems. */
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_DEBUG
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  define PNG_DEBUG 0
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
100b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if PNG_DEBUG > 1
101b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug(m)        ((void)fprintf(stderr, m "\n"))
102b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug1(m,p1)    ((void)fprintf(stderr, m "\n", p1))
103b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug2(m,p1,p2) ((void)fprintf(stderr, m "\n", p1, p2))
104b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#else
105b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug(m)        ((void)0)
106b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug1(m,p1)    ((void)0)
107b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug2(m,p1,p2) ((void)0)
108b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
109b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !PNG_DEBUG
111a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#  define SINGLE_ROWBUF_ALLOC  /* Makes buffer overruns easier to nail */
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#ifndef PNG_UNUSED
11506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#  define PNG_UNUSED(param) (void)param;
11606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
11706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Turn on CPU timing
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNGTEST_TIMING
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project*/
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1225f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifndef PNG_FLOATING_POINT_SUPPORTED
123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#undef PNGTEST_TIMING
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic float t_start, t_stop, t_decode, t_encode, t_misc;
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <time.h>
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1315f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
1324215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#define PNG_tIME_STRING_LENGTH 29
1334215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic int tIME_chunk_present = 0;
1344215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic char tIME_string[PNG_tIME_STRING_LENGTH] = "tIME chunk is not present";
13506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
13606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#if PNG_LIBPNG_VER < 10619
13706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#define png_convert_to_rfc1123_buffer(ts, t) tIME_to_str(read_ptr, ts, t)
13806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
13906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarettstatic int
14006f1087a94f1e48298e89d77ccc51a0ced871958Matt SaretttIME_to_str(png_structp png_ptr, png_charp ts, png_const_timep t)
14106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett{
1427a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   png_const_charp str = png_convert_to_rfc1123(png_ptr, t);
14306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
1447a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   if (str == NULL)
1457a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       return 0;
14606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
1477a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   strcpy(ts, str);
1487a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   return 1;
14906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett}
15006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* older libpng */
151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic int verbose = 0;
154b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int strict = 0;
155b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int relaxed = 0;
156b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int unsupported_chunks = 0; /* chunk unsupported by libpng in input */
157b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int error_count = 0; /* count calls to png_error */
158b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int warning_count = 0; /* count calls to png_warning */
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */
161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef png_jmpbuf
162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  define png_jmpbuf(png_ptr) png_ptr->jmpbuf
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
165b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Defines for unknown chunk handling if required. */
166b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifndef PNG_HANDLE_CHUNK_ALWAYS
167b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define PNG_HANDLE_CHUNK_ALWAYS       3
168b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
169b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifndef PNG_HANDLE_CHUNK_IF_SAFE
170b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define PNG_HANDLE_CHUNK_IF_SAFE      2
171b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
172b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
173b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Utility to save typing/errors, the argument must be a name */
174b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define MEMZERO(var) ((void)memset(&var, 0, sizeof var))
175b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
176a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Example of using row callbacks to make a simple progress meter */
1774215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic int status_pass = 1;
1784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic int status_dots_requested = 0;
1794215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic int status_dots = 1;
1804215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
181b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectread_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
184a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL || row_number > PNG_UINT_31_MAX)
185a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
186b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
187a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (status_pass != pass)
188a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   {
189a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(stdout, "\n Pass %d: ", pass);
190a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      status_pass = pass;
191a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      status_dots = 31;
192a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   }
193b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
194a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   status_dots--;
195b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
196a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (status_dots == 0)
197a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   {
198a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(stdout, "\n         ");
199a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      status_dots=30;
200a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   }
201b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
202a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   fprintf(stdout, "r");
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
205b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_SUPPORTED
206b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectwrite_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
209a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7)
210a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
211b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
212a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   fprintf(stdout, "w");
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
214b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2175f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
21806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett/* Example of using a user transform callback (doesn't do anything at present).
219a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
220b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
22106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarettread_user_callback(png_structp png_ptr, png_row_infop row_info, png_bytep data)
222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
22306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   PNG_UNUSED(png_ptr)
22406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   PNG_UNUSED(row_info)
22506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   PNG_UNUSED(data)
226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
230a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Example of using user transform callback (we don't transform anything,
231a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * but merely count the zero samples)
232a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic png_uint_32 zero_samples;
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
236b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectcount_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data)
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep dp = data;
240b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr == NULL)
241b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return;
242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
243a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Contents of row_info:
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_uint_32 width      width of row
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_uint_32 rowbytes   number of bytes in row
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_byte color_type    color type of pixels
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_byte bit_depth     bit depth of samples
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_byte channels      number of channels (1-4)
249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_byte pixel_depth   bits per pixel (depth*channels)
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2527a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   /* Counts the number of zero samples (or zero pixels if color_type is 3 */
253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2547a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   if (row_info->color_type == 0 || row_info->color_type == 3)
2557a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   {
2567a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      int pos = 0;
2577a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      png_uint_32 n, nstop;
258b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2597a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      for (n = 0, nstop=row_info->width; n<nstop; n++)
2607a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      {
2617a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 1)
2627a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
2637a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (((*dp << pos++ ) & 0x80) == 0)
2647a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
265b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2667a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (pos == 8)
2677a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            {
2687a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               pos = 0;
2697a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp++;
2707a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            }
2717a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
272b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2737a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 2)
2747a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
2757a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (((*dp << (pos+=2)) & 0xc0) == 0)
2767a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
277b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2787a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (pos == 8)
2797a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            {
2807a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               pos = 0;
2817a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp++;
2827a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            }
2837a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
284b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2857a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 4)
2867a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
2877a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (((*dp << (pos+=4)) & 0xf0) == 0)
2887a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
289b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2907a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (pos == 8)
2917a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            {
2927a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               pos = 0;
2937a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp++;
2947a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            }
2957a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
296b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2977a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 8)
2987a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (*dp++ == 0)
2997a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
300b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
3017a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 16)
3027a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
3037a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if ((*dp | *(dp+1)) == 0)
3047a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
3057a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            dp+=2;
3067a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
3077a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      }
3087a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   }
3097a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   else /* Other color types */
3107a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   {
3117a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      png_uint_32 n, nstop;
3127a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      int channel;
3137a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      int color_channels = row_info->channels;
3147a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      if (row_info->color_type > 3)
3157a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         color_channels--;
316b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
3177a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      for (n = 0, nstop=row_info->width; n<nstop; n++)
3187a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      {
3197a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         for (channel = 0; channel < color_channels; channel++)
3207a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
3217a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (row_info->bit_depth == 8)
3227a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               if (*dp++ == 0)
3237a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                  zero_samples++;
324b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
3257a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (row_info->bit_depth == 16)
3267a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            {
3277a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               if ((*dp | *(dp+1)) == 0)
3287a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                  zero_samples++;
3297a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis
3307a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp+=2;
3317a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            }
3327a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
3337a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->color_type > 3)
3347a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
3357a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            dp++;
3367a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (row_info->bit_depth == 16)
3377a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp++;
3387a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
3397a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      }
3407a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   }
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
3429b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_USER_TRANSFORM */
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
3445f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifndef PNG_STDIO_SUPPORTED
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* START of code to validate stdio-free compilation */
346a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* These copies of the default read/write functions come from pngrio.c and
347a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * pngwio.c.  They allow "don't include stdio" testing of the library.
348a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This is the function that does the actual reading of data.  If you are
349a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * not reading from a standard C stream, you should create a replacement
350a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * read_data function and use it at run time with png_set_read_fn(), rather
351a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * than changing the library.
352a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
354b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_IO_STATE_SUPPORTED
355b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid
356b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpngtest_check_io_state(png_structp png_ptr, png_size_t data_length,
3577a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis    png_uint_32 io_op);
358b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid
359b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpngtest_check_io_state(png_structp png_ptr, png_size_t data_length,
3607a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis    png_uint_32 io_op)
361b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
362b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_uint_32 io_state = png_get_io_state(png_ptr);
363b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   int err = 0;
364b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
365b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Check if the current operation (reading / writing) is as expected. */
366b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if ((io_state & PNG_IO_MASK_OP) != io_op)
367b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "Incorrect operation in I/O state");
368b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
369b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Check if the buffer size specific to the current location
370b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * (file signature / header / data / crc) is as expected.
371b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
372b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   switch (io_state & PNG_IO_MASK_LOC)
373b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
374b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   case PNG_IO_SIGNATURE:
375b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (data_length > 8)
376b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         err = 1;
377b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      break;
378b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   case PNG_IO_CHUNK_HDR:
379b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (data_length != 8)
380b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         err = 1;
381b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      break;
382b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   case PNG_IO_CHUNK_DATA:
383b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      break;  /* no restrictions here */
384b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   case PNG_IO_CHUNK_CRC:
385b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (data_length != 4)
386b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         err = 1;
387b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      break;
388b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   default:
389b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      err = 1;  /* uninitialized */
390b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
3919b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (err != 0)
392b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "Bad I/O state or buffer size");
393b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
394b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
395b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
396b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
3995f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_size_t check = 0;
4005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_voidp io_ptr;
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* fread() returns 0 on error, so it is OK to store this in a png_size_t
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * instead of an int, which is what fread() actually returns.
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
4055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   io_ptr = png_get_io_ptr(png_ptr);
4065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   if (io_ptr != NULL)
4075f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   {
408b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      check = fread(data, 1, length, (png_FILE_p)io_ptr);
4095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   }
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (check != length)
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
413b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "Read Error");
414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
416b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_IO_STATE_SUPPORTED
417b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_check_io_state(png_ptr, length, PNG_IO_READING);
418b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
4215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_FLUSH_SUPPORTED
422b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_flush(png_structp png_ptr)
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
425a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Do nothing; fflush() is said to be just a waste of energy. */
426b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   PNG_UNUSED(png_ptr)   /* Stifle compiler warning */
427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This is the function that does the actual writing of data.  If you are
431a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * not writing to a standard C stream, you should create a replacement
432a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * write_data function and use it at run time with png_set_write_fn(), rather
433a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * than changing the library.
434a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
435b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
438b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_size_t check;
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
440b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   check = fwrite(data, 1, length, (png_FILE_p)png_get_io_ptr(png_ptr));
441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (check != length)
443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_error(png_ptr, "Write Error");
445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
446b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
447b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_IO_STATE_SUPPORTED
448b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING);
449b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
4519b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* !STDIO */
452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function is called when there is a warning, but the library thinks
454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it can continue anyway.  Replacement functions don't have to do anything
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * here if you don't want to.  In the default configuration, png_ptr is
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * not used, but it is passed in case it may be useful.
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
458b50c217251b086440efcdb273c22f86a06c80cbaChris Craiktypedef struct
459b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
460b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   PNG_CONST char *file_name;
461b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}  pngtest_error_parameters;
462b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
463b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_warning(png_structp png_ptr, png_const_charp message)
465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST char *name = "UNKNOWN (ERROR!)";
467b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_error_parameters *test =
468b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      (pngtest_error_parameters*)png_get_error_ptr(png_ptr);
469b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
470b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   ++warning_count;
471b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
472b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (test != NULL && test->file_name != NULL)
473b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      name = test->file_name;
474b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
475b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   fprintf(STDERR, "%s: libpng warning: %s\n", name, message);
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This is the default error handling function.  Note that replacements for
479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * this function MUST NOT RETURN, or the program will likely crash.  This
480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * function is used by default, or if the program supplies NULL for the
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * error function pointer in png_set_error_fn().
482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
483b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_error(png_structp png_ptr, png_const_charp message)
485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
486b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   ++error_count;
487b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   pngtest_warning(png_ptr, message);
489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* We can return because png_error calls the default handler, which is
490a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * actually OK in this case.
491a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    */
492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
493b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
4944215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project/* END of code to validate stdio-free compilation */
495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* START of code to validate memory allocation and deallocation */
497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allocate memory.  For reasonable files, size should never exceed
5009b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett * 64K.  However, zlib may allocate more than 64K if you don't tell
501a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * it not to.  See zconf.h and png.h for more information.  zlib does
502a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * need to allocate exactly 64K, so whatever you call here must
503a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * have the ability to do that.
504a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott *
505a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This piece of code can be compiled to validate max 64K allocations
506a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K.
507a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projecttypedef struct memory_information
509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
510b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_alloc_size_t          size;
511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_voidp                 pointer;
512b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   struct memory_information *next;
513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} memory_information;
514b50c217251b086440efcdb273c22f86a06c80cbaChris Craiktypedef memory_information *memory_infop;
515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic memory_infop pinformation = NULL;
517851c67770f9cebece9c79e914a54c348f539a512Matt Sarettstatic png_alloc_size_t current_allocation = 0;
518851c67770f9cebece9c79e914a54c348f539a512Matt Sarettstatic png_alloc_size_t maximum_allocation = 0;
519851c67770f9cebece9c79e914a54c348f539a512Matt Sarettstatic png_alloc_size_t total_allocation = 0;
520851c67770f9cebece9c79e914a54c348f539a512Matt Sarettstatic png_alloc_size_t num_allocations = 0;
521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
522b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_voidp PNGCBAPI png_debug_malloc PNGARG((png_structp png_ptr,
523b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    png_alloc_size_t size));
524b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid PNGCBAPI png_debug_free PNGARG((png_structp png_ptr, png_voidp ptr));
525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp
527b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNGCBAPI png_debug_malloc(png_structp png_ptr, png_alloc_size_t size)
528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* png_malloc has already tested for NULL; png_create_struct calls
531a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * png_debug_malloc directly, with png_ptr == NULL which is OK
532a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    */
533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (size == 0)
535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (NULL);
536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* This calls the library allocator twice, once to get the requested
538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      buffer and once to get a new free list entry. */
539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* Disable malloc_fn and free_fn */
541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      memory_infop pinfo;
542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_set_mem_fn(png_ptr, NULL, NULL, NULL);
543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      pinfo = (memory_infop)png_malloc(png_ptr,
5447a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (sizeof *pinfo));
545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      pinfo->size = size;
546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      current_allocation += size;
547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      total_allocation += size;
548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      num_allocations ++;
549b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (current_allocation > maximum_allocation)
551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         maximum_allocation = current_allocation;
552b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
553b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      pinfo->pointer = png_malloc(png_ptr, size);
554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* Restore malloc_fn and free_fn */
555b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
5564215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_set_mem_fn(png_ptr,
557b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          NULL, png_debug_malloc, png_debug_free);
558b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (size != 0 && pinfo->pointer == NULL)
560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         current_allocation -= size;
562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         total_allocation -= size;
563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr,
564b50c217251b086440efcdb273c22f86a06c80cbaChris Craik           "out of memory in pngtest->png_debug_malloc");
565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
566b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      pinfo->next = pinformation;
568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      pinformation = pinfo;
569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* Make sure the caller isn't assuming zeroed memory. */
570b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      memset(pinfo->pointer, 0xdd, pinfo->size);
571b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
5729b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (verbose != 0)
573b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         printf("png_malloc %lu bytes at %p\n", (unsigned long)size,
5747a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             pinfo->pointer);
575b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (png_voidp)(pinfo->pointer);
577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free a pointer.  It is removed from the list at the same time. */
581b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid PNGCBAPI
582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_debug_free(png_structp png_ptr, png_voidp ptr)
583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr == NULL)
585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "NULL pointer to png_debug_free.\n");
586b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (ptr == 0)
588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if 0 /* This happens all the time. */
590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "WARNING: freeing NULL pointer\n");
591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Unlink the element from the list. */
5969b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (pinformation != NULL)
597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
598b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      memory_infop *ppinfo = &pinformation;
599b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (;;)
601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         memory_infop pinfo = *ppinfo;
603b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (pinfo->pointer == ptr)
605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *ppinfo = pinfo->next;
607851c67770f9cebece9c79e914a54c348f539a512Matt Sarett            if (current_allocation < pinfo->size)
608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               fprintf(STDERR, "Duplicate free of memory\n");
609851c67770f9cebece9c79e914a54c348f539a512Matt Sarett            else
610851c67770f9cebece9c79e914a54c348f539a512Matt Sarett               current_allocation -= pinfo->size;
611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            /* We must free the list element too, but first kill
612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               the memory that is to be freed. */
613b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            memset(ptr, 0x55, pinfo->size);
6149b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            free(pinfo);
6154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            pinfo = NULL;
616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
618b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (pinfo->next == NULL)
620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
6219b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            fprintf(STDERR, "Pointer %p not found\n", ptr);
622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
624b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         ppinfo = &pinfo->next;
626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Finally free the data. */
6309b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (verbose != 0)
631b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      printf("Freeing %p\n", ptr);
632b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
6339b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (ptr != NULL)
634b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      free(ptr);
6354215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   ptr = NULL;
636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
6379b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* USER_MEM && DEBUG */
638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* END of code to test memory allocation/deallocation */
639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
6404215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
641b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
6424215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project/* Demonstration of user chunk support of the sTER and vpAg chunks */
6434215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
644a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* (sTER is a public chunk not yet known by libpng.  vpAg is a private
6454215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectchunk used in ImageMagick to store "virtual page" size).  */
6464215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
647b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic struct user_chunk_data
648b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
649b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_const_infop info_ptr;
650b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_uint_32     vpAg_width, vpAg_height;
651b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_byte        vpAg_units;
652b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_byte        sTER_mode;
653b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   int             location[2];
654b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
655b50c217251b086440efcdb273c22f86a06c80cbaChris Craikuser_chunk_data;
656b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
657b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Used for location and order; zero means nothing. */
658b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define have_sTER   0x01
659b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define have_vpAg   0x02
660b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define before_PLTE 0x10
661b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define before_IDAT 0x20
662b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define after_IDAT  0x40
663b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
664b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
665b50c217251b086440efcdb273c22f86a06c80cbaChris Craikinit_callback_info(png_const_infop info_ptr)
666b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
667b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   MEMZERO(user_chunk_data);
668b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   user_chunk_data.info_ptr = info_ptr;
669b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
670b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
671b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int
672b50c217251b086440efcdb273c22f86a06c80cbaChris Craikset_location(png_structp png_ptr, struct user_chunk_data *data, int what)
673b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
674b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   int location;
675b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
6769b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((data->location[0] & what) != 0 || (data->location[1] & what) != 0)
677b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return 0; /* already have one of these */
6784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
6799b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   /* Find where we are (the code below zeroes info_ptr to indicate that the
680b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * chunks before the first IDAT have been read.)
681b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
682b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (data->info_ptr == NULL) /* after IDAT */
683b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      location = what | after_IDAT;
684b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
6859b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   else if (png_get_valid(png_ptr, data->info_ptr, PNG_INFO_PLTE) != 0)
686b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      location = what | before_IDAT;
687b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
688b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else
689b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      location = what | before_PLTE;
690b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
691b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (data->location[0] == 0)
692b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      data->location[0] = location;
693b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
694b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else
695b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      data->location[1] = location;
6964215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
697b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return 1; /* handled */
698b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
699b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
700b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic int PNGCBAPI
701b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurariread_user_chunk_callback(png_struct *png_ptr, png_unknown_chunkp chunk)
7024215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project{
703b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   struct user_chunk_data *my_user_chunk_data =
704b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      (struct user_chunk_data*)png_get_user_chunk_ptr(png_ptr);
705b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
706b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (my_user_chunk_data == NULL)
707b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "lost user chunk pointer");
708a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
709a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Return one of the following:
710a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *    return (-n);  chunk had an error
711a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *    return (0);  did not recognize
712a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *    return (n);  success
713a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *
714a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * The unknown chunk structure contains the chunk data:
715a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * png_byte name[5];
716a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * png_byte *data;
717a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * png_size_t size;
718a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *
719a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * Note that libpng has already taken care of the CRC handling.
720a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    */
721a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
722a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (chunk->name[0] == 115 && chunk->name[1] ==  84 &&     /* s  T */
723a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott       chunk->name[2] ==  69 && chunk->name[3] ==  82)       /* E  R */
724a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      {
725a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Found sTER chunk */
726a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         if (chunk->size != 1)
727a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            return (-1); /* Error return */
728b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
729a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         if (chunk->data[0] != 0 && chunk->data[0] != 1)
730a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            return (-1);  /* Invalid mode */
731b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
7329b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (set_location(png_ptr, my_user_chunk_data, have_sTER) != 0)
733b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
734b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            my_user_chunk_data->sTER_mode=chunk->data[0];
735b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            return (1);
736b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
737b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
738b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else
739b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            return (0); /* duplicate sTER - give it to libpng */
740a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      }
741a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
742a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (chunk->name[0] != 118 || chunk->name[1] != 112 ||    /* v  p */
743a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott       chunk->name[2] !=  65 || chunk->name[3] != 103)      /* A  g */
744a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return (0); /* Did not recognize */
745a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
746a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Found ImageMagick vpAg chunk */
747a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
748a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (chunk->size != 9)
749a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return (-1); /* Error return */
750a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
7519b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (set_location(png_ptr, my_user_chunk_data, have_vpAg) == 0)
752b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return (0);  /* duplicate vpAg */
753a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
754b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   my_user_chunk_data->vpAg_width = png_get_uint_31(png_ptr, chunk->data);
755b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   my_user_chunk_data->vpAg_height = png_get_uint_31(png_ptr, chunk->data + 4);
756b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   my_user_chunk_data->vpAg_units = chunk->data[8];
757a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
758a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   return (1);
759b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
760b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
761b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_SUPPORTED
762b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
763b50c217251b086440efcdb273c22f86a06c80cbaChris Craikwrite_sTER_chunk(png_structp write_ptr)
764b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
765b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   png_byte sTER[5] = {115,  84,  69,  82, '\0'};
766b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
7679b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (verbose != 0)
768b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      fprintf(STDERR, "\n stereo mode = %d\n", user_chunk_data.sTER_mode);
769b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
770b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   png_write_chunk(write_ptr, sTER, &user_chunk_data.sTER_mode, 1);
771b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
772b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
773b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
774b50c217251b086440efcdb273c22f86a06c80cbaChris Craikwrite_vpAg_chunk(png_structp write_ptr)
775b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
776b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   png_byte vpAg[5] = {118, 112,  65, 103, '\0'};
7774215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
778b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_byte vpag_chunk_data[9];
779b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
7809b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (verbose != 0)
781b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      fprintf(STDERR, " vpAg = %lu x %lu, units = %d\n",
7827a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long)user_chunk_data.vpAg_width,
7837a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long)user_chunk_data.vpAg_height,
7847a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          user_chunk_data.vpAg_units);
785b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
786b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_save_uint_32(vpag_chunk_data, user_chunk_data.vpAg_width);
787b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_save_uint_32(vpag_chunk_data + 4, user_chunk_data.vpAg_height);
788b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   vpag_chunk_data[8] = user_chunk_data.vpAg_units;
789b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   png_write_chunk(write_ptr, vpAg, vpag_chunk_data, 9);
7904215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project}
791b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
792b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
793b50c217251b086440efcdb273c22f86a06c80cbaChris Craikwrite_chunks(png_structp write_ptr, int location)
794b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
795b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   int i;
796b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
797b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Notice that this preserves the original chunk order, however chunks
798b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * intercepted by the callback will be written *after* chunks passed to
799b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * libpng.  This will actually reverse a pair of sTER chunks or a pair of
800b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * vpAg chunks, resulting in an error later.  This is not worth worrying
801b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * about - the chunks should not be duplicated!
802b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
803b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   for (i=0; i<2; ++i)
804b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
805b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (user_chunk_data.location[i] == (location | have_sTER))
806b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         write_sTER_chunk(write_ptr);
807b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
808b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (user_chunk_data.location[i] == (location | have_vpAg))
809b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         write_vpAg_chunk(write_ptr);
810b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
811b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
8129b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE */
8139b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#else /* !READ_USER_CHUNKS */
814b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define write_chunks(pp,loc) ((void)0)
8154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#endif
8164215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project/* END of code to demonstrate user chunk support */
8174215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
818b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* START of code to check that libpng has the required text support; this only
819b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * checks for the write support because if read support is missing the chunk
820b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * will simply not be reported back to pngtest.
821b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
822b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_TEXT_SUPPORTED
823b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
82406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarettpngtest_check_text_support(png_structp png_ptr, png_textp text_ptr,
8257a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis    int num_text)
826b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
827b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   while (num_text > 0)
828b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
829b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      switch (text_ptr[--num_text].compression)
830b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
831b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case PNG_TEXT_COMPRESSION_NONE:
832b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
833b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
834b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case PNG_TEXT_COMPRESSION_zTXt:
835b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#           ifndef PNG_WRITE_zTXt_SUPPORTED
836b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               ++unsupported_chunks;
83706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               /* In libpng 1.7 this now does an app-error, so stop it: */
83806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               text_ptr[num_text].compression = PNG_TEXT_COMPRESSION_NONE;
839b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#           endif
840b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
841b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
842b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case PNG_ITXT_COMPRESSION_NONE:
843b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case PNG_ITXT_COMPRESSION_zTXt:
844b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#           ifndef PNG_WRITE_iTXt_SUPPORTED
845b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               ++unsupported_chunks;
84606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               text_ptr[num_text].compression = PNG_TEXT_COMPRESSION_NONE;
847b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#           endif
848b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
849b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
850b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         default:
851b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This is an error */
852b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            png_error(png_ptr, "invalid text chunk compression field");
853b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
854b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
855b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
856b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
857b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
858b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* END of code to check that libpng has the required text support */
859b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
860893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Test one file */
861b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int
862893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projecttest_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
863893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
864893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   static png_FILE_p fpin;
865893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   static png_FILE_p fpout;  /* "static" prevents setjmp corruption */
866b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_error_parameters error_parameters;
867893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_structp read_ptr;
868893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop read_info_ptr, end_info_ptr;
869893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
870893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_structp write_ptr;
871893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop write_info_ptr;
872893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop write_end_info_ptr;
87306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#ifdef PNG_WRITE_FILTER_SUPPORTED
874b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   int interlace_preserved = 1;
87506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* WRITE_FILTER */
87606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#else /* !WRITE */
877893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_structp write_ptr = NULL;
878893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop write_info_ptr = NULL;
879893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop write_end_info_ptr = NULL;
88006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* !WRITE */
881893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep row_buf;
882893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_uint_32 y;
883893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_uint_32 width, height;
88406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   volatile int num_passes;
88506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   int pass;
886893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int bit_depth, color_type;
887893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
888893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   row_buf = NULL;
889b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   error_parameters.file_name = inname;
890893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
891893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((fpin = fopen(inname, "rb")) == NULL)
892893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
893893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "Could not find input file %s\n", inname);
894893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
895893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
896893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
897893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((fpout = fopen(outname, "wb")) == NULL)
898893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
899893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "Could not open output file %s\n", outname);
900893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpin);
901893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
902893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
903893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
904b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Allocating read and write structures");
905893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
9064215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   read_ptr =
9077a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_create_read_struct_2(PNG_LIBPNG_VER_STRING, NULL,
9087a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL, NULL, NULL, png_debug_malloc, png_debug_free);
909893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
9104215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   read_ptr =
9117a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
912893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
913b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_error_fn(read_ptr, &error_parameters, pngtest_error,
9147a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       pngtest_warning);
9154215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
916893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
917893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
9184215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   write_ptr =
9197a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL,
9207a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL, NULL, NULL, png_debug_malloc, png_debug_free);
921893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
9224215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   write_ptr =
9237a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
924893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
925b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_error_fn(write_ptr, &error_parameters, pngtest_error,
9267a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       pngtest_warning);
9274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#endif
928b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Allocating read_info, write_info and end_info structures");
929893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   read_info_ptr = png_create_info_struct(read_ptr);
930893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   end_info_ptr = png_create_info_struct(read_ptr);
931893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
932893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   write_info_ptr = png_create_info_struct(write_ptr);
933893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   write_end_info_ptr = png_create_info_struct(write_ptr);
934893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
936b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
937b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   init_callback_info(read_info_ptr);
938b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_read_user_chunk_fn(read_ptr, &user_chunk_data,
9397a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       read_user_chunk_callback);
9407a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis#endif
9417a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis
942851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#ifdef PNG_SET_USER_LIMITS_SUPPORTED
943851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#  ifdef CHUNK_LIMIT /* from the build, for testing */
944851c67770f9cebece9c79e914a54c348f539a512Matt Sarett      png_set_chunk_malloc_max(read_ptr, CHUNK_LIMIT);
945851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#  endif /* CHUNK_LIMIT */
946851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#endif
947851c67770f9cebece9c79e914a54c348f539a512Matt Sarett
948893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
949b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Setting jmpbuf for read struct");
950893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (setjmp(png_jmpbuf(read_ptr)))
951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "%s -> %s: libpng read error\n", inname, outname);
953893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(read_ptr, row_buf);
9544215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      row_buf = NULL;
955893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
956893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_info_struct(write_ptr, &write_end_info_ptr);
958893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_write_struct(&write_ptr, &write_info_ptr);
959893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
960893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpin);
961893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpout);
962893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
963893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
964893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
965893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
966b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Setting jmpbuf for write struct");
967b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
968893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (setjmp(png_jmpbuf(write_ptr)))
969893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
970893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "%s -> %s: libpng write error\n", inname, outname);
971893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
972893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_info_struct(write_ptr, &write_end_info_ptr);
973893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
974893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_write_struct(&write_ptr, &write_info_ptr);
975893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
976893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpin);
977893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpout);
978893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
979893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
980893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
981893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
982b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
9839b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (strict != 0)
984b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
985b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Treat png_benign_error() as errors on read */
986b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_benign_errors(read_ptr, 0);
987b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
988851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#ifdef PNG_WRITE_SUPPORTED
989b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Treat them as errors on write */
990b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_benign_errors(write_ptr, 0);
991851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#endif
992b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
993b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* if strict is not set, then app warnings and errors are treated as
994b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * warnings in release builds, but not in unstable builds; this can be
995b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * changed with '--relaxed'.
996b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       */
997b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
998b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
9999b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   else if (relaxed != 0)
1000b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
1001b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Allow application (pngtest) errors and warnings to pass */
1002b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_benign_errors(read_ptr, 1);
1003b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1004851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#ifdef PNG_WRITE_SUPPORTED
1005b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_benign_errors(write_ptr, 1);
1006851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#endif
1007b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
1008893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1009b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Initializing input and output streams");
10105f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_STDIO_SUPPORTED
1011893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_init_io(read_ptr, fpin);
1012893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  ifdef PNG_WRITE_SUPPORTED
1013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_init_io(write_ptr, fpout);
1014893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  endif
1015893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1016893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_read_fn(read_ptr, (png_voidp)fpin, pngtest_read_data);
1017893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  ifdef PNG_WRITE_SUPPORTED
1018893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_write_fn(write_ptr, (png_voidp)fpout,  pngtest_write_data,
10195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#    ifdef PNG_WRITE_FLUSH_SUPPORTED
10207a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       pngtest_flush);
1021893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#    else
10227a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL);
1023893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#    endif
1024893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  endif
1025893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1026b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
10274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (status_dots_requested == 1)
1028893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1029893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1030893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_set_write_status_fn(write_ptr, write_row_callback);
1031893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1032893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_set_read_status_fn(read_ptr, read_row_callback);
1033893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1034b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1035893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
1036893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1037893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1038b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_write_status_fn(write_ptr, NULL);
1039893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1040b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_read_status_fn(read_ptr, NULL);
1041893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1042893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
10435f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
104406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   png_set_read_user_transform_fn(read_ptr, read_user_callback);
1045893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
10465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
10474215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   zero_samples = 0;
1048893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_write_user_transform_fn(write_ptr, count_zero_samples);
1049893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1050893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1051b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
1052b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Preserve all the unknown chunks, if possible.  If this is disabled then,
1053b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * even if the png_{get,set}_unknown_chunks stuff is enabled, we can't use
1054b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * libpng to *save* the unknown chunks on read (because we can't switch the
1055b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * save option on!)
1056b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    *
1057b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * Notice that if SET_UNKNOWN_CHUNKS is *not* supported read will discard all
1058b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * unknown chunks and write will write them all.
1059b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1060b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
1061893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_keep_unknown_chunks(read_ptr, PNG_HANDLE_CHUNK_ALWAYS,
10627a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL, 0);
1063893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
10645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1065b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_keep_unknown_chunks(write_ptr, PNG_HANDLE_CHUNK_ALWAYS,
10667a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL, 0);
1067b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1068893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1069893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1070b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Reading info struct");
1071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_info(read_ptr, read_info_ptr);
1072893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1073b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
1074b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* This is a bit of a hack; there is no obvious way in the callback function
1075b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * to determine that the chunks before the first IDAT have been read, so
1076b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * remove the info_ptr (which is only used to determine position relative to
1077b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * PLTE) here to indicate that we are after the IDAT.
1078b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1079b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   user_chunk_data.info_ptr = NULL;
1080b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1081b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1082b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Transferring info struct");
1083893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1084893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int interlace_type, compression_type, filter_type;
1085893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1086893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_IHDR(read_ptr, read_info_ptr, &width, &height, &bit_depth,
10879b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett          &color_type, &interlace_type, &compression_type, &filter_type) != 0)
1088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1089893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_IHDR(write_ptr, write_info_ptr, width, height, bit_depth,
10907a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             color_type, interlace_type, compression_type, filter_type);
109106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         /* num_passes may not be available below if interlace support is not
109206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett          * provided by libpng for both read and write.
1093b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari          */
1094b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         switch (interlace_type)
1095b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         {
1096b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari            case PNG_INTERLACE_NONE:
109706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               num_passes = 1;
1098b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari               break;
1099b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari
1100b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari            case PNG_INTERLACE_ADAM7:
110106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               num_passes = 7;
110206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               break;
1103b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari
1104b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari            default:
110506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               png_error(read_ptr, "invalid interlace type");
110606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               /*NOT REACHED*/
1107b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         }
1108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
11099b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
111006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      else
111106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         png_error(read_ptr, "png_get_IHDR failed");
111206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   }
11135f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_FIXED_POINT_SUPPORTED
11145f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_cHRM_SUPPORTED
1115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
11177a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          blue_y;
1118b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
11195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      if (png_get_cHRM_fixed(read_ptr, read_info_ptr, &white_x, &white_y,
11207a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y) != 0)
1121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_cHRM_fixed(write_ptr, write_info_ptr, white_x, white_y, red_x,
11237a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             red_y, green_x, green_y, blue_x, blue_y);
1124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11275f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_gAMA_SUPPORTED
1128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_fixed_point gamma;
1130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11319b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma) != 0)
1132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma);
1133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else /* Use floating point versions */
11365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_FLOATING_POINT_SUPPORTED
11375f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_cHRM_SUPPORTED
1138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      double white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
11407a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          blue_y;
1141b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_cHRM(read_ptr, read_info_ptr, &white_x, &white_y, &red_x,
11437a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &red_y, &green_x, &green_y, &blue_x, &blue_y) != 0)
1144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_cHRM(write_ptr, write_info_ptr, white_x, white_y, red_x,
11467a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             red_y, green_x, green_y, blue_x, blue_y);
1147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_gAMA_SUPPORTED
1151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      double gamma;
1153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11549b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_gAMA(read_ptr, read_info_ptr, &gamma) != 0)
1155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_gAMA(write_ptr, write_info_ptr, gamma);
1156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1158a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* Floating point */
1159a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* Fixed point */
11605f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_iCCP_SUPPORTED
1161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp name;
1163b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_bytep profile;
1164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 proflen;
1165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int compression_type;
1166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_iCCP(read_ptr, read_info_ptr, &name, &compression_type,
11687a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &profile, &proflen) != 0)
1169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_iCCP(write_ptr, write_info_ptr, name, compression_type,
11717a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             profile, proflen);
1172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11755f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_sRGB_SUPPORTED
1176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int intent;
1178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11799b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_sRGB(read_ptr, read_info_ptr, &intent) != 0)
1180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_sRGB(write_ptr, write_info_ptr, intent);
1181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_colorp palette;
1185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int num_palette;
1186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11879b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette) != 0)
1188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);
1189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
11905f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_bKGD_SUPPORTED
1191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_color_16p background;
1193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11949b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_bKGD(read_ptr, read_info_ptr, &background) != 0)
1195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_bKGD(write_ptr, write_info_ptr, background);
1197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_hIST_SUPPORTED
1201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_16p hist;
1203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12049b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_hIST(read_ptr, read_info_ptr, &hist) != 0)
1205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_hIST(write_ptr, write_info_ptr, hist);
1206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_oFFs_SUPPORTED
1209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_int_32 offset_x, offset_y;
1211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int unit_type;
1212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12134215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (png_get_oFFs(read_ptr, read_info_ptr, &offset_x, &offset_y,
12149b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett          &unit_type) != 0)
1215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type);
1217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12205f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_pCAL_SUPPORTED
1221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp purpose, units;
1223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charpp params;
1224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_int_32 X0, X1;
1225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int type, nparams;
1226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_pCAL(read_ptr, read_info_ptr, &purpose, &X0, &X1, &type,
12287a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &nparams, &units, &params) != 0)
1229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_pCAL(write_ptr, write_info_ptr, purpose, X0, X1, type,
12317a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             nparams, units, params);
1232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12355f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_pHYs_SUPPORTED
1236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 res_x, res_y;
1238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int unit_type;
1239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12409b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y,
12419b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett          &unit_type) != 0)
1242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type);
1243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_sBIT_SUPPORTED
1246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_color_8p sig_bit;
1248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12499b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit) != 0)
1250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_sBIT(write_ptr, write_info_ptr, sig_bit);
1251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_sCAL_SUPPORTED
1254b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if defined(PNG_FLOATING_POINT_SUPPORTED) && \
1255b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)
1256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int unit;
1258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      double scal_width, scal_height;
1259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_sCAL(read_ptr, read_info_ptr, &unit, &scal_width,
12617a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &scal_height) != 0)
1262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_sCAL(write_ptr, write_info_ptr, unit, scal_width, scal_height);
1264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FIXED_POINT_SUPPORTED
1268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int unit;
1270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp scal_width, scal_height;
1271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_sCAL_s(read_ptr, read_info_ptr, &unit, &scal_width,
12737a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis           &scal_height) != 0)
1274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
12755f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_set_sCAL_s(write_ptr, write_info_ptr, unit, scal_width,
12765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott             scal_height);
1277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
127906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
128006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
128106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
12829b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
12839b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#ifdef PNG_sPLT_SUPPORTED
12849b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   {
12859b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       png_sPLT_tp entries;
12869b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
12879b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       int num_entries = (int) png_get_sPLT(read_ptr, read_info_ptr, &entries);
12889b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       if (num_entries)
12899b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       {
12909b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett           png_set_sPLT(write_ptr, write_info_ptr, entries, num_entries);
12919b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       }
12929b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   }
129306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
12949b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
12955f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TEXT_SUPPORTED
1296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int num_text;
1299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0)
1301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1302b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text);
1303b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1304b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_check_text_support(read_ptr, text_ptr, num_text);
1305b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
13069b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (verbose != 0)
1307b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1308b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            int i;
1309b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1310b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            printf("\n");
1311b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (i=0; i<num_text; i++)
1312b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
1313b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               printf("   Text compression[%d]=%d\n",
13147a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   i, text_ptr[i].compression);
1315b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
1316b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1317b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_text(write_ptr, write_info_ptr, text_ptr, num_text);
1319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
132106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
13225f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_tIME_SUPPORTED
1323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_timep mod_time;
1325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
13269b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_tIME(read_ptr, read_info_ptr, &mod_time) != 0)
1327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_tIME(write_ptr, write_info_ptr, mod_time);
13295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
13309b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (png_convert_to_rfc1123_buffer(tIME_string, mod_time) != 0)
1331b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            tIME_string[(sizeof tIME_string) - 1] = '\0';
1332b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1333b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else
1334b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1335b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            strncpy(tIME_string, "*** invalid time ***", (sizeof tIME_string));
1336b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            tIME_string[(sizeof tIME_string) - 1] = '\0';
1337b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1338b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         tIME_chunk_present++;
13409b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* TIME_RFC1123 */
1341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
134306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
13445f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_tRNS_SUPPORTED
1345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1346b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_bytep trans_alpha;
1347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int num_trans;
1348b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_color_16p trans_color;
1349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1350b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (png_get_tRNS(read_ptr, read_info_ptr, &trans_alpha, &num_trans,
13517a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &trans_color) != 0)
1352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
13535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         int sample_max = (1 << bit_depth);
1354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* libpng doesn't reject a tRNS chunk with out-of-range samples */
13555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         if (!((color_type == PNG_COLOR_TYPE_GRAY &&
1356b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             (int)trans_color->gray > sample_max) ||
13575f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott             (color_type == PNG_COLOR_TYPE_RGB &&
1358b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             ((int)trans_color->red > sample_max ||
1359b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             (int)trans_color->green > sample_max ||
1360b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             (int)trans_color->blue > sample_max))))
1361b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            png_set_tRNS(write_ptr, write_info_ptr, trans_alpha, num_trans,
1362b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               trans_color);
1363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
136506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
13665f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_unknown_chunkp unknowns;
1369b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      int num_unknowns = png_get_unknown_chunks(read_ptr, read_info_ptr,
13707a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &unknowns);
1371b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
13729b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (num_unknowns != 0)
1373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns,
13757a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             num_unknowns);
1376b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if PNG_LIBPNG_VER < 10600
1377a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Copy the locations from the read_info_ptr.  The automatically
1378b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * generated locations in write_end_info_ptr are wrong prior to 1.6.0
1379b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * because they are reset from the write pointer (removed in 1.6.0).
1380a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          */
1381b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1382b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            int i;
1383b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (i = 0; i < num_unknowns; i++)
1384b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              png_set_unknown_chunk_location(write_ptr, write_info_ptr, i,
13857a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                  unknowns[i].location);
1386b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1387b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1393b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Writing info struct");
1394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1395b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Write the info in two steps so that if we write the 'unknown' chunks here
1396b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * they go to the correct place.
1397b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1398b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_write_info_before_PLTE(write_ptr, write_info_ptr);
1399a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1400b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   write_chunks(write_ptr, before_PLTE); /* before PLTE */
1401a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1402b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_write_info(write_ptr, write_info_ptr);
14034215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
1404b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   write_chunks(write_ptr, before_IDAT); /* after PLTE */
1405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef SINGLE_ROWBUF_ALLOC
1408b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Allocating row buffer...");
1409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   row_buf = (png_bytep)png_malloc(read_ptr,
14107a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_get_rowbytes(read_ptr, read_info_ptr));
1411b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1412b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug1("\t0x%08lx", (unsigned long)row_buf);
1413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* SINGLE_ROWBUF_ALLOC */
1414b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Writing row data");
1415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
141606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#if defined(PNG_READ_INTERLACING_SUPPORTED) &&\
141706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   defined(PNG_WRITE_INTERLACING_SUPPORTED)
141806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   /* Both must be defined for libpng to be able to handle the interlace,
141906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett    * otherwise it gets handled below by simply reading and writing the passes
142006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett    * directly.
142106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett    */
142206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   if (png_set_interlace_handling(read_ptr) != num_passes)
142306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      png_error(write_ptr,
14247a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "png_set_interlace_handling(read): wrong pass count ");
142506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   if (png_set_interlace_handling(write_ptr) != num_passes)
142606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      png_error(write_ptr,
14277a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "png_set_interlace_handling(write): wrong pass count ");
142806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#else /* png_set_interlace_handling not called on either read or write */
142906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#  define calc_pass_height
143006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* not using libpng interlace handling */
1431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
1433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_stop = (float)clock();
1434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_misc += (t_stop - t_start);
1435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_start = t_stop;
1436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
143706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   for (pass = 0; pass < num_passes; pass++)
1438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
143906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#     ifdef calc_pass_height
144006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         png_uint_32 pass_height;
144106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
144206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         if (num_passes == 7) /* interlaced */
144306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         {
144406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett            if (PNG_PASS_COLS(width, pass) > 0)
144506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               pass_height = PNG_PASS_ROWS(height, pass);
144606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
144706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett            else
144806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               pass_height = 0;
144906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         }
145006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
145106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         else /* not interlaced */
145206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett            pass_height = height;
145306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#     else
145406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#        define pass_height height
145506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#     endif
145606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
1457b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      pngtest_debug1("Writing row data for pass %d", pass);
145806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      for (y = 0; y < pass_height; y++)
1459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef SINGLE_ROWBUF_ALLOC
1461b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_debug2("Allocating row buffer (pass %d, y = %u)...", pass, y);
14629b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
1463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         row_buf = (png_bytep)png_malloc(read_ptr,
14647a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             png_get_rowbytes(read_ptr, read_info_ptr));
1465b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
14669b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         pngtest_debug2("\t0x%08lx (%lu bytes)", (unsigned long)row_buf,
14677a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             (unsigned long)png_get_rowbytes(read_ptr, read_info_ptr));
1468b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* !SINGLE_ROWBUF_ALLOC */
1470b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1);
1471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
1474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_stop = (float)clock();
1475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_decode += (t_stop - t_start);
1476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_start = t_stop;
1477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_write_rows(write_ptr, (png_bytepp)&row_buf, 1);
1479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
1480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_stop = (float)clock();
1481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_encode += (t_stop - t_start);
1482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_start = t_stop;
1483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
14849b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE */
1485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef SINGLE_ROWBUF_ALLOC
1487b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_debug2("Freeing row buffer (pass %d, y = %u)", pass, y);
1488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(read_ptr, row_buf);
14894215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         row_buf = NULL;
1490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* !SINGLE_ROWBUF_ALLOC */
1491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1494b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
1495b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
1496b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_free_data(read_ptr, read_info_ptr, PNG_FREE_UNKN, -1);
1497b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  endif
1498b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1499b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1);
1500b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  endif
1501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1503b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Reading and writing end_info data");
1504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_end(read_ptr, end_info_ptr);
15065f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TEXT_SUPPORTED
1507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int num_text;
1510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0)
1512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1513b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text);
1514b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1515b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_check_text_support(read_ptr, text_ptr, num_text);
1516b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
15179b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (verbose != 0)
1518b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1519b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            int i;
1520b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1521b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            printf("\n");
1522b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (i=0; i<num_text; i++)
1523b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
1524b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               printf("   Text compression[%d]=%d\n",
15257a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   i, text_ptr[i].compression);
1526b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
1527b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1528b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text);
1530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
15335f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_tIME_SUPPORTED
1534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_timep mod_time;
1536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15379b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_tIME(read_ptr, end_info_ptr, &mod_time) != 0)
1538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_tIME(write_ptr, write_end_info_ptr, mod_time);
15405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
15419b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (png_convert_to_rfc1123_buffer(tIME_string, mod_time) != 0)
1542b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            tIME_string[(sizeof tIME_string) - 1] = '\0';
1543b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1544b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else
1545b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1546b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            strncpy(tIME_string, "*** invalid time ***", sizeof tIME_string);
1547b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            tIME_string[(sizeof tIME_string)-1] = '\0';
1548b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1549b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         tIME_chunk_present++;
15519b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* TIME_RFC1123 */
1552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
15555f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_unknown_chunkp unknowns;
1558b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      int num_unknowns = png_get_unknown_chunks(read_ptr, end_info_ptr,
15597a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &unknowns);
1560b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
15619b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (num_unknowns != 0)
1562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns,
15647a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             num_unknowns);
1565b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if PNG_LIBPNG_VER < 10600
1566a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Copy the locations from the read_info_ptr.  The automatically
1567b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * generated locations in write_end_info_ptr are wrong prior to 1.6.0
1568b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * because they are reset from the write pointer (removed in 1.6.0).
1569a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          */
1570b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1571b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            int i;
1572b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (i = 0; i < num_unknowns; i++)
1573b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i,
15747a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                  unknowns[i].location);
1575b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1576b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1580b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1582b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
1583b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Normally one would use Z_DEFAULT_STRATEGY for text compression.
1584b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * This is here just to make pngtest replicate the results from libpng
1585b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * versions prior to 1.5.4, and to test this new API.
1586b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1587b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_text_compression_strategy(write_ptr, Z_FILTERED);
1588b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1589b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1590b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* When the unknown vpAg/sTER chunks are written by pngtest the only way to
1591b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * do it is to write them *before* calling png_write_end.  When unknown
1592b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * chunks are written by libpng, however, they are written just before IEND.
1593b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * There seems to be no way round this, however vpAg/sTER are not expected
1594b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * after IDAT.
1595b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1596b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   write_chunks(write_ptr, after_IDAT);
1597b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_write_end(write_ptr, write_end_info_ptr);
1599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_EASY_ACCESS_SUPPORTED
16029b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (verbose != 0)
1603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 iwidth, iheight;
1605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      iwidth = png_get_image_width(write_ptr, write_info_ptr);
1606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      iheight = png_get_image_height(write_ptr, write_info_ptr);
1607a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(STDERR, "\n Image width = %lu, height = %lu\n",
16087a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long)iwidth, (unsigned long)iheight);
1609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1612b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Destroying data structs");
1613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef SINGLE_ROWBUF_ALLOC
1614b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("destroying row_buf for read_ptr");
1615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(read_ptr, row_buf);
16164215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   row_buf = NULL;
1617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* SINGLE_ROWBUF_ALLOC */
1618b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("destroying read_ptr, read_info_ptr, end_info_ptr");
1619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
1620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1621b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("destroying write_end_info_ptr");
1622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_destroy_info_struct(write_ptr, &write_end_info_ptr);
1623b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("destroying write_ptr, write_info_ptr");
1624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_destroy_write_struct(&write_ptr, &write_info_ptr);
1625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1626b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Destruction complete.");
1627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   FCLOSE(fpin);
1629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   FCLOSE(fpout);
1630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1631b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Summarize any warnings or errors and in 'strict' mode fail the test.
1632b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * Unsupported chunks can result in warnings, in that case ignore the strict
1633b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * setting, otherwise fail the test on warnings as well as errors.
1634b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1635b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (error_count > 0)
1636b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
1637b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* We don't really expect to get here because of the setjmp handling
1638b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * above, but this is safe.
1639b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       */
1640b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      fprintf(STDERR, "\n  %s: %d libpng errors found (%d warnings)",
16417a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          inname, error_count, warning_count);
1642b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1643b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (strict != 0)
1644b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return (1);
1645b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
1646b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1647b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  ifdef PNG_WRITE_SUPPORTED
164806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      /* If there is no write support nothing was written! */
1649b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (unsupported_chunks > 0)
1650b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
1651b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         fprintf(STDERR, "\n  %s: unsupported chunks (%d)%s",
16527a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             inname, unsupported_chunks, strict ? ": IGNORED --strict!" : "");
1653b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
1654b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  endif
1655b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1656b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else if (warning_count > 0)
1657b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
1658b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      fprintf(STDERR, "\n  %s: %d libpng warnings found",
16597a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          inname, warning_count);
1660b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1661b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (strict != 0)
1662b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return (1);
1663b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
1664b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1665b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Opening files for comparison");
1666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((fpin = fopen(inname, "rb")) == NULL)
1667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "Could not find file %s\n", inname);
1669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
1670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((fpout = fopen(outname, "rb")) == NULL)
1673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1674893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "Could not find file %s\n", outname);
1675893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpin);
1676893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
1677893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1678893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
167906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#if defined (PNG_WRITE_SUPPORTED) /* else nothing was written */ &&\
168006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett    defined (PNG_WRITE_FILTER_SUPPORTED)
16819b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (interlace_preserved != 0) /* else the files will be changed */
1682893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1683b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      for (;;)
1684893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1685b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         static int wrote_question = 0;
1686b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_size_t num_in, num_out;
1687b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         char inbuf[256], outbuf[256];
1688b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1689b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         num_in = fread(inbuf, 1, sizeof inbuf, fpin);
1690b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         num_out = fread(outbuf, 1, sizeof outbuf, fpout);
1691b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1692b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (num_in != num_out)
1693893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1694b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            fprintf(STDERR, "\nFiles %s and %s are of a different size\n",
16957a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                inname, outname);
1696b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1697b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            if (wrote_question == 0 && unsupported_chunks == 0)
1698b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
1699b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17007a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   "   Was %s written with the same maximum IDAT"
17017a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   " chunk size (%d bytes),",
17027a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   inname, PNG_ZBUF_SIZE);
1703b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17047a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   "\n   filtering heuristic (libpng default), compression");
1705b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17067a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   " level (zlib default),\n   and zlib version (%s)?\n\n",
17077a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   ZLIB_VERSION);
1708b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               wrote_question = 1;
1709b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
1710b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1711b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            FCLOSE(fpin);
1712b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            FCLOSE(fpout);
1713b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1714b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            if (strict != 0 && unsupported_chunks == 0)
1715b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              return (1);
1716b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1717b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            else
1718b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              return (0);
1719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
17219b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (num_in == 0)
1722b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
1723893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1724b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (memcmp(inbuf, outbuf, num_in))
1725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1726b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            fprintf(STDERR, "\nFiles %s and %s are different\n", inname,
17277a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                outname);
1728b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1729b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            if (wrote_question == 0 && unsupported_chunks == 0)
1730b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
1731b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17327a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   "   Was %s written with the same maximum"
17337a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   " IDAT chunk size (%d bytes),",
1734b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                    inname, PNG_ZBUF_SIZE);
1735b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17367a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   "\n   filtering heuristic (libpng default), compression");
1737b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17387a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   " level (zlib default),\n   and zlib version (%s)?\n\n",
1739b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 ZLIB_VERSION);
1740b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               wrote_question = 1;
1741b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
1742b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1743b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            FCLOSE(fpin);
1744b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            FCLOSE(fpout);
1745b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1746b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* NOTE: the unsupported_chunks escape is permitted here because
1747b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             * unsupported text chunk compression will result in the compression
1748b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             * mode being changed (to NONE) yet, in the test case, the result
1749b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             * can be exactly the same size!
1750b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             */
1751b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            if (strict != 0 && unsupported_chunks == 0)
1752b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              return (1);
1753b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1754b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            else
1755b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              return (0);
1756893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1757893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1758893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
175906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* WRITE && WRITE_FILTER */
1760893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1761893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   FCLOSE(fpin);
1762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   FCLOSE(fpout);
1763893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1764893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (0);
1765893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1767a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Input and output filenames */
1768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef RISCOS
1769893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST char *inname = "pngtest/png";
1770893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST char *outname = "pngout/png";
1771893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1772893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST char *inname = "pngtest.png";
1773893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST char *outname = "pngout.png";
1774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1775893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1776893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint
1777893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectmain(int argc, char *argv[])
1778893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int multiple = 0;
1780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int ierror = 0;
1781893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
17829b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   png_structp dummy_ptr;
17839b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
1784a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   fprintf(STDERR, "\n Testing libpng version %s\n", PNG_LIBPNG_VER_STRING);
1785893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   fprintf(STDERR, "   with zlib   version %s\n", ZLIB_VERSION);
17864215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, "%s", png_get_copyright(NULL));
1787893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Show the version of libpng used in building the library */
17884215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " library (%lu):%s",
17897a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       (unsigned long)png_access_version_number(),
17907a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_get_header_version(NULL));
1791b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1792893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Show the version of libpng used in building the application */
17934215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER,
17947a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       PNG_HEADER_VERSION_STRING);
1795893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1796893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Do some consistency checking on the memory allocation settings, I'm
1797a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * not sure this matters, but it is nice to know, the first of these
1798a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * tests should be impossible because of the way the macros are set
1799a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * in pngconf.h
1800a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    */
1801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)
1802893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, " NOTE: Zlib compiled for max 64k, libpng not\n");
1803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* I think the following can happen. */
1805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(MAXSEG_64K) && defined(PNG_MAX_MALLOC_64K)
1806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, " NOTE: libpng compiled for max 64k, zlib not\n");
1807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1809893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING))
1810893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1811893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR,
18127a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "Warning: versions are different between png.h and png.c\n");
1813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "  png.h version: %s\n", PNG_LIBPNG_VER_STRING);
1814893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "  png.c version: %s\n\n", png_libpng_ver);
1815893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ++ierror;
1816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1817893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1818893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (argc > 1)
1819893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1820893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (strcmp(argv[1], "-m") == 0)
1821893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1822893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         multiple = 1;
1823893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         status_dots_requested = 0;
1824893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1825b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1826893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (strcmp(argv[1], "-mv") == 0 ||
1827893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               strcmp(argv[1], "-vm") == 0 )
1828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1829893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         multiple = 1;
1830893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         verbose = 1;
1831893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         status_dots_requested = 1;
1832893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1833b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1834893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (strcmp(argv[1], "-v") == 0)
1835893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1836893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         verbose = 1;
1837893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         status_dots_requested = 1;
1838893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         inname = argv[2];
1839893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1840b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1841b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (strcmp(argv[1], "--strict") == 0)
1842b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
1843b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         status_dots_requested = 0;
1844b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         verbose = 1;
1845b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         inname = argv[2];
1846b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         strict++;
1847b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         relaxed = 0;
1848b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
1849b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1850b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (strcmp(argv[1], "--relaxed") == 0)
1851b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
1852b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         status_dots_requested = 0;
1853b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         verbose = 1;
1854b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         inname = argv[2];
1855b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         strict = 0;
1856b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         relaxed++;
1857b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
1858b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1859893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1860893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1861893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         inname = argv[1];
1862893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         status_dots_requested = 0;
1863893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1864893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1865893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
18669b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (multiple == 0 && argc == 3 + verbose)
18677a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      outname = argv[2 + verbose];
1868893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
18699b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((multiple == 0 && argc > 3 + verbose) ||
18709b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       (multiple != 0 && argc < 2))
1871893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
18727a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      fprintf(STDERR,
18737a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "usage: %s [infile.png] [outfile.png]\n\t%s -m {infile.png}\n",
18747a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          argv[0], argv[0]);
18757a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      fprintf(STDERR,
18767a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "  reads/writes one PNG file (without -m) or multiple files (-m)\n");
18777a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      fprintf(STDERR,
18787a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "  with -m %s is used as a temporary file\n", outname);
18797a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      exit(1);
1880893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1881893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
18829b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (multiple != 0)
1883893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1884893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int i;
1885893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
1886851c67770f9cebece9c79e914a54c348f539a512Matt Sarett      png_alloc_size_t allocation_now = current_allocation;
1887893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1888893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i=2; i<argc; ++i)
1889893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1890893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         int kerror;
1891a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         fprintf(STDERR, "\n Testing %s:", argv[i]);
18929b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#if PNG_DEBUG > 0
18939b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         fprintf(STDERR, "\n");
18949b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif
1895893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         kerror = test_one_file(argv[i], outname);
1896893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (kerror == 0)
1897893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
18985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
1899893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            fprintf(STDERR, "\n PASS (%lu zero samples)\n",
19007a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                (unsigned long)zero_samples);
1901893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1902893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            fprintf(STDERR, " PASS\n");
1903893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
19045f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
19059b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            if (tIME_chunk_present != 0)
19069b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett               fprintf(STDERR, " tIME = %s\n", tIME_string);
1907b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
19089b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            tIME_chunk_present = 0;
19099b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* TIME_RFC1123 */
1910893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1911b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1912893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
1913893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1914893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            fprintf(STDERR, " FAIL\n");
1915893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            ierror += kerror;
1916893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1917893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
1918893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (allocation_now != current_allocation)
1919851c67770f9cebece9c79e914a54c348f539a512Matt Sarett            fprintf(STDERR, "MEMORY ERROR: %lu bytes lost\n",
1920851c67770f9cebece9c79e914a54c348f539a512Matt Sarett                (unsigned long)(current_allocation - allocation_now));
1921b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1922893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (current_allocation != 0)
1923893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1924893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            memory_infop pinfo = pinformation;
1925893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1926851c67770f9cebece9c79e914a54c348f539a512Matt Sarett            fprintf(STDERR, "MEMORY ERROR: %lu bytes still allocated\n",
1927851c67770f9cebece9c79e914a54c348f539a512Matt Sarett                (unsigned long)current_allocation);
1928b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1929893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            while (pinfo != NULL)
1930893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
19319b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett               fprintf(STDERR, " %lu bytes at %p\n",
19327a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   (unsigned long)pinfo->size,
19337a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   pinfo->pointer);
1934893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               pinfo = pinfo->next;
1935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1936893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1937893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1938893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1939893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
1940851c67770f9cebece9c79e914a54c348f539a512Matt Sarett         fprintf(STDERR, " Current memory allocation: %20lu bytes\n",
1941851c67770f9cebece9c79e914a54c348f539a512Matt Sarett             (unsigned long)current_allocation);
1942851c67770f9cebece9c79e914a54c348f539a512Matt Sarett         fprintf(STDERR, " Maximum memory allocation: %20lu bytes\n",
1943851c67770f9cebece9c79e914a54c348f539a512Matt Sarett             (unsigned long) maximum_allocation);
1944851c67770f9cebece9c79e914a54c348f539a512Matt Sarett         fprintf(STDERR, " Total   memory allocation: %20lu bytes\n",
1945851c67770f9cebece9c79e914a54c348f539a512Matt Sarett             (unsigned long)total_allocation);
1946851c67770f9cebece9c79e914a54c348f539a512Matt Sarett         fprintf(STDERR, "     Number of allocations: %20lu\n",
1947851c67770f9cebece9c79e914a54c348f539a512Matt Sarett             (unsigned long)num_allocations);
1948893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1949893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1950b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
1952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1953893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int i;
19544215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      for (i = 0; i<3; ++i)
1955893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1956893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         int kerror;
1957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
1958851c67770f9cebece9c79e914a54c348f539a512Matt Sarett         png_alloc_size_t allocation_now = current_allocation;
1959893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1960b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (i == 1)
1961b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            status_dots_requested = 1;
1962b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1963b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else if (verbose == 0)
1964b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            status_dots_requested = 0;
1965b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1966893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (i == 0 || verbose == 1 || ierror != 0)
19679b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         {
1968a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            fprintf(STDERR, "\n Testing %s:", inname);
19699b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#if PNG_DEBUG > 0
19709b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            fprintf(STDERR, "\n");
19719b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif
19729b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         }
1973b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1974893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         kerror = test_one_file(inname, outname);
1975b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
19764215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (kerror == 0)
1977893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
19784215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            if (verbose == 1 || i == 2)
1979893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
19805f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
1981893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                fprintf(STDERR, "\n PASS (%lu zero samples)\n",
19827a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                    (unsigned long)zero_samples);
1983893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1984893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                fprintf(STDERR, " PASS\n");
1985893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
19865f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
19874215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project             if (tIME_chunk_present != 0)
19884215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                fprintf(STDERR, " tIME = %s\n", tIME_string);
19899b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* TIME_RFC1123 */
1990893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1991893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1992b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1993893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
1994893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
19954215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            if (verbose == 0 && i != 2)
19969b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            {
1997a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott               fprintf(STDERR, "\n Testing %s:", inname);
19989b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#if PNG_DEBUG > 0
19999b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett               fprintf(STDERR, "\n");
20009b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif
20019b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            }
2002b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2003893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            fprintf(STDERR, " FAIL\n");
2004893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            ierror += kerror;
2005893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
2006893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
2007893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (allocation_now != current_allocation)
2008851c67770f9cebece9c79e914a54c348f539a512Matt Sarett             fprintf(STDERR, "MEMORY ERROR: %lu bytes lost\n",
2009851c67770f9cebece9c79e914a54c348f539a512Matt Sarett                 (unsigned long)(current_allocation - allocation_now));
2010b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2011893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (current_allocation != 0)
2012893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
2013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             memory_infop pinfo = pinformation;
2014893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2015851c67770f9cebece9c79e914a54c348f539a512Matt Sarett             fprintf(STDERR, "MEMORY ERROR: %lu bytes still allocated\n",
2016851c67770f9cebece9c79e914a54c348f539a512Matt Sarett                 (unsigned long)current_allocation);
2017b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2018893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             while (pinfo != NULL)
2019893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             {
20209b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett                fprintf(STDERR, " %lu bytes at %p\n",
20217a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                    (unsigned long)pinfo->size, pinfo->pointer);
2022893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                pinfo = pinfo->next;
2023893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             }
2024893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          }
2025893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2026893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       }
2027893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
2028851c67770f9cebece9c79e914a54c348f539a512Matt Sarett       fprintf(STDERR, " Current memory allocation: %20lu bytes\n",
2029851c67770f9cebece9c79e914a54c348f539a512Matt Sarett           (unsigned long)current_allocation);
2030851c67770f9cebece9c79e914a54c348f539a512Matt Sarett       fprintf(STDERR, " Maximum memory allocation: %20lu bytes\n",
2031851c67770f9cebece9c79e914a54c348f539a512Matt Sarett           (unsigned long)maximum_allocation);
2032851c67770f9cebece9c79e914a54c348f539a512Matt Sarett       fprintf(STDERR, " Total   memory allocation: %20lu bytes\n",
2033851c67770f9cebece9c79e914a54c348f539a512Matt Sarett           (unsigned long)total_allocation);
2034851c67770f9cebece9c79e914a54c348f539a512Matt Sarett       fprintf(STDERR, "     Number of allocations: %20lu\n",
2035851c67770f9cebece9c79e914a54c348f539a512Matt Sarett           (unsigned long)num_allocations);
2036893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2037893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
2038893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2039893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
2040893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_stop = (float)clock();
2041893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_misc += (t_stop - t_start);
2042893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_start = t_stop;
20434215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " CPU time used = %.3f seconds",
20447a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       (t_misc+t_decode+t_encode)/(float)CLOCKS_PER_SEC);
20454215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " (decoding %.3f,\n",
20467a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       t_decode/(float)CLOCKS_PER_SEC);
20474215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, "        encoding %.3f ,",
20487a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       t_encode/(float)CLOCKS_PER_SEC);
20494215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " other %.3f seconds)\n\n",
20507a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       t_misc/(float)CLOCKS_PER_SEC);
2051893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2052893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2053893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (ierror == 0)
2054a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(STDERR, " libpng passes test\n");
2055b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2056893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
2057a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(STDERR, " libpng FAILS test\n");
2058b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
20599b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   dummy_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
20609b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   fprintf(STDERR, " Default limits:\n");
20619b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   fprintf(STDERR, "  width_max  = %lu\n",
20627a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       (unsigned long) png_get_user_width_max(dummy_ptr));
20639b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   fprintf(STDERR, "  height_max = %lu\n",
20647a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       (unsigned long) png_get_user_height_max(dummy_ptr));
20659b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (png_get_chunk_cache_max(dummy_ptr) == 0)
20669b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      fprintf(STDERR, "  cache_max  = unlimited\n");
20679b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   else
20689b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      fprintf(STDERR, "  cache_max  = %lu\n",
20697a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long) png_get_chunk_cache_max(dummy_ptr));
20709b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (png_get_chunk_malloc_max(dummy_ptr) == 0)
20719b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      fprintf(STDERR, "  malloc_max = unlimited\n");
20729b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   else
20739b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      fprintf(STDERR, "  malloc_max = %lu\n",
20747a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long) png_get_chunk_malloc_max(dummy_ptr));
20759b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   png_destroy_read_struct(&dummy_ptr, NULL, NULL);
20769b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
2077893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (int)(ierror != 0);
2078893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
2079b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#else
2080b50c217251b086440efcdb273c22f86a06c80cbaChris Craikint
2081b50c217251b086440efcdb273c22f86a06c80cbaChris Craikmain(void)
2082b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
2083b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   fprintf(STDERR,
20847a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       " test ignored because libpng was not built with read support\n");
2085b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* And skip this test */
2086851c67770f9cebece9c79e914a54c348f539a512Matt Sarett   return SKIP;
2087b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
2088b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
2089893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2090893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Generate a compiler error if there is an old png.h in the search path. */
2091851c67770f9cebece9c79e914a54c348f539a512Matt Saretttypedef png_libpng_version_1_6_25 Your_png_h_is_not_version_1_6_25;
2092