92 lines
4.0 KiB
C++
92 lines
4.0 KiB
C++
/*
|
|
* Copyright (C) 2002,2003,2004,2005,2006 Daniel Heck
|
|
*
|
|
* 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 (at your option) 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, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
#ifndef GUI_LEVELPREVIEWCACHE_HH_INCLUDED
|
|
#define GUI_LEVELPREVIEWCACHE_HH_INCLUDED
|
|
|
|
#include "lev/Index.hh"
|
|
#include "lev/Proxy.hh"
|
|
#include <map>
|
|
|
|
namespace enigma { namespace gui {
|
|
/**
|
|
* A singleton manager for level previews with autocaching.
|
|
* Clients just need to know the level proxy to request a preview.
|
|
* <p>
|
|
* Previews will be loaded from levelpack bundles if provided. These
|
|
* preview files have the same name as the levels themself but the
|
|
* suffix ".png". They just sit aside the levels in the same directory
|
|
* or in the same zip archive. Only local stored previews will be looked
|
|
* for.<p>
|
|
* If no bundled preview exists the preview will be loaded from prior
|
|
* generated and saved instances. Previews will be looked up at the
|
|
* resourceFS with play time generated previews stored at the userImagePath
|
|
* and installation time generated previews at the system path. The previews
|
|
* will be stored at "data/thumbs" with a subpath that reflectes the level
|
|
* subpath with critical characters replaced for url and other special levels.
|
|
* The level release number is attached to the previewname as "#n" to allow
|
|
* different previews for different releases to exist in parallel.<p>
|
|
*
|
|
* If no stored preview exists a new one will be generated by loading the
|
|
* level. The preview will be stored to the userImagePath for future use.<p>
|
|
*
|
|
* All loaded previews will be autocached. Futher requests will be served
|
|
* by the cache. The cache will be autocleared when a change in the
|
|
* current Index is detected.<p>
|
|
*
|
|
* TODO remove unused preview on filesystem
|
|
* TODO autogenerate previews on install
|
|
*/
|
|
class LevelPreviewCache {
|
|
public:
|
|
static LevelPreviewCache *instance();
|
|
static void makeSystemPreview(lev::Proxy *levelProxy, std::string systemDataPath);
|
|
~LevelPreviewCache();
|
|
|
|
ecl::Surface *getPreview (lev::Proxy *levelProxy,
|
|
bool allowGeneration, bool &didGenerate);
|
|
ecl::Surface *updatePreview (lev::Proxy *levelProxy);
|
|
void clear();
|
|
protected:
|
|
LevelPreviewCache();
|
|
private:
|
|
static LevelPreviewCache *theSingleton;
|
|
|
|
/**
|
|
* A mapping of "levelId+levelRelease" to preview surfaces
|
|
*/
|
|
typedef std::map<std::string, ecl::Surface*> PreviewMap;
|
|
|
|
// ---------- Internal methods ----------
|
|
|
|
static ecl::Surface *newPreview (lev::Proxy *levelProxy);
|
|
std::string makePreviewPath(lev::Proxy *levelProxy);
|
|
void savePreview(lev::Proxy *levelProxy, ecl::Surface *s);
|
|
|
|
// ---------- Variables ----------
|
|
|
|
PreviewMap cache; // a second mapping to avoid searched on the filesystem
|
|
enigma::ImageCache imgCache; // the owner of the preview surfaces -
|
|
// cannot be used as mapping as this cache
|
|
// uses the filepath as index and autoloads
|
|
// files on "get"-access
|
|
lev::Index *cachedIndex; // the index that is currently cached
|
|
};
|
|
}} // namespace enigma::gui
|
|
#endif
|