diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index d5d3315dd..e21004d4f 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/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() diff --git a/src/modules/image/devil/ImageData.h b/src/modules/image/devil/ImageData.h index c8caa7ca6..bf34d97a1 100644 --- a/src/modules/image/devil/ImageData.h +++ b/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 -#include - -// DevIL -#include - -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 +#include + +// DevIL +#include + +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 \ No newline at end of file