aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/gfx/image/pngloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sword25/gfx/image/pngloader.cpp')
-rw-r--r--engines/sword25/gfx/image/pngloader.cpp135
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