diff options
author | SmallJoker <SmallJoker@users.noreply.github.com> | 2022-05-04 20:55:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-04 20:55:13 +0200 |
commit | 3ce5a68cd12e45d7b618c49e205936fb140ecbfe (patch) | |
tree | 22e234febf709749b06056292ef6784fbcd28534 | |
parent | 0704ca055059088bdd53e15be672e6b5663b8f50 (diff) | |
download | minetest-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.
-rw-r--r-- | src/client/client.cpp | 2 | ||||
-rw-r--r-- | src/client/guiscalingfilter.cpp | 12 |
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(), |