]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/imageloader.h
Dirty hack to pull the image loaders in when linking statically
[libs/gui.git] / source / graphics / imageloader.h
index 06532753b3e535d152c84c6ad75abae80230167b..031ecb411667da36a505da084fad0ff2d66ba341 100644 (file)
@@ -23,20 +23,61 @@ public:
 
 class ImageLoader
 {
+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;
+       };
+
 private:
        IO::Base *source;
-protected:
 
+       static std::list<RegisterBase *> &get_registered_loaders();
+       static bool registered_loaders_changed;
+       static bool signature_size_compare(RegisterBase *, RegisterBase *);
+
+protected:
        ImageLoader();
 public:
        virtual ~ImageLoader();
 
        static ImageLoader *open_file(const std::string &);
-       static ImageLoader *open_io(IO::Base &);
+       static ImageLoader *open_io(IO::Seekable &);
 
        virtual void load(Image::Data &) = 0;
 };
 
+
+template<typename T>
+class RegisteredImageLoader: public ImageLoader
+{
+       friend class 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