mirror of
https://github.com/love2d/love.git
synced 2026-08-16 08:11:02 +02:00
Add sync and async texture and buffer readback APIs.
- Add imagedata = love.graphics.readbackTexture(texture, [slice, mipmap, x, y, w, h, [dest, destx, desty]]). - Add readback = love.graphics.readbackTextureAsync(texture, [slice, mipmap, x, y, w, h, [dest, destx, desty]]). - Add bytedata = love.graphics.readbackBuffer(buffer, [offset, size, [dest, destoffset]]). - Add readback = ove.graphics.readbackBufferAsync(buffer, [offset, size, [dest, destoffset]]). - Deprecate Texture:newImageData. The async variants return a new GraphicsReadback object. It has the following methods: - isComplete() - hasError() - wait() - getBufferData() - getImageData() - update() (called automatically every frame by love, not normally needed). Support notes: - readbackBuffer and readbackBufferAsync require buffer copying support. - readbackTexture with a render target (canvas) is always supported. readbackTexture with a non-render-target requires copy-texture-to-buffer support. - readbackTextureAsync with a render target requires copy-render-target-to-buffer support. readbackTextureAsync with a non-render-target requires copy-texture-to-buffer support.
This commit is contained in:
@@ -385,16 +385,15 @@ int w_Texture_replacePixels(lua_State *L)
|
||||
|
||||
int w_Texture_newImageData(lua_State *L)
|
||||
{
|
||||
luax_markdeprecated(L, 1, "Texture:newImageData", API_METHOD, DEPRECATED_RENAMED, "love.graphics.readbackTexture");
|
||||
|
||||
Texture *t = luax_checktexture(L, 1);
|
||||
love::image::Image *image = luax_getmodule<love::image::Image>(L, love::image::Image::type);
|
||||
|
||||
int slice = 0;
|
||||
int mipmap = 0;
|
||||
|
||||
if (t->getTextureType() != TEXTURE_2D)
|
||||
slice = (int) luaL_checkinteger(L, 2) - 1;
|
||||
|
||||
mipmap = (int) luaL_optinteger(L, 3, 1) - 1;
|
||||
int mipmap = (int) luaL_optinteger(L, 3, 1) - 1;
|
||||
|
||||
Rect rect = {0, 0, t->getPixelWidth(mipmap), t->getPixelHeight(mipmap)};
|
||||
if (!lua_isnoneornil(L, 4))
|
||||
@@ -405,8 +404,12 @@ int w_Texture_newImageData(lua_State *L)
|
||||
rect.h = (int) luaL_checkinteger(L, 7);
|
||||
}
|
||||
|
||||
auto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);
|
||||
if (gfx == nullptr)
|
||||
return luaL_error(L, "Cannot find Graphics module.");
|
||||
|
||||
love::image::ImageData *img = nullptr;
|
||||
luax_catchexcept(L, [&](){ img = t->newImageData(image, slice, mipmap, rect); });
|
||||
luax_catchexcept(L, [&](){ img = gfx->readbackTexture(t, slice, mipmap, rect, nullptr, 0, 0); });
|
||||
|
||||
luax_pushtype(L, img);
|
||||
img->release();
|
||||
@@ -501,8 +504,11 @@ const luaL_Reg w_Texture_functions[] =
|
||||
{ "setDepthSampleMode", w_Texture_setDepthSampleMode },
|
||||
{ "generateMipmaps", w_Texture_generateMipmaps },
|
||||
{ "replacePixels", w_Texture_replacePixels },
|
||||
{ "newImageData", w_Texture_newImageData },
|
||||
{ "renderTo", w_Texture_renderTo },
|
||||
|
||||
// Deprecated
|
||||
{ "newImageData", w_Texture_newImageData },
|
||||
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user