1ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik/* readpng.c 2ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * 3ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * Copyright (c) 2013 John Cunningham Bowler 4ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * 5ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * Last changed in libpng 1.6.1 [March 28, 2013] 6ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * 7ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * This code is released under the libpng license. 8ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * For conditions of distribution and use, see the disclaimer 9ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * and license in png.h 10ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * 11ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * Load an arbitrary number of PNG files (from the command line, or, if there 12ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * are no arguments on the command line, from stdin) then run a time test by 13ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * reading each file by row. The test does nothing with the read result and 14ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * does no transforms. The only output is a time as a floating point number of 15ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * seconds with 9 decimal digits. 16ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik */ 17ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <stdlib.h> 18ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <stdio.h> 19ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <string.h> 20ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 21ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H) 22ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# include <config.h> 23ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif 24ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 25ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik/* Define the following to use this test against your installed libpng, rather 26ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * than the one being built here: 27ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik */ 28ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#ifdef PNG_FREESTANDING_TESTS 29ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# include <png.h> 30ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#else 31ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik# include "../../png.h" 32ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#endif 33ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 34ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikstatic int 35ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikread_png(FILE *fp) 36ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{ 37ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0); 38ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_infop info_ptr = NULL; 39ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_bytep row = NULL, display = NULL; 40ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 41ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (png_ptr == NULL) 42ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik return 0; 43ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 44ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (setjmp(png_jmpbuf(png_ptr))) 45ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik { 46ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_destroy_read_struct(&png_ptr, &info_ptr, NULL); 47ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (row != NULL) free(row); 48ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (display != NULL) free(display); 49ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik return 0; 50ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik } 51ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 52ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_init_io(png_ptr, fp); 53ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 54ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik info_ptr = png_create_info_struct(png_ptr); 55ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (info_ptr == NULL) 56ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_error(png_ptr, "OOM allocating info structure"); 57ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 58ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_ALWAYS, NULL, 0); 59ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 60ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_read_info(png_ptr, info_ptr); 61ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 62ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik { 63ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_size_t rowbytes = png_get_rowbytes(png_ptr, info_ptr); 64ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 65ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik row = malloc(rowbytes); 66ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik display = malloc(rowbytes); 67ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 68ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (row == NULL || display == NULL) 69ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_error(png_ptr, "OOM allocating row buffers"); 70ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 71ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik { 72ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_uint_32 height = png_get_image_height(png_ptr, info_ptr); 73ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik int passes = png_set_interlace_handling(png_ptr); 74ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik int pass; 75ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 76ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_start_read_image(png_ptr); 77ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 78ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik for (pass = 0; pass < passes; ++pass) 79ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik { 80ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_uint_32 y = height; 81ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 82ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik /* NOTE: this trashes the row each time; interlace handling won't 83ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * work, but this avoids memory thrashing for speed testing. 84ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik */ 85ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik while (y-- > 0) 86ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_read_row(png_ptr, row, display); 87ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik } 88ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik } 89ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik } 90ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 91ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik /* Make sure to read to the end of the file: */ 92ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_read_end(png_ptr, info_ptr); 93ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_destroy_read_struct(&png_ptr, &info_ptr, NULL); 94ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik free(row); 95ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik free(display); 96ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik return 1; 97ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik} 98ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 99ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikint 100ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikmain(void) 101ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{ 102ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik /* Exit code 0 on success. */ 103ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik return !read_png(stdin); 104ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik} 105