From 9cf40d7f535c2104fbbf6f7236ee2360f1aae17f Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Tue, 24 Apr 2012 13:18:45 -0300 Subject: [PATCH] fix repeated texture allocation bug --- src/framework/core/resourcemanager.cpp | 17 +++++++++-------- src/framework/core/resourcemanager.h | 2 +- src/framework/graphics/texturemanager.cpp | 14 +++++++++----- src/framework/graphics/texturemanager.h | 2 +- src/framework/otml/otmldocument.cpp | 2 +- 5 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/framework/core/resourcemanager.cpp b/src/framework/core/resourcemanager.cpp index 47de5dad..ce2a0daf 100644 --- a/src/framework/core/resourcemanager.cpp +++ b/src/framework/core/resourcemanager.cpp @@ -68,7 +68,7 @@ bool ResourceManager::addToSearchPath(const std::string& path, bool insertInFron void ResourceManager::searchAndAddPackages(const std::string& packagesDir, const std::string& packageExt, bool append) { - auto files = listDirectoryFiles(checkPath(packagesDir)); + auto files = listDirectoryFiles(resolvePath(packagesDir)); for(const std::string& file : files) { if(boost::ends_with(file, packageExt)) addToSearchPath(packagesDir + "/" + file, !append); @@ -77,17 +77,17 @@ void ResourceManager::searchAndAddPackages(const std::string& packagesDir, const bool ResourceManager::fileExists(const std::string& fileName) { - return (PHYSFS_exists(checkPath(fileName).c_str()) && !PHYSFS_isDirectory(checkPath(fileName).c_str())); + return (PHYSFS_exists(resolvePath(fileName).c_str()) && !PHYSFS_isDirectory(resolvePath(fileName).c_str())); } bool ResourceManager::directoryExists(const std::string& directoryName) { - return (PHYSFS_isDirectory(checkPath(directoryName).c_str())); + return (PHYSFS_isDirectory(resolvePath(directoryName).c_str())); } void ResourceManager::loadFile(const std::string& fileName, std::iostream& out) { - std::string fullPath = checkPath(fileName); + std::string fullPath = resolvePath(fileName); out.clear(std::ios::goodbit); PHYSFS_file* file = PHYSFS_openRead(fullPath.c_str()); if(!file) { @@ -144,7 +144,7 @@ bool ResourceManager::saveFile(const std::string& fileName, const std::string& d FileStreamPtr ResourceManager::openFile(const std::string& fileName) { - std::string fullPath = checkPath(fileName); + std::string fullPath = resolvePath(fileName); PHYSFS_File* file = PHYSFS_openRead(fullPath.c_str()); if(!file) { logTraceError("unable to open file '", fullPath, "': ", PHYSFS_getLastError()); @@ -175,13 +175,13 @@ FileStreamPtr ResourceManager::createFile(const std::string& fileName) bool ResourceManager::deleteFile(const std::string& fileName) { - return PHYSFS_delete(checkPath(fileName).c_str()) != 0; + return PHYSFS_delete(resolvePath(fileName).c_str()) != 0; } std::list ResourceManager::listDirectoryFiles(const std::string& directoryPath) { std::list files; - auto rc = PHYSFS_enumerateFiles(checkPath(directoryPath).c_str()); + auto rc = PHYSFS_enumerateFiles(resolvePath(directoryPath).c_str()); for(int i = 0; rc[i] != NULL; i++) files.push_back(rc[i]); @@ -190,7 +190,7 @@ std::list ResourceManager::listDirectoryFiles(const std::string& di return files; } -std::string ResourceManager::checkPath(const std::string& path) +std::string ResourceManager::resolvePath(const std::string& path) { std::string fullPath; if(boost::starts_with(path, "/")) @@ -203,6 +203,7 @@ std::string ResourceManager::checkPath(const std::string& path) } if(!(boost::starts_with(fullPath, "/"))) logTraceWarning("the following file path is not fully resolved: ", path); + boost::replace_all(fullPath, "//", "/"); return fullPath; } diff --git a/src/framework/core/resourcemanager.h b/src/framework/core/resourcemanager.h index 7edc81d5..dea54612 100644 --- a/src/framework/core/resourcemanager.h +++ b/src/framework/core/resourcemanager.h @@ -52,7 +52,7 @@ public: std::list listDirectoryFiles(const std::string& directoryPath = ""); - std::string checkPath(const std::string& path); + std::string resolvePath(const std::string& path); std::string getBaseDir(); }; diff --git a/src/framework/graphics/texturemanager.cpp b/src/framework/graphics/texturemanager.cpp index 633d3bc9..3eaf8480 100644 --- a/src/framework/graphics/texturemanager.cpp +++ b/src/framework/graphics/texturemanager.cpp @@ -29,12 +29,15 @@ TextureManager g_textures; -TexturePtr TextureManager::getTexture(const std::string& textureFile) +TexturePtr TextureManager::getTexture(const std::string& fileName) { TexturePtr texture; + // before must resolve filename to full path + std::string filePath = g_resources.resolvePath(fileName); + // check if the texture is already loaded - auto it = m_textures.find(textureFile); + auto it = m_textures.find(filePath); if(it != m_textures.end()) { if(it->second.expired()) m_textures.erase(it); @@ -46,17 +49,18 @@ TexturePtr TextureManager::getTexture(const std::string& textureFile) if(!texture) { try { // currently only png textures are supported - if(!boost::ends_with(textureFile, ".png")) + if(!boost::ends_with(filePath, ".png")) Fw::throwException("texture file format no supported"); // load texture file data std::stringstream fin; - g_resources.loadFile(textureFile, fin); + g_resources.loadFile(filePath, fin); texture = loadPNG(fin); } catch(Exception& e) { - logError("unable to load texture '", textureFile, "': ", e.what()); + logError("unable to load texture '", fileName, "': ", e.what()); texture = g_graphics.getEmptyTexture(); } + m_textures[filePath] = texture; } return texture; diff --git a/src/framework/graphics/texturemanager.h b/src/framework/graphics/texturemanager.h index fc838367..e2eb08fc 100644 --- a/src/framework/graphics/texturemanager.h +++ b/src/framework/graphics/texturemanager.h @@ -28,7 +28,7 @@ class TextureManager { public: - TexturePtr getTexture(const std::string& textureFile); + TexturePtr getTexture(const std::string& fileName); static TexturePtr loadPNG(std::stringstream& file); diff --git a/src/framework/otml/otmldocument.cpp b/src/framework/otml/otmldocument.cpp index b04d34a6..2235b949 100644 --- a/src/framework/otml/otmldocument.cpp +++ b/src/framework/otml/otmldocument.cpp @@ -36,7 +36,7 @@ OTMLDocumentPtr OTMLDocument::create() OTMLDocumentPtr OTMLDocument::parse(const std::string& fileName) { std::stringstream fin; - std::string source = g_resources.checkPath(fileName); + std::string source = g_resources.resolvePath(fileName); g_resources.loadFile(source, fin); return parse(fin, source); }