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; }