#ifndef CBITMAPCACHE_H
#define CBITMAPCACHE_H
#include <allegro\file.h>
#include <allegro\gfx.h>
#include <allegro\draw.h>
#include <allegro\datafile.h>
#include <allegro\color.h>
#include <map>
#include <string>
struct BITMAP;
class BitmapCache {
public:
static BITMAP* GetBitmap(std::string filename);
static BITMAP* GetBitmap(BITMAP* file);
static std::string GetBitmapFilename(BITMAP* file);
static BITMAP* GetBlankBitmap(int width, int height);
protected:
private:
static std::map<std::string, BITMAP*>* _pool;
static void CleanCache();
};
#endif
#include "CBitmapCache"CBitmapCache.h"h"
#include <algorithm>
std::map*map<std::string, BITMAP*>* BitmapCache::_pool = NULL;
BITMAP* BitmapCache::GetBitmap(std::string filename) {
//Return NULL if a bad filename was passed.
if(filename.empty()) return NULL;
if(exists(filename.c_str()) == false) return NULL;
//Reduce incorrect results by forcing slash equality.
filename = fix_filename_slashes(&filename[0]&filename[0]);
//Create pool on first use.
if(_pool == NULL) _pool = new std::mapmap<std::string, BITMAP*>();
//Clean the pool if it's dirty.
CleanCache();
//Search for requested BITMAP.
std::mapmap<std::string, BITMAP*>::iterator _iter = _pool->find>find(filename);
//If found, return it.
if(_iter != _pool->end>end()) return _iter->second;>second;
//Otherwise, create it, store it, then return it.
BITMAP* result = load_bmp(filename.c_str(), NULL);
if(result == NULL) return NULL;
_pool->insert>insert(std::pairpair<std::string, BITMAP*>(filename, result));
return result;
}
BITMAP* BitmapCache::GetBitmap(BITMAP* file) {
if(file == NULL) return NULL;
if(_pool == NULL) new std::mapmap<std::string, BITMAP*>();
CleanCache();
for(std::mapmap<std::string, BITMAP*>::iterator _iter = _pool->begin>begin(); _iter != _pool->end>end(); ++_iter) {
if(_iter->second>second != file) continue;
return _iter->second;>second;
}
return NULL;
}
std::string BitmapCache::GetBitmapFilename(BITMAP* file) {
if(file == NULL) return std::string("""");
if(_pool == NULL) return std::string("""");
CleanCache();
for(std::mapmap<std::string, BITMAP*>::iterator _iter = _pool->begin>begin(); _iter != _pool->end>end(); ++_iter) {
if(_iter->second>second != file) continue;
return _iter->first;>first;
}
return std::string("""");
}
BITMAP* BitmapCache::GetBlankBitmap(int width, int height) {
//Smallest allowed size is 1x1.
if(width < 1 || height < 1) return NULL;
//Create pool on first use.
if(_pool == NULL) _pool = new std::map<std::string, BITMAP*>();
//Cleans the cache.
CleanCache();
//Partial Sequential Search for requested BITMAP.
if(_pool->empty>empty() == false) {
for(std::mapmap<std::string, BITMAP*>::iterator _iter = _pool->begin>begin(); _iter != _pool->end>end(); ++_iter) {
//String keys sorted in ascending order.
//If key is not empty reached non-blank section.
if(_iter->first>first.empty() == false) break;
if(width == _iter->second>second->w>w &&&& height == _iter->second>second->h>h) {
return _iter->second;>second;
}
}
}
//Attempt to create bitmap, if failed, return NULL.
BITMAP* result = create_bitmap(width, height);
if(result == NULL) return NULL;
//Clear to black, store it, then return to caller.
clear_bitmap(result);
_pool->insert>insert(std::pairpair<std::string, BITMAP*>("""", result));
return result;
}
void BitmapCache::CleanCache() {
//Clean the pool of any NULL bitmaps that were deleted by caller.
for(std::mapmap<std::string, BITMAP*>::iterator _iter = _pool->begin>begin(); _iter != _pool->end>end(); ++_iter) {
if(_iter->second>second != NULL) continue;
_pool->erase>erase(_iter);
}
}