[Scummvm-cvs-logs] SF.net SVN: scummvm:[53757] scummvm/trunk/engines/sword25/gfx/image/ pngloader.cpp
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Sun Oct 24 03:33:24 CEST 2010
Revision: 53757
http://scummvm.svn.sourceforge.net/scummvm/?rev=53757&view=rev
Author: fingolfin
Date: 2010-10-24 01:33:24 +0000 (Sun, 24 Oct 2010)
Log Message:
-----------
SWORD25: Simplify & optimize PNG reading code
The interlaced part is untested since I do not know any place
in the game where interlaced data is used.
Modified Paths:
--------------
scummvm/trunk/engines/sword25/gfx/image/pngloader.cpp
Modified: scummvm/trunk/engines/sword25/gfx/image/pngloader.cpp
===================================================================
--- scummvm/trunk/engines/sword25/gfx/image/pngloader.cpp 2010-10-24 01:32:52 UTC (rev 53756)
+++ scummvm/trunk/engines/sword25/gfx/image/pngloader.cpp 2010-10-24 01:33:24 UTC (rev 53757)
@@ -100,8 +100,6 @@
bool PNGLoader::doDecodeImage(const byte *fileDataPtr, uint fileSize, byte *&uncompressedDataPtr, int &width, int &height, int &pitch) {
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
- png_bytep rawDataBuffer = NULL;
- png_bytep *pRowPtr = NULL;
int bitDepth;
int colorType;
@@ -166,59 +164,39 @@
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);
- // PNGs ohne Interlacing werden Zeilenweise eingelesen
if (interlaceType == PNG_INTERLACE_NONE) {
- // Speicher f\xFCr eine Bildzeile reservieren
- 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\xFCnschte Zielformat konvertieren
+ // PNGs without interlacing can simply be read row by row.
for (i = 0; i < height; i++) {
- // Zeile einlesen
- png_read_row(png_ptr, rawDataBuffer, NULL);
-
- // Zeile konvertieren
- memcpy(&uncompressedDataPtr[i * pitch], rawDataBuffer, pitch);
+ png_read_row(png_ptr, uncompressedDataPtr + i * pitch, NULL);
}
} else {
- // PNGs mit Interlacing werden an einem St\xFCck eingelesen
- // Speicher f\xFCr das komplette Bild reservieren
- rawDataBuffer = new png_byte[png_get_rowbytes(png_ptr, info_ptr) * height];
- if (!rawDataBuffer) {
- error("Could not allocate memory for raw image buffer.");
- }
+ // PNGs with interlacing require us to allocate an auxillary
+ // buffer with pointers to all row starts.
- // Speicher f\xFCr die Rowpointer reservieren
- pRowPtr = new png_bytep[height];
+ // Allocate row pointer buffer
+ png_bytep *pRowPtr = new png_bytep[height];
if (!pRowPtr) {
error("Could not allocate memory for row pointers.");
}
- // Alle Rowpointer mit den richtigen Offsets initialisieren
+ // Initialize row pointers
for (i = 0; i < height; i++)
- pRowPtr[i] = rawDataBuffer + i * png_get_rowbytes(png_ptr, info_ptr);
+ pRowPtr[i] = uncompressedDataPtr + i * pitch;
- // Bild einlesen
+ // Read image data
png_read_image(png_ptr, pRowPtr);
- // Bilddaten zeilenweise in das gew\xFCnschte Ausgabeformat konvertieren
- for (i = 0; i < height; i++)
- memcpy(&uncompressedDataPtr[i * pitch], &rawDataBuffer[i * png_get_rowbytes(png_ptr, info_ptr)], pitch);
+ // Free row pointer buffer
+ delete[] pRowPtr;
}
- // Die zus\xE4tzlichen Daten am Ende des Bildes lesen
+ // Read additional data at the end.
png_read_end(png_ptr, NULL);
- // Die Strukturen freigeben
+ // Destroy libpng structures
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
- // Tempor\xE4re Buffer freigeben
- delete[] pRowPtr;
- delete[] rawDataBuffer;
-
- // Der Funktionsaufruf war erfolgreich
+ // Signal success
return true;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list