summaryrefslogtreecommitdiff
path: root/src/resources/resourcemanager/resourcemanager.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/resources/resourcemanager/resourcemanager.h')
-rw-r--r--src/resources/resourcemanager/resourcemanager.h277
1 files changed, 277 insertions, 0 deletions
diff --git a/src/resources/resourcemanager/resourcemanager.h b/src/resources/resourcemanager/resourcemanager.h
new file mode 100644
index 000000000..2c2caabce
--- /dev/null
+++ b/src/resources/resourcemanager/resourcemanager.h
@@ -0,0 +1,277 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2016 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef RESOURCES_RESOURCEMANAGER_RESOURCEMANAGER_H
+#define RESOURCES_RESOURCEMANAGER_RESOURCEMANAGER_H
+
+#include "resources/memorycounter.h"
+
+#include "enums/simpletypes/append.h"
+
+#include "utils/stringvector.h"
+
+#include <map>
+#include <set>
+
+#include "localconsts.h"
+
+class Image;
+class ImageSet;
+class Map;
+class SDLMusic;
+class Resource;
+class SoundEffect;
+class SpriteDef;
+class WalkLayer;
+
+struct SDL_Surface;
+struct SDL_RWops;
+
+/**
+ * A class for loading and managing resources.
+ */
+class ResourceManager final : public MemoryCounter
+{
+ friend class Resource;
+
+ public:
+ typedef Resource *(*loader)(SDL_RWops *rw,
+ const std::string &name);
+ typedef Resource *(&generator)(const void *const data);
+
+ ResourceManager();
+
+ A_DELETE_COPY(ResourceManager)
+
+ /**
+ * Destructor. Cleans up remaining resources, warning about resources
+ * that were still referenced.
+ */
+ ~ResourceManager();
+
+ /**
+ * Sets the write directory.
+ *
+ * @param path The path of the directory to be added.
+ * @return <code>true</code> on success, <code>false</code> otherwise.
+ */
+ bool setWriteDir(const std::string &path) const;
+
+ /**
+ * Adds a directory or archive to the search path. If append is true
+ * then the directory is added to the end of the search path, otherwise
+ * it is added at the front.
+ *
+ * @return <code>true</code> on success, <code>false</code> otherwise.
+ */
+ bool addToSearchPath(const std::string &path,
+ const Append append) const;
+
+ /**
+ * Remove a directory or archive from the search path.
+ *
+ * @return <code>true</code> on success, <code>false</code> otherwise.
+ */
+ bool removeFromSearchPath(const std::string &path) const;
+
+ /**
+ * Searches for zip files and adds them to the search path.
+ */
+ void searchAndAddArchives(const std::string &restrict path,
+ const std::string &restrict ext,
+ const Append append) const;
+
+ /**
+ * Searches for zip files and remove them from the search path.
+ */
+ void searchAndRemoveArchives(const std::string &restrict path,
+ const std::string &restrict ext) const;
+
+ /**
+ * Creates a resource and adds it to the resource map.
+ *
+ * @param idPath The resource identifier path.
+ * @param fun A function for generating the resource.
+ * @param data Extra parameters for the generator.
+ * @return A valid resource or <code>NULL</code> if the resource could
+ * not be generated.
+ */
+ Resource *get(const std::string &idPath,
+ generator fun,
+ const void *const data) A_WARN_UNUSED;
+
+ Resource *getFromCache(const std::string &idPath) A_WARN_UNUSED;
+
+ Resource *getFromCache(const std::string &filename,
+ const int variant) A_WARN_UNUSED;
+
+ /**
+ * Adds a preformatted resource to the resource map.
+ *
+ * @param path The file name.
+ * @param Resource The Resource to add.
+ * @return true if successfull, false otherwise.
+ */
+ bool addResource(const std::string &idPath, Resource *const resource);
+
+ /**
+ * Convenience wrapper around ResourceManager::get for loading
+ * images.
+ */
+ Image *getImage(const std::string &idPath) A_WARN_UNUSED;
+
+ /**
+ * Convenience wrapper around ResourceManager::get for loading
+ * songs.
+ */
+ SDLMusic *getMusic(const std::string &idPath) A_WARN_UNUSED;
+
+ /**
+ * Convenience wrapper around ResourceManager::get for loading
+ * samples.
+ */
+ SoundEffect *getSoundEffect(const std::string &idPath) A_WARN_UNUSED;
+
+ /**
+ * Creates a image set based on the image referenced by the given
+ * path and the supplied sprite sizes
+ */
+ ImageSet *getImageSet(const std::string &imagePath,
+ const int w, const int h) A_WARN_UNUSED;
+
+ ImageSet *getSubImageSet(Image *const parent,
+ const int width,
+ const int height) A_WARN_UNUSED;
+
+ Image *getSubImage(Image *const parent, const int x, const int y,
+ const int width, const int height) A_WARN_UNUSED;
+
+#ifdef USE_OPENGL
+ Resource *getAtlas(const std::string &name,
+ const StringVect &files) A_WARN_UNUSED;
+
+ Resource *getShader(const unsigned int type,
+ const std::string &name) A_WARN_UNUSED;
+
+ Resource *getShaderProgram(const std::string &vertex,
+ const std::string &fragment,
+ const bool isNewShader) A_WARN_UNUSED;
+#endif
+
+ WalkLayer *getWalkLayer(const std::string &name, Map *const map);
+
+ /**
+ * Creates a sprite definition based on a given path and the supplied
+ * variant.
+ */
+ SpriteDef *getSprite(const std::string &path,
+ const int variant = 0) A_WARN_UNUSED;
+
+ /**
+ * Releases a resource, placing it in the set of orphaned resources.
+ */
+ void release(Resource *const res);
+
+ void clearDeleted(const bool full = true);
+
+ void decRefDelete(Resource *const res);
+
+ /**
+ * Move resource to deleted resources list.
+ */
+ void moveToDeleted(Resource *const res);
+
+ Image *getRescaled(const Image *const image,
+ const int width,
+ const int height) A_WARN_UNUSED;
+
+ /**
+ * Loads the given filename as an SDL surface. The returned surface is
+ * expected to be freed by the caller using SDL_FreeSurface.
+ */
+ SDL_Surface *loadSDLSurface(const std::string &filename)
+ const A_WARN_UNUSED;
+
+ void scheduleDelete(SDL_Surface *const surface);
+
+ void clearScheduled();
+
+ /**
+ * Deletes the class instance if it exists.
+ */
+ static void deleteInstance();
+
+ int size() const A_WARN_UNUSED
+ { return CAST_S32(mResources.size()); }
+
+ typedef std::map<std::string, Resource*> Resources;
+ typedef Resources::iterator ResourceIterator;
+ typedef Resources::const_iterator ResourceCIterator;
+
+#ifdef DEBUG_DUMP_LEAKS
+ Resources* getResources() A_WARN_UNUSED
+ { return &mResources; }
+
+ Resources* getOrphanedResources() A_WARN_UNUSED
+ { return &mOrphanedResources; }
+#endif
+
+ bool cleanOrphans(const bool always = false);
+
+ void cleanProtected();
+
+ bool isInCache(const std::string &idPath) const A_WARN_UNUSED;
+
+ Resource *getTempResource(const std::string &idPath) A_WARN_UNUSED;
+
+ void clearCache();
+
+ int calcMemoryLocal() const override final;
+
+ int calcMemoryChilds(const int level) const override final;
+
+ std::string getCounterName() const override final
+ { return "ResourceManager"; }
+
+ static void init();
+
+ private:
+ /**
+ * Deletes the resource after logging a cleanup message.
+ */
+ static void cleanUp(Resource *const resource);
+
+ static void logResource(const Resource *const res);
+
+ static ResourceManager *instance;
+ std::set<SDL_Surface*> deletedSurfaces;
+ Resources mResources;
+ Resources mOrphanedResources;
+ std::set<Resource*> mDeletedResources;
+ time_t mOldestOrphan;
+ bool mDestruction;
+ bool mUseLongLiveSprites;
+};
+
+extern ResourceManager *resourceManager;
+
+#endif // RESOURCES_RESOURCEMANAGER_RESOURCEMANAGER_H