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