From fcfd53aed1c73b7730e0e666485c5130309d4914 Mon Sep 17 00:00:00 2001 From: sapier Date: Thu, 12 Jun 2014 22:41:57 +0200 Subject: Don't keep temporary images in RAM --- src/tile.cpp | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/tile.cpp b/src/tile.cpp index 310630b84..c9a36918a 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -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: \""< dim = ti->img->getDimension(); - - baseimg = driver->createImage(video::ECF_A8R8G8B8, dim); + core::dimension2d dim = ti->texture->getSize(); - ti->img->copyTo( - baseimg, // target - v2s32(0,0), // position in target - core::rect(v2s32(0,0), dim) // from - ); + baseimg = driver->createImage(ti->texture,v2s32(0,0), dim); /*infostream<<"getTextureIdDirect(): Loaded \"" <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 \"" <