?? pngtest.c
字號(hào):
/* pngtest.c - a simple test program to test libpng * * libpng 1.2.8 - December 3, 2004 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2004 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * This program reads in a PNG image, writes it out again, and then * compares the two files. If the files are identical, this shows that * the basic chunk handling, filtering, and (de)compression code is working * properly. It does not currently test all of the transforms, although * it probably should. * * The program will report "FAIL" in certain legitimate cases: * 1) when the compression level or filter selection method is changed. * 2) when the maximum IDAT size (PNG_ZBUF_SIZE in pngconf.h) is not 8192. * 3) unknown unsafe-to-copy ancillary chunks or unknown critical chunks * exist in the input file. * 4) others not listed here... * In these cases, it is best to check with another tool such as "pngcheck" * to see what the differences between the two files are. * * If a filename is given on the command-line, then this file is used * for the input, rather than the default "pngtest.png". This allows * testing a wide variety of files easily. You can also test a number * of files at once by typing "pngtest -m file1.png file2.png ..." */#include "png.h"#if defined(_WIN32_WCE)# if _WIN32_WCE < 211 __error__ (f|w)printf functions are not supported on old WindowsCE.;# endif# include <windows.h># include <stdlib.h># define READFILE(file, data, length, check) \ if (ReadFile(file, data, length, &check,NULL)) check = 0# define WRITEFILE(file, data, length, check)) \ if (WriteFile(file, data, length, &check, NULL)) check = 0# define FCLOSE(file) CloseHandle(file)#else# include <stdio.h># include <stdlib.h># include <assert.h># define READFILE(file, data, length, check) \ check=(png_size_t)fread(data,(png_size_t)1,length,file)# define WRITEFILE(file, data, length, check) \ check=(png_size_t)fwrite(data,(png_size_t)1, length, file)# define FCLOSE(file) fclose(file)#endif#if defined(PNG_NO_STDIO)# if defined(_WIN32_WCE) typedef HANDLE png_FILE_p;# else typedef FILE * png_FILE_p;# endif#endif/* Makes pngtest verbose so we can find problems (needs to be before png.h) */#ifndef PNG_DEBUG# define PNG_DEBUG 0#endif#if !PNG_DEBUG# define SINGLE_ROWBUF_ALLOC /* makes buffer overruns easier to nail */#endif/* Turn on CPU timing#define PNGTEST_TIMING*/#ifdef PNG_NO_FLOATING_POINT_SUPPORTED#undef PNGTEST_TIMING#endif#ifdef PNGTEST_TIMINGstatic float t_start, t_stop, t_decode, t_encode, t_misc;#include <time.h>#endif/* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */#ifndef png_jmpbuf# define png_jmpbuf(png_ptr) png_ptr->jmpbuf#endif#ifdef PNGTEST_TIMINGstatic float t_start, t_stop, t_decode, t_encode, t_misc;#if !defined(PNG_tIME_SUPPORTED)#include <time.h>#endif#endif#if defined(PNG_TIME_RFC1123_SUPPORTED)static int tIME_chunk_present=0;static char tIME_string[30] = "no tIME chunk present in file";#endifstatic int verbose = 0;int test_one_file PNGARG((PNG_CONST char *inname, PNG_CONST char *outname));#ifdef __TURBOC__#include <mem.h>#endif/* defined so I can write to a file on gui/windowing platforms *//* #define STDERR stderr */#define STDERR stdout /* for DOS *//* example of using row callbacks to make a simple progress meter */static int status_pass=1;static int status_dots_requested=0;static int status_dots=1;void#ifdef PNG_1_0_XPNGAPI#endifread_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass);void#ifdef PNG_1_0_XPNGAPI#endifread_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass){ if(png_ptr == NULL || row_number > PNG_UINT_31_MAX) return; if(status_pass != pass) { fprintf(stdout,"\n Pass %d: ",pass); status_pass = pass; status_dots = 31; } status_dots--; if(status_dots == 0) { fprintf(stdout, "\n "); status_dots=30; } fprintf(stdout, "r");}void#ifdef PNG_1_0_XPNGAPI#endifwrite_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass);void#ifdef PNG_1_0_XPNGAPI#endifwrite_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass){ if(png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7) return; fprintf(stdout, "w");}#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)/* Example of using user transform callback (we don't transform anything, but merely examine the row filters. We set this to 256 rather than 5 in case illegal filter values are present.) */static png_uint_32 filters_used[256];void#ifdef PNG_1_0_XPNGAPI#endifcount_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data);void#ifdef PNG_1_0_XPNGAPI#endifcount_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data){ if(png_ptr != NULL && row_info != NULL) ++filters_used[*(data-1)];}#endif#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)/* example of using user transform callback (we don't transform anything, but merely count the zero samples) */static png_uint_32 zero_samples;void#ifdef PNG_1_0_XPNGAPI#endifcount_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data);void#ifdef PNG_1_0_XPNGAPI#endifcount_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data){ png_bytep dp = data; if(png_ptr == NULL)return; /* contents of row_info: * png_uint_32 width width of row * png_uint_32 rowbytes number of bytes in row * png_byte color_type color type of pixels * png_byte bit_depth bit depth of samples * png_byte channels number of channels (1-4) * png_byte pixel_depth bits per pixel (depth*channels) */ /* counts the number of zero samples (or zero pixels if color_type is 3 */ if(row_info->color_type == 0 || row_info->color_type == 3) { int pos=0; png_uint_32 n, nstop; for (n=0, nstop=row_info->width; n<nstop; n++) { if(row_info->bit_depth == 1) { if(((*dp << pos++ ) & 0x80) == 0) zero_samples++; if(pos == 8) { pos = 0; dp++; } } if(row_info->bit_depth == 2) { if(((*dp << (pos+=2)) & 0xc0) == 0) zero_samples++; if(pos == 8) { pos = 0; dp++; } } if(row_info->bit_depth == 4) { if(((*dp << (pos+=4)) & 0xf0) == 0) zero_samples++; if(pos == 8) { pos = 0; dp++; } } if(row_info->bit_depth == 8) if(*dp++ == 0) zero_samples++; if(row_info->bit_depth == 16) { if((*dp | *(dp+1)) == 0) zero_samples++; dp+=2; } } } else /* other color types */ { png_uint_32 n, nstop; int channel; int color_channels = row_info->channels; if(row_info->color_type > 3)color_channels--; for (n=0, nstop=row_info->width; n<nstop; n++) { for (channel = 0; channel < color_channels; channel++) { if(row_info->bit_depth == 8) if(*dp++ == 0) zero_samples++; if(row_info->bit_depth == 16) { if((*dp | *(dp+1)) == 0) zero_samples++; dp+=2; } } if(row_info->color_type > 3) { dp++; if(row_info->bit_depth == 16)dp++; } } }}#endif /* PNG_WRITE_USER_TRANSFORM_SUPPORTED */static int wrote_question = 0;#if defined(PNG_NO_STDIO)/* START of code to validate stdio-free compilation *//* These copies of the default read/write functions come from pngrio.c and *//* pngwio.c. They allow "don't include stdio" testing of the library. *//* This is the function that does the actual reading of data. If you are not reading from a standard C stream, you should create a replacement read_data function and use it at run time with png_set_read_fn(), rather than changing the library. */#ifndef USE_FAR_KEYWORDstatic voidpngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length){ png_size_t check; /* fread() returns 0 on error, so it is OK to store this in a png_size_t * instead of an int, which is what fread() actually returns. */ READFILE((png_FILE_p)png_ptr->io_ptr, data, length, check); if (check != length) { png_error(png_ptr, "Read Error!"); }}#else/* this is the model-independent version. Since the standard I/O library can't handle far buffers in the medium and small models, we have to copy the data.*/#define NEAR_BUF_SIZE 1024#define MIN(a,b) (a <= b ? a : b)static voidpngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length){ int check; png_byte *n_data; png_FILE_p io_ptr; /* Check if data really is near. If so, use usual code. */ n_data = (png_byte *)CVT_PTR_NOCHECK(data); io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); if ((png_bytep)n_data == data) { READFILE(io_ptr, n_data, length, check); } else { png_byte buf[NEAR_BUF_SIZE]; png_size_t read, remaining, err; check = 0; remaining = length; do { read = MIN(NEAR_BUF_SIZE, remaining); READFILE(io_ptr, buf, 1, err); png_memcpy(data, buf, read); /* copy far buffer to near buffer */ if(err != read) break; else check += err; data += read; remaining -= read; } while (remaining != 0); } if (check != length) { png_error(png_ptr, "read Error"); }}#endif /* USE_FAR_KEYWORD */#if defined(PNG_WRITE_FLUSH_SUPPORTED)static voidpngtest_flush(png_structp png_ptr){#if !defined(_WIN32_WCE) png_FILE_p io_ptr; io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr)); if (io_ptr != NULL) fflush(io_ptr);#endif}#endif/* This is the function that does the actual writing of data. If you are not writing to a standard C stream, you should create a replacement write_data function and use it at run time with png_set_write_fn(), rather than changing the library. */#ifndef USE_FAR_KEYWORDstatic voidpngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length){ png_uint_32 check; WRITEFILE((png_FILE_p)png_ptr->io_ptr, data, length, check); if (check != length) { png_error(png_ptr, "Write Error");
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -