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