Commits

vrld committed 960861d

Fix issue #294: Canvas not working when not rendering to default render target.

  • Participants
  • Parent commits 9ca9e51

Comments (0)

Files changed (2)

File src/modules/graphics/opengl/Canvas.h

 		bool loadVolatile();
 		void unloadVolatile();
 
+		/// Unbind the current canvas on construction and rebind it upon destruction.
+		// Exception safe temporary unbinding/rebinding for techniques that require
+		// the default canvas to work (e.g. stencils).
+		// XXX: If a canvas is switched between creating and destroying an unbinder
+		//      object, the canvas will not be switched back.
+		struct TemporaryUnbinder
+		{
+			Canvas * canvas;
+			inline TemporaryUnbinder() : canvas(Canvas::current)
+			{
+				if (NULL != canvas)
+					Canvas::bindDefaultCanvas();
+			}
+
+			inline ~TemporaryUnbinder()
+			{
+				if (NULL != canvas && NULL == Canvas::current)
+					canvas->startGrab();
+			}
+		};
+
 	private:
 		friend class PixelEffect;
 		GLuint getTextureName() const { return img; }

File src/modules/graphics/opengl/wrap_Graphics.cpp

 #include <font/Rasterizer.h>
 
 #include <scripts/graphics.lua.h>
+#include <cassert>
 
 namespace love
 {
 
 	static int setStencil(lua_State * L, bool invert)
 	{
+		// stencils require the default fb to work properly
+		Canvas::TemporaryUnbinder unbinder;
+
 		// no argument -> clear mask
 		if (lua_isnoneornil(L, 1)) {
 			instance->discardStencil();