Guy Schalnat | 4ee97b0 | 1996-01-16 01:51:56 -0600 | [diff] [blame] | 1 | /* pngtest.c - a simple test program to test libpng |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 2 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 3 | libpng 1.0 beta 3 - version 0.89 |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 4 | For conditions of distribution and use, see copyright notice in png.h |
Guy Schalnat | b2e01bd | 1996-01-26 01:38:47 -0600 | [diff] [blame] | 5 | Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 6 | May 25, 1996 |
Guy Schalnat | 4ee97b0 | 1996-01-16 01:51:56 -0600 | [diff] [blame] | 7 | */ |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 8 | |
| 9 | #include <stdio.h> |
| 10 | #include <stdlib.h> |
| 11 | #include "png.h" |
| 12 | |
| 13 | #ifdef __TURBOC__ |
| 14 | #include <mem.h> |
| 15 | #endif |
| 16 | |
| 17 | /* defined so I can write to a file on gui/windowing platforms */ |
Guy Schalnat | 6d76471 | 1995-12-19 03:22:19 -0600 | [diff] [blame] | 18 | /* #define STDERR stderr */ |
Guy Schalnat | b2e01bd | 1996-01-26 01:38:47 -0600 | [diff] [blame] | 19 | #define STDERR stdout /* for DOS */ |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 20 | |
| 21 | /* input and output filenames */ |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 22 | #ifdef RISCOS |
| 23 | char *inname = "pngtest_pn"; |
| 24 | char *outname = "pngout_png"; |
| 25 | #else |
| 26 | char *inname = "pngtest.png"; |
| 27 | char *outname = "pngout.png"; |
| 28 | #endif |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 29 | |
| 30 | char inbuf[256], outbuf[256]; |
| 31 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 32 | int main(int argc, char *argv[]) |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 33 | { |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 34 | FILE *fpin, *fpout; |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 35 | png_structp read_ptr; |
| 36 | png_structp write_ptr; |
| 37 | png_infop info_ptr; |
| 38 | png_infop end_info; |
Guy Schalnat | b2e01bd | 1996-01-26 01:38:47 -0600 | [diff] [blame] | 39 | png_bytep row_buf; |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 40 | png_byte *near_row_buf; |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 41 | png_uint_32 rowbytes; |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 42 | png_uint_32 y; |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 43 | int channels, num_pass, pass; |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 44 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 45 | row_buf = (png_bytep)NULL; |
| 46 | near_row_buf = (png_byte *)NULL; |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 47 | |
Guy Schalnat | 51f0eb4 | 1995-09-26 05:22:39 -0500 | [diff] [blame] | 48 | fprintf(STDERR, "Testing libpng version %s\n", PNG_LIBPNG_VER_STRING); |
| 49 | |
| 50 | if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING)) |
| 51 | { |
| 52 | fprintf(STDERR, |
| 53 | "Warning: versions are different between png.h and png.c\n"); |
| 54 | fprintf(STDERR, " png.h version: %s\n", PNG_LIBPNG_VER_STRING); |
| 55 | fprintf(STDERR, " png.c version: %s\n\n", png_libpng_ver); |
| 56 | } |
| 57 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 58 | if (argc > 1) |
| 59 | inname = argv[1]; |
| 60 | |
| 61 | if (argc > 2) |
| 62 | outname = argv[2]; |
| 63 | |
| 64 | if (argc > 3) |
| 65 | { |
| 66 | fprintf(stderr, "usage: %s [infile.png] [outfile.png]\n", argv[0]); |
| 67 | exit(1); |
| 68 | } |
| 69 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 70 | fpin = fopen(inname, "rb"); |
| 71 | if (!fpin) |
| 72 | { |
| 73 | fprintf(STDERR, "Could not find input file %s\n", inname); |
| 74 | return 1; |
| 75 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 76 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 77 | fpout = fopen(outname, "wb"); |
| 78 | if (!fpout) |
| 79 | { |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 80 | fprintf(STDERR, "Could not open output file %s\n", outname); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 81 | fclose(fpin); |
| 82 | return 1; |
| 83 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 84 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 85 | read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (void *)NULL, |
| 86 | (png_error_ptr)NULL, (png_error_ptr)NULL); |
| 87 | write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (void *)NULL, |
| 88 | (png_error_ptr)NULL, (png_error_ptr)NULL); |
| 89 | info_ptr = png_create_info_struct(read_ptr); |
| 90 | end_info = png_create_info_struct(read_ptr); |
| 91 | |
| 92 | if (setjmp(read_ptr->jmpbuf)) |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 93 | { |
| 94 | fprintf(STDERR, "libpng read error\n"); |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 95 | png_destroy_read_struct(&read_ptr, &info_ptr, &end_info); |
| 96 | png_destroy_write_struct(&write_ptr, (png_infopp)NULL); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 97 | fclose(fpin); |
| 98 | fclose(fpout); |
| 99 | return 1; |
| 100 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 101 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 102 | if (setjmp(write_ptr->jmpbuf)) |
Guy Schalnat | b2e01bd | 1996-01-26 01:38:47 -0600 | [diff] [blame] | 103 | { |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 104 | fprintf(STDERR, "libpng write error\n"); |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 105 | png_destroy_read_struct(&read_ptr, &info_ptr, &end_info); |
| 106 | png_destroy_write_struct(&write_ptr, (png_infopp)NULL); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 107 | fclose(fpin); |
| 108 | fclose(fpout); |
| 109 | return 1; |
| 110 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 111 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 112 | png_init_io(read_ptr, fpin); |
| 113 | png_init_io(write_ptr, fpout); |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 114 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 115 | png_read_info(read_ptr, info_ptr); |
| 116 | png_write_info(write_ptr, info_ptr); |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 117 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 118 | if ((info_ptr->color_type & PNG_COLOR_TYPE_PALETTE)==PNG_COLOR_TYPE_PALETTE) |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 119 | channels = 1; |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 120 | else |
| 121 | channels = 3; |
| 122 | if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 123 | channels++; |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 124 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 125 | rowbytes = ((info_ptr->width * info_ptr->bit_depth * channels + 7) >> 3); |
Guy Schalnat | b2e01bd | 1996-01-26 01:38:47 -0600 | [diff] [blame] | 126 | near_row_buf = (png_byte *)malloc((size_t)rowbytes); |
Guy Schalnat | 4ee97b0 | 1996-01-16 01:51:56 -0600 | [diff] [blame] | 127 | row_buf = (png_bytep)near_row_buf; |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 128 | if (!row_buf) |
| 129 | { |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 130 | fprintf(STDERR, "No memory to allocate row buffer\n"); |
| 131 | png_destroy_read_struct(&read_ptr, &info_ptr, &end_info); |
| 132 | png_destroy_write_struct(&write_ptr, (png_infopp)NULL); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 133 | fclose(fpin); |
| 134 | fclose(fpout); |
| 135 | return 1; |
| 136 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 137 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 138 | if (info_ptr->interlace_type) |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 139 | { |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 140 | num_pass = png_set_interlace_handling(read_ptr); |
| 141 | num_pass = png_set_interlace_handling(write_ptr); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 142 | } |
| 143 | else |
| 144 | { |
| 145 | num_pass = 1; |
| 146 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 147 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 148 | for (pass = 0; pass < num_pass; pass++) |
| 149 | { |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 150 | for (y = 0; y < info_ptr->height; y++) |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 151 | { |
Guy Schalnat | 4ee97b0 | 1996-01-16 01:51:56 -0600 | [diff] [blame] | 152 | #ifdef TESTING |
| 153 | fprintf(STDERR, "Processing line #%ld\n", y); |
| 154 | #endif |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 155 | png_read_rows(read_ptr, (png_bytepp)&row_buf, (png_bytepp)0, 1); |
| 156 | png_write_rows(write_ptr, (png_bytepp)&row_buf, 1); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 157 | } |
| 158 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 159 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 160 | png_read_end(read_ptr, end_info); |
| 161 | png_write_end(write_ptr, end_info); |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 162 | |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 163 | png_destroy_read_struct(&read_ptr, &info_ptr, &end_info); |
| 164 | png_destroy_write_struct(&write_ptr, (png_infopp)NULL); |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 165 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 166 | fclose(fpin); |
| 167 | fclose(fpout); |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 168 | |
Guy Schalnat | 4ee97b0 | 1996-01-16 01:51:56 -0600 | [diff] [blame] | 169 | free((void *)near_row_buf); |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 170 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 171 | fpin = fopen(inname, "rb"); |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 172 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 173 | if (!fpin) |
| 174 | { |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 175 | fprintf(STDERR, "Could not find file %s\n", inname); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 176 | return 1; |
| 177 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 178 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 179 | fpout = fopen(outname, "rb"); |
| 180 | if (!fpout) |
| 181 | { |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 182 | fprintf(STDERR, "Could not find file %s\n", outname); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 183 | fclose(fpin); |
| 184 | return 1; |
| 185 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 186 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 187 | while (1) |
| 188 | { |
| 189 | int num_in, num_out; |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 190 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 191 | num_in = fread(inbuf, 1, 256, fpin); |
| 192 | num_out = fread(outbuf, 1, 256, fpout); |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 193 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 194 | if (num_in != num_out) |
| 195 | { |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 196 | fprintf(STDERR, "Files %s and %s are of a different size\n", |
| 197 | inname, outname); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 198 | fclose(fpin); |
| 199 | fclose(fpout); |
| 200 | return 1; |
| 201 | } |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 202 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 203 | if (!num_in) |
| 204 | break; |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 205 | |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 206 | if (memcmp(inbuf, outbuf, num_in)) |
| 207 | { |
Guy Schalnat | e5a3779 | 1996-06-05 15:50:50 -0500 | [diff] [blame^] | 208 | fprintf(STDERR, "Files %s and %s are different\n", inname, outname); |
Guy Schalnat | 0f71645 | 1995-11-28 11:22:13 -0600 | [diff] [blame] | 209 | fclose(fpin); |
| 210 | fclose(fpout); |
| 211 | return 1; |
| 212 | } |
| 213 | } |
| 214 | |
| 215 | fclose(fpin); |
| 216 | fclose(fpout); |
Guy Schalnat | 0d58058 | 1995-07-20 02:43:20 -0500 | [diff] [blame] | 217 | fprintf(STDERR, "libpng passes test\n"); |
| 218 | |
| 219 | return 0; |
| 220 | } |
Guy Schalnat | 51f0eb4 | 1995-09-26 05:22:39 -0500 | [diff] [blame] | 221 | |