Browse Source

love.graphics.newScreenshot replaces alpha with full opacity by default (issue #374, thanks Boolsheet)
Some additional overhead was added to newScreenshot because it doesn't use glPixelTransfer (not supported in ES2 / core GL3+, and like all GL functions has the slight potential to be buggy on some drivers). This choice might be revisited in the future.

Alex Szpakowski 12 years ago
parent
commit
d39bb315af

+ 9 - 4
src/modules/graphics/opengl/Graphics.cpp

@@ -1070,7 +1070,7 @@ void Graphics::polygon(DrawMode mode, const float *coords, size_t count)
 	}
 }
 
-love::image::ImageData *Graphics::newScreenshot(love::image::Image *image)
+love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool copyAlpha)
 {
 	int w = getWidth();
 	int h = getHeight();
@@ -1084,16 +1084,21 @@ love::image::ImageData *Graphics::newScreenshot(love::image::Image *image)
 
 	glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
 
+	if (!copyAlpha)
+	{
+		// Replace alpha values with full opacity.
+		for (int i = 3; i < size; i += 4)
+			pixels[i] = 255;
+	}
+
 	// OpenGL sucks and reads pixels from the lower-left. Let's fix that.
 
 	GLubyte *src = pixels - row, *dst = screenshot + size;
 
 	for (int i = 0; i < h; ++i)
-	{
 		memcpy(dst-=row, src+=row, row);
-	}
 
-	love::image::ImageData *img = image->newImageData(w, h, (void *)screenshot);
+	love::image::ImageData *img = image->newImageData(w, h, (void *) screenshot);
 
 	delete [] pixels;
 	delete [] screenshot;

+ 2 - 1
src/modules/graphics/opengl/Graphics.h

@@ -461,8 +461,9 @@ public:
 	/**
 	 * Creates a screenshot of the view and saves it to the default folder.
 	 * @param image The love.image module.
+	 * @param copyAlpha If the alpha channel should be copied or set to full opacity (255).
 	 **/
-	love::image::ImageData *newScreenshot(love::image::Image *image);
+	love::image::ImageData *newScreenshot(love::image::Image *image, bool copyAlpha = true);
 
 	void push();
 	void pop();

+ 2 - 1
src/modules/graphics/opengl/wrap_Graphics.cpp

@@ -839,7 +839,8 @@ int w_getMaxPointSize(lua_State *L)
 int w_newScreenshot(lua_State *L)
 {
 	love::image::Image *image = luax_getmodule<love::image::Image>(L, "image", MODULE_IMAGE_T);
-	love::image::ImageData *i = instance->newScreenshot(image);
+	bool copyAlpha = luax_optboolean(L, 1, false);
+	love::image::ImageData *i = instance->newScreenshot(image, copyAlpha);
 	luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void *)i);
 	return 1;
 }