2
2
/* pngtest.c - a simple test program to test libpng
4
* Last changed in libpng 1.2.22 - [November 6, 2007]
5
* For conditions of distribution and use, see copyright notice in png.h
6
* Copyright (c) 1998-2004 Glenn Randers-Pehrson
4
* Last changed in libpng 1.2.41 [December 3, 2009]
5
* Copyright (c) 1998-2009 Glenn Randers-Pehrson
7
6
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
8
7
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
9
* This code is released under the libpng license.
10
* For conditions of distribution and use, see the disclaimer
11
* and license in png.h
10
13
* This program reads in a PNG image, writes it out again, and then
11
14
* compares the two files. If the files are identical, this shows that
12
15
* the basic chunk handling, filtering, and (de)compression code is working
28
31
* of files at once by typing "pngtest -m file1.png file2.png ..."
34
#define PNG_PEDANTIC_WARNINGS
33
#if defined(_WIN32_WCE)
34
38
# if _WIN32_WCE < 211
35
39
__error__ (f|w)printf functions are not supported on old WindowsCE.;
37
41
# include <windows.h>
38
42
# include <stdlib.h>
39
43
# define READFILE(file, data, length, check) \
40
if (ReadFile(file, data, length, &check,NULL)) check = 0
44
if (ReadFile(file, data, length, &check, NULL)) check = 0
41
45
# define WRITEFILE(file, data, length, check)) \
42
46
if (WriteFile(file, data, length, &check, NULL)) check = 0
43
47
# define FCLOSE(file) CloseHandle(file)
45
49
# include <stdio.h>
46
50
# include <stdlib.h>
47
51
# define READFILE(file, data, length, check) \
48
check=(png_size_t)fread(data,(png_size_t)1,length,file)
52
check=(png_size_t)fread(data, (png_size_t)1, length, file)
49
53
# define WRITEFILE(file, data, length, check) \
50
check=(png_size_t)fwrite(data,(png_size_t)1, length, file)
54
check=(png_size_t)fwrite(data, (png_size_t)1, length, file)
51
55
# define FCLOSE(file) fclose(file)
54
#if defined(PNG_NO_STDIO)
55
# if defined(_WIN32_WCE)
58
#ifndef PNG_STDIO_SUPPORTED
56
60
typedef HANDLE png_FILE_p;
58
62
typedef FILE * png_FILE_p;
84
#if defined(PNG_TIME_RFC1123_SUPPORTED)
85
#define PNG_tIME_STRING_LENGTH 30
86
static int tIME_chunk_present=0;
87
static char tIME_string[PNG_tIME_STRING_LENGTH] = "no tIME chunk present in file";
88
#ifdef PNG_TIME_RFC1123_SUPPORTED
89
#define PNG_tIME_STRING_LENGTH 29
90
static int tIME_chunk_present = 0;
91
static char tIME_string[PNG_tIME_STRING_LENGTH] = "tIME chunk is not present";
90
94
static int verbose = 0;
98
/* defined so I can write to a file on gui/windowing platforms */
102
/* Defined so I can write to a file on gui/windowing platforms */
99
103
/* #define STDERR stderr */
100
#define STDERR stdout /* for DOS */
102
/* example of using row callbacks to make a simple progress meter */
103
static int status_pass=1;
104
static int status_dots_requested=0;
105
static int status_dots=1;
104
#define STDERR stdout /* For DOS */
107
106
/* In case a system header (e.g., on AIX) defined jmpbuf */
126
130
read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
128
if(png_ptr == NULL || row_number > PNG_UINT_31_MAX) return;
129
if(status_pass != pass)
131
fprintf(stdout,"\n Pass %d: ",pass);
138
fprintf(stdout, "\n ");
141
fprintf(stdout, "r");
132
if (png_ptr == NULL || row_number > PNG_UINT_31_MAX)
134
if (status_pass != pass)
136
fprintf(stdout, "\n Pass %d: ", pass);
141
if (status_dots == 0)
143
fprintf(stdout, "\n ");
146
fprintf(stdout, "r");
153
158
write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
155
if(png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7) return;
156
fprintf(stdout, "w");
160
if (png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7)
162
fprintf(stdout, "w");
160
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
166
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
161
167
/* Example of using user transform callback (we don't transform anything,
162
but merely examine the row filters. We set this to 256 rather than
163
5 in case illegal filter values are present.) */
168
* but merely examine the row filters. We set this to 256 rather than
169
* 5 in case illegal filter values are present.)
164
171
static png_uint_32 filters_used[256];
174
181
count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data)
176
if(png_ptr != NULL && row_info != NULL)
177
++filters_used[*(data-1)];
183
if (png_ptr != NULL && row_info != NULL)
184
++filters_used[*(data - 1)];
181
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
182
/* example of using user transform callback (we don't transform anything,
183
but merely count the zero samples) */
188
#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
189
/* Example of using user transform callback (we don't transform anything,
190
* but merely count the zero samples)
185
193
static png_uint_32 zero_samples;
207
215
* png_byte pixel_depth bits per pixel (depth*channels)
211
/* counts the number of zero samples (or zero pixels if color_type is 3 */
213
if(row_info->color_type == 0 || row_info->color_type == 3)
218
/* Counts the number of zero samples (or zero pixels if color_type is 3 */
220
if (row_info->color_type == 0 || row_info->color_type == 3)
216
223
png_uint_32 n, nstop;
217
for (n=0, nstop=row_info->width; n<nstop; n++)
224
for (n = 0, nstop=row_info->width; n<nstop; n++)
219
if(row_info->bit_depth == 1)
221
if(((*dp << pos++ ) & 0x80) == 0) zero_samples++;
228
if(row_info->bit_depth == 2)
230
if(((*dp << (pos+=2)) & 0xc0) == 0) zero_samples++;
237
if(row_info->bit_depth == 4)
239
if(((*dp << (pos+=4)) & 0xf0) == 0) zero_samples++;
246
if(row_info->bit_depth == 8)
247
if(*dp++ == 0) zero_samples++;
248
if(row_info->bit_depth == 16)
250
if((*dp | *(dp+1)) == 0) zero_samples++;
226
if (row_info->bit_depth == 1)
228
if (((*dp << pos++ ) & 0x80) == 0)
236
if (row_info->bit_depth == 2)
238
if (((*dp << (pos+=2)) & 0xc0) == 0)
246
if (row_info->bit_depth == 4)
248
if (((*dp << (pos+=4)) & 0xf0) == 0)
256
if (row_info->bit_depth == 8)
259
if (row_info->bit_depth == 16)
261
if ((*dp | *(dp+1)) == 0)
255
else /* other color types */
267
else /* Other color types */
257
269
png_uint_32 n, nstop;
259
271
int color_channels = row_info->channels;
260
if(row_info->color_type > 3)color_channels--;
272
if (row_info->color_type > 3)color_channels--;
262
for (n=0, nstop=row_info->width; n<nstop; n++)
274
for (n = 0, nstop=row_info->width; n<nstop; n++)
264
276
for (channel = 0; channel < color_channels; channel++)
266
if(row_info->bit_depth == 8)
267
if(*dp++ == 0) zero_samples++;
268
if(row_info->bit_depth == 16)
278
if (row_info->bit_depth == 8)
281
if (row_info->bit_depth == 16)
270
if((*dp | *(dp+1)) == 0) zero_samples++;
283
if ((*dp | *(dp+1)) == 0)
274
if(row_info->color_type > 3)
288
if (row_info->color_type > 3)
277
if(row_info->bit_depth == 16)dp++;
291
if (row_info->bit_depth == 16)
284
299
static int wrote_question = 0;
286
#if defined(PNG_NO_STDIO)
301
#ifndef PNG_STDIO_SUPPORTED
287
302
/* START of code to validate stdio-free compilation */
288
/* These copies of the default read/write functions come from pngrio.c and */
289
/* pngwio.c. They allow "don't include stdio" testing of the library. */
290
/* This is the function that does the actual reading of data. If you are
291
not reading from a standard C stream, you should create a replacement
292
read_data function and use it at run time with png_set_read_fn(), rather
293
than changing the library. */
303
/* These copies of the default read/write functions come from pngrio.c and
304
* pngwio.c. They allow "don't include stdio" testing of the library.
305
* This is the function that does the actual reading of data. If you are
306
* not reading from a standard C stream, you should create a replacement
307
* read_data function and use it at run time with png_set_read_fn(), rather
308
* than changing the library.
295
311
#ifndef USE_FAR_KEYWORD
342
358
read = MIN(NEAR_BUF_SIZE, remaining);
343
359
READFILE(io_ptr, buf, 1, err);
344
png_memcpy(data, buf, read); /* copy far buffer to near buffer */
360
png_memcpy(data, buf, read); /* Copy far buffer to near buffer */
352
368
while (remaining != 0);
354
370
if (check != length)
356
371
png_error(png_ptr, "read Error");
359
373
#endif /* USE_FAR_KEYWORD */
361
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
375
#ifdef PNG_WRITE_FLUSH_SUPPORTED
363
377
pngtest_flush(png_structp png_ptr)
365
#if !defined(_WIN32_WCE)
367
io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
379
/* Do nothing; fflush() is said to be just a waste of energy. */
380
png_ptr = png_ptr; /* Stifle compiler warning */
374
384
/* This is the function that does the actual writing of data. If you are
375
not writing to a standard C stream, you should create a replacement
376
write_data function and use it at run time with png_set_write_fn(), rather
377
than changing the library. */
385
* not writing to a standard C stream, you should create a replacement
386
* write_data function and use it at run time with png_set_write_fn(), rather
387
* than changing the library.
378
389
#ifndef USE_FAR_KEYWORD
380
391
pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
421
432
written = MIN(NEAR_BUF_SIZE, remaining);
422
png_memcpy(buf, data, written); /* copy far buffer to near buffer */
433
png_memcpy(buf, data, written); /* Copy far buffer to near buffer */
423
434
WRITEFILE(io_ptr, buf, written, err);
424
435
if (err != written)
464
473
pngtest_warning(png_ptr, message);
465
474
/* We can return because png_error calls the default handler, which is
466
* actually OK in this case. */
475
* actually OK in this case.
478
#endif /* !PNG_STDIO_SUPPORTED */
479
/* END of code to validate stdio-free compilation */
469
481
/* START of code to validate memory allocation and deallocation */
470
482
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
472
484
/* Allocate memory. For reasonable files, size should never exceed
473
64K. However, zlib may allocate more then 64K if you don't tell
474
it not to. See zconf.h and png.h for more information. zlib does
475
need to allocate exactly 64K, so whatever you call here must
476
have the ability to do that.
478
This piece of code can be compiled to validate max 64K allocations
479
by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K. */
485
* 64K. However, zlib may allocate more then 64K if you don't tell
486
* it not to. See zconf.h and png.h for more information. zlib does
487
* need to allocate exactly 64K, so whatever you call here must
488
* have the ability to do that.
490
* This piece of code can be compiled to validate max 64K allocations
491
* by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K.
480
493
typedef struct memory_information
482
495
png_uint_32 size;
511
525
memory_infop pinfo;
512
526
png_set_mem_fn(png_ptr, NULL, NULL, NULL);
513
527
pinfo = (memory_infop)png_malloc(png_ptr,
514
(png_uint_32)png_sizeof (*pinfo));
528
(png_uint_32)png_sizeof(*pinfo));
515
529
pinfo->size = size;
516
530
current_allocation += size;
517
531
total_allocation += size;
520
534
maximum_allocation = current_allocation;
521
535
pinfo->pointer = (png_voidp)png_malloc(png_ptr, size);
522
536
/* Restore malloc_fn and free_fn */
523
png_set_mem_fn(png_ptr, png_voidp_NULL, (png_malloc_ptr)png_debug_malloc,
524
(png_free_ptr)png_debug_free);
537
png_set_mem_fn(png_ptr,
538
png_voidp_NULL, (png_malloc_ptr)png_debug_malloc,
539
(png_free_ptr)png_debug_free);
525
540
if (size != 0 && pinfo->pointer == NULL)
527
542
current_allocation -= size;
533
548
pinformation = pinfo;
534
549
/* Make sure the caller isn't assuming zeroed memory. */
535
550
png_memset(pinfo->pointer, 0xdd, pinfo->size);
537
printf("png_malloc %lu bytes at %x\n",(unsigned long)size,
552
printf("png_malloc %lu bytes at %x\n", (unsigned long)size,
539
554
return (png_voidp)(pinfo->pointer);
585
600
/* Finally free the data. */
587
printf("Freeing %x\n",ptr);
602
printf("Freeing %x\n", ptr);
588
603
png_free_default(png_ptr, ptr);
591
606
#endif /* PNG_USER_MEM_SUPPORTED && PNG_DEBUG */
592
607
/* END of code to test memory allocation/deallocation */
610
/* Demonstration of user chunk support of the sTER and vpAg chunks */
611
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
613
/* (sTER is a public chunk not yet known by libpng. vpAg is a private
614
chunk used in ImageMagick to store "virtual page" size). */
616
static png_uint_32 user_chunk_data[4];
624
static int read_user_chunk_callback(png_struct *png_ptr,
625
png_unknown_chunkp chunk)
630
/* Return one of the following:
631
* return (-n); chunk had an error
632
* return (0); did not recognize
633
* return (n); success
635
* The unknown chunk structure contains the chunk data:
640
* Note that libpng has already taken care of the CRC handling.
643
if (chunk->name[0] == 115 && chunk->name[1] == 84 && /* s T */
644
chunk->name[2] == 69 && chunk->name[3] == 82) /* E R */
646
/* Found sTER chunk */
647
if (chunk->size != 1)
648
return (-1); /* Error return */
649
if (chunk->data[0] != 0 && chunk->data[0] != 1)
650
return (-1); /* Invalid mode */
651
my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr);
652
my_user_chunk_data[0]=chunk->data[0]+1;
656
if (chunk->name[0] != 118 || chunk->name[1] != 112 || /* v p */
657
chunk->name[2] != 65 || chunk->name[3] != 103) /* A g */
658
return (0); /* Did not recognize */
660
/* Found ImageMagick vpAg chunk */
662
if (chunk->size != 9)
663
return (-1); /* Error return */
665
my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr);
667
my_user_chunk_data[1]=png_get_uint_31(png_ptr, chunk->data);
668
my_user_chunk_data[2]=png_get_uint_31(png_ptr, chunk->data + 4);
669
my_user_chunk_data[3]=(png_uint_32)chunk->data[8];
675
/* END of code to demonstrate user chunk support */
594
677
/* Test one file */
596
679
test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
622
#if defined(_WIN32_WCE)
623
706
TCHAR path[MAX_PATH];
625
708
char inbuf[256], outbuf[256];
629
#if defined(_WIN32_WCE)
630
713
MultiByteToWideChar(CP_ACP, 0, inname, -1, path, MAX_PATH);
631
714
if ((fpin = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
652
png_debug(0, "Allocating read and write structures\n");
735
png_debug(0, "Allocating read and write structures");
653
736
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
654
read_ptr = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
738
png_create_read_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
655
739
png_error_ptr_NULL, png_error_ptr_NULL, png_voidp_NULL,
656
740
(png_malloc_ptr)png_debug_malloc, (png_free_ptr)png_debug_free);
658
read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
743
png_create_read_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
659
744
png_error_ptr_NULL, png_error_ptr_NULL);
746
#ifndef PNG_STDIO_SUPPORTED
661
747
png_set_error_fn(read_ptr, (png_voidp)inname, pngtest_error,
662
748
pngtest_warning);
751
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
752
user_chunk_data[0] = 0;
753
user_chunk_data[1] = 0;
754
user_chunk_data[2] = 0;
755
user_chunk_data[3] = 0;
756
png_set_read_user_chunk_fn(read_ptr, user_chunk_data,
757
read_user_chunk_callback);
663
760
#ifdef PNG_WRITE_SUPPORTED
664
761
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
665
write_ptr = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
763
png_create_write_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
666
764
png_error_ptr_NULL, png_error_ptr_NULL, png_voidp_NULL,
667
765
(png_malloc_ptr)png_debug_malloc, (png_free_ptr)png_debug_free);
669
write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
768
png_create_write_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
670
769
png_error_ptr_NULL, png_error_ptr_NULL);
771
#ifndef PNG_STDIO_SUPPORTED
672
772
png_set_error_fn(write_ptr, (png_voidp)inname, pngtest_error,
673
773
pngtest_warning);
675
png_debug(0, "Allocating read_info, write_info and end_info structures\n");
776
png_debug(0, "Allocating read_info, write_info and end_info structures");
676
777
read_info_ptr = png_create_info_struct(read_ptr);
677
778
end_info_ptr = png_create_info_struct(read_ptr);
678
779
#ifdef PNG_WRITE_SUPPORTED
691
792
fprintf(STDERR, "%s -> %s: libpng read error\n", inname, outname);
693
png_free(read_ptr, row_buf);
793
png_free(read_ptr, row_buf);
694
795
png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
695
796
#ifdef PNG_WRITE_SUPPORTED
696
797
png_destroy_info_struct(write_ptr, &write_end_info_ptr);
703
804
#ifdef USE_FAR_KEYWORD
704
png_memcpy(png_jmpbuf(read_ptr),jmpbuf,png_sizeof(jmp_buf));
805
png_memcpy(png_jmpbuf(read_ptr), jmpbuf, png_sizeof(jmp_buf));
707
808
#ifdef PNG_WRITE_SUPPORTED
708
png_debug(0, "Setting jmpbuf for write struct\n");
809
png_debug(0, "Setting jmpbuf for write struct");
709
810
#ifdef USE_FAR_KEYWORD
710
811
if (setjmp(jmpbuf))
725
826
#ifdef USE_FAR_KEYWORD
726
png_memcpy(png_jmpbuf(write_ptr),jmpbuf,png_sizeof(jmp_buf));
827
png_memcpy(png_jmpbuf(write_ptr), jmpbuf, png_sizeof(jmp_buf));
731
png_debug(0, "Initializing input and output streams\n");
732
#if !defined(PNG_NO_STDIO)
832
png_debug(0, "Initializing input and output streams");
833
#ifdef PNG_STDIO_SUPPORTED
733
834
png_init_io(read_ptr, fpin);
734
835
# ifdef PNG_WRITE_SUPPORTED
735
836
png_init_io(write_ptr, fpout);
738
839
png_set_read_fn(read_ptr, (png_voidp)fpin, pngtest_read_data);
739
840
# ifdef PNG_WRITE_SUPPORTED
740
841
png_set_write_fn(write_ptr, (png_voidp)fpout, pngtest_write_data,
741
# if defined(PNG_WRITE_FLUSH_SUPPORTED)
842
# ifdef PNG_WRITE_FLUSH_SUPPORTED
748
if(status_dots_requested == 1)
849
if (status_dots_requested == 1)
750
851
#ifdef PNG_WRITE_SUPPORTED
751
852
png_set_write_status_fn(write_ptr, write_row_callback);
760
861
png_set_read_status_fn(read_ptr, png_read_status_ptr_NULL);
763
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
864
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
768
png_set_read_user_transform_fn(read_ptr, count_filters);
867
for (i = 0; i<256; i++)
869
png_set_read_user_transform_fn(read_ptr, count_filters);
771
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
872
#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
773
874
png_set_write_user_transform_fn(write_ptr, count_zero_samples);
776
#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
877
#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
777
878
# ifndef PNG_HANDLE_CHUNK_ALWAYS
778
879
# define PNG_HANDLE_CHUNK_ALWAYS 3
780
881
png_set_keep_unknown_chunks(read_ptr, PNG_HANDLE_CHUNK_ALWAYS,
781
882
png_bytep_NULL, 0);
783
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
884
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
784
885
# ifndef PNG_HANDLE_CHUNK_IF_SAFE
785
886
# define PNG_HANDLE_CHUNK_IF_SAFE 2
788
889
png_bytep_NULL, 0);
791
png_debug(0, "Reading info struct\n");
892
png_debug(0, "Reading info struct");
792
893
png_read_info(read_ptr, read_info_ptr);
794
png_debug(0, "Transferring info struct\n");
895
png_debug(0, "Transferring info struct");
796
897
int interlace_type, compression_type, filter_type;
799
900
&color_type, &interlace_type, &compression_type, &filter_type))
801
902
png_set_IHDR(write_ptr, write_info_ptr, width, height, bit_depth,
802
#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
903
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
803
904
color_type, interlace_type, compression_type, filter_type);
805
906
color_type, PNG_INTERLACE_NONE, compression_type, filter_type);
809
#if defined(PNG_FIXED_POINT_SUPPORTED)
810
#if defined(PNG_cHRM_SUPPORTED)
910
#ifdef PNG_FIXED_POINT_SUPPORTED
911
#ifdef PNG_cHRM_SUPPORTED
812
913
png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
822
#if defined(PNG_gAMA_SUPPORTED)
923
#ifdef PNG_gAMA_SUPPORTED
824
925
png_fixed_point gamma;
826
927
if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma))
828
928
png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma);
832
931
#else /* Use floating point versions */
833
#if defined(PNG_FLOATING_POINT_SUPPORTED)
834
#if defined(PNG_cHRM_SUPPORTED)
932
#ifdef PNG_FLOATING_POINT_SUPPORTED
933
#ifdef PNG_cHRM_SUPPORTED
836
935
double white_x, white_y, red_x, red_y, green_x, green_y, blue_x,
846
#if defined(PNG_gAMA_SUPPORTED)
945
#ifdef PNG_gAMA_SUPPORTED
850
949
if (png_get_gAMA(read_ptr, read_info_ptr, &gamma))
852
950
png_set_gAMA(write_ptr, write_info_ptr, gamma);
856
#endif /* floating point */
857
#endif /* fixed point */
858
#if defined(PNG_iCCP_SUPPORTED)
953
#endif /* Floating point */
954
#endif /* Fixed point */
955
#ifdef PNG_iCCP_SUPPORTED
861
958
png_charp profile;
887
982
if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette))
889
983
png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);
892
#if defined(PNG_bKGD_SUPPORTED)
985
#ifdef PNG_bKGD_SUPPORTED
894
987
png_color_16p background;
902
#if defined(PNG_hIST_SUPPORTED)
995
#ifdef PNG_hIST_SUPPORTED
904
997
png_uint_16p hist;
906
999
if (png_get_hIST(read_ptr, read_info_ptr, &hist))
908
1000
png_set_hIST(write_ptr, write_info_ptr, hist);
912
#if defined(PNG_oFFs_SUPPORTED)
1003
#ifdef PNG_oFFs_SUPPORTED
914
1005
png_int_32 offset_x, offset_y;
917
if (png_get_oFFs(read_ptr, read_info_ptr,&offset_x,&offset_y,&unit_type))
1008
if (png_get_oFFs(read_ptr, read_info_ptr, &offset_x, &offset_y,
919
1011
png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type);
923
#if defined(PNG_pCAL_SUPPORTED)
1015
#ifdef PNG_pCAL_SUPPORTED
925
1017
png_charp purpose, units;
926
1018
png_charpp params;
938
#if defined(PNG_pHYs_SUPPORTED)
1030
#ifdef PNG_pHYs_SUPPORTED
940
1032
png_uint_32 res_x, res_y;
943
1035
if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y, &unit_type))
945
1036
png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type);
949
#if defined(PNG_sBIT_SUPPORTED)
1039
#ifdef PNG_sBIT_SUPPORTED
951
1041
png_color_8p sig_bit;
953
1043
if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit))
955
1044
png_set_sBIT(write_ptr, write_info_ptr, sig_bit);
959
#if defined(PNG_sCAL_SUPPORTED)
1047
#ifdef PNG_sCAL_SUPPORTED
960
1048
#ifdef PNG_FLOATING_POINT_SUPPORTED
986
#if defined(PNG_TEXT_SUPPORTED)
1074
#ifdef PNG_TEXT_SUPPORTED
988
1076
png_textp text_ptr;
991
1079
if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0)
993
png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks\n", num_text);
1081
png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks", num_text);
994
1082
png_set_text(write_ptr, write_info_ptr, text_ptr, num_text);
998
#if defined(PNG_tIME_SUPPORTED)
1086
#ifdef PNG_tIME_SUPPORTED
1000
1088
png_timep mod_time;
1002
1090
if (png_get_tIME(read_ptr, read_info_ptr, &mod_time))
1004
1092
png_set_tIME(write_ptr, write_info_ptr, mod_time);
1005
#if defined(PNG_TIME_RFC1123_SUPPORTED)
1006
/* we have to use png_memcpy instead of "=" because the string
1007
pointed to by png_convert_to_rfc1123() gets free'ed before
1093
#ifdef PNG_TIME_RFC1123_SUPPORTED
1094
/* We have to use png_memcpy instead of "=" because the string
1095
* pointed to by png_convert_to_rfc1123() gets free'ed before
1009
1098
png_memcpy(tIME_string,
1010
png_convert_to_rfc1123(read_ptr, mod_time),
1099
png_convert_to_rfc1123(read_ptr, mod_time),
1011
1100
png_sizeof(tIME_string));
1012
tIME_string[png_sizeof(tIME_string)-1] = '\0';
1101
tIME_string[png_sizeof(tIME_string) - 1] = '\0';
1013
1102
tIME_chunk_present++;
1014
1103
#endif /* PNG_TIME_RFC1123_SUPPORTED */
1018
#if defined(PNG_tRNS_SUPPORTED)
1107
#ifdef PNG_tRNS_SUPPORTED
1020
1109
png_bytep trans;
1024
1113
if (png_get_tRNS(read_ptr, read_info_ptr, &trans, &num_trans,
1025
1114
&trans_values))
1027
png_set_tRNS(write_ptr, write_info_ptr, trans, num_trans,
1116
int sample_max = (1 << bit_depth);
1117
/* libpng doesn't reject a tRNS chunk with out-of-range samples */
1118
if (!((color_type == PNG_COLOR_TYPE_GRAY &&
1119
(int)trans_values->gray > sample_max) ||
1120
(color_type == PNG_COLOR_TYPE_RGB &&
1121
((int)trans_values->red > sample_max ||
1122
(int)trans_values->green > sample_max ||
1123
(int)trans_values->blue > sample_max))))
1124
png_set_tRNS(write_ptr, write_info_ptr, trans, num_trans,
1032
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
1129
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1034
1131
png_unknown_chunkp unknowns;
1035
1132
int num_unknowns = (int)png_get_unknown_chunks(read_ptr, read_info_ptr,
1040
1137
png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns,
1042
/* copy the locations from the read_info_ptr. The automatically
1043
generated locations in write_info_ptr are wrong because we
1044
haven't written anything yet */
1139
/* Copy the locations from the read_info_ptr. The automatically
1140
* generated locations in write_info_ptr are wrong because we
1141
* haven't written anything yet.
1045
1143
for (i = 0; i < (png_size_t)num_unknowns; i++)
1046
1144
png_set_unknown_chunk_location(write_ptr, write_info_ptr, i,
1047
1145
unknowns[i].location);
1052
1150
#ifdef PNG_WRITE_SUPPORTED
1053
png_debug(0, "\nWriting info struct\n");
1151
png_debug(0, "Writing info struct");
1055
1153
/* If we wanted, we could write info in two steps:
1056
png_write_info_before_PLTE(write_ptr, write_info_ptr);
1154
* png_write_info_before_PLTE(write_ptr, write_info_ptr);
1058
1156
png_write_info(write_ptr, write_info_ptr);
1158
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
1159
if (user_chunk_data[0] != 0)
1161
png_byte png_sTER[5] = {115, 84, 69, 82, '\0'};
1167
fprintf(STDERR, "\n stereo mode = %lu\n",
1168
(unsigned long)(user_chunk_data[0] - 1));
1169
ster_chunk_data[0]=(unsigned char)(user_chunk_data[0] - 1);
1170
png_write_chunk(write_ptr, png_sTER, ster_chunk_data, 1);
1172
if (user_chunk_data[1] != 0 || user_chunk_data[2] != 0)
1174
png_byte png_vpAg[5] = {118, 112, 65, 103, '\0'};
1180
fprintf(STDERR, " vpAg = %lu x %lu, units = %lu\n",
1181
(unsigned long)user_chunk_data[1],
1182
(unsigned long)user_chunk_data[2],
1183
(unsigned long)user_chunk_data[3]);
1184
png_save_uint_32(vpag_chunk_data, user_chunk_data[1]);
1185
png_save_uint_32(vpag_chunk_data + 4, user_chunk_data[2]);
1186
vpag_chunk_data[8] = (unsigned char)(user_chunk_data[3] & 0xff);
1187
png_write_chunk(write_ptr, png_vpAg, vpag_chunk_data, 9);
1061
1193
#ifdef SINGLE_ROWBUF_ALLOC
1062
png_debug(0, "\nAllocating row buffer...");
1194
png_debug(0, "Allocating row buffer...");
1063
1195
row_buf = (png_bytep)png_malloc(read_ptr,
1064
1196
png_get_rowbytes(read_ptr, read_info_ptr));
1065
png_debug1(0, "0x%08lx\n\n", (unsigned long)row_buf);
1197
png_debug1(0, "0x%08lx", (unsigned long)row_buf);
1066
1198
#endif /* SINGLE_ROWBUF_ALLOC */
1067
png_debug(0, "Writing row data\n");
1199
png_debug(0, "Writing row data");
1069
1201
#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
1070
1202
defined(PNG_WRITE_INTERLACING_SUPPORTED)
1084
1216
for (pass = 0; pass < num_pass; pass++)
1086
png_debug1(0, "Writing row data for pass %d\n",pass);
1218
png_debug1(0, "Writing row data for pass %d", pass);
1087
1219
for (y = 0; y < height; y++)
1089
1221
#ifndef SINGLE_ROWBUF_ALLOC
1090
png_debug2(0, "\nAllocating row buffer (pass %d, y = %ld)...", pass,y);
1222
png_debug2(0, "Allocating row buffer (pass %d, y = %ld)...", pass, y);
1091
1223
row_buf = (png_bytep)png_malloc(read_ptr,
1092
1224
png_get_rowbytes(read_ptr, read_info_ptr));
1093
png_debug2(0, "0x%08lx (%ld bytes)\n", (unsigned long)row_buf,
1225
png_debug2(0, "0x%08lx (%ld bytes)", (unsigned long)row_buf,
1094
1226
png_get_rowbytes(read_ptr, read_info_ptr));
1095
1227
#endif /* !SINGLE_ROWBUF_ALLOC */
1096
1228
png_read_rows(read_ptr, (png_bytepp)&row_buf, png_bytepp_NULL, 1);
1110
1242
#endif /* PNG_WRITE_SUPPORTED */
1112
1244
#ifndef SINGLE_ROWBUF_ALLOC
1113
png_debug2(0, "Freeing row buffer (pass %d, y = %ld)\n\n", pass, y);
1245
png_debug2(0, "Freeing row buffer (pass %d, y = %ld)", pass, y);
1114
1246
png_free(read_ptr, row_buf);
1115
1248
#endif /* !SINGLE_ROWBUF_ALLOC */
1119
#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
1252
#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
1120
1253
png_free_data(read_ptr, read_info_ptr, PNG_FREE_UNKN, -1);
1122
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
1255
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1123
1256
png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1);
1126
png_debug(0, "Reading and writing end_info data\n");
1259
png_debug(0, "Reading and writing end_info data");
1128
1261
png_read_end(read_ptr, end_info_ptr);
1129
#if defined(PNG_TEXT_SUPPORTED)
1262
#ifdef PNG_TEXT_SUPPORTED
1131
1264
png_textp text_ptr;
1134
1267
if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0)
1136
png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks\n", num_text);
1269
png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks", num_text);
1137
1270
png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text);
1141
#if defined(PNG_tIME_SUPPORTED)
1274
#ifdef PNG_tIME_SUPPORTED
1143
1276
png_timep mod_time;
1145
1278
if (png_get_tIME(read_ptr, end_info_ptr, &mod_time))
1147
1280
png_set_tIME(write_ptr, write_end_info_ptr, mod_time);
1148
#if defined(PNG_TIME_RFC1123_SUPPORTED)
1149
/* we have to use png_memcpy instead of "=" because the string
1281
#ifdef PNG_TIME_RFC1123_SUPPORTED
1282
/* We have to use png_memcpy instead of "=" because the string
1150
1283
pointed to by png_convert_to_rfc1123() gets free'ed before
1152
1285
png_memcpy(tIME_string,
1153
1286
png_convert_to_rfc1123(read_ptr, mod_time),
1154
1287
png_sizeof(tIME_string));
1155
tIME_string[png_sizeof(tIME_string)-1] = '\0';
1288
tIME_string[png_sizeof(tIME_string) - 1] = '\0';
1156
1289
tIME_chunk_present++;
1157
1290
#endif /* PNG_TIME_RFC1123_SUPPORTED */
1161
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
1294
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
1163
1296
png_unknown_chunkp unknowns;
1164
1297
int num_unknowns;
1170
1303
png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns,
1172
/* copy the locations from the read_info_ptr. The automatically
1173
generated locations in write_end_info_ptr are wrong because we
1174
haven't written the end_info yet */
1305
/* Copy the locations from the read_info_ptr. The automatically
1306
* generated locations in write_end_info_ptr are wrong because we
1307
* haven't written the end_info yet.
1175
1309
for (i = 0; i < (png_size_t)num_unknowns; i++)
1176
1310
png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i,
1177
1311
unknowns[i].location);
1185
1319
#ifdef PNG_EASY_ACCESS_SUPPORTED
1188
1322
png_uint_32 iwidth, iheight;
1189
1323
iwidth = png_get_image_width(write_ptr, write_info_ptr);
1190
1324
iheight = png_get_image_height(write_ptr, write_info_ptr);
1191
fprintf(STDERR, "Image width = %lu, height = %lu\n",
1325
fprintf(STDERR, "\n Image width = %lu, height = %lu\n",
1192
1326
(unsigned long)iwidth, (unsigned long)iheight);
1196
png_debug(0, "Destroying data structs\n");
1330
png_debug(0, "Destroying data structs");
1197
1331
#ifdef SINGLE_ROWBUF_ALLOC
1198
png_debug(1, "destroying row_buf for read_ptr\n");
1332
png_debug(1, "destroying row_buf for read_ptr");
1199
1333
png_free(read_ptr, row_buf);
1201
1335
#endif /* SINGLE_ROWBUF_ALLOC */
1202
png_debug(1, "destroying read_ptr, read_info_ptr, end_info_ptr\n");
1336
png_debug(1, "destroying read_ptr, read_info_ptr, end_info_ptr");
1203
1337
png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
1204
1338
#ifdef PNG_WRITE_SUPPORTED
1205
png_debug(1, "destroying write_end_info_ptr\n");
1339
png_debug(1, "destroying write_end_info_ptr");
1206
1340
png_destroy_info_struct(write_ptr, &write_end_info_ptr);
1207
png_debug(1, "destroying write_ptr, write_info_ptr\n");
1341
png_debug(1, "destroying write_ptr, write_info_ptr");
1208
1342
png_destroy_write_struct(&write_ptr, &write_info_ptr);
1210
png_debug(0, "Destruction complete.\n");
1344
png_debug(0, "Destruction complete.");
1215
png_debug(0, "Opening files for comparison\n");
1216
#if defined(_WIN32_WCE)
1349
png_debug(0, "Opening files for comparison");
1217
1351
MultiByteToWideChar(CP_ACP, 0, inname, -1, path, MAX_PATH);
1218
1352
if ((fpin = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
1241
1375
png_size_t num_in, num_out;
1243
READFILE(fpin, inbuf, 1, num_in);
1244
READFILE(fpout, outbuf, 1, num_out);
1377
READFILE(fpin, inbuf, 1, num_in);
1378
READFILE(fpout, outbuf, 1, num_out);
1246
1380
if (num_in != num_out)
1248
1382
fprintf(STDERR, "\nFiles %s and %s are of a different size\n",
1249
1383
inname, outname);
1250
if(wrote_question == 0)
1384
if (wrote_question == 0)
1252
1386
fprintf(STDERR,
1253
1387
" Was %s written with the same maximum IDAT chunk size (%d bytes),",
1254
inname,PNG_ZBUF_SIZE);
1388
inname, PNG_ZBUF_SIZE);
1255
1389
fprintf(STDERR,
1256
1390
"\n filtering heuristic (libpng default), compression");
1257
1391
fprintf(STDERR,
1258
1392
" level (zlib default),\n and zlib version (%s)?\n\n",
1270
1404
if (png_memcmp(inbuf, outbuf, num_in))
1272
1406
fprintf(STDERR, "\nFiles %s and %s are different\n", inname, outname);
1273
if(wrote_question == 0)
1407
if (wrote_question == 0)
1275
1409
fprintf(STDERR,
1276
1410
" Was %s written with the same maximum IDAT chunk size (%d bytes),",
1277
inname,PNG_ZBUF_SIZE);
1411
inname, PNG_ZBUF_SIZE);
1278
1412
fprintf(STDERR,
1279
1413
"\n filtering heuristic (libpng default), compression");
1280
1414
fprintf(STDERR,
1281
1415
" level (zlib default),\n and zlib version (%s)?\n\n",
1309
1443
int multiple = 0;
1310
1444
int ierror = 0;
1312
fprintf(STDERR, "Testing libpng version %s\n", PNG_LIBPNG_VER_STRING);
1446
fprintf(STDERR, "\n Testing libpng version %s\n", PNG_LIBPNG_VER_STRING);
1313
1447
fprintf(STDERR, " with zlib version %s\n", ZLIB_VERSION);
1314
fprintf(STDERR,"%s",png_get_copyright(NULL));
1448
fprintf(STDERR, "%s", png_get_copyright(NULL));
1315
1449
/* Show the version of libpng used in building the library */
1316
fprintf(STDERR," library (%lu):%s",
1450
fprintf(STDERR, " library (%lu):%s",
1317
1451
(unsigned long)png_access_version_number(),
1318
1452
png_get_header_version(NULL));
1319
1453
/* Show the version of libpng used in building the application */
1320
fprintf(STDERR," pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER,
1454
fprintf(STDERR, " pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER,
1321
1455
PNG_HEADER_VERSION_STRING);
1322
fprintf(STDERR," png_sizeof(png_struct)=%ld, png_sizeof(png_info)=%ld\n",
1456
fprintf(STDERR, " sizeof(png_struct)=%ld, sizeof(png_info)=%ld\n",
1323
1457
(long)png_sizeof(png_struct), (long)png_sizeof(png_info));
1325
1459
/* Do some consistency checking on the memory allocation settings, I'm
1326
not sure this matters, but it is nice to know, the first of these
1327
tests should be impossible because of the way the macros are set
1460
* not sure this matters, but it is nice to know, the first of these
1461
* tests should be impossible because of the way the macros are set
1329
1464
#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)
1330
1465
fprintf(STDERR, " NOTE: Zlib compiled for max 64k, libpng not\n");
1373
if (!multiple && argc == 3+verbose)
1374
outname = argv[2+verbose];
1508
if (!multiple && argc == 3 + verbose)
1509
outname = argv[2 + verbose];
1376
if ((!multiple && argc > 3+verbose) || (multiple && argc < 2))
1511
if ((!multiple && argc > 3 + verbose) || (multiple && argc < 2))
1378
1513
fprintf(STDERR,
1379
1514
"usage: %s [infile.png] [outfile.png]\n\t%s -m {infile.png}\n",
1394
1529
for (i=2; i<argc; ++i)
1396
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
1531
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
1400
fprintf(STDERR, "Testing %s:",argv[i]);
1535
fprintf(STDERR, "\n Testing %s:", argv[i]);
1401
1536
kerror = test_one_file(argv[i], outname);
1402
1537
if (kerror == 0)
1404
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
1539
#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
1405
1540
fprintf(STDERR, "\n PASS (%lu zero samples)\n",
1406
1541
(unsigned long)zero_samples);
1408
1543
fprintf(STDERR, " PASS\n");
1410
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
1411
for (k=0; k<256; k++)
1545
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
1546
for (k = 0; k<256; k++)
1547
if (filters_used[k])
1413
1548
fprintf(STDERR, " Filter %d was used %lu times\n",
1414
k,(unsigned long)filters_used[k]);
1549
k, (unsigned long)filters_used[k]);
1416
#if defined(PNG_TIME_RFC1123_SUPPORTED)
1417
if(tIME_chunk_present != 0)
1418
fprintf(STDERR, " tIME = %s\n",tIME_string);
1551
#ifdef PNG_TIME_RFC1123_SUPPORTED
1552
if (tIME_chunk_present != 0)
1553
fprintf(STDERR, " tIME = %s\n", tIME_string);
1419
1554
tIME_chunk_present = 0;
1420
1555
#endif /* PNG_TIME_RFC1123_SUPPORTED */
1427
1562
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
1428
1563
if (allocation_now != current_allocation)
1429
1564
fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
1430
current_allocation-allocation_now);
1565
current_allocation - allocation_now);
1431
1566
if (current_allocation != 0)
1433
1568
memory_infop pinfo = pinformation;
1596
for (i = 0; i<3; ++i)
1463
1599
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
1464
1600
int allocation_now = current_allocation;
1466
1602
if (i == 1) status_dots_requested = 1;
1467
else if(verbose == 0)status_dots_requested = 0;
1603
else if (verbose == 0)status_dots_requested = 0;
1468
1604
if (i == 0 || verbose == 1 || ierror != 0)
1469
fprintf(STDERR, "Testing %s:",inname);
1605
fprintf(STDERR, "\n Testing %s:", inname);
1470
1606
kerror = test_one_file(inname, outname);
1473
if(verbose == 1 || i == 2)
1609
if (verbose == 1 || i == 2)
1475
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
1611
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
1478
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
1614
#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
1479
1615
fprintf(STDERR, "\n PASS (%lu zero samples)\n",
1480
1616
(unsigned long)zero_samples);
1482
1618
fprintf(STDERR, " PASS\n");
1484
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
1485
for (k=0; k<256; k++)
1620
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
1621
for (k = 0; k<256; k++)
1622
if (filters_used[k])
1487
1623
fprintf(STDERR, " Filter %d was used %lu times\n",
1488
k,(unsigned long)filters_used[k]);
1625
(unsigned long)filters_used[k]);
1490
#if defined(PNG_TIME_RFC1123_SUPPORTED)
1491
if(tIME_chunk_present != 0)
1492
fprintf(STDERR, " tIME = %s\n",tIME_string);
1627
#ifdef PNG_TIME_RFC1123_SUPPORTED
1628
if (tIME_chunk_present != 0)
1629
fprintf(STDERR, " tIME = %s\n", tIME_string);
1493
1630
#endif /* PNG_TIME_RFC1123_SUPPORTED */
1498
if(verbose == 0 && i != 2)
1499
fprintf(STDERR, "Testing %s:",inname);
1635
if (verbose == 0 && i != 2)
1636
fprintf(STDERR, "\n Testing %s:", inname);
1500
1637
fprintf(STDERR, " FAIL\n");
1501
1638
ierror += kerror;
1503
1640
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
1504
1641
if (allocation_now != current_allocation)
1505
1642
fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
1506
current_allocation-allocation_now);
1643
current_allocation - allocation_now);
1507
1644
if (current_allocation != 0)
1509
1646
memory_infop pinfo = pinformation;
1535
1672
t_stop = (float)clock();
1536
1673
t_misc += (t_stop - t_start);
1537
1674
t_start = t_stop;
1538
fprintf(STDERR," CPU time used = %.3f seconds",
1675
fprintf(STDERR, " CPU time used = %.3f seconds",
1539
1676
(t_misc+t_decode+t_encode)/(float)CLOCKS_PER_SEC);
1540
fprintf(STDERR," (decoding %.3f,\n",
1677
fprintf(STDERR, " (decoding %.3f,\n",
1541
1678
t_decode/(float)CLOCKS_PER_SEC);
1542
fprintf(STDERR," encoding %.3f ,",
1679
fprintf(STDERR, " encoding %.3f ,",
1543
1680
t_encode/(float)CLOCKS_PER_SEC);
1544
fprintf(STDERR," other %.3f seconds)\n\n",
1681
fprintf(STDERR, " other %.3f seconds)\n\n",
1545
1682
t_misc/(float)CLOCKS_PER_SEC);
1548
1685
if (ierror == 0)
1549
fprintf(STDERR, "libpng passes test\n");
1686
fprintf(STDERR, " libpng passes test\n");
1551
fprintf(STDERR, "libpng FAILS test\n");
1688
fprintf(STDERR, " libpng FAILS test\n");
1552
1689
return (int)(ierror != 0);
1555
1692
/* Generate a compiler error if there is an old png.h in the search path. */
1556
typedef version_1_2_23 your_png_h_is_not_version_1_2_23;
1693
typedef version_1_2_41 your_png_h_is_not_version_1_2_41;