diff options
Diffstat (limited to 'engines/sword25/gfx/image/pngloader.cpp')
-rw-r--r-- | engines/sword25/gfx/image/pngloader.cpp | 135 |
1 files changed, 54 insertions, 81 deletions
diff --git a/engines/sword25/gfx/image/pngloader.cpp b/engines/sword25/gfx/image/pngloader.cpp index 1136b94006..a61036311f 100644 --- a/engines/sword25/gfx/image/pngloader.cpp +++ b/engines/sword25/gfx/image/pngloader.cpp @@ -32,10 +32,6 @@ * */ -// ----------------------------------------------------------------------------- -// Includes -// ----------------------------------------------------------------------------- - #include "sword25/gfx/image/image.h" #include "sword25/gfx/image/pngloader.h" #include <png.h> @@ -44,45 +40,34 @@ namespace Sword25 { #define BS_LOG_PREFIX "PNGLOADER" -// ----------------------------------------------------------------------------- -// Konstruktor / Destruktor -// ----------------------------------------------------------------------------- - PNGLoader::PNGLoader() { } -// ----------------------------------------------------------------------------- -// Laden -// ----------------------------------------------------------------------------- - 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); *ref += length; } -// ----------------------------------------------------------------------------- - -bool PNGLoader::DoDecodeImage(const byte *FileDataPtr, uint FileSize, GraphicEngine::COLOR_FORMATS ColorFormat, byte *&UncompressedDataPtr, - int &Width, int &Height, int &Pitch) { +bool PNGLoader::doDecodeImage(const byte *fileDataPtr, uint fileSize, GraphicEngine::COLOR_FORMATS colorFormat, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) { png_structp png_ptr = NULL; png_infop info_ptr = NULL; - png_bytep RawDataBuffer = NULL; + png_bytep rawDataBuffer = NULL; png_bytep *pRowPtr = NULL; - int BitDepth; - int ColorType; - int InterlaceType; + int bitDepth; + int colorType; + int interlaceType; int i; // Zielfarbformat überprüfen - if (ColorFormat != GraphicEngine::CF_ARGB32) { + if (colorFormat != GraphicEngine::CF_ARGB32) { BS_LOG_ERRORLN("Illegal or unsupported color format."); return false; } // PNG Signatur überprüfen - if (!png_check_sig(reinterpret_cast<png_bytep>(const_cast<byte *>(FileDataPtr)), 8)) { + if (!png_check_sig(reinterpret_cast<png_bytep>(const_cast<byte *>(fileDataPtr)), 8)) { error("png_check_sig failed"); } @@ -98,64 +83,64 @@ bool PNGLoader::DoDecodeImage(const byte *FileDataPtr, uint FileSize, GraphicEn } // Alternative Lesefunktion benutzen - const byte **ref = &FileDataPtr; + const byte **ref = &fileDataPtr; png_set_read_fn(png_ptr, (void *)ref, png_user_read_data); // PNG Header einlesen png_read_info(png_ptr, info_ptr); // PNG Informationen auslesen - png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *)&Width, (png_uint_32 *)&Height, &BitDepth, &ColorType, &InterlaceType, NULL, NULL); + png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *)&width, (png_uint_32 *)&height, &bitDepth, &colorType, &interlaceType, NULL, NULL); // Pitch des Ausgabebildes berechnen - Pitch = GraphicEngine::calcPitch(ColorFormat, Width); + pitch = GraphicEngine::calcPitch(colorFormat, width); // Speicher für die endgültigen Bilddaten reservieren // Dieses geschieht vor dem reservieren von Speicher für temporäre Bilddaten um die Fragmentierung des Speichers gering zu halten - UncompressedDataPtr = new byte[Pitch * Height]; - if (!UncompressedDataPtr) { + uncompressedDataPtr = new byte[pitch * height]; + if (!uncompressedDataPtr) { error("Could not allocate memory for output image."); } // Bilder jeglicher Farbformate werden zunächst in ARGB Bilder umgewandelt - if (BitDepth == 16) + if (bitDepth == 16) png_set_strip_16(png_ptr); - if (ColorType == PNG_COLOR_TYPE_PALETTE) + if (colorType == PNG_COLOR_TYPE_PALETTE) png_set_expand(png_ptr); - if (BitDepth < 8) + if (bitDepth < 8) png_set_expand(png_ptr); if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_expand(png_ptr); - if (ColorType == PNG_COLOR_TYPE_GRAY || - ColorType == PNG_COLOR_TYPE_GRAY_ALPHA) + if (colorType == PNG_COLOR_TYPE_GRAY || + colorType == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); png_set_bgr(png_ptr); - if (ColorType != PNG_COLOR_TYPE_RGB_ALPHA) + if (colorType != PNG_COLOR_TYPE_RGB_ALPHA) png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); // Nachdem die Transformationen registriert wurden, werden die Bilddaten erneut eingelesen png_read_update_info(png_ptr, info_ptr); - png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *)&Width, (png_uint_32 *)&Height, &BitDepth, &ColorType, NULL, NULL, NULL); + png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *)&width, (png_uint_32 *)&height, &bitDepth, &colorType, NULL, NULL, NULL); // PNGs ohne Interlacing werden Zeilenweise eingelesen - if (InterlaceType == PNG_INTERLACE_NONE) { + if (interlaceType == PNG_INTERLACE_NONE) { // Speicher für eine Bildzeile reservieren - RawDataBuffer = new png_byte[png_get_rowbytes(png_ptr, info_ptr)]; - if (!RawDataBuffer) { + rawDataBuffer = new png_byte[png_get_rowbytes(png_ptr, info_ptr)]; + if (!rawDataBuffer) { error("Could not allocate memory for row buffer."); } // Bilddaten zeilenweise einlesen und in das gewünschte Zielformat konvertieren - for (i = 0; i < Height; i++) { + for (i = 0; i < height; i++) { // Zeile einlesen - png_read_row(png_ptr, RawDataBuffer, NULL); + png_read_row(png_ptr, rawDataBuffer, NULL); // Zeile konvertieren - switch (ColorFormat) { + switch (colorFormat) { case GraphicEngine::CF_ARGB32: - memcpy(&UncompressedDataPtr[i * Pitch], RawDataBuffer, Pitch); + memcpy(&uncompressedDataPtr[i * pitch], rawDataBuffer, pitch); break; default: assert(0); @@ -164,29 +149,29 @@ bool PNGLoader::DoDecodeImage(const byte *FileDataPtr, uint FileSize, GraphicEn } else { // PNGs mit Interlacing werden an einem Stück eingelesen // Speicher für das komplette Bild reservieren - RawDataBuffer = new png_byte[png_get_rowbytes(png_ptr, info_ptr) * Height]; - if (!RawDataBuffer) { + rawDataBuffer = new png_byte[png_get_rowbytes(png_ptr, info_ptr) * height]; + if (!rawDataBuffer) { error("Could not allocate memory for raw image buffer."); } // Speicher für die Rowpointer reservieren - pRowPtr = new png_bytep[Height]; + pRowPtr = new png_bytep[height]; if (!pRowPtr) { error("Could not allocate memory for row pointers."); } // Alle Rowpointer mit den richtigen Offsets initialisieren - for (i = 0; i < Height; i++) - pRowPtr[i] = RawDataBuffer + i * png_get_rowbytes(png_ptr, info_ptr); + for (i = 0; i < height; i++) + pRowPtr[i] = rawDataBuffer + i * png_get_rowbytes(png_ptr, info_ptr); // Bild einlesen png_read_image(png_ptr, pRowPtr); // Bilddaten zeilenweise in das gewünschte Ausgabeformat konvertieren - switch (ColorFormat) { + switch (colorFormat) { case GraphicEngine::CF_ARGB32: - for (i = 0; i < Height; i++) - memcpy(&UncompressedDataPtr[i * Pitch], &RawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)], Pitch); + for (i = 0; i < height; i++) + memcpy(&uncompressedDataPtr[i * pitch], &rawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)], pitch); break; default: error("Unhandled case in DoDecodeImage"); @@ -202,24 +187,20 @@ bool PNGLoader::DoDecodeImage(const byte *FileDataPtr, uint FileSize, GraphicEn // Temporäre Buffer freigeben delete[] pRowPtr; - delete[] RawDataBuffer; + delete[] rawDataBuffer; // Der Funktionsaufruf war erfolgreich return true; } -// ----------------------------------------------------------------------------- - -bool PNGLoader::DecodeImage(const byte *FileDataPtr, uint FileSize, GraphicEngine::COLOR_FORMATS ColorFormat, byte *&UncompressedDataPtr, - int &Width, int &Height, int &Pitch) { - return DoDecodeImage(FileDataPtr, FileSize, ColorFormat, UncompressedDataPtr, Width, Height, Pitch); +bool PNGLoader::decodeImage(const byte *fileDataPtr, uint fileSize, GraphicEngine::COLOR_FORMATS colorFormat, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) { + return doDecodeImage(fileDataPtr, fileSize, colorFormat, uncompressedDataPtr, width, height, pitch); } -// ----------------------------------------------------------------------------- - -bool PNGLoader::DoImageProperties(const byte *FileDataPtr, uint FileSize, GraphicEngine::COLOR_FORMATS &ColorFormat, int &Width, int &Height) { +bool PNGLoader::doImageProperties(const byte *fileDataPtr, uint fileSize, GraphicEngine::COLOR_FORMATS &colorFormat, int &width, int &height) { // PNG Signatur überprüfen - if (!DoIsCorrectImageFormat(FileDataPtr, FileSize)) return false; + if (!doIsCorrectImageFormat(fileDataPtr, fileSize)) + return false; png_structp png_ptr = NULL; png_infop info_ptr = NULL; @@ -236,22 +217,22 @@ bool PNGLoader::DoImageProperties(const byte *FileDataPtr, uint FileSize, Graphi } // Alternative Lesefunktion benutzen - const byte **ref = &FileDataPtr; + const byte **ref = &fileDataPtr; png_set_read_fn(png_ptr, (void *)ref, png_user_read_data); // PNG Header einlesen png_read_info(png_ptr, info_ptr); // PNG Informationen auslesen - int BitDepth; - int ColorType; - png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *)&Width, (png_uint_32 *)&Height, &BitDepth, &ColorType, NULL, NULL, NULL); + int bitDepth; + int colorType; + png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *)&width, (png_uint_32 *)&height, &bitDepth, &colorType, NULL, NULL, NULL); // PNG-ColorType in BS ColorFormat konvertieren. - if (ColorType & PNG_COLOR_MASK_ALPHA || png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) - ColorFormat = GraphicEngine::CF_ARGB32; + if (colorType & PNG_COLOR_MASK_ALPHA || png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) + colorFormat = GraphicEngine::CF_ARGB32; else - ColorFormat = GraphicEngine::CF_RGB24; + colorFormat = GraphicEngine::CF_RGB24; // Die Strukturen freigeben png_destroy_read_struct(&png_ptr, &info_ptr, NULL); @@ -260,27 +241,19 @@ bool PNGLoader::DoImageProperties(const byte *FileDataPtr, uint FileSize, Graphi } -// ----------------------------------------------------------------------------- - -bool PNGLoader::ImageProperties(const byte *FileDataPtr, uint FileSize, GraphicEngine::COLOR_FORMATS &ColorFormat, int &Width, int &Height) { - return DoImageProperties(FileDataPtr, FileSize, ColorFormat, Width, Height); +bool PNGLoader::imageProperties(const byte *fileDataPtr, uint fileSize, GraphicEngine::COLOR_FORMATS &colorFormat, int &width, int &height) { + return doImageProperties(fileDataPtr, fileSize, colorFormat, width, height); } -// ----------------------------------------------------------------------------- -// Header überprüfen -// ----------------------------------------------------------------------------- - -bool PNGLoader::DoIsCorrectImageFormat(const byte *FileDataPtr, uint FileSize) { - if (FileSize > 8) - return png_check_sig(const_cast<byte *>(FileDataPtr), 8) ? true : false; +bool PNGLoader::doIsCorrectImageFormat(const byte *fileDataPtr, uint fileSize) { + if (fileSize > 8) + return png_check_sig(const_cast<byte *>(fileDataPtr), 8) ? true : false; else return false; } -// ----------------------------------------------------------------------------- - -bool PNGLoader::IsCorrectImageFormat(const byte *FileDataPtr, uint FileSize) { - return DoIsCorrectImageFormat(FileDataPtr, FileSize); +bool PNGLoader::isCorrectImageFormat(const byte *fileDataPtr, uint fileSize) { + return doIsCorrectImageFormat(fileDataPtr, fileSize); } } // End of namespace Sword25 |