]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/tile.cpp
Install menu textures of minetest_game
[dragonfireclient.git] / src / tile.cpp
index aea9665f5eb69ca3568c12447538a81e7a1b8771..5f25e123bdd21556029e407cd81304a7e3cbee91 100644 (file)
@@ -77,7 +77,7 @@ static bool replace_ext(std::string &path, const char *ext)
 
        If failed, return "".
 */
-static std::string getImagePath(std::string path)
+std::string getImagePath(std::string path)
 {
        // A NULL-ended list of possible image extensions
        const char *extensions[] = {
@@ -201,6 +201,13 @@ struct SourceAtlasPointer
 class SourceImageCache
 {
 public:
+       ~SourceImageCache() {
+               for(std::map<std::string, video::IImage*>::iterator iter = m_images.begin();
+                               iter != m_images.end(); iter++) {
+                       iter->second->drop();
+               }
+               m_images.clear();
+       }
        void insert(const std::string &name, video::IImage *img,
                        bool prefer_local, video::IVideoDriver *driver)
        {
@@ -209,23 +216,28 @@ class SourceImageCache
                std::map<std::string, video::IImage*>::iterator n;
                n = m_images.find(name);
                if(n != m_images.end()){
-                       video::IImage *oldimg = n->second;
-                       if(oldimg)
-                               oldimg->drop();
+                       if(n->second)
+                               n->second->drop();
                }
+
+               video::IImage* toadd = img;
+               bool need_to_grab = true;
+
                // Try to use local texture instead if asked to
                if(prefer_local){
                        std::string path = getTexturePath(name.c_str());
                        if(path != ""){
                                video::IImage *img2 = driver->createImageFromFile(path.c_str());
                                if(img2){
-                                       m_images[name] = img2;
-                                       return;
+                                       toadd = img2;
+                                       need_to_grab = false;
                                }
                        }
                }
-               img->grab();
-               m_images[name] = img;
+
+               if (need_to_grab)
+                       toadd->grab();
+               m_images[name] = toadd;
        }
        video::IImage* get(const std::string &name)
        {
@@ -254,8 +266,7 @@ class SourceImageCache
                infostream<<"SourceImageCache::getOrLoad(): Loading path \""<<path
                                <<"\""<<std::endl;
                video::IImage *img = driver->createImageFromFile(path.c_str());
-               // Even if could not be loaded, put as NULL
-               //m_images[name] = img;
+
                if(img){
                        m_images[name] = img;
                        img->grab(); // Grab for caller
@@ -274,7 +285,7 @@ class TextureSource : public IWritableTextureSource
 {
 public:
        TextureSource(IrrlichtDevice *device);
-       ~TextureSource();
+       virtual ~TextureSource();
 
        /*
                Example case:
@@ -454,6 +465,28 @@ TextureSource::TextureSource(IrrlichtDevice *device):
 
 TextureSource::~TextureSource()
 {
+       video::IVideoDriver* driver = m_device->getVideoDriver();
+
+       unsigned int textures_before = driver->getTextureCount();
+
+       for (std::vector<SourceAtlasPointer>::iterator iter =
+                       m_atlaspointer_cache.begin();  iter != m_atlaspointer_cache.end();
+                       iter++)
+       {
+               video::ITexture *t = driver->getTexture(iter->name.c_str());
+
+               //cleanup texture
+               if (t)
+                       driver->removeTexture(t);
+
+               //cleanup source image
+               if (iter->atlas_img)
+                       iter->atlas_img->drop();
+       }
+       m_atlaspointer_cache.clear();
+
+       infostream << "~TextureSource() "<< textures_before << "/"
+                       << driver->getTextureCount() << std::endl;
 }
 
 u32 TextureSource::getTextureId(const std::string &name)
@@ -826,7 +859,7 @@ void TextureSource::rebuildImagesAndTextures()
                video::ITexture *t = NULL;
                if(img)
                        t = driver->addTexture(sap->name.c_str(), img);
-               
+               video::ITexture *t_old = sap->a.atlas;
                // Replace texture
                sap->a.atlas = t;
                sap->a.pos = v2f(0,0);
@@ -835,6 +868,9 @@ void TextureSource::rebuildImagesAndTextures()
                sap->atlas_img = img;
                sap->intpos = v2s32(0,0);
                sap->intsize = img->getDimension();
+
+               if (t_old != 0)
+                       driver->removeTexture(t_old);
        }
 }
 
@@ -1202,7 +1238,6 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg,
                        core::dimension2d<u32> dim = image->getDimension();
                        baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
                        image->copyTo(baseimg);
-                       image->drop();
                }
                // Else blit on base.
                else
@@ -1221,9 +1256,9 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg,
                                        video::SColor(255,255,255,255),
                                        NULL);*/
                        blit_with_alpha(image, baseimg, pos_from, pos_to, dim);
-                       // Drop image
-                       image->drop();
                }
+               //cleanup
+               image->drop();
        }
        else
        {
@@ -1627,6 +1662,9 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg,
                        video::IImage *image = driver->createImage(rtt, v2s32(0,0), dim);
                        assert(image);
 
+                       //cleanup texture
+                       driver->removeTexture(rtt);
+
                        baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
 
                        if(image)