X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fimageloader.h;h=031ecb411667da36a505da084fad0ff2d66ba341;hb=917222bae696465f99024e0e15f73ba1058add44;hp=06532753b3e535d152c84c6ad75abae80230167b;hpb=cfd3548464e6424fc9decf0539d6cd04b031ba10;p=libs%2Fgui.git diff --git a/source/graphics/imageloader.h b/source/graphics/imageloader.h index 0653275..031ecb4 100644 --- a/source/graphics/imageloader.h +++ b/source/graphics/imageloader.h @@ -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 &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 +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 RegisteredImageLoader::Register RegisteredImageLoader::reg; + } // namespace Graphics } // namespace Msp