diff --git a/src/modules/graphics/wrap_Texture.cpp b/src/modules/graphics/wrap_Texture.cpp index b667c48b3..9c1515272 100644 --- a/src/modules/graphics/wrap_Texture.cpp +++ b/src/modules/graphics/wrap_Texture.cpp @@ -375,10 +375,17 @@ int w_Texture_generateMipmaps(lua_State *L) int w_Texture_replacePixels(lua_State *L) { Texture *t = luax_checktexture(L, 1); - love::image::ImageData *id = luax_checktype(L, 2); + + love::image::ImageData *id = nullptr; + love::image::CompressedImageData *cid = nullptr; + + if (luax_istype(L, 2, love::image::CompressedImageData::type)) + cid = luax_checktype(L, 2); + else + id = luax_checktype(L, 2); int slice = 0; - int mipmap = 0; + int dstmip = 0; int x = 0; int y = 0; bool reloadmipmaps = t->getMipmapsMode() == Texture::MIPMAPS_AUTO; @@ -386,7 +393,7 @@ int w_Texture_replacePixels(lua_State *L) if (t->getTextureType() != TEXTURE_2D) slice = (int) luaL_checkinteger(L, 3) - 1; - mipmap = (int) luaL_optinteger(L, 4, 1) - 1; + dstmip = (int) luaL_optinteger(L, 4, 1) - 1; if (!lua_isnoneornil(L, 5)) { @@ -397,7 +404,22 @@ int w_Texture_replacePixels(lua_State *L) reloadmipmaps = luax_optboolean(L, 7, reloadmipmaps); } - luax_catchexcept(L, [&](){ t->replacePixels(id, slice, mipmap, x, y, reloadmipmaps); }); + if (cid != nullptr) + { + int srcmip = 0; + + if (cid->getMipmapCount() > 1) + srcmip = (int) luaL_checkinteger(L, 8) - 1; + + if (srcmip < 0 || srcmip >= cid->getMipmapCount()) + return luaL_error(L, "Invalid source mipmap level."); + + luax_catchexcept(L, [&](){ t->replacePixels(cid->getSlice(0, srcmip), slice, dstmip, x, y, reloadmipmaps); }); + } + else + { + luax_catchexcept(L, [&](){ t->replacePixels(id, slice, dstmip, x, y, reloadmipmaps); }); + } return 0; }