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