Browse Source

Fixed love.graphics.newScreenshot to always read from the main framebuffer, even when a canvas is bound

Alex Szpakowski 12 years ago
parent
commit
ac094f9437
1 changed files with 16 additions and 2 deletions
  1. 16 2
      src/modules/graphics/opengl/Graphics.cpp

+ 16 - 2
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;
 }