Browse Source

Fixed up love.graphics.newScreenshot() to return a right-side up image without breaking abstraction layers.

bill@Ixion 16 years ago
parent
commit
4d2994e05f
2 changed files with 102 additions and 83 deletions
  1. 21 2
      src/modules/graphics/opengl/Graphics.cpp
  2. 81 81
      src/modules/image/devil/ImageData.h

+ 21 - 2
src/modules/graphics/opengl/Graphics.cpp

@@ -1178,10 +1178,29 @@ namespace opengl
 		int w = getWidth();
 		int h = getHeight();
 		
-		GLubyte * pixels = new GLubyte[4*w*h];
+		int row = 4*w;
+		
+		int size = row*h;
+		
+		GLubyte * pixels = new GLubyte[size];
+		GLubyte * screenshot = new GLubyte[size];
+		
 		glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+		
+		// OpenGL sucks and reads pixels from the lower-left. Let's fix that.
+		
+		GLubyte *src = pixels - row, *dst = screenshot + size;
+		
+		for (int i = 0; i < h; ++i) {
+			memcpy(dst-=row, src+=row, row);
+		}
 
-		return image->newImageData(w, h, (void*)pixels);
+		love::image::ImageData * img = image->newImageData(w, h, (void*)screenshot);
+		
+		delete [] pixels;
+		delete [] screenshot;
+		
+		return img;
 	}
 
 	void Graphics::push()

+ 81 - 81
src/modules/image/devil/ImageData.h

@@ -1,82 +1,82 @@
-/**
-* Copyright (c) 2006-2009 LOVE Development Team
-* 
-* This software is provided 'as-is', without any express or implied
-* warranty.  In no event will the authors be held liable for any damages
-* arising from the use of this software.
-* 
-* Permission is granted to anyone to use this software for any purpose,
-* including commercial applications, and to alter it and redistribute it
-* freely, subject to the following restrictions:
-* 
-* 1. The origin of this software must not be misrepresented; you must not
-*    claim that you wrote the original software. If you use this software
-*    in a product, an acknowledgment in the product documentation would be
-*    appreciated but is not required.
-* 2. Altered source versions must be plainly marked as such, and must not be
-*    misrepresented as being the original software.
-* 3. This notice may not be removed or altered from any source distribution.
-**/
-
-#ifndef LOVE_DEVIL_IMAGE_DATA_H
-#define LOVE_DEVIL_IMAGE_DATA_H
-
-// LOVE
-#include <filesystem/File.h>
-#include <image/ImageData.h>
-
-// DevIL
-#include <IL/il.h>
-
-namespace love
-{	
-namespace image
-{
-namespace devil
-{
-	class ImageData : public love::image::ImageData
-	{
-	private:
-
-		// The width of the image data.
-		int width;
-
-		// The height of the image data.
-		int height;
-
-		// The origin of the image.
-		int origin;
-
-		// The bits per pixel.
-		int bpp;
-
-		// DevIL image identifier.
-		ILuint image;
-
-		void load(Data * data);
-
-	public:
-
-		ImageData(Data * data);
-		ImageData(love::filesystem::File * file);
-		ImageData(int width, int height);
-		ImageData(int width, int height, void *data);
-		virtual ~ImageData();
-
-		// Implements Data.
-		void * getData() const;
-		int getSize() const;
-
-		// Implements ImageData.
-		int getWidth() const ;
-		int getHeight() const ;
-		void setPixel(int x, int y, pixel c);
-		pixel getPixel(int x, int y) const;
-
-	}; // ImageData
-
-} // devil
-} // image
-} // love
-
+/**
+* Copyright (c) 2006-2009 LOVE Development Team
+* 
+* This software is provided 'as-is', without any express or implied
+* warranty.  In no event will the authors be held liable for any damages
+* arising from the use of this software.
+* 
+* Permission is granted to anyone to use this software for any purpose,
+* including commercial applications, and to alter it and redistribute it
+* freely, subject to the following restrictions:
+* 
+* 1. The origin of this software must not be misrepresented; you must not
+*    claim that you wrote the original software. If you use this software
+*    in a product, an acknowledgment in the product documentation would be
+*    appreciated but is not required.
+* 2. Altered source versions must be plainly marked as such, and must not be
+*    misrepresented as being the original software.
+* 3. This notice may not be removed or altered from any source distribution.
+**/
+
+#ifndef LOVE_DEVIL_IMAGE_DATA_H
+#define LOVE_DEVIL_IMAGE_DATA_H
+
+// LOVE
+#include <filesystem/File.h>
+#include <image/ImageData.h>
+
+// DevIL
+#include <IL/il.h>
+
+namespace love
+{	
+namespace image
+{
+namespace devil
+{
+	class ImageData : public love::image::ImageData
+	{
+	private:
+
+		// The width of the image data.
+		int width;
+
+		// The height of the image data.
+		int height;
+
+		// The origin of the image.
+		int origin;
+
+		// The bits per pixel.
+		int bpp;
+
+		// DevIL image identifier.
+		ILuint image;
+
+		void load(Data * data);
+
+	public:
+
+		ImageData(Data * data);
+		ImageData(love::filesystem::File * file);
+		ImageData(int width, int height);
+		ImageData(int width, int height, void *data);
+		virtual ~ImageData();
+
+		// Implements Data.
+		void * getData() const;
+		int getSize() const;
+
+		// Implements ImageData.
+		int getWidth() const ;
+		int getHeight() const ;
+		void setPixel(int x, int y, pixel c);
+		pixel getPixel(int x, int y) const;
+
+	}; // ImageData
+
+} // devil
+} // image
+} // love
+
 #endif // LOVE_DEVIL_IMAGE_DATA_H