aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSmallJoker <SmallJoker@users.noreply.github.com>2022-05-04 20:55:13 +0200
committerGitHub <noreply@github.com>2022-05-04 20:55:13 +0200
commit3ce5a68cd12e45d7b618c49e205936fb140ecbfe (patch)
tree22e234febf709749b06056292ef6784fbcd28534 /src
parent0704ca055059088bdd53e15be672e6b5663b8f50 (diff)
downloadminetest-3ce5a68cd12e45d7b618c49e205936fb140ecbfe.tar.gz
minetest-3ce5a68cd12e45d7b618c49e205936fb140ecbfe.tar.bz2
minetest-3ce5a68cd12e45d7b618c49e205936fb140ecbfe.zip
guiScalingFilter: Fix most memory leaks (#12256)
Calls to the cache function ended up creating a new texture regardless whether the texture is already cached.
Diffstat (limited to 'src')
-rw-r--r--src/client/client.cpp2
-rw-r--r--src/client/guiscalingfilter.cpp12
2 files changed, 11 insertions, 3 deletions
diff --git a/src/client/client.cpp b/src/client/client.cpp
index 0a1fc73d1..cb556c1ce 100644
--- a/src/client/client.cpp
+++ b/src/client/client.cpp
@@ -334,6 +334,8 @@ Client::~Client()
// cleanup 3d model meshes on client shutdown
m_rendering_engine->cleanupMeshCache();
+ guiScalingCacheClear();
+
delete m_minimap;
m_minimap = nullptr;
diff --git a/src/client/guiscalingfilter.cpp b/src/client/guiscalingfilter.cpp
index 232219237..de122becf 100644
--- a/src/client/guiscalingfilter.cpp
+++ b/src/client/guiscalingfilter.cpp
@@ -43,6 +43,10 @@ void guiScalingCache(const io::path &key, video::IVideoDriver *driver, video::II
{
if (!g_settings->getBool("gui_scaling_filter"))
return;
+
+ if (g_imgCache.find(key) != g_imgCache.end())
+ return; // Already cached.
+
video::IImage *copied = driver->createImage(value->getColorFormat(),
value->getDimension());
value->copyTo(copied);
@@ -90,14 +94,16 @@ video::ITexture *guiScalingResizeCached(video::IVideoDriver *driver,
io::path scalename = origname + "@guiScalingFilter:" + rectstr;
// Search for existing scaled texture.
- video::ITexture *scaled = g_txrCache[scalename];
+ auto it_txr = g_txrCache.find(scalename);
+ video::ITexture *scaled = (it_txr != g_txrCache.end()) ? it_txr->second : nullptr;
if (scaled)
return scaled;
// Try to find the texture converted to an image in the cache.
// If the image was not found, try to extract it from the texture.
- video::IImage* srcimg = g_imgCache[origname];
- if (srcimg == NULL) {
+ auto it_img = g_imgCache.find(origname);
+ video::IImage *srcimg = (it_img != g_imgCache.end()) ? it_img->second : nullptr;
+ if (!srcimg) {
if (!g_settings->getBool("gui_scaling_filter_txr2img"))
return src;
srcimg = driver->createImageFromData(src->getColorFormat(),