소스 검색

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

Alex Szpakowski 12 년 전
부모
커밋
ac094f9437
1개의 변경된 파일16개의 추가작업 그리고 2개의 파일을 삭제
  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;
 }