X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fimageloader.cpp;h=da897984449993b56e3163b5ffd8830da06e22a9;hb=d3bc6c9;hp=15f0e50f7e14b1142f2ce664f542d7f4fbcd7618;hpb=21b0c47700f1b570b6129384ce0b96a0c6b48ffd;p=libs%2Fgui.git diff --git a/source/graphics/imageloader.cpp b/source/graphics/imageloader.cpp index 15f0e50..da89798 100644 --- a/source/graphics/imageloader.cpp +++ b/source/graphics/imageloader.cpp @@ -1,15 +1,26 @@ #include #include #include +#include "bmploader.h" #include "imageloader.h" +#ifdef WITH_LIBPNG +#include "png/pngloader.h" +#endif +#ifdef WITH_LIBJPEG +#include "jpeg/jpegloader.h" +#endif +#ifdef WITH_DEVIL +#include "devil/devilloader.h" +#endif +#ifdef WITH_QUARTZ +#include "quartz/quartzloader.h" +#endif using namespace std; namespace Msp { namespace Graphics { -bool ImageLoader::registered_loaders_changed = false; - ImageLoader::ImageLoader(): source(0) { } @@ -36,19 +47,22 @@ ImageLoader *ImageLoader::open_file(const string &fn) ImageLoader *ImageLoader::open_io(IO::Seekable &io) { - 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); } - vector sig_buf(loaders.back()->get_signature_size()); + if(registry.loaders.empty()) + throw unsupported_image_format("no loaders"); + + 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); @@ -69,18 +83,34 @@ 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; + load_headers(data); + load_data(data); } - -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) @@ -88,5 +118,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