#include "mxpng.h" namespace mx { static SDL_Surface *CreateBuffer(size_t w = 640, size_t h = 480) { SDL_Surface *surface; static int rmask, gmask, bmask, amask; #if SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; #else rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; #endif surface = SDL_CreateRGBSurface(SDL_SWSURFACE , w, h, 32, rmask, gmask,bmask, amask); return surface; } mxPng::mxPng() {} mxPng::mxPng(std::string fname) { pngOpen(fname); } int mxPng::pngOpen(std::string fname) { png_byte header[8]; FILE *fp = fopen(fname.c_str(), "rb"); if (!fp) return 0; fread(header, 1, 8, fp); if (png_sig_cmp(header, 0, 8)) return 0; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) return 0; info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) return 0; if (setjmp(png_jmpbuf(png_ptr))) return 0; png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, 8); png_read_info(png_ptr, info_ptr); width = info_ptr->width; height = info_ptr->height; color_type = info_ptr->color_type; bit_depth = info_ptr->bit_depth; number_of_passes = png_set_interlace_handling(png_ptr); png_read_update_info(png_ptr, info_ptr); if (setjmp(png_jmpbuf(png_ptr))) return 0; row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height); for (y=0; yrowbytes); png_read_image(png_ptr, row_pointers); fclose(fp); return 1; } int mxPng::pngClose() { for (y=0; yformat, 255,255,255)); int x,y; if (SDL_MUSTLOCK(surf)) { if(SDL_LockSurface(surf) < 0) return 0; } Uint32 *buffer = (Uint32*) surf->pixels; for(y=0;yformat, ptr[0], ptr[1], ptr[2]); *uptr = value; } } if(SDL_MUSTLOCK(surf)) SDL_UnlockSurface(surf); return surf; } }