[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