X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fimageloader.cpp;h=2c6ce217381f4dcbf1f33bec50104eeee6c1987c;hb=2ebdf45974a0a7649b3488f9da4b8cf90a1db584;hp=fbba25cd75ae59ce6e194134caea9141e79a2177;hpb=917222bae696465f99024e0e15f73ba1058add44;p=libs%2Fgui.git diff --git a/source/graphics/imageloader.cpp b/source/graphics/imageloader.cpp index fbba25c..2c6ce21 100644 --- a/source/graphics/imageloader.cpp +++ b/source/graphics/imageloader.cpp @@ -1,6 +1,7 @@ #include #include #include +#include "bmploader.h" #include "imageloader.h" #ifdef WITH_LIBPNG #include "png/pngloader.h" @@ -20,10 +21,9 @@ using namespace std; namespace Msp { namespace Graphics { -bool ImageLoader::registered_loaders_changed = false; - ImageLoader::ImageLoader(): - source(0) + source(0), + state(INITIAL) { } ImageLoader::~ImageLoader() @@ -48,35 +48,22 @@ ImageLoader *ImageLoader::open_file(const string &fn) ImageLoader *ImageLoader::open_io(IO::Seekable &io) { -#ifdef WITH_LIBPNG - (void)RegisteredImageLoader::reg; -#endif -#ifdef WITH_LIBJPEG - (void)RegisteredImageLoader::reg; -#endif -#ifdef WITH_DEVIL - (void)RegisteredImageLoader::reg; -#endif -#ifdef WITH_QUARTZ - (void)RegisteredImageLoader::reg; -#endif - - list &loaders = get_registered_loaders(); - if(registered_loaders_changed) + Registry ®istry = get_registry(); + if(registry.changed) { - registered_loaders_changed = false; - loaders.sort(signature_size_compare); + registry.changed = false; + registry.loaders.sort(signature_size_compare); } - if(loaders.empty()) + if(registry.loaders.empty()) throw unsupported_image_format("no loaders"); - vector sig_buf(loaders.back()->get_signature_size()); + vector sig_buf(registry.loaders.back()->get_signature_size()); unsigned sig_len = io.read(&sig_buf[0], sig_buf.size()); string signature(sig_buf.begin(), sig_buf.end()); ImageLoader *loader = 0; - for(list::const_iterator i=loaders.begin(); (!loader && i!=loaders.end()); ++i) + for(list::const_iterator i=registry.loaders.begin(); (!loader && i!=registry.loaders.end()); ++i) if((*i)->detect(signature)) loader = (*i)->create(io); @@ -97,18 +84,37 @@ ImageLoader *ImageLoader::open_io(IO::Seekable &io) return loader; } - -ImageLoader::RegisterBase::RegisterBase() +void ImageLoader::load(Image::Data &data) { - get_registered_loaders().push_back(this); - registered_loaders_changed = true; -} + if(state>=FINISHED) + throw logic_error("already loaded"); + load_(data); + state = FINISHED; +} -list &ImageLoader::get_registered_loaders() +ImageLoader::Registry &ImageLoader::get_registry() { - static list regs; - return regs; + static Registry registry; + static bool initialized = false; + if(!initialized) + { + initialized = true; + register_loader(); +#ifdef WITH_LIBPNG + register_loader(); +#endif +#ifdef WITH_LIBJPEG + register_loader(); +#endif +#ifdef WITH_DEVIL + register_loader(); +#endif +#ifdef WITH_QUARTZ + register_loader(); +#endif + } + return registry; } bool ImageLoader::signature_size_compare(RegisterBase *r1, RegisterBase *r2) @@ -116,5 +122,16 @@ bool ImageLoader::signature_size_compare(RegisterBase *r1, RegisterBase *r2) return r1->get_signature_size()get_signature_size(); } + +ImageLoader::Registry::Registry(): + changed(false) +{ } + +ImageLoader::Registry::~Registry() +{ + for(list::iterator i=loaders.begin(); i!=loaders.end(); ++i) + delete *i; +} + } // namespace Graphics } // namespace Msp