]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/imageloader.h
Register image loaders more explicitly
[libs/gui.git] / source / graphics / imageloader.h
index 031ecb411667da36a505da084fad0ff2d66ba341..f0b8d52c36412ec6cf3e9901d5b2a43c51aefdd6 100644 (file)
@@ -27,7 +27,7 @@ protected:
        class RegisterBase
        {
        protected:
-               RegisterBase();
+               RegisterBase() { }
        public:
                virtual ~RegisterBase() { }
 
@@ -36,13 +36,27 @@ protected:
                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;
 
-       static std::list<RegisterBase *> &get_registered_loaders();
-       static bool registered_loaders_changed;
-       static bool signature_size_compare(RegisterBase *, RegisterBase *);
-
 protected:
        ImageLoader();
 public:
@@ -51,32 +65,25 @@ public:
        static ImageLoader *open_file(const std::string &);
        static ImageLoader *open_io(IO::Seekable &);
 
-       virtual void load(Image::Data &) = 0;
-};
-
-
-template<typename T>
-class RegisteredImageLoader: public ImageLoader
-{
-       friend class ImageLoader;
+       virtual void load(Image::Data &);
+       virtual void load_headers(Image::Data &) { }
+       virtual void load_data(Image::Data &) { }
 
+       template<typename T>
+       static void register_loader();
 private:
-       class Register: 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); }
-       };
-
-       static Register reg;
+       static Registry &get_registry();
 
-protected:
-       RegisteredImageLoader() { (void)reg; }
+       static bool signature_size_compare(RegisterBase *, RegisterBase *);
 };
 
 template<typename T>
-typename RegisteredImageLoader<T>::Register RegisteredImageLoader<T>::reg;
+void ImageLoader::register_loader()
+{
+       Registry &registry = get_registry();
+       registry.loaders.push_back(new RegisteredLoader<T>);
+       registry.changed = true;
+}
 
 } // namespace Graphics
 } // namespace Msp