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