1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngtest.c - a simple test program to test libpng
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
43cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III * Last changed in libpng 1.6.32 [August 24, 2017]
53cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III * Copyright (c) 1998-2002,2004,2006-2017 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
46b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Known chunks that exist in pngtest.png must be supported or pngtest will fail
47b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * simply as a result of re-ordering them.  This may be fixed in 1.7
48b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari *
49b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * pngtest allocates a single row buffer for each row and overwrites it,
50b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * therefore if the write side doesn't support the writing of interlaced images
51b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * nothing can be done for an interlaced image (and the code below will fail
52b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * horribly trying to write extra data after writing garbage).
53b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
54b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if defined PNG_READ_SUPPORTED && /* else nothing can be done */\
55b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_bKGD_SUPPORTED &&\
56b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_cHRM_SUPPORTED &&\
57b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_gAMA_SUPPORTED &&\
58b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_oFFs_SUPPORTED &&\
59b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_pCAL_SUPPORTED &&\
60b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_pHYs_SUPPORTED &&\
61b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_sBIT_SUPPORTED &&\
62b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_sCAL_SUPPORTED &&\
63b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_sRGB_SUPPORTED &&\
6406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   defined PNG_READ_sPLT_SUPPORTED &&\
65b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_tEXt_SUPPORTED &&\
66b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined PNG_READ_tIME_SUPPORTED &&\
67b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   defined PNG_READ_zTXt_SUPPORTED &&\
6806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   (defined PNG_WRITE_INTERLACING_SUPPORTED || PNG_LIBPNG_VER >= 10700)
69b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari
70b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_ZLIB_HEADER
71b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  include PNG_ZLIB_HEADER /* defined by pnglibconf.h from 1.7 */
72b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#else
73b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  include "zlib.h"
74b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
75b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
76b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Copied from pngpriv.h but only used in error messages below. */
77b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifndef PNG_ZBUF_SIZE
78b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define PNG_ZBUF_SIZE 8192
79b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
80b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define FCLOSE(file) fclose(file)
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifndef PNG_STDIO_SUPPORTED
83b50c217251b086440efcdb273c22f86a06c80cbaChris Craiktypedef FILE                * png_FILE_p;
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
86b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Makes pngtest verbose so we can find problems. */
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef PNG_DEBUG
88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  define PNG_DEBUG 0
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
91b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if PNG_DEBUG > 1
92b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug(m)        ((void)fprintf(stderr, m "\n"))
93b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug1(m,p1)    ((void)fprintf(stderr, m "\n", p1))
94b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug2(m,p1,p2) ((void)fprintf(stderr, m "\n", p1, p2))
95b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#else
96b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug(m)        ((void)0)
97b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug1(m,p1)    ((void)0)
98b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define pngtest_debug2(m,p1,p2) ((void)0)
99b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
100b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !PNG_DEBUG
102a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#  define SINGLE_ROWBUF_ALLOC  /* Makes buffer overruns easier to nail */
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
10506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#ifndef PNG_UNUSED
10606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#  define PNG_UNUSED(param) (void)param;
10706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
10806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Turn on CPU timing
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNGTEST_TIMING
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project*/
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1135f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifndef PNG_FLOATING_POINT_SUPPORTED
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#undef PNGTEST_TIMING
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic float t_start, t_stop, t_decode, t_encode, t_misc;
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include <time.h>
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1225f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
1234215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#define PNG_tIME_STRING_LENGTH 29
1244215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic int tIME_chunk_present = 0;
1254215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic char tIME_string[PNG_tIME_STRING_LENGTH] = "tIME chunk is not present";
12606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
12706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#if PNG_LIBPNG_VER < 10619
12806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#define png_convert_to_rfc1123_buffer(ts, t) tIME_to_str(read_ptr, ts, t)
12906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
13006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarettstatic int
13106f1087a94f1e48298e89d77ccc51a0ced871958Matt SaretttIME_to_str(png_structp png_ptr, png_charp ts, png_const_timep t)
13206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett{
1337a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   png_const_charp str = png_convert_to_rfc1123(png_ptr, t);
13406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
1357a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   if (str == NULL)
1367a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       return 0;
13706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
1387a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   strcpy(ts, str);
1397a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   return 1;
14006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett}
14106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* older libpng */
142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic int verbose = 0;
145b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int strict = 0;
146b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int relaxed = 0;
1473cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins IIIstatic int xfail = 0;
148b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int unsupported_chunks = 0; /* chunk unsupported by libpng in input */
149b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int error_count = 0; /* count calls to png_error */
150b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int warning_count = 0; /* count calls to png_warning */
151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef png_jmpbuf
154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  define png_jmpbuf(png_ptr) png_ptr->jmpbuf
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
157b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Defines for unknown chunk handling if required. */
158b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifndef PNG_HANDLE_CHUNK_ALWAYS
159b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define PNG_HANDLE_CHUNK_ALWAYS       3
160b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
161b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifndef PNG_HANDLE_CHUNK_IF_SAFE
162b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define PNG_HANDLE_CHUNK_IF_SAFE      2
163b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
164b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
165b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Utility to save typing/errors, the argument must be a name */
166b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define MEMZERO(var) ((void)memset(&var, 0, sizeof var))
167b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
168a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Example of using row callbacks to make a simple progress meter */
1694215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic int status_pass = 1;
1704215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic int status_dots_requested = 0;
1714215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectstatic int status_dots = 1;
1724215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
173b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectread_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
176a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL || row_number > PNG_UINT_31_MAX)
177a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
178b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
179a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (status_pass != pass)
180a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   {
181a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(stdout, "\n Pass %d: ", pass);
182a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      status_pass = pass;
183a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      status_dots = 31;
184a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   }
185b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
186a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   status_dots--;
187b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
188a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (status_dots == 0)
189a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   {
190a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(stdout, "\n         ");
191a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      status_dots=30;
192a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   }
193b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
194a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   fprintf(stdout, "r");
195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
197b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_SUPPORTED
198b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectwrite_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
201a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7)
202a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
203b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
204a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   fprintf(stdout, "w");
205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
206b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
21006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett/* Example of using a user transform callback (doesn't do anything at present).
211a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
212b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
21306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarettread_user_callback(png_structp png_ptr, png_row_infop row_info, png_bytep data)
214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
21506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   PNG_UNUSED(png_ptr)
21606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   PNG_UNUSED(row_info)
21706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   PNG_UNUSED(data)
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
222a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Example of using user transform callback (we don't transform anything,
223a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * but merely count the zero samples)
224a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic png_uint_32 zero_samples;
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
228b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectcount_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data)
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep dp = data;
232b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr == NULL)
233b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return;
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
235a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Contents of row_info:
236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_uint_32 width      width of row
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_uint_32 rowbytes   number of bytes in row
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_byte color_type    color type of pixels
239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_byte bit_depth     bit depth of samples
240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_byte channels      number of channels (1-4)
241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    *  png_byte pixel_depth   bits per pixel (depth*channels)
242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2447a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   /* Counts the number of zero samples (or zero pixels if color_type is 3 */
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2467a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   if (row_info->color_type == 0 || row_info->color_type == 3)
2477a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   {
2487a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      int pos = 0;
2497a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      png_uint_32 n, nstop;
250b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2517a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      for (n = 0, nstop=row_info->width; n<nstop; n++)
2527a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      {
2537a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 1)
2547a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
2557a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (((*dp << pos++ ) & 0x80) == 0)
2567a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
257b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2587a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (pos == 8)
2597a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            {
2607a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               pos = 0;
2617a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp++;
2627a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            }
2637a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
264b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2657a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 2)
2667a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
2677a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (((*dp << (pos+=2)) & 0xc0) == 0)
2687a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
269b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2707a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (pos == 8)
2717a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            {
2727a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               pos = 0;
2737a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp++;
2747a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            }
2757a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
276b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2777a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 4)
2787a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
2797a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (((*dp << (pos+=4)) & 0xf0) == 0)
2807a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
281b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2827a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (pos == 8)
2837a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            {
2847a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               pos = 0;
2857a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp++;
2867a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            }
2877a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
288b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2897a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 8)
2907a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (*dp++ == 0)
2917a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
292b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2937a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->bit_depth == 16)
2947a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
2957a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if ((*dp | *(dp+1)) == 0)
2967a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               zero_samples++;
2977a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            dp+=2;
2987a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
2997a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      }
3007a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   }
3017a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   else /* Other color types */
3027a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   {
3037a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      png_uint_32 n, nstop;
3047a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      int channel;
3057a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      int color_channels = row_info->channels;
3067a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      if (row_info->color_type > 3)
3077a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         color_channels--;
308b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
3097a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      for (n = 0, nstop=row_info->width; n<nstop; n++)
3107a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      {
3117a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         for (channel = 0; channel < color_channels; channel++)
3127a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
3137a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (row_info->bit_depth == 8)
3147a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               if (*dp++ == 0)
3157a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                  zero_samples++;
316b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
3177a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (row_info->bit_depth == 16)
3187a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            {
3197a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               if ((*dp | *(dp+1)) == 0)
3207a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                  zero_samples++;
3217a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis
3227a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp+=2;
3237a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            }
3247a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
3257a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         if (row_info->color_type > 3)
3267a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         {
3277a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            dp++;
3287a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis            if (row_info->bit_depth == 16)
3297a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis               dp++;
3307a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis         }
3317a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      }
3327a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis   }
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
3349b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_USER_TRANSFORM */
335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
3365f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifndef PNG_STDIO_SUPPORTED
337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* START of code to validate stdio-free compilation */
338a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* These copies of the default read/write functions come from pngrio.c and
339a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * pngwio.c.  They allow "don't include stdio" testing of the library.
340a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This is the function that does the actual reading of data.  If you are
341a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * not reading from a standard C stream, you should create a replacement
342a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * read_data function and use it at run time with png_set_read_fn(), rather
343a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * than changing the library.
344a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
346b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_IO_STATE_SUPPORTED
347b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid
348b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpngtest_check_io_state(png_structp png_ptr, png_size_t data_length,
3497a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis    png_uint_32 io_op);
350b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid
351b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpngtest_check_io_state(png_structp png_ptr, png_size_t data_length,
3527a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis    png_uint_32 io_op)
353b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
354b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_uint_32 io_state = png_get_io_state(png_ptr);
355b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   int err = 0;
356b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
357b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Check if the current operation (reading / writing) is as expected. */
358b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if ((io_state & PNG_IO_MASK_OP) != io_op)
359b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "Incorrect operation in I/O state");
360b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
361b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Check if the buffer size specific to the current location
362b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * (file signature / header / data / crc) is as expected.
363b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
364b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   switch (io_state & PNG_IO_MASK_LOC)
365b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
366b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   case PNG_IO_SIGNATURE:
367b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (data_length > 8)
368b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         err = 1;
369b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      break;
370b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   case PNG_IO_CHUNK_HDR:
371b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (data_length != 8)
372b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         err = 1;
373b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      break;
374b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   case PNG_IO_CHUNK_DATA:
375b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      break;  /* no restrictions here */
376b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   case PNG_IO_CHUNK_CRC:
377b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (data_length != 4)
378b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         err = 1;
379b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      break;
380b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   default:
381b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      err = 1;  /* uninitialized */
382b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
3839b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (err != 0)
384b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "Bad I/O state or buffer size");
385b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
386b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
387b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
388b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
3915f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_size_t check = 0;
3925f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   png_voidp io_ptr;
393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* fread() returns 0 on error, so it is OK to store this in a png_size_t
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * instead of an int, which is what fread() actually returns.
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    */
3975f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   io_ptr = png_get_io_ptr(png_ptr);
3985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   if (io_ptr != NULL)
3995f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   {
400b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      check = fread(data, 1, length, (png_FILE_p)io_ptr);
4015f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott   }
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (check != length)
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
405b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "Read Error");
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
408b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_IO_STATE_SUPPORTED
409b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_check_io_state(png_ptr, length, PNG_IO_READING);
410b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
4135f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_FLUSH_SUPPORTED
414b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_flush(png_structp png_ptr)
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
417a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Do nothing; fflush() is said to be just a waste of energy. */
418b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   PNG_UNUSED(png_ptr)   /* Stifle compiler warning */
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This is the function that does the actual writing of data.  If you are
423a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * not writing to a standard C stream, you should create a replacement
424a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * write_data function and use it at run time with png_set_write_fn(), rather
425a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * than changing the library.
426a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
427b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
430b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_size_t check;
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
432b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   check = fwrite(data, 1, length, (png_FILE_p)png_get_io_ptr(png_ptr));
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (check != length)
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_error(png_ptr, "Write Error");
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
438b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
439b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_IO_STATE_SUPPORTED
440b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING);
441b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
4439b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* !STDIO */
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function is called when there is a warning, but the library thinks
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * it can continue anyway.  Replacement functions don't have to do anything
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * here if you don't want to.  In the default configuration, png_ptr is
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * not used, but it is passed in case it may be useful.
449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
450b50c217251b086440efcdb273c22f86a06c80cbaChris Craiktypedef struct
451b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
452b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   PNG_CONST char *file_name;
453b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}  pngtest_error_parameters;
454b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
455b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_warning(png_structp png_ptr, png_const_charp message)
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   PNG_CONST char *name = "UNKNOWN (ERROR!)";
459b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_error_parameters *test =
460b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      (pngtest_error_parameters*)png_get_error_ptr(png_ptr);
461b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
462b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   ++warning_count;
463b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
464b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (test != NULL && test->file_name != NULL)
465b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      name = test->file_name;
466b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
4673cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   fprintf(STDERR, "\n%s: libpng warning: %s\n", name, message);
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This is the default error handling function.  Note that replacements for
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * this function MUST NOT RETURN, or the program will likely crash.  This
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * function is used by default, or if the program supplies NULL for the
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * error function pointer in png_set_error_fn().
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
475b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void PNGCBAPI
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpngtest_error(png_structp png_ptr, png_const_charp message)
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
478b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   ++error_count;
479b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   pngtest_warning(png_ptr, message);
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* We can return because png_error calls the default handler, which is
482a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * actually OK in this case.
483a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    */
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
485b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
4864215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project/* END of code to validate stdio-free compilation */
487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* START of code to validate memory allocation and deallocation */
489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Allocate memory.  For reasonable files, size should never exceed
4929b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett * 64K.  However, zlib may allocate more than 64K if you don't tell
493a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * it not to.  See zconf.h and png.h for more information.  zlib does
494a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * need to allocate exactly 64K, so whatever you call here must
495a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * have the ability to do that.
496a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott *
497a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This piece of code can be compiled to validate max 64K allocations
498a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K.
499a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott */
500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projecttypedef struct memory_information
501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
502b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_alloc_size_t          size;
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_voidp                 pointer;
504b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   struct memory_information *next;
505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} memory_information;
506b50c217251b086440efcdb273c22f86a06c80cbaChris Craiktypedef memory_information *memory_infop;
507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic memory_infop pinformation = NULL;
5093cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins IIIstatic int current_allocation = 0;
5103cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins IIIstatic int maximum_allocation = 0;
5113cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins IIIstatic int total_allocation = 0;
5123cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins IIIstatic int num_allocations = 0;
513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
514b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_voidp PNGCBAPI png_debug_malloc PNGARG((png_structp png_ptr,
515b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    png_alloc_size_t size));
516b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid PNGCBAPI png_debug_free PNGARG((png_structp png_ptr, png_voidp ptr));
517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp
519b50c217251b086440efcdb273c22f86a06c80cbaChris CraikPNGCBAPI png_debug_malloc(png_structp png_ptr, png_alloc_size_t size)
520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* png_malloc has already tested for NULL; png_create_struct calls
523a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * png_debug_malloc directly, with png_ptr == NULL which is OK
524a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    */
525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (size == 0)
527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (NULL);
528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* This calls the library allocator twice, once to get the requested
530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      buffer and once to get a new free list entry. */
531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* Disable malloc_fn and free_fn */
533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      memory_infop pinfo;
534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_set_mem_fn(png_ptr, NULL, NULL, NULL);
535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      pinfo = (memory_infop)png_malloc(png_ptr,
5367a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (sizeof *pinfo));
537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      pinfo->size = size;
538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      current_allocation += size;
539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      total_allocation += size;
540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      num_allocations ++;
541b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (current_allocation > maximum_allocation)
543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         maximum_allocation = current_allocation;
544b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
545b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      pinfo->pointer = png_malloc(png_ptr, size);
546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* Restore malloc_fn and free_fn */
547b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
5484215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      png_set_mem_fn(png_ptr,
549b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          NULL, png_debug_malloc, png_debug_free);
550b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (size != 0 && pinfo->pointer == NULL)
552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         current_allocation -= size;
554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         total_allocation -= size;
555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_error(png_ptr,
556b50c217251b086440efcdb273c22f86a06c80cbaChris Craik           "out of memory in pngtest->png_debug_malloc");
557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
558b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      pinfo->next = pinformation;
560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      pinformation = pinfo;
561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      /* Make sure the caller isn't assuming zeroed memory. */
562b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      memset(pinfo->pointer, 0xdd, pinfo->size);
563b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
5649b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (verbose != 0)
565b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         printf("png_malloc %lu bytes at %p\n", (unsigned long)size,
5667a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             pinfo->pointer);
567b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (png_voidp)(pinfo->pointer);
569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Free a pointer.  It is removed from the list at the same time. */
573b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid PNGCBAPI
574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_debug_free(png_structp png_ptr, png_voidp ptr)
575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr == NULL)
577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "NULL pointer to png_debug_free.\n");
578b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (ptr == 0)
580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if 0 /* This happens all the time. */
582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "WARNING: freeing NULL pointer\n");
583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return;
585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Unlink the element from the list. */
5889b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (pinformation != NULL)
589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
590b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      memory_infop *ppinfo = &pinformation;
591b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (;;)
593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         memory_infop pinfo = *ppinfo;
595b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (pinfo->pointer == ptr)
597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *ppinfo = pinfo->next;
5993cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            current_allocation -= pinfo->size;
6003cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            if (current_allocation < 0)
601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               fprintf(STDERR, "Duplicate free of memory\n");
602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            /* We must free the list element too, but first kill
603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               the memory that is to be freed. */
604b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            memset(ptr, 0x55, pinfo->size);
6059b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            free(pinfo);
6064215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            pinfo = NULL;
607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
609b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (pinfo->next == NULL)
611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
6129b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            fprintf(STDERR, "Pointer %p not found\n", ptr);
613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
615b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         ppinfo = &pinfo->next;
617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Finally free the data. */
6219b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (verbose != 0)
622b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      printf("Freeing %p\n", ptr);
623b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
6249b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (ptr != NULL)
625b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      free(ptr);
6264215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   ptr = NULL;
627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
6289b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* USER_MEM && DEBUG */
629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* END of code to test memory allocation/deallocation */
630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
6314215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
632b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
6334215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project/* Demonstration of user chunk support of the sTER and vpAg chunks */
6344215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
635a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* (sTER is a public chunk not yet known by libpng.  vpAg is a private
6364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Projectchunk used in ImageMagick to store "virtual page" size).  */
6374215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
638b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic struct user_chunk_data
639b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
640b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_const_infop info_ptr;
641b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_uint_32     vpAg_width, vpAg_height;
642b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_byte        vpAg_units;
643b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_byte        sTER_mode;
644b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   int             location[2];
645b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
646b50c217251b086440efcdb273c22f86a06c80cbaChris Craikuser_chunk_data;
647b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
648b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Used for location and order; zero means nothing. */
649b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define have_sTER   0x01
650b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define have_vpAg   0x02
651b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define before_PLTE 0x10
652b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define before_IDAT 0x20
653b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#define after_IDAT  0x40
654b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
655b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
656b50c217251b086440efcdb273c22f86a06c80cbaChris Craikinit_callback_info(png_const_infop info_ptr)
657b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
658b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   MEMZERO(user_chunk_data);
659b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   user_chunk_data.info_ptr = info_ptr;
660b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
661b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
662b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int
663b50c217251b086440efcdb273c22f86a06c80cbaChris Craikset_location(png_structp png_ptr, struct user_chunk_data *data, int what)
664b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
665b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   int location;
666b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
6679b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((data->location[0] & what) != 0 || (data->location[1] & what) != 0)
668b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return 0; /* already have one of these */
6694215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
6709b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   /* Find where we are (the code below zeroes info_ptr to indicate that the
671b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * chunks before the first IDAT have been read.)
672b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
673b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (data->info_ptr == NULL) /* after IDAT */
674b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      location = what | after_IDAT;
675b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
6769b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   else if (png_get_valid(png_ptr, data->info_ptr, PNG_INFO_PLTE) != 0)
677b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      location = what | before_IDAT;
678b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
679b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else
680b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      location = what | before_PLTE;
681b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
682b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (data->location[0] == 0)
683b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      data->location[0] = location;
684b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
685b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else
686b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      data->location[1] = location;
6874215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
688b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return 1; /* handled */
689b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
690b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
691b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic int PNGCBAPI
692b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurariread_user_chunk_callback(png_struct *png_ptr, png_unknown_chunkp chunk)
6934215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project{
694b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   struct user_chunk_data *my_user_chunk_data =
695b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      (struct user_chunk_data*)png_get_user_chunk_ptr(png_ptr);
696b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
697b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (my_user_chunk_data == NULL)
698b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_error(png_ptr, "lost user chunk pointer");
699a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
700a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Return one of the following:
701a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *    return (-n);  chunk had an error
702a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *    return (0);  did not recognize
703a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *    return (n);  success
704a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *
705a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * The unknown chunk structure contains the chunk data:
706a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * png_byte name[5];
707a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * png_byte *data;
708a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * png_size_t size;
709a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    *
710a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * Note that libpng has already taken care of the CRC handling.
711a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    */
712a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
713a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (chunk->name[0] == 115 && chunk->name[1] ==  84 &&     /* s  T */
714a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott       chunk->name[2] ==  69 && chunk->name[3] ==  82)       /* E  R */
715a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      {
716a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Found sTER chunk */
717a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         if (chunk->size != 1)
718a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            return (-1); /* Error return */
719b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
720a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         if (chunk->data[0] != 0 && chunk->data[0] != 1)
721a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            return (-1);  /* Invalid mode */
722b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
7239b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (set_location(png_ptr, my_user_chunk_data, have_sTER) != 0)
724b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
725b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            my_user_chunk_data->sTER_mode=chunk->data[0];
726b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            return (1);
727b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
728b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
729b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else
730b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            return (0); /* duplicate sTER - give it to libpng */
731a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      }
732a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
733a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (chunk->name[0] != 118 || chunk->name[1] != 112 ||    /* v  p */
734a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott       chunk->name[2] !=  65 || chunk->name[3] != 103)      /* A  g */
735a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return (0); /* Did not recognize */
736a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
737a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   /* Found ImageMagick vpAg chunk */
738a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
739a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (chunk->size != 9)
740a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return (-1); /* Error return */
741a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
7429b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (set_location(png_ptr, my_user_chunk_data, have_vpAg) == 0)
743b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return (0);  /* duplicate vpAg */
744a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
745b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   my_user_chunk_data->vpAg_width = png_get_uint_31(png_ptr, chunk->data);
746b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   my_user_chunk_data->vpAg_height = png_get_uint_31(png_ptr, chunk->data + 4);
747b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   my_user_chunk_data->vpAg_units = chunk->data[8];
748a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
749a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   return (1);
750b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
751b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
752b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_SUPPORTED
753b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
754b50c217251b086440efcdb273c22f86a06c80cbaChris Craikwrite_sTER_chunk(png_structp write_ptr)
755b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
756b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   png_byte sTER[5] = {115,  84,  69,  82, '\0'};
757b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
7589b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (verbose != 0)
759b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      fprintf(STDERR, "\n stereo mode = %d\n", user_chunk_data.sTER_mode);
760b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
761b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   png_write_chunk(write_ptr, sTER, &user_chunk_data.sTER_mode, 1);
762b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
763b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
764b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
765b50c217251b086440efcdb273c22f86a06c80cbaChris Craikwrite_vpAg_chunk(png_structp write_ptr)
766b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
767b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   png_byte vpAg[5] = {118, 112,  65, 103, '\0'};
7684215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
769b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_byte vpag_chunk_data[9];
770b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
7719b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (verbose != 0)
772b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      fprintf(STDERR, " vpAg = %lu x %lu, units = %d\n",
7737a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long)user_chunk_data.vpAg_width,
7747a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long)user_chunk_data.vpAg_height,
7757a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          user_chunk_data.vpAg_units);
776b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
777b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_save_uint_32(vpag_chunk_data, user_chunk_data.vpAg_width);
778b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_save_uint_32(vpag_chunk_data + 4, user_chunk_data.vpAg_height);
779b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   vpag_chunk_data[8] = user_chunk_data.vpAg_units;
780b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   png_write_chunk(write_ptr, vpAg, vpag_chunk_data, 9);
7814215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project}
782b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
783b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
784b50c217251b086440efcdb273c22f86a06c80cbaChris Craikwrite_chunks(png_structp write_ptr, int location)
785b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
786b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   int i;
787b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
788b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Notice that this preserves the original chunk order, however chunks
789b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * intercepted by the callback will be written *after* chunks passed to
790b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * libpng.  This will actually reverse a pair of sTER chunks or a pair of
791b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * vpAg chunks, resulting in an error later.  This is not worth worrying
792b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * about - the chunks should not be duplicated!
793b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
794b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   for (i=0; i<2; ++i)
795b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
796b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (user_chunk_data.location[i] == (location | have_sTER))
797b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         write_sTER_chunk(write_ptr);
798b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
799b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (user_chunk_data.location[i] == (location | have_vpAg))
800b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         write_vpAg_chunk(write_ptr);
801b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
802b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
8039b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE */
8049b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#else /* !READ_USER_CHUNKS */
805b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  define write_chunks(pp,loc) ((void)0)
8064215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#endif
8074215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project/* END of code to demonstrate user chunk support */
8084215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
809b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* START of code to check that libpng has the required text support; this only
810b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * checks for the write support because if read support is missing the chunk
811b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * will simply not be reported back to pngtest.
812b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
813b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_TEXT_SUPPORTED
814b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic void
81506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarettpngtest_check_text_support(png_structp png_ptr, png_textp text_ptr,
8167a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis    int num_text)
817b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
818b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   while (num_text > 0)
819b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
820b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      switch (text_ptr[--num_text].compression)
821b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
822b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case PNG_TEXT_COMPRESSION_NONE:
823b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
824b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
825b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case PNG_TEXT_COMPRESSION_zTXt:
826b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#           ifndef PNG_WRITE_zTXt_SUPPORTED
827b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               ++unsupported_chunks;
82806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               /* In libpng 1.7 this now does an app-error, so stop it: */
82906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               text_ptr[num_text].compression = PNG_TEXT_COMPRESSION_NONE;
830b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#           endif
831b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
832b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
833b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case PNG_ITXT_COMPRESSION_NONE:
834b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case PNG_ITXT_COMPRESSION_zTXt:
835b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#           ifndef PNG_WRITE_iTXt_SUPPORTED
836b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               ++unsupported_chunks;
83706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               text_ptr[num_text].compression = PNG_TEXT_COMPRESSION_NONE;
838b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#           endif
839b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
840b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
841b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         default:
842b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This is an error */
843b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            png_error(png_ptr, "invalid text chunk compression field");
844b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
845b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
846b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
847b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
848b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
849b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* END of code to check that libpng has the required text support */
850b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
851893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Test one file */
852b50c217251b086440efcdb273c22f86a06c80cbaChris Craikstatic int
853893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projecttest_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
854893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
855893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   static png_FILE_p fpin;
856893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   static png_FILE_p fpout;  /* "static" prevents setjmp corruption */
857b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_error_parameters error_parameters;
858893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_structp read_ptr;
859893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop read_info_ptr, end_info_ptr;
860893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
861893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_structp write_ptr;
862893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop write_info_ptr;
863893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop write_end_info_ptr;
86406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#ifdef PNG_WRITE_FILTER_SUPPORTED
865b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   int interlace_preserved = 1;
86606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* WRITE_FILTER */
86706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#else /* !WRITE */
868893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_structp write_ptr = NULL;
869893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop write_info_ptr = NULL;
870893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_infop write_end_info_ptr = NULL;
87106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* !WRITE */
872893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_bytep row_buf;
873893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_uint_32 y;
874893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_uint_32 width, height;
87506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   volatile int num_passes;
87606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   int pass;
877893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int bit_depth, color_type;
878893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
879893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   row_buf = NULL;
880b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   error_parameters.file_name = inname;
881893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
882893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((fpin = fopen(inname, "rb")) == NULL)
883893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
884893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "Could not find input file %s\n", inname);
885893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
886893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
887893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
888893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((fpout = fopen(outname, "wb")) == NULL)
889893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
890893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "Could not open output file %s\n", outname);
891893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpin);
892893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
893893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
894893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
895b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Allocating read and write structures");
896893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
8974215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   read_ptr =
8987a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_create_read_struct_2(PNG_LIBPNG_VER_STRING, NULL,
8997a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL, NULL, NULL, png_debug_malloc, png_debug_free);
900893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
9014215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   read_ptr =
9027a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
903893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
904b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_error_fn(read_ptr, &error_parameters, pngtest_error,
9057a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       pngtest_warning);
9064215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
907893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
908893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
9094215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   write_ptr =
9107a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL,
9117a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL, NULL, NULL, png_debug_malloc, png_debug_free);
912893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
9134215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   write_ptr =
9147a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
915893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
916b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_error_fn(write_ptr, &error_parameters, pngtest_error,
9177a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       pngtest_warning);
9184215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project#endif
919b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Allocating read_info, write_info and end_info structures");
920893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   read_info_ptr = png_create_info_struct(read_ptr);
921893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   end_info_ptr = png_create_info_struct(read_ptr);
922893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
923893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   write_info_ptr = png_create_info_struct(write_ptr);
924893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   write_end_info_ptr = png_create_info_struct(write_ptr);
925893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
926893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
927b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
928b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   init_callback_info(read_info_ptr);
929b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_read_user_chunk_fn(read_ptr, &user_chunk_data,
9307a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       read_user_chunk_callback);
9317a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis#endif
9327a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis
933893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_SETJMP_SUPPORTED
934b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Setting jmpbuf for read struct");
935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (setjmp(png_jmpbuf(read_ptr)))
936893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
937893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "%s -> %s: libpng read error\n", inname, outname);
938893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_free(read_ptr, row_buf);
9394215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      row_buf = NULL;
9403cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      if (verbose != 0)
9413cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III        fprintf(STDERR, "   destroy read structs\n");
942893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
943893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
9443cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      if (verbose != 0)
9453cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III        fprintf(STDERR, "   destroy write structs\n");
946893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_info_struct(write_ptr, &write_end_info_ptr);
947893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_write_struct(&write_ptr, &write_info_ptr);
948893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
949893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpin);
950893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpout);
951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
953893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
954893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
955b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Setting jmpbuf for write struct");
956b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (setjmp(png_jmpbuf(write_ptr)))
958893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
959893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "%s -> %s: libpng write error\n", inname, outname);
9603cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      if (verbose != 0)
9613cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III        fprintf(STDERR, "   destroying read structs\n");
962893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
9633cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      if (verbose != 0)
9643cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III        fprintf(STDERR, "   destroying write structs\n");
965893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_info_struct(write_ptr, &write_end_info_ptr);
966893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_destroy_write_struct(&write_ptr, &write_info_ptr);
967893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpin);
968893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpout);
969893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
970893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
971893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
972893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
973b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
9743cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III#ifdef PNG_BENIGN_ERRORS_SUPPORTED
9759b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (strict != 0)
976b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
977b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Treat png_benign_error() as errors on read */
978b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_benign_errors(read_ptr, 0);
979b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
9803cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III# ifdef PNG_WRITE_SUPPORTED
981b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Treat them as errors on write */
982b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_benign_errors(write_ptr, 0);
9833cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III# endif
984b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
985b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* if strict is not set, then app warnings and errors are treated as
986b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * warnings in release builds, but not in unstable builds; this can be
987b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * changed with '--relaxed'.
988b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       */
989b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
990b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
9919b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   else if (relaxed != 0)
992b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
993b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Allow application (pngtest) errors and warnings to pass */
994b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_benign_errors(read_ptr, 1);
995b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
9963cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      /* Turn off CRC checking while reading */
9973cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      png_set_crc_action(read_ptr, PNG_CRC_QUIET_USE, PNG_CRC_QUIET_USE);
9983cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III
9993cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III#ifdef PNG_IGNORE_ADLER32
10003cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      /* Turn off ADLER32 checking while reading */
10013cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      png_set_option(read_ptr, PNG_IGNORE_ADLER32, PNG_OPTION_ON);
1002851c67770f9cebece9c79e914a54c348f539a512Matt Sarett#endif
10033cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III
10043cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III# ifdef PNG_WRITE_SUPPORTED
10053cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      png_set_benign_errors(write_ptr, 1);
10063cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III# endif
10073cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III
1008b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
10093cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III#endif /* BENIGN_ERRORS */
1010893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1011b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Initializing input and output streams");
10125f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_STDIO_SUPPORTED
1013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_init_io(read_ptr, fpin);
1014893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  ifdef PNG_WRITE_SUPPORTED
1015893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_init_io(write_ptr, fpout);
1016893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  endif
1017893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1018893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_read_fn(read_ptr, (png_voidp)fpin, pngtest_read_data);
1019893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  ifdef PNG_WRITE_SUPPORTED
1020893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_write_fn(write_ptr, (png_voidp)fpout,  pngtest_write_data,
10215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#    ifdef PNG_WRITE_FLUSH_SUPPORTED
10227a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       pngtest_flush);
1023893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#    else
10247a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL);
1025893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#    endif
1026893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#  endif
1027893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1028b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
10294215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   if (status_dots_requested == 1)
1030893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1031893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1032893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_set_write_status_fn(write_ptr, write_row_callback);
1033893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1034893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_set_read_status_fn(read_ptr, read_row_callback);
1035893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1036b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1037893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
1038893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1039893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1040b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_write_status_fn(write_ptr, NULL);
1041893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1042b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_set_read_status_fn(read_ptr, NULL);
1043893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1044893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
10455f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
104606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   png_set_read_user_transform_fn(read_ptr, read_user_callback);
1047893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
10485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
10494215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   zero_samples = 0;
1050893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_write_user_transform_fn(write_ptr, count_zero_samples);
1051893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1052893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1053b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
1054b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Preserve all the unknown chunks, if possible.  If this is disabled then,
1055b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * even if the png_{get,set}_unknown_chunks stuff is enabled, we can't use
1056b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * libpng to *save* the unknown chunks on read (because we can't switch the
1057b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * save option on!)
1058b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    *
1059b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * Notice that if SET_UNKNOWN_CHUNKS is *not* supported read will discard all
1060b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * unknown chunks and write will write them all.
1061b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1062b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
1063893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_keep_unknown_chunks(read_ptr, PNG_HANDLE_CHUNK_ALWAYS,
10647a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL, 0);
1065893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
10665f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1067b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_keep_unknown_chunks(write_ptr, PNG_HANDLE_CHUNK_ALWAYS,
10687a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       NULL, 0);
1069b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1070893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1072b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Reading info struct");
1073893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_info(read_ptr, read_info_ptr);
1074893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1075b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
1076b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* This is a bit of a hack; there is no obvious way in the callback function
1077b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * to determine that the chunks before the first IDAT have been read, so
1078b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * remove the info_ptr (which is only used to determine position relative to
1079b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * PLTE) here to indicate that we are after the IDAT.
1080b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1081b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   user_chunk_data.info_ptr = NULL;
1082b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1083b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1084b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Transferring info struct");
1085893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1086893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int interlace_type, compression_type, filter_type;
1087893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_IHDR(read_ptr, read_info_ptr, &width, &height, &bit_depth,
10899b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett          &color_type, &interlace_type, &compression_type, &filter_type) != 0)
1090893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1091893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_IHDR(write_ptr, write_info_ptr, width, height, bit_depth,
10927a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             color_type, interlace_type, compression_type, filter_type);
109306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         /* num_passes may not be available below if interlace support is not
109406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett          * provided by libpng for both read and write.
1095b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari          */
1096b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         switch (interlace_type)
1097b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         {
1098b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari            case PNG_INTERLACE_NONE:
109906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               num_passes = 1;
1100b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari               break;
1101b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari
1102b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari            case PNG_INTERLACE_ADAM7:
110306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               num_passes = 7;
110406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               break;
1105b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari
1106b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari            default:
110706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               png_error(read_ptr, "invalid interlace type");
110806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               /*NOT REACHED*/
1109b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         }
1110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
11119b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
111206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      else
111306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         png_error(read_ptr, "png_get_IHDR failed");
111406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   }
11155f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_FIXED_POINT_SUPPORTED
11165f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_cHRM_SUPPORTED
1117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
11197a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          blue_y;
1120b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
11215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott      if (png_get_cHRM_fixed(read_ptr, read_info_ptr, &white_x, &white_y,
11227a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y) != 0)
1123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_cHRM_fixed(write_ptr, write_info_ptr, white_x, white_y, red_x,
11257a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             red_y, green_x, green_y, blue_x, blue_y);
1126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11295f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_gAMA_SUPPORTED
1130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_fixed_point gamma;
1132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11339b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma) != 0)
1134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma);
1135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else /* Use floating point versions */
11385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_FLOATING_POINT_SUPPORTED
11395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_cHRM_SUPPORTED
1140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      double white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
11427a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          blue_y;
1143b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_cHRM(read_ptr, read_info_ptr, &white_x, &white_y, &red_x,
11457a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &red_y, &green_x, &green_y, &blue_x, &blue_y) != 0)
1146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_cHRM(write_ptr, write_info_ptr, white_x, white_y, red_x,
11487a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             red_y, green_x, green_y, blue_x, blue_y);
1149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_gAMA_SUPPORTED
1153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      double gamma;
1155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11569b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_gAMA(read_ptr, read_info_ptr, &gamma) != 0)
1157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_gAMA(write_ptr, write_info_ptr, gamma);
1158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1160a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* Floating point */
1161a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott#endif /* Fixed point */
11625f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_iCCP_SUPPORTED
1163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp name;
1165b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_bytep profile;
1166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 proflen;
1167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int compression_type;
1168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_iCCP(read_ptr, read_info_ptr, &name, &compression_type,
11707a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &profile, &proflen) != 0)
1171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_iCCP(write_ptr, write_info_ptr, name, compression_type,
11737a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             profile, proflen);
1174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
11775f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_sRGB_SUPPORTED
1178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int intent;
1180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11819b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_sRGB(read_ptr, read_info_ptr, &intent) != 0)
1182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_sRGB(write_ptr, write_info_ptr, intent);
1183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_colorp palette;
1187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int num_palette;
1188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11899b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette) != 0)
1190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);
1191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
11925f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_bKGD_SUPPORTED
1193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_color_16p background;
1195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11969b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_bKGD(read_ptr, read_info_ptr, &background) != 0)
1197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_bKGD(write_ptr, write_info_ptr, background);
1199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12023cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III#ifdef PNG_READ_eXIf_SUPPORTED
12033cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   {
12043cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      png_bytep exif=NULL;
12053cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      png_uint_32 exif_length;
12063cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III
12073cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      if (png_get_eXIf_1(read_ptr, read_info_ptr, &exif_length, &exif) != 0)
12083cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      {
12093cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         if (exif_length > 1)
12103cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            fprintf(STDERR," eXIf type %c%c, %lu bytes\n",exif[0],exif[1],
12113cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III               (unsigned long)exif_length);
12123cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III# ifdef PNG_WRITE_eXIf_SUPPORTED
12133cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         png_set_eXIf_1(write_ptr, write_info_ptr, exif_length, exif);
12143cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III# endif
12153cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      }
12163cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   }
12173cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III#endif
12185f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_hIST_SUPPORTED
1219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_16p hist;
1221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12229b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_hIST(read_ptr, read_info_ptr, &hist) != 0)
1223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_hIST(write_ptr, write_info_ptr, hist);
1224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12265f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_oFFs_SUPPORTED
1227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_int_32 offset_x, offset_y;
1229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int unit_type;
1230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12314215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      if (png_get_oFFs(read_ptr, read_info_ptr, &offset_x, &offset_y,
12329b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett          &unit_type) != 0)
1233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type);
1235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_pCAL_SUPPORTED
1239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp purpose, units;
1241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charpp params;
1242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_int_32 X0, X1;
1243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int type, nparams;
1244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_pCAL(read_ptr, read_info_ptr, &purpose, &X0, &X1, &type,
12467a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &nparams, &units, &params) != 0)
1247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_pCAL(write_ptr, write_info_ptr, purpose, X0, X1, type,
12497a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             nparams, units, params);
1250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_pHYs_SUPPORTED
1254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 res_x, res_y;
1256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int unit_type;
1257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12589b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y,
12599b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett          &unit_type) != 0)
1260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type);
1261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_sBIT_SUPPORTED
1264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_color_8p sig_bit;
1266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
12679b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit) != 0)
1268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_sBIT(write_ptr, write_info_ptr, sig_bit);
1269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
12715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_sCAL_SUPPORTED
1272b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if defined(PNG_FLOATING_POINT_SUPPORTED) && \
1273b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)
1274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int unit;
1276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      double scal_width, scal_height;
1277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_sCAL(read_ptr, read_info_ptr, &unit, &scal_width,
12797a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &scal_height) != 0)
1280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_sCAL(write_ptr, write_info_ptr, unit, scal_width, scal_height);
1282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_FIXED_POINT_SUPPORTED
1286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int unit;
1288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_charp scal_width, scal_height;
1289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_sCAL_s(read_ptr, read_info_ptr, &unit, &scal_width,
12917a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis           &scal_height) != 0)
1292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
12935f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         png_set_sCAL_s(write_ptr, write_info_ptr, unit, scal_width,
12945f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott             scal_height);
1295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
129706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
129806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
129906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
13009b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
13019b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#ifdef PNG_sPLT_SUPPORTED
13029b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   {
13039b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       png_sPLT_tp entries;
13049b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
13059b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       int num_entries = (int) png_get_sPLT(read_ptr, read_info_ptr, &entries);
13069b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       if (num_entries)
13079b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       {
13089b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett           png_set_sPLT(write_ptr, write_info_ptr, entries, num_entries);
13099b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       }
13109b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   }
131106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
13129b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
13135f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TEXT_SUPPORTED
1314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int num_text;
1317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0)
1319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1320b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text);
1321b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1322b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_check_text_support(read_ptr, text_ptr, num_text);
1323b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
13249b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (verbose != 0)
1325b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1326b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            int i;
1327b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
13283cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            fprintf(STDERR,"\n");
1329b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (i=0; i<num_text; i++)
1330b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
13313cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III               fprintf(STDERR,"   Text compression[%d]=%d\n",
13327a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   i, text_ptr[i].compression);
1333b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
1334b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1335b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_text(write_ptr, write_info_ptr, text_ptr, num_text);
1337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
133906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
13405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_tIME_SUPPORTED
1341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_timep mod_time;
1343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
13449b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_tIME(read_ptr, read_info_ptr, &mod_time) != 0)
1345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_tIME(write_ptr, write_info_ptr, mod_time);
13475f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
13489b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (png_convert_to_rfc1123_buffer(tIME_string, mod_time) != 0)
1349b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            tIME_string[(sizeof tIME_string) - 1] = '\0';
1350b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1351b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else
1352b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1353b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            strncpy(tIME_string, "*** invalid time ***", (sizeof tIME_string));
1354b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            tIME_string[(sizeof tIME_string) - 1] = '\0';
1355b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1356b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         tIME_chunk_present++;
13589b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* TIME_RFC1123 */
1359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
136106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
13625f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_tRNS_SUPPORTED
1363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1364b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_bytep trans_alpha;
1365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int num_trans;
1366b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_color_16p trans_color;
1367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1368b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (png_get_tRNS(read_ptr, read_info_ptr, &trans_alpha, &num_trans,
13697a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &trans_color) != 0)
1370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
13715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         int sample_max = (1 << bit_depth);
1372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         /* libpng doesn't reject a tRNS chunk with out-of-range samples */
13735f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott         if (!((color_type == PNG_COLOR_TYPE_GRAY &&
1374b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             (int)trans_color->gray > sample_max) ||
13755f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott             (color_type == PNG_COLOR_TYPE_RGB &&
1376b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             ((int)trans_color->red > sample_max ||
1377b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             (int)trans_color->green > sample_max ||
1378b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             (int)trans_color->blue > sample_max))))
1379b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            png_set_tRNS(write_ptr, write_info_ptr, trans_alpha, num_trans,
1380b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               trans_color);
1381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
138306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif
13845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_unknown_chunkp unknowns;
1387b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      int num_unknowns = png_get_unknown_chunks(read_ptr, read_info_ptr,
13887a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &unknowns);
1389b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
13909b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (num_unknowns != 0)
1391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns,
13937a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             num_unknowns);
1394b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if PNG_LIBPNG_VER < 10600
1395a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Copy the locations from the read_info_ptr.  The automatically
1396b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * generated locations in write_end_info_ptr are wrong prior to 1.6.0
1397b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * because they are reset from the write pointer (removed in 1.6.0).
1398a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          */
1399b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1400b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            int i;
1401b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (i = 0; i < num_unknowns; i++)
1402b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              png_set_unknown_chunk_location(write_ptr, write_info_ptr, i,
14037a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                  unknowns[i].location);
1404b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1405b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1411b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Writing info struct");
1412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1413b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Write the info in two steps so that if we write the 'unknown' chunks here
1414b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * they go to the correct place.
1415b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1416b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_write_info_before_PLTE(write_ptr, write_info_ptr);
1417a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1418b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   write_chunks(write_ptr, before_PLTE); /* before PLTE */
1419a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott
1420b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_write_info(write_ptr, write_info_ptr);
14214215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
1422b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   write_chunks(write_ptr, before_IDAT); /* after PLTE */
14233cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III
14243cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   png_write_info(write_ptr, write_end_info_ptr);
14253cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III
14263cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   write_chunks(write_ptr, after_IDAT); /* after IDAT */
14273cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III
14283cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III#ifdef PNG_COMPRESSION_COMPAT
14293cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   /* Test the 'compatibility' setting here, if it is available. */
14303cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   png_set_compression(write_ptr, PNG_COMPRESSION_COMPAT);
14313cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III#endif
1432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef SINGLE_ROWBUF_ALLOC
1435b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Allocating row buffer...");
1436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   row_buf = (png_bytep)png_malloc(read_ptr,
14377a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_get_rowbytes(read_ptr, read_info_ptr));
1438b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1439b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug1("\t0x%08lx", (unsigned long)row_buf);
1440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* SINGLE_ROWBUF_ALLOC */
1441b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Writing row data");
1442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
144306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#if defined(PNG_READ_INTERLACING_SUPPORTED) &&\
144406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   defined(PNG_WRITE_INTERLACING_SUPPORTED)
144506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   /* Both must be defined for libpng to be able to handle the interlace,
144606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett    * otherwise it gets handled below by simply reading and writing the passes
144706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett    * directly.
144806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett    */
144906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   if (png_set_interlace_handling(read_ptr) != num_passes)
145006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      png_error(write_ptr,
14517a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "png_set_interlace_handling(read): wrong pass count ");
145206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   if (png_set_interlace_handling(write_ptr) != num_passes)
145306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      png_error(write_ptr,
14547a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "png_set_interlace_handling(write): wrong pass count ");
145506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#else /* png_set_interlace_handling not called on either read or write */
145606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#  define calc_pass_height
145706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* not using libpng interlace handling */
1458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
1460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_stop = (float)clock();
1461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_misc += (t_stop - t_start);
1462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_start = t_stop;
1463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
146406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett   for (pass = 0; pass < num_passes; pass++)
1465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
146606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#     ifdef calc_pass_height
146706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         png_uint_32 pass_height;
146806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
146906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         if (num_passes == 7) /* interlaced */
147006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         {
147106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett            if (PNG_PASS_COLS(width, pass) > 0)
147206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               pass_height = PNG_PASS_ROWS(height, pass);
147306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
147406f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett            else
147506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett               pass_height = 0;
147606f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         }
147706f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
147806f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett         else /* not interlaced */
147906f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett            pass_height = height;
148006f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#     else
148106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#        define pass_height height
148206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#     endif
148306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett
1484b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      pngtest_debug1("Writing row data for pass %d", pass);
148506f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      for (y = 0; y < pass_height; y++)
1486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef SINGLE_ROWBUF_ALLOC
1488b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_debug2("Allocating row buffer (pass %d, y = %u)...", pass, y);
14899b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
1490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         row_buf = (png_bytep)png_malloc(read_ptr,
14917a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             png_get_rowbytes(read_ptr, read_info_ptr));
1492b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
14939b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         pngtest_debug2("\t0x%08lx (%lu bytes)", (unsigned long)row_buf,
14947a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             (unsigned long)png_get_rowbytes(read_ptr, read_info_ptr));
1495b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* !SINGLE_ROWBUF_ALLOC */
1497b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1);
1498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
1501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_stop = (float)clock();
1502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_decode += (t_stop - t_start);
1503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_start = t_stop;
1504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_write_rows(write_ptr, (png_bytepp)&row_buf, 1);
1506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
1507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_stop = (float)clock();
1508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_encode += (t_stop - t_start);
1509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         t_start = t_stop;
1510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
15119b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE */
1512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef SINGLE_ROWBUF_ALLOC
1514b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_debug2("Freeing row buffer (pass %d, y = %u)", pass, y);
1515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_free(read_ptr, row_buf);
15164215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         row_buf = NULL;
1517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* !SINGLE_ROWBUF_ALLOC */
1518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1521b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
1522b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
1523b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_free_data(read_ptr, read_info_ptr, PNG_FREE_UNKN, -1);
1524b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  endif
1525b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1526b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1);
1527b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#  endif
1528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1530b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Reading and writing end_info data");
1531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_read_end(read_ptr, end_info_ptr);
15335f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TEXT_SUPPORTED
1534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_textp text_ptr;
1536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int num_text;
1537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0)
1539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1540b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text);
1541b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1542b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         pngtest_check_text_support(read_ptr, text_ptr, num_text);
1543b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
15449b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (verbose != 0)
1545b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1546b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            int i;
1547b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
15483cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            fprintf(STDERR,"\n");
1549b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (i=0; i<num_text; i++)
1550b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
15513cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III               fprintf(STDERR,"   Text compression[%d]=%d\n",
15527a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   i, text_ptr[i].compression);
1553b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
1554b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1555b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text);
1557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
15603cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III#ifdef PNG_READ_eXIf_SUPPORTED
15613cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   {
15623cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      png_bytep exif=NULL;
15633cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      png_uint_32 exif_length;
15643cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III
15653cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      if (png_get_eXIf_1(read_ptr, end_info_ptr, &exif_length, &exif) != 0)
15663cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      {
15673cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         if (exif_length > 1)
15683cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            fprintf(STDERR," eXIf type %c%c, %lu bytes\n",exif[0],exif[1],
15693cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III               (unsigned long)exif_length);
15703cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III# ifdef PNG_WRITE_eXIf_SUPPORTED
15713cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         png_set_eXIf_1(write_ptr, write_end_info_ptr, exif_length, exif);
15723cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III# endif
15733cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      }
15743cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   }
15753cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III#endif
15765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_tIME_SUPPORTED
1577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_timep mod_time;
1579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15809b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (png_get_tIME(read_ptr, end_info_ptr, &mod_time) != 0)
1581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_tIME(write_ptr, write_end_info_ptr, mod_time);
15835f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
15849b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (png_convert_to_rfc1123_buffer(tIME_string, mod_time) != 0)
1585b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            tIME_string[(sizeof tIME_string) - 1] = '\0';
1586b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1587b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else
1588b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1589b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            strncpy(tIME_string, "*** invalid time ***", sizeof tIME_string);
1590b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            tIME_string[(sizeof tIME_string)-1] = '\0';
1591b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1592b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         tIME_chunk_present++;
15949b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* TIME_RFC1123 */
1595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
15985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_unknown_chunkp unknowns;
1601b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      int num_unknowns = png_get_unknown_chunks(read_ptr, end_info_ptr,
16027a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          &unknowns);
1603b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
16049b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if (num_unknowns != 0)
1605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns,
16077a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             num_unknowns);
1608b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if PNG_LIBPNG_VER < 10600
1609a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         /* Copy the locations from the read_info_ptr.  The automatically
1610b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * generated locations in write_end_info_ptr are wrong prior to 1.6.0
1611b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * because they are reset from the write pointer (removed in 1.6.0).
1612a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott          */
1613b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
1614b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            int i;
1615b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (i = 0; i < num_unknowns; i++)
1616b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i,
16177a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                  unknowns[i].location);
1618b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
1619b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1623b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1625b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
1626b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Normally one would use Z_DEFAULT_STRATEGY for text compression.
1627b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * This is here just to make pngtest replicate the results from libpng
1628b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * versions prior to 1.5.4, and to test this new API.
1629b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1630b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_set_text_compression_strategy(write_ptr, Z_FILTERED);
1631b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
1632b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1633b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* When the unknown vpAg/sTER chunks are written by pngtest the only way to
1634b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * do it is to write them *before* calling png_write_end.  When unknown
1635b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * chunks are written by libpng, however, they are written just before IEND.
1636b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * There seems to be no way round this, however vpAg/sTER are not expected
1637b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * after IDAT.
1638b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1639b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   write_chunks(write_ptr, after_IDAT);
1640b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_write_end(write_ptr, write_end_info_ptr);
1642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_EASY_ACCESS_SUPPORTED
16459b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (verbose != 0)
1646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 iwidth, iheight;
1648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      iwidth = png_get_image_width(write_ptr, write_info_ptr);
1649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      iheight = png_get_image_height(write_ptr, write_info_ptr);
1650a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(STDERR, "\n Image width = %lu, height = %lu\n",
16517a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long)iwidth, (unsigned long)iheight);
1652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1655b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Destroying data structs");
1656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef SINGLE_ROWBUF_ALLOC
1657b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("destroying row_buf for read_ptr");
1658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_free(read_ptr, row_buf);
16594215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   row_buf = NULL;
1660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* SINGLE_ROWBUF_ALLOC */
1661b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("destroying read_ptr, read_info_ptr, end_info_ptr");
1662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
1663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
1664b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("destroying write_end_info_ptr");
1665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_destroy_info_struct(write_ptr, &write_end_info_ptr);
1666b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("destroying write_ptr, write_info_ptr");
1667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_destroy_write_struct(&write_ptr, &write_info_ptr);
1668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1669b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Destruction complete.");
1670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   FCLOSE(fpin);
1672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   FCLOSE(fpout);
1673893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1674b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Summarize any warnings or errors and in 'strict' mode fail the test.
1675b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * Unsupported chunks can result in warnings, in that case ignore the strict
1676b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * setting, otherwise fail the test on warnings as well as errors.
1677b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
1678b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (error_count > 0)
1679b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
1680b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* We don't really expect to get here because of the setjmp handling
1681b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * above, but this is safe.
1682b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       */
1683b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      fprintf(STDERR, "\n  %s: %d libpng errors found (%d warnings)",
16847a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          inname, error_count, warning_count);
1685b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1686b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (strict != 0)
1687b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return (1);
1688b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
1689b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1690b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  ifdef PNG_WRITE_SUPPORTED
169106f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett      /* If there is no write support nothing was written! */
1692b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (unsupported_chunks > 0)
1693b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
1694b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         fprintf(STDERR, "\n  %s: unsupported chunks (%d)%s",
16957a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis             inname, unsupported_chunks, strict ? ": IGNORED --strict!" : "");
1696b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
1697b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#  endif
1698b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1699b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else if (warning_count > 0)
1700b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
1701b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      fprintf(STDERR, "\n  %s: %d libpng warnings found",
17027a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          inname, warning_count);
1703b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1704b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (strict != 0)
1705b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return (1);
1706b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
1707b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1708b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   pngtest_debug("Opening files for comparison");
1709893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((fpin = fopen(inname, "rb")) == NULL)
1710893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1711893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "Could not find file %s\n", inname);
1712893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
1713893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1714893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1715893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if ((fpout = fopen(outname, "rb")) == NULL)
1716893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1717893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "Could not find file %s\n", outname);
1718893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      FCLOSE(fpin);
1719893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (1);
1720893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1721893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
172206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#if defined (PNG_WRITE_SUPPORTED) /* else nothing was written */ &&\
172306f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett    defined (PNG_WRITE_FILTER_SUPPORTED)
17249b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (interlace_preserved != 0) /* else the files will be changed */
1725893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1726b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      for (;;)
1727893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1728b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         static int wrote_question = 0;
1729b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_size_t num_in, num_out;
1730b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         char inbuf[256], outbuf[256];
1731b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1732b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         num_in = fread(inbuf, 1, sizeof inbuf, fpin);
1733b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         num_out = fread(outbuf, 1, sizeof outbuf, fpout);
1734b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1735b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (num_in != num_out)
1736893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1737b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            fprintf(STDERR, "\nFiles %s and %s are of a different size\n",
17387a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                inname, outname);
1739b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1740b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            if (wrote_question == 0 && unsupported_chunks == 0)
1741b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
1742b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17437a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   "   Was %s written with the same maximum IDAT"
17447a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   " chunk size (%d bytes),",
17457a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   inname, PNG_ZBUF_SIZE);
1746b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17477a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   "\n   filtering heuristic (libpng default), compression");
1748b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17497a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   " level (zlib default),\n   and zlib version (%s)?\n\n",
17507a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   ZLIB_VERSION);
1751b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               wrote_question = 1;
1752b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
1753b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1754b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            FCLOSE(fpin);
1755b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            FCLOSE(fpout);
1756b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1757b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            if (strict != 0 && unsupported_chunks == 0)
1758b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              return (1);
1759b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1760b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            else
1761b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              return (0);
1762893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1763893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
17649b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         if (num_in == 0)
1765b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
1766893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1767b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (memcmp(inbuf, outbuf, num_in))
1768893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1769b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            fprintf(STDERR, "\nFiles %s and %s are different\n", inname,
17707a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                outname);
1771b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1772b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            if (wrote_question == 0 && unsupported_chunks == 0)
1773b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
1774b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17757a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   "   Was %s written with the same maximum"
17767a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   " IDAT chunk size (%d bytes),",
1777b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                    inname, PNG_ZBUF_SIZE);
1778b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17797a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   "\n   filtering heuristic (libpng default), compression");
1780b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               fprintf(STDERR,
17817a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   " level (zlib default),\n   and zlib version (%s)?\n\n",
1782b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 ZLIB_VERSION);
1783b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               wrote_question = 1;
1784b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
1785b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1786b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            FCLOSE(fpin);
1787b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            FCLOSE(fpout);
1788b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1789b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* NOTE: the unsupported_chunks escape is permitted here because
1790b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             * unsupported text chunk compression will result in the compression
1791b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             * mode being changed (to NONE) yet, in the test case, the result
1792b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             * can be exactly the same size!
1793b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             */
1794b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            if (strict != 0 && unsupported_chunks == 0)
1795b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              return (1);
1796b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1797b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            else
1798b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              return (0);
1799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
180206f1087a94f1e48298e89d77ccc51a0ced871958Matt Sarett#endif /* WRITE && WRITE_FILTER */
1803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   FCLOSE(fpin);
1805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   FCLOSE(fpout);
1806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (0);
1808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
1809893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1810a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Input and output filenames */
1811893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef RISCOS
1812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST char *inname = "pngtest/png";
1813893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST char *outname = "pngout/png";
1814893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1815893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST char *inname = "pngtest.png";
1816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST char *outname = "pngout.png";
1817893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1818893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1819893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint
1820893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectmain(int argc, char *argv[])
1821893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1822893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int multiple = 0;
1823893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   int ierror = 0;
1824893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
18259b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   png_structp dummy_ptr;
18269b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
1827a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   fprintf(STDERR, "\n Testing libpng version %s\n", PNG_LIBPNG_VER_STRING);
1828893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   fprintf(STDERR, "   with zlib   version %s\n", ZLIB_VERSION);
18294215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, "%s", png_get_copyright(NULL));
1830893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Show the version of libpng used in building the library */
18314215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " library (%lu):%s",
18327a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       (unsigned long)png_access_version_number(),
18337a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       png_get_header_version(NULL));
1834b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1835893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Show the version of libpng used in building the application */
18364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER,
18377a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       PNG_HEADER_VERSION_STRING);
1838893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1839893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Do some consistency checking on the memory allocation settings, I'm
1840a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * not sure this matters, but it is nice to know, the first of these
1841a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * tests should be impossible because of the way the macros are set
1842a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    * in pngconf.h
1843a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    */
1844893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)
1845893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, " NOTE: Zlib compiled for max 64k, libpng not\n");
1846893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1847893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* I think the following can happen. */
1848893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(MAXSEG_64K) && defined(PNG_MAX_MALLOC_64K)
1849893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, " NOTE: libpng compiled for max 64k, zlib not\n");
1850893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1851893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1852893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING))
1853893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1854893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR,
18557a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "Warning: versions are different between png.h and png.c\n");
1856893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "  png.h version: %s\n", PNG_LIBPNG_VER_STRING);
1857893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      fprintf(STDERR, "  png.c version: %s\n\n", png_libpng_ver);
1858893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      ++ierror;
1859893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1860893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1861893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (argc > 1)
1862893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1863893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (strcmp(argv[1], "-m") == 0)
1864893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1865893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         multiple = 1;
1866893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         status_dots_requested = 0;
1867893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1868b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1869893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (strcmp(argv[1], "-mv") == 0 ||
1870893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               strcmp(argv[1], "-vm") == 0 )
1871893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1872893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         multiple = 1;
1873893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         verbose = 1;
1874893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         status_dots_requested = 1;
1875893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1876b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1877893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (strcmp(argv[1], "-v") == 0)
1878893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1879893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         verbose = 1;
1880893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         status_dots_requested = 1;
1881893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         inname = argv[2];
1882893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1883b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1884b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (strcmp(argv[1], "--strict") == 0)
1885b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
1886b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         status_dots_requested = 0;
1887b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         verbose = 1;
1888b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         inname = argv[2];
1889b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         strict++;
1890b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         relaxed = 0;
18913cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         multiple=1;
1892b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
1893b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1894b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (strcmp(argv[1], "--relaxed") == 0)
1895b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
1896b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         status_dots_requested = 0;
1897b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         verbose = 1;
1898b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         inname = argv[2];
1899b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         strict = 0;
1900b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         relaxed++;
19013cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         multiple=1;
19023cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      }
19033cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      else if (strcmp(argv[1], "--xfail") == 0)
19043cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      {
19053cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         status_dots_requested = 0;
19063cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         verbose = 1;
19073cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         inname = argv[2];
19083cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         strict = 0;
19093cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         xfail++;
19103cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         relaxed++;
19113cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         multiple=1;
1912b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
1913b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1914893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
1915893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1916893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         inname = argv[1];
1917893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         status_dots_requested = 0;
1918893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1919893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1920893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
19219b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (multiple == 0 && argc == 3 + verbose)
19227a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      outname = argv[2 + verbose];
1923893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
19249b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((multiple == 0 && argc > 3 + verbose) ||
19259b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett       (multiple != 0 && argc < 2))
1926893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
19277a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      fprintf(STDERR,
19287a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "usage: %s [infile.png] [outfile.png]\n\t%s -m {infile.png}\n",
19297a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          argv[0], argv[0]);
19307a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      fprintf(STDERR,
19317a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "  reads/writes one PNG file (without -m) or multiple files (-m)\n");
19327a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      fprintf(STDERR,
19337a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          "  with -m %s is used as a temporary file\n", outname);
19347a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis      exit(1);
1935893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
1936893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
19379b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (multiple != 0)
1938893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
1939893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int i;
1940893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
19413cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III      int allocation_now = current_allocation;
1942893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1943893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i=2; i<argc; ++i)
1944893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
1945893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         int kerror;
1946a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott         fprintf(STDERR, "\n Testing %s:", argv[i]);
19479b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#if PNG_DEBUG > 0
19489b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         fprintf(STDERR, "\n");
19499b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif
1950893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         kerror = test_one_file(argv[i], outname);
1951893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (kerror == 0)
1952893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
19535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
1954893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            fprintf(STDERR, "\n PASS (%lu zero samples)\n",
19557a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                (unsigned long)zero_samples);
1956893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
1957893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            fprintf(STDERR, " PASS\n");
1958893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
19595f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
19609b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            if (tIME_chunk_present != 0)
19619b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett               fprintf(STDERR, " tIME = %s\n", tIME_string);
1962b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
19639b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            tIME_chunk_present = 0;
19649b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* TIME_RFC1123 */
1965893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1966b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1967893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
1968893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
19693cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            if (xfail)
19703cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III              fprintf(STDERR, " XFAIL\n");
19713cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            else
19723cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            {
19733cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III              fprintf(STDERR, " FAIL\n");
19743cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III              ierror += kerror;
19753cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            }
1976893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1977893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
1978893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (allocation_now != current_allocation)
19793cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
19803cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III                current_allocation - allocation_now);
1981b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1982893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (current_allocation != 0)
1983893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
1984893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            memory_infop pinfo = pinformation;
1985893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
19863cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n",
19873cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III                current_allocation);
1988b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
1989893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            while (pinfo != NULL)
1990893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
19919b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett               fprintf(STDERR, " %lu bytes at %p\n",
19927a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   (unsigned long)pinfo->size,
19937a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                   pinfo->pointer);
1994893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               pinfo = pinfo->next;
1995893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
1996893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
1997893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
1998893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
1999893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
20003cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         fprintf(STDERR, " Current memory allocation: %10d bytes\n",
20013cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III             current_allocation);
20023cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         fprintf(STDERR, " Maximum memory allocation: %10d bytes\n",
20033cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III             maximum_allocation);
20043cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         fprintf(STDERR, " Total   memory allocation: %10d bytes\n",
20053cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III             total_allocation);
20063cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         fprintf(STDERR, "     Number of allocations: %10d\n",
20073cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III             num_allocations);
2008893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2009893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
2010b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2011893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
2012893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
2013893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int i;
20144215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project      for (i = 0; i<3; ++i)
2015893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
2016893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         int kerror;
2017893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
20183cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III         int allocation_now = current_allocation;
2019893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2020b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (i == 1)
2021b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            status_dots_requested = 1;
2022b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2023b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else if (verbose == 0)
2024b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            status_dots_requested = 0;
2025b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2026893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (i == 0 || verbose == 1 || ierror != 0)
20279b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         {
2028a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott            fprintf(STDERR, "\n Testing %s:", inname);
20299b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#if PNG_DEBUG > 0
20309b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            fprintf(STDERR, "\n");
20319b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif
20329b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett         }
2033b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2034893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         kerror = test_one_file(inname, outname);
2035b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
20364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project         if (kerror == 0)
2037893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
20384215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            if (verbose == 1 || i == 2)
2039893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
20405f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
2041893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                fprintf(STDERR, "\n PASS (%lu zero samples)\n",
20427a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                    (unsigned long)zero_samples);
2043893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
2044893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                fprintf(STDERR, " PASS\n");
2045893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
20465f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_TIME_RFC1123_SUPPORTED
20474215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project             if (tIME_chunk_present != 0)
20484215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project                fprintf(STDERR, " tIME = %s\n", tIME_string);
20499b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* TIME_RFC1123 */
2050893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
2051893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
2052b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2053893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
2054893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
20554215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project            if (verbose == 0 && i != 2)
20569b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            {
2057a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott               fprintf(STDERR, "\n Testing %s:", inname);
20589b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#if PNG_DEBUG > 0
20599b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett               fprintf(STDERR, "\n");
20609b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif
20619b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            }
2062b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
20633cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            if (xfail)
20643cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III              fprintf(STDERR, " XFAIL\n");
20653cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            else
20663cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            {
20673cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III              fprintf(STDERR, " FAIL\n");
20683cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III              ierror += kerror;
20693cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III            }
2070893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
2071893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
2072893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (allocation_now != current_allocation)
20733cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III             fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
20743cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III                 current_allocation - allocation_now);
2075b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2076893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (current_allocation != 0)
2077893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
2078893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             memory_infop pinfo = pinformation;
2079893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
20803cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III             fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n",
20813cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III                 current_allocation);
2082b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2083893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             while (pinfo != NULL)
2084893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             {
20859b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett                fprintf(STDERR, " %lu bytes at %p\n",
20867a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis                    (unsigned long)pinfo->size, pinfo->pointer);
2087893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                pinfo = pinfo->next;
2088893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project             }
2089893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          }
2090893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2091893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       }
2092893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
20933cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III       fprintf(STDERR, " Current memory allocation: %10d bytes\n",
20943cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III           current_allocation);
20953cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III       fprintf(STDERR, " Maximum memory allocation: %10d bytes\n",
20963cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III           maximum_allocation);
20973cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III       fprintf(STDERR, " Total   memory allocation: %10d bytes\n",
20983cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III           total_allocation);
20993cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III       fprintf(STDERR, "     Number of allocations: %10d\n",
21003cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III           num_allocations);
2101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
2103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifdef PNGTEST_TIMING
2105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_stop = (float)clock();
2106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_misc += (t_stop - t_start);
2107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   t_start = t_stop;
21084215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " CPU time used = %.3f seconds",
21097a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       (t_misc+t_decode+t_encode)/(float)CLOCKS_PER_SEC);
21104215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " (decoding %.3f,\n",
21117a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       t_decode/(float)CLOCKS_PER_SEC);
21124215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, "        encoding %.3f ,",
21137a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       t_encode/(float)CLOCKS_PER_SEC);
21144215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   fprintf(STDERR, " other %.3f seconds)\n\n",
21157a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       t_misc/(float)CLOCKS_PER_SEC);
2116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
2117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (ierror == 0)
2119a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(STDERR, " libpng passes test\n");
2120b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
2122a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      fprintf(STDERR, " libpng FAILS test\n");
2123b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
21249b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   dummy_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
21259b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   fprintf(STDERR, " Default limits:\n");
21269b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   fprintf(STDERR, "  width_max  = %lu\n",
21277a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       (unsigned long) png_get_user_width_max(dummy_ptr));
21289b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   fprintf(STDERR, "  height_max = %lu\n",
21297a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       (unsigned long) png_get_user_height_max(dummy_ptr));
21309b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (png_get_chunk_cache_max(dummy_ptr) == 0)
21319b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      fprintf(STDERR, "  cache_max  = unlimited\n");
21329b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   else
21339b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      fprintf(STDERR, "  cache_max  = %lu\n",
21347a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long) png_get_chunk_cache_max(dummy_ptr));
21359b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if (png_get_chunk_malloc_max(dummy_ptr) == 0)
21369b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      fprintf(STDERR, "  malloc_max = unlimited\n");
21379b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   else
21389b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      fprintf(STDERR, "  malloc_max = %lu\n",
21397a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          (unsigned long) png_get_chunk_malloc_max(dummy_ptr));
21409b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   png_destroy_read_struct(&dummy_ptr, NULL, NULL);
21419b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett
2142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (int)(ierror != 0);
2143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
2144b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#else
2145b50c217251b086440efcdb273c22f86a06c80cbaChris Craikint
2146b50c217251b086440efcdb273c22f86a06c80cbaChris Craikmain(void)
2147b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
2148b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   fprintf(STDERR,
21497a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis       " test ignored because libpng was not built with read support\n");
2150b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* And skip this test */
21513cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins III   return PNG_LIBPNG_VER < 10600 ? 0 : 77;
2152b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
2153b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
2154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Generate a compiler error if there is an old png.h in the search path. */
21563cc83ac4b563ffa7a1bae9572f5fc3c1ee5f8a10Leon Scroggins IIItypedef png_libpng_version_1_6_34 Your_png_h_is_not_version_1_6_34;
2157