Don't keep temporary images in RAM
authorsapier <Sapier at GMX dot net>
Thu, 12 Jun 2014 20:41:57 +0000 (22:41 +0200)
committersapier <Sapier at GMX dot net>
Sun, 22 Jun 2014 22:13:41 +0000 (00:13 +0200)
src/tile.cpp

index 310630b84a842a98b2e2802fe792ad8908eb1f76..c9a36918a3d46d941e1086f37f5fa8fcb3fd1899 100644 (file)
@@ -164,16 +164,13 @@ struct TextureInfo
 {
        std::string name;
        video::ITexture *texture;
-       video::IImage *img; // The source image
 
        TextureInfo(
                        const std::string &name_,
-                       video::ITexture *texture_=NULL,
-                       video::IImage *img_=NULL
+                       video::ITexture *texture_=NULL
                ):
                name(name_),
-               texture(texture_),
-               img(img_)
+               texture(texture_)
        {
        }
 };
@@ -460,10 +457,6 @@ TextureSource::~TextureSource()
                //cleanup texture
                if (iter->texture)
                        driver->removeTexture(iter->texture);
-
-               //cleanup source image
-               if (iter->img)
-                       iter->img->drop();
        }
        m_textureinfo_cache.clear();
 
@@ -666,23 +659,17 @@ u32 TextureSource::getTextureIdDirect(const std::string &name)
 
                TextureInfo *ti = &m_textureinfo_cache[base_image_id];
 
-               if(ti->img == NULL)
+               if(ti->texture == NULL)
                {
-                       infostream<<"getTextureIdDirect(): WARNING: NULL image in "
+                       infostream<<"getTextureIdDirect(): WARNING: NULL Texture in "
                                        <<"cache: \""<<base_image_name<<"\""
                                        <<std::endl;
                }
                else
                {
-                       core::dimension2d<u32> dim = ti->img->getDimension();
-
-                       baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
+                       core::dimension2d<u32> dim = ti->texture->getSize();
 
-                       ti->img->copyTo(
-                                       baseimg, // target
-                                       v2s32(0,0), // position in target
-                                       core::rect<s32>(v2s32(0,0), dim) // from
-                       );
+                       baseimg = driver->createImage(ti->texture,v2s32(0,0), dim);
 
                        /*infostream<<"getTextureIdDirect(): Loaded \""
                                        <<base_image_name<<"\" from image cache"
@@ -717,6 +704,7 @@ u32 TextureSource::getTextureIdDirect(const std::string &name)
        {
                // Create texture from resulting image
                t = driver->addTexture(name.c_str(), baseimg);
+               baseimg->drop();
        }
 
        /*
@@ -726,7 +714,7 @@ u32 TextureSource::getTextureIdDirect(const std::string &name)
        JMutexAutoLock lock(m_textureinfo_cache_mutex);
 
        u32 id = m_textureinfo_cache.size();
-       TextureInfo ti(name, t, baseimg);
+       TextureInfo ti(name, t);
        m_textureinfo_cache.push_back(ti);
        m_name_to_id[name] = id;
 
@@ -809,12 +797,13 @@ void TextureSource::rebuildImagesAndTextures()
                video::IImage *img = generateImageFromScratch(ti->name);
                // Create texture from resulting image
                video::ITexture *t = NULL;
-               if(img)
+               if(img) {
                        t = driver->addTexture(ti->name.c_str(), img);
+                       img->drop();
+               }
                video::ITexture *t_old = ti->texture;
                // Replace texture
                ti->texture = t;
-               ti->img = img;
 
                if (t_old != 0)
                        m_texture_trash.push_back(t_old);
@@ -975,7 +964,7 @@ bool TextureSource::generateImage(std::string part_of_name, video::IImage *& bas
 
                if (image == NULL) {
                        if (part_of_name != "") {
-                               if (part_of_name.find("_normal.png") == std::string::npos){                     
+                               if (part_of_name.find("_normal.png") == std::string::npos){
                                        errorstream<<"generateImage(): Could not load image \""
                                                <<part_of_name<<"\""<<" while building texture"<<std::endl;
                                        errorstream<<"generateImage(): Creating a dummy"