From ac094f94377e430a665557aa42ee90b7b76be987 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Wed, 22 May 2013 19:18:11 -0300 Subject: [PATCH] Fixed love.graphics.newScreenshot to always read from the main framebuffer, even when a canvas is bound --- src/modules/graphics/opengl/Graphics.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 26eda5fc8..00c5aef42 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -1173,8 +1173,14 @@ void Graphics::polygon(DrawMode mode, const float *coords, size_t count) love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool copyAlpha) { - int w = getRenderWidth(); - int h = getRenderHeight(); + // Temporarily unbind the currently active canvas (glReadPixels reads the + // active framebuffer, not the main one.) + Canvas *curcanvas = Canvas::current; + if (curcanvas) + Canvas::bindDefaultCanvas(); + + int w = getWidth(); + int h = getHeight(); int row = 4*w; @@ -1192,6 +1198,8 @@ love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool { delete[] pixels; delete[] screenshot; + if (curcanvas) + curcanvas->startGrab(curcanvas->getAttachedCanvases()); throw love::Exception("Out of memory."); } @@ -1221,11 +1229,17 @@ love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool catch (love::Exception &) { delete[] screenshot; + if (curcanvas) + curcanvas->startGrab(curcanvas->getAttachedCanvases()); throw; } delete[] screenshot; + // Re-bind the active canvas, if necessary. + if (curcanvas) + curcanvas->startGrab(curcanvas->getAttachedCanvases()); + return img; }