From a86cb87b98f0ec904dcc8e46b5b2c4b3d2f81aca Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 2 Feb 2011 15:43:45 +0000 Subject: GRAPHICS: Implemented a PNG decoder, and set it as default for the sword25 engine libpng is still needed for PNG encoding (for thumbnails in saved games of sword25), but since we'll probably drop support for the original saved games anyway, the PNG encoding code will ultimately be removed svn-id: r55723 --- engines/sword25/gfx/image/pngloader.cpp | 37 +++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'engines/sword25/gfx') diff --git a/engines/sword25/gfx/image/pngloader.cpp b/engines/sword25/gfx/image/pngloader.cpp index cdff0012c2..f54b45254b 100644 --- a/engines/sword25/gfx/image/pngloader.cpp +++ b/engines/sword25/gfx/image/pngloader.cpp @@ -32,13 +32,23 @@ * */ +// Define to use ScummVM's PNG decoder, instead of libpng +#define USE_INTERNAL_PNG_DECODER + +#ifndef USE_INTERNAL_PNG_DECODER // Disable symbol overrides so that we can use png.h #define FORBIDDEN_SYMBOL_ALLOW_ALL +#endif #include "common/memstream.h" #include "sword25/gfx/image/image.h" #include "sword25/gfx/image/pngloader.h" +#ifndef USE_INTERNAL_PNG_DECODER #include +#else +#include "graphics/pixelformat.h" +#include "graphics/png.h" +#endif namespace Sword25 { @@ -87,6 +97,7 @@ static uint findEmbeddedPNG(const byte *fileDataPtr, uint fileSize) { return static_cast(stream.pos() + compressedGamedataSize); } +#ifndef USE_INTERNAL_PNG_DECODER static void png_user_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { const byte **ref = (const byte **)png_get_io_ptr(png_ptr); memcpy(data, *ref, length); @@ -96,9 +107,10 @@ static void png_user_read_data(png_structp png_ptr, png_bytep data, png_size_t l static bool doIsCorrectImageFormat(const byte *fileDataPtr, uint fileSize) { return (fileSize > 8) && png_check_sig(const_cast(fileDataPtr), 8); } - +#endif bool PNGLoader::doDecodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) { +#ifndef USE_INTERNAL_PNG_DECODER png_structp png_ptr = NULL; png_infop info_ptr = NULL; @@ -202,7 +214,25 @@ bool PNGLoader::doDecodeImage(const byte *fileDataPtr, uint fileSize, byte *&unc // Destroy libpng structures png_destroy_read_struct(&png_ptr, &info_ptr, NULL); +#else + Common::MemoryReadStream *fileStr = new Common::MemoryReadStream(fileDataPtr, fileSize, DisposeAfterUse::NO); + Graphics::PNG *png = new Graphics::PNG(); + if (!png->read(fileStr)) // the fileStr pointer, and thus pFileData will be deleted after this is done + error("Error while reading PNG image"); + + Graphics::PixelFormat format = Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24); + Graphics::Surface *pngSurface = png->getSurface(format); + width = pngSurface->w; + height = pngSurface->h; + uncompressedDataPtr = new byte[pngSurface->pitch * pngSurface->h]; + memcpy(uncompressedDataPtr, (byte *)pngSurface->pixels, pngSurface->pitch * pngSurface->h); + pngSurface->free(); + + delete pngSurface; + delete png; + +#endif // Signal success return true; } @@ -213,6 +243,7 @@ bool PNGLoader::decodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncom } bool PNGLoader::doImageProperties(const byte *fileDataPtr, uint fileSize, int &width, int &height) { +#ifndef USE_INTERNAL_PNG_DECODER // Check for valid PNG signature if (!doIsCorrectImageFormat(fileDataPtr, fileSize)) return false; @@ -249,7 +280,9 @@ bool PNGLoader::doImageProperties(const byte *fileDataPtr, uint fileSize, int &w // Die Strukturen freigeben png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - +#else + // We don't need to read the image properties here... +#endif return true; } -- cgit v1.2.3