]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/imageloader.h
Add some state checking to ImageLoader
[libs/gui.git] / source / graphics / imageloader.h
index f953990c696458dffb587d0a3fd3889fe10b9975..cb3f54ac204f303afe23e5bfc30b111ece28f33a 100644 (file)
@@ -23,10 +23,49 @@ public:
 
 class ImageLoader
 {
+public:
+       enum State
+       {
+               INITIAL,
+               FINISHED
+       };
+
+protected:
+       class RegisterBase
+       {
+       protected:
+               RegisterBase() { }
+       public:
+               virtual ~RegisterBase() { }
+
+               virtual unsigned get_signature_size() const = 0;
+               virtual bool detect(const std::string &) const = 0;
+               virtual ImageLoader *create(IO::Seekable &) const = 0;
+       };
+
+       template<typename T>
+       class RegisteredLoader: public RegisterBase
+       {
+       public:
+               virtual unsigned get_signature_size() const { return T::get_signature_size(); }
+               virtual bool detect(const std::string &s) const { return T::detect(s); }
+               virtual ImageLoader *create(IO::Seekable &io) const { return new T(io); }
+       };
+
+       struct Registry
+       {
+               std::list<RegisterBase *> loaders;
+               bool changed;
+
+               Registry();
+               ~Registry();
+       };
+
 private:
        IO::Base *source;
-protected:
+       State state;
 
+protected:
        ImageLoader();
 public:
        virtual ~ImageLoader();
@@ -34,9 +73,29 @@ public:
        static ImageLoader *open_file(const std::string &);
        static ImageLoader *open_io(IO::Seekable &);
 
-       virtual void load(Image::Data &) = 0;
+       virtual void load(Image::Data &);
+protected:
+       virtual void load_(Image::Data &) = 0;
+
+public:
+       State get_state() const { return state; }
+
+       template<typename T>
+       static void register_loader();
+private:
+       static Registry &get_registry();
+
+       static bool signature_size_compare(RegisterBase *, RegisterBase *);
 };
 
+template<typename T>
+void ImageLoader::register_loader()
+{
+       Registry &registry = get_registry();
+       registry.loaders.push_back(new RegisteredLoader<T>);
+       registry.changed = true;
+}
+
 } // namespace Graphics
 } // namespace Msp