mirror of
https://github.com/love2d/love.git
synced 2026-08-13 17:10:54 +02:00
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.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user