blob: 18fc07ab08b7eb1f5ad9197733f868fd368baac6 [file] [log] [blame]
Guy Schalnat4ee97b01996-01-16 01:51:56 -06001/* pngtest.c - a simple test program to test libpng
Guy Schalnat0d580581995-07-20 02:43:20 -05002
Guy Schalnate5a37791996-06-05 15:50:50 -05003 libpng 1.0 beta 3 - version 0.89
Guy Schalnat0d580581995-07-20 02:43:20 -05004 For conditions of distribution and use, see copyright notice in png.h
Guy Schalnatb2e01bd1996-01-26 01:38:47 -06005 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
Guy Schalnate5a37791996-06-05 15:50:50 -05006 May 25, 1996
Guy Schalnat4ee97b01996-01-16 01:51:56 -06007*/
Guy Schalnat0d580581995-07-20 02:43:20 -05008
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 Schalnat6d764711995-12-19 03:22:19 -060018/* #define STDERR stderr */
Guy Schalnatb2e01bd1996-01-26 01:38:47 -060019#define STDERR stdout /* for DOS */
Guy Schalnat0d580581995-07-20 02:43:20 -050020
21/* input and output filenames */
Guy Schalnate5a37791996-06-05 15:50:50 -050022#ifdef RISCOS
23char *inname = "pngtest_pn";
24char *outname = "pngout_png";
25#else
26char *inname = "pngtest.png";
27char *outname = "pngout.png";
28#endif
Guy Schalnat0d580581995-07-20 02:43:20 -050029
30char inbuf[256], outbuf[256];
31
Guy Schalnate5a37791996-06-05 15:50:50 -050032int main(int argc, char *argv[])
Guy Schalnat0d580581995-07-20 02:43:20 -050033{
Guy Schalnat0f716451995-11-28 11:22:13 -060034 FILE *fpin, *fpout;
Guy Schalnate5a37791996-06-05 15:50:50 -050035 png_structp read_ptr;
36 png_structp write_ptr;
37 png_infop info_ptr;
38 png_infop end_info;
Guy Schalnatb2e01bd1996-01-26 01:38:47 -060039 png_bytep row_buf;
Guy Schalnate5a37791996-06-05 15:50:50 -050040 png_byte *near_row_buf;
Guy Schalnat0f716451995-11-28 11:22:13 -060041 png_uint_32 rowbytes;
Guy Schalnat0d580581995-07-20 02:43:20 -050042 png_uint_32 y;
Guy Schalnat0f716451995-11-28 11:22:13 -060043 int channels, num_pass, pass;
Guy Schalnat0d580581995-07-20 02:43:20 -050044
Guy Schalnate5a37791996-06-05 15:50:50 -050045 row_buf = (png_bytep)NULL;
46 near_row_buf = (png_byte *)NULL;
Guy Schalnat0d580581995-07-20 02:43:20 -050047
Guy Schalnat51f0eb41995-09-26 05:22:39 -050048 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 Schalnate5a37791996-06-05 15:50:50 -050058 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 Schalnat0f716451995-11-28 11:22:13 -060070 fpin = fopen(inname, "rb");
71 if (!fpin)
72 {
73 fprintf(STDERR, "Could not find input file %s\n", inname);
74 return 1;
75 }
Guy Schalnat0d580581995-07-20 02:43:20 -050076
Guy Schalnat0f716451995-11-28 11:22:13 -060077 fpout = fopen(outname, "wb");
78 if (!fpout)
79 {
Guy Schalnate5a37791996-06-05 15:50:50 -050080 fprintf(STDERR, "Could not open output file %s\n", outname);
Guy Schalnat0f716451995-11-28 11:22:13 -060081 fclose(fpin);
82 return 1;
83 }
Guy Schalnat0d580581995-07-20 02:43:20 -050084
Guy Schalnate5a37791996-06-05 15:50:50 -050085 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 Schalnat0f716451995-11-28 11:22:13 -060093 {
94 fprintf(STDERR, "libpng read error\n");
Guy Schalnate5a37791996-06-05 15:50:50 -050095 png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
96 png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
Guy Schalnat0f716451995-11-28 11:22:13 -060097 fclose(fpin);
98 fclose(fpout);
99 return 1;
100 }
Guy Schalnat0d580581995-07-20 02:43:20 -0500101
Guy Schalnate5a37791996-06-05 15:50:50 -0500102 if (setjmp(write_ptr->jmpbuf))
Guy Schalnatb2e01bd1996-01-26 01:38:47 -0600103 {
Guy Schalnat0f716451995-11-28 11:22:13 -0600104 fprintf(STDERR, "libpng write error\n");
Guy Schalnate5a37791996-06-05 15:50:50 -0500105 png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
106 png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
Guy Schalnat0f716451995-11-28 11:22:13 -0600107 fclose(fpin);
108 fclose(fpout);
109 return 1;
110 }
Guy Schalnat0d580581995-07-20 02:43:20 -0500111
Guy Schalnate5a37791996-06-05 15:50:50 -0500112 png_init_io(read_ptr, fpin);
113 png_init_io(write_ptr, fpout);
Guy Schalnat0d580581995-07-20 02:43:20 -0500114
Guy Schalnate5a37791996-06-05 15:50:50 -0500115 png_read_info(read_ptr, info_ptr);
116 png_write_info(write_ptr, info_ptr);
Guy Schalnat0d580581995-07-20 02:43:20 -0500117
Guy Schalnate5a37791996-06-05 15:50:50 -0500118 if ((info_ptr->color_type & PNG_COLOR_TYPE_PALETTE)==PNG_COLOR_TYPE_PALETTE)
Guy Schalnat0f716451995-11-28 11:22:13 -0600119 channels = 1;
Guy Schalnate5a37791996-06-05 15:50:50 -0500120 else
121 channels = 3;
122 if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
Guy Schalnat0f716451995-11-28 11:22:13 -0600123 channels++;
Guy Schalnat0d580581995-07-20 02:43:20 -0500124
Guy Schalnate5a37791996-06-05 15:50:50 -0500125 rowbytes = ((info_ptr->width * info_ptr->bit_depth * channels + 7) >> 3);
Guy Schalnatb2e01bd1996-01-26 01:38:47 -0600126 near_row_buf = (png_byte *)malloc((size_t)rowbytes);
Guy Schalnat4ee97b01996-01-16 01:51:56 -0600127 row_buf = (png_bytep)near_row_buf;
Guy Schalnat0f716451995-11-28 11:22:13 -0600128 if (!row_buf)
129 {
Guy Schalnate5a37791996-06-05 15:50:50 -0500130 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 Schalnat0f716451995-11-28 11:22:13 -0600133 fclose(fpin);
134 fclose(fpout);
135 return 1;
136 }
Guy Schalnat0d580581995-07-20 02:43:20 -0500137
Guy Schalnate5a37791996-06-05 15:50:50 -0500138 if (info_ptr->interlace_type)
Guy Schalnat0f716451995-11-28 11:22:13 -0600139 {
Guy Schalnate5a37791996-06-05 15:50:50 -0500140 num_pass = png_set_interlace_handling(read_ptr);
141 num_pass = png_set_interlace_handling(write_ptr);
Guy Schalnat0f716451995-11-28 11:22:13 -0600142 }
143 else
144 {
145 num_pass = 1;
146 }
Guy Schalnat0d580581995-07-20 02:43:20 -0500147
Guy Schalnat0f716451995-11-28 11:22:13 -0600148 for (pass = 0; pass < num_pass; pass++)
149 {
Guy Schalnate5a37791996-06-05 15:50:50 -0500150 for (y = 0; y < info_ptr->height; y++)
Guy Schalnat0f716451995-11-28 11:22:13 -0600151 {
Guy Schalnat4ee97b01996-01-16 01:51:56 -0600152#ifdef TESTING
153 fprintf(STDERR, "Processing line #%ld\n", y);
154#endif
Guy Schalnate5a37791996-06-05 15:50:50 -0500155 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 Schalnat0f716451995-11-28 11:22:13 -0600157 }
158 }
Guy Schalnat0d580581995-07-20 02:43:20 -0500159
Guy Schalnate5a37791996-06-05 15:50:50 -0500160 png_read_end(read_ptr, end_info);
161 png_write_end(write_ptr, end_info);
Guy Schalnat0d580581995-07-20 02:43:20 -0500162
Guy Schalnate5a37791996-06-05 15:50:50 -0500163 png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
164 png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
Guy Schalnat0d580581995-07-20 02:43:20 -0500165
Guy Schalnat0f716451995-11-28 11:22:13 -0600166 fclose(fpin);
167 fclose(fpout);
Guy Schalnat0d580581995-07-20 02:43:20 -0500168
Guy Schalnat4ee97b01996-01-16 01:51:56 -0600169 free((void *)near_row_buf);
Guy Schalnat0d580581995-07-20 02:43:20 -0500170
Guy Schalnat0f716451995-11-28 11:22:13 -0600171 fpin = fopen(inname, "rb");
Guy Schalnat0d580581995-07-20 02:43:20 -0500172
Guy Schalnat0f716451995-11-28 11:22:13 -0600173 if (!fpin)
174 {
Guy Schalnate5a37791996-06-05 15:50:50 -0500175 fprintf(STDERR, "Could not find file %s\n", inname);
Guy Schalnat0f716451995-11-28 11:22:13 -0600176 return 1;
177 }
Guy Schalnat0d580581995-07-20 02:43:20 -0500178
Guy Schalnat0f716451995-11-28 11:22:13 -0600179 fpout = fopen(outname, "rb");
180 if (!fpout)
181 {
Guy Schalnate5a37791996-06-05 15:50:50 -0500182 fprintf(STDERR, "Could not find file %s\n", outname);
Guy Schalnat0f716451995-11-28 11:22:13 -0600183 fclose(fpin);
184 return 1;
185 }
Guy Schalnat0d580581995-07-20 02:43:20 -0500186
Guy Schalnat0f716451995-11-28 11:22:13 -0600187 while (1)
188 {
189 int num_in, num_out;
Guy Schalnat0d580581995-07-20 02:43:20 -0500190
Guy Schalnat0f716451995-11-28 11:22:13 -0600191 num_in = fread(inbuf, 1, 256, fpin);
192 num_out = fread(outbuf, 1, 256, fpout);
Guy Schalnat0d580581995-07-20 02:43:20 -0500193
Guy Schalnat0f716451995-11-28 11:22:13 -0600194 if (num_in != num_out)
195 {
Guy Schalnate5a37791996-06-05 15:50:50 -0500196 fprintf(STDERR, "Files %s and %s are of a different size\n",
197 inname, outname);
Guy Schalnat0f716451995-11-28 11:22:13 -0600198 fclose(fpin);
199 fclose(fpout);
200 return 1;
201 }
Guy Schalnat0d580581995-07-20 02:43:20 -0500202
Guy Schalnat0f716451995-11-28 11:22:13 -0600203 if (!num_in)
204 break;
Guy Schalnat0d580581995-07-20 02:43:20 -0500205
Guy Schalnat0f716451995-11-28 11:22:13 -0600206 if (memcmp(inbuf, outbuf, num_in))
207 {
Guy Schalnate5a37791996-06-05 15:50:50 -0500208 fprintf(STDERR, "Files %s and %s are different\n", inname, outname);
Guy Schalnat0f716451995-11-28 11:22:13 -0600209 fclose(fpin);
210 fclose(fpout);
211 return 1;
212 }
213 }
214
215 fclose(fpin);
216 fclose(fpout);
Guy Schalnat0d580581995-07-20 02:43:20 -0500217 fprintf(STDERR, "libpng passes test\n");
218
219 return 0;
220}
Guy Schalnat51f0eb41995-09-26 05:22:39 -0500221