]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/imageloader.h
Add a helper class for registering image loaders
[libs/gui.git] / source / graphics / imageloader.h
index c06a7592fcf75bc1cf9ea918ceae470424ad785d..85e6b5200479a3f2814403b4b2a532fd06d1723d 100644 (file)
@@ -23,7 +23,7 @@ public:
 
 class ImageLoader
 {
-private:
+protected:
        class RegisterBase
        {
        protected:
@@ -36,16 +36,6 @@ private:
                virtual ImageLoader *create(IO::Seekable &) const = 0;
        };
 
-protected:
-       template<typename T>
-       class Register: 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 T *create(IO::Seekable &io) const { return new T(io); }
-       };
-
 private:
        IO::Base *source;
 
@@ -64,6 +54,28 @@ public:
        virtual void load(Image::Data &) = 0;
 };
 
+
+template<typename T>
+class RegisteredImageLoader: public ImageLoader
+{
+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;
+
+protected:
+       RegisteredImageLoader() { (void)reg; }
+};
+
+template<typename T>
+typename RegisteredImageLoader<T>::Register RegisteredImageLoader<T>::reg;
+
 } // namespace Graphics
 } // namespace Msp