#include "pngfile.h" #pragma comment(lib,"libpng.lib") FILE *png_stream; #define png_ptr_stream png_stream//((FILE *)png_ptr->io_ptr) void _flushpngfile(png_structp png_ptr) { fflush(png_ptr_stream); } void _readpngfile(png_structp png_ptr,unsigned char *buf,int size) { if (fread(buf,1,size,png_ptr_stream)==0) printf("Error reading stream for PNG file!\n"); } void _writepngfile(png_structp png_ptr,unsigned char *buf,int size) { if (fwrite(buf,1,size,png_ptr_stream)==0) printf("Error writing stream for PNG file!\n"); } Pixelmap *LoadPNG(char *loadtarget) { int bit_depth,color_type,interlace_type,compression_type,filter_method; char *filename; int x,y; char buf[8]; char **rows; png_structp png_ptr; png_infop info_ptr; png_uint_32 width,height; //FILE *png_stream; Pixelmap *pixmap=NULL; if (!loadtarget) return 0; filename=loadtarget; //printf("Loading PNG image: \"%s\"\n",filename); if (!(png_stream=fopen(filename,"rb"))) { return NULL; } if (fread(buf,1,8,png_stream)!=8) return 0; if (png_sig_cmp((unsigned char *)buf,0,8)!=0) { fclose(png_stream); return NULL; } png_ptr=png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); if (!png_ptr) { fclose(png_stream); return NULL; } png_ptr->io_ptr=png_stream; info_ptr=png_create_info_struct(png_ptr); if (!info_ptr) { fclose(png_stream); png_destroy_read_struct(&png_ptr,NULL,NULL); return 0; } png_set_sig_bytes(png_ptr,8); png_set_read_fn(png_ptr,NULL,(png_rw_ptr)_readpngfile); png_read_png(png_ptr,info_ptr,PNG_TRANSFORM_EXPAND|PNG_TRANSFORM_STRIP_16,0); png_get_IHDR( png_ptr,info_ptr, &width,&height,&bit_depth, &color_type,&interlace_type, &compression_type, &filter_method); if (bit_depth=8) { PixelFormat pixelformat=PixelsNone; int usestdcreator=0; switch (color_type) { case PNG_COLOR_TYPE_GRAY: pixelformat=PixelsI8; usestdcreator=1; break; case PNG_COLOR_TYPE_RGB: pixelformat=PixelsR8G8B8; usestdcreator=1; break; case PNG_COLOR_TYPE_RGBA: pixelformat=PixelsR8G8B8A8; usestdcreator=1; break; case PNG_COLOR_TYPE_GRAY_ALPHA: pixmap=new Pixelmap((int)width,(int)height,PixelsR8G8B8A8); rows=(char **)png_get_rows(png_ptr,info_ptr); for (y=0; y<(int)height; y++) { char *src=rows[y]; char *dst=pixmap->PixPtr(0,y); for (x=0; x<(int)width; x++) { char a=src[0]; char i=src[1]; dst[0]=i; dst[1]=i; dst[2]=i; dst[3]=a; src+=2; dst+=4; } } break; } if (usestdcreator) { pixmap=new Pixelmap((int)width,(int)height,pixelformat); rows=(char **)png_get_rows(png_ptr,info_ptr); for (y=0; y<(int)height; y++) { if (!PixelBufferCopy((unsigned char *)rows[y],(unsigned char *)pixmap->PixPtr(0,y),pixelformat,width)) { png_destroy_read_struct(&png_ptr,&info_ptr,NULL); fclose(png_stream); delete pixmap; return NULL; } } } } png_destroy_read_struct(&png_ptr,&info_ptr,NULL); fclose(png_stream); return pixmap; }