all repos — mgba @ 6882339f625b97f344c6464915c2038bc453ea3c

mGBA Game Boy Advance Emulator

src/third-party/libpng/contrib/libtests/readpng.c (view raw)

  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}