+void ImageLoader::load(Image::Data &data)
+{
+ if(state>=FINISHED)
+ throw logic_error("already loaded");
+
+ if(state<HEADERS_LOADED)
+ load_headers_(data);
+ if(!data.pixels)
+ data.pixels = data.owned_pixels = new char[data.stride*data.height];
+ load_pixels_(data);
+ state = FINISHED;
+}
+
+void ImageLoader::load_headers(Image::Data &data)
+{
+ if(state>=HEADERS_LOADED)
+ throw logic_error("headers already loaded");
+
+ load_headers_(data);
+ state = HEADERS_LOADED;
+}
+
+ImageLoader::Registry &ImageLoader::get_registry()
+{
+ static Registry registry;
+ static bool initialized = false;
+ if(!initialized)
+ {
+ initialized = true;
+ register_loader<BmpLoader>();
+#ifdef WITH_LIBPNG
+ register_loader<PngLoader>();
+#endif
+#ifdef WITH_LIBJPEG
+ register_loader<JpegLoader>();
+#endif
+#ifdef WITH_DEVIL
+ register_loader<DevilLoader>();
+#endif
+#ifdef WITH_QUARTZ
+ register_loader<QuartzLoader>();
+#endif
+ }
+ return registry;
+}
+
+bool ImageLoader::signature_size_compare(RegisterBase *r1, RegisterBase *r2)
+{
+ return r1->get_signature_size()<r2->get_signature_size();
+}
+
+
+ImageLoader::Registry::Registry():
+ changed(false)
+{ }
+
+ImageLoader::Registry::~Registry()
+{
+ for(list<RegisterBase *>::iterator i=loaders.begin(); i!=loaders.end(); ++i)
+ delete *i;
+}
+