00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _FL_IMAGE_CACHE_H_
00023 #define _FL_IMAGE_CACHE_H_
00024
00025 #include "Fl_Image.h"
00026 #include "Fl_Ptr_List.h"
00027
00029 class Fl_Image_Cache
00030 {
00031 typedef struct {
00032 Fl_Image *image;
00033 char *identify;
00034 } CachedImage;
00035
00036 Fl_Ptr_List images;
00037 uint size_;
00038 bool autodelete_;
00039
00040 public:
00041
00042 Fl_Image_Cache(int size=0) { size_ = size; autodelete_ = false; }
00043 ~Fl_Image_Cache() { clear(); }
00044
00045
00046 void clear() {
00047 for(uint n=0; n<images.size(); n++) {
00048 CachedImage *i = (CachedImage *)images[n];
00049 if(i->identify) delete []i->identify;
00050 if(i->image && autodelete_) delete i->image;
00051 delete i;
00052 }
00053 images.clear();
00054 }
00055 Fl_Image *get(const char *identify) {
00056 for(uint n=0; n<images.size(); n++) {
00057 CachedImage *i = (CachedImage *)images[n];
00058 if(!strcmp(identify, i->identify)) return i->image;
00059 }
00060 return 0;
00061 }
00062
00063
00064 Fl_Image *remove(const char *identify) {
00065 for(uint n=0; n<images.size(); n++) {
00066 CachedImage *i = (CachedImage *)images[n];
00067 if(!strcmp(identify, i->identify)) {
00068 images.remove(i);
00069 if(i->identify) delete []i->identify;
00070 Fl_Image *tmp = i->image;
00071 delete i;
00072 return tmp;
00073 }
00074 }
00075 return 0;
00076 }
00077
00078
00079 Fl_Image *add(Fl_Image *i, const char *identify) {
00080 if(!i) return 0;
00081
00082 CachedImage *c;
00083
00084 for(uint n=0; n<images.size(); n++) {
00085 c = (CachedImage *)images[n];
00086 if(!strcmp(identify, c->identify)) {
00087 if(c->identify) delete []c->identify;
00088 c->identify = strdup(identify);
00089 Fl_Image *tmp = c->image;
00090 c->image = i;
00091 return tmp;
00092 }
00093 }
00094
00095 c = new CachedImage;
00096 c->image = i;
00097 c->identify = strdup(identify);
00098
00099 images.append(c);
00100 check_size();
00101
00102 return 0;
00103 }
00104
00105
00106 void check_size() {
00107 if(size_>0 && images.count() > size_) {
00108 CachedImage *i = (CachedImage *)images[0];
00109 images.remove(i);
00110 if(i->identify) delete []i->identify;
00111 if(i->image && autodelete_) delete i->image;
00112 delete i;
00113 }
00114 }
00115
00116 bool autodelete() { return autodelete_; }
00117 void autodelete(bool val) { autodelete_ = val; }
00118 int size() { return size_; }
00119 void size(int s) { size_ = s; check_size(); }
00120 int cached() { return images.count(); }
00121 };
00122
00123 #endif