]> git.tdb.fi Git - libs/gui.git/commitdiff
Add some state checking to ImageLoader
authorMikko Rasa <tdb@tdb.fi>
Sun, 7 Feb 2021 14:36:12 +0000 (16:36 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sun, 7 Feb 2021 14:37:13 +0000 (16:37 +0200)
Reject attemps to call load again on the same loader

12 files changed:
source/graphics/bmploader.cpp
source/graphics/bmploader.h
source/graphics/devil/devilloader.cpp
source/graphics/devil/devilloader.h
source/graphics/imageloader.cpp
source/graphics/imageloader.h
source/graphics/jpeg/jpegloader.cpp
source/graphics/jpeg/jpegloader.h
source/graphics/png/pngloader.cpp
source/graphics/png/pngloader.h
source/graphics/quartz/quartzloader.cpp
source/graphics/quartz/quartzloader.h

index f711dc1e8d66b2c50761ceab07ecdc72a97b8bf9..39629f714e776e3a8d1bfa954fe60007c1a3be3f 100644 (file)
@@ -44,7 +44,7 @@ bool BmpLoader::detect(const std::string &sig)
        return !sig.compare(0, sizeof(bmp_sig), bmp_sig, sizeof(bmp_sig));
 }
 
-void BmpLoader::load(Image::Data &data)
+void BmpLoader::load_(Image::Data &data)
 {
        char bm_header[14];
        read_full(io, bm_header+sig_bytes, sizeof(bm_header)-sig_bytes);
index 273e104407056300f29367c7343c5636a5c82c47..9ae8f4e7c21bbd0d7a8312281c539170e87ec52f 100644 (file)
@@ -18,7 +18,7 @@ public:
        static unsigned get_signature_size() { return 2; }
        static bool detect(const std::string &);
 
-       virtual void load(Image::Data &);
+       virtual void load_(Image::Data &);
 };
 
 } // namespace Graphics
index e837154ecc3ed4730ba4d469a7023c8ce0724418..423b108a5bf6ad13d960099c03070cfe2e30b96b 100644 (file)
@@ -101,7 +101,7 @@ bool DevilLoader::detect(const string &sig)
        return type!=IL_TYPE_UNKNOWN;
 }
 
-void DevilLoader::load(Image::Data &data)
+void DevilLoader::load_(Image::Data &data)
 {
        ilSetRead(0, 0, eof, get, read, seek, tell);
        ilBindImage(id);
index 42ac2b2559516acc1058a990134bd98c00314baf..3cba0d5a56f358c7b13a4832698798efe4051b89 100644 (file)
@@ -19,7 +19,7 @@ public:
        static unsigned get_signature_size() { return 128; }
        static bool detect(const std::string &);
 
-       virtual void load(Image::Data &);
+       virtual void load_(Image::Data &);
 };
 
 } // namespace Graphics
index b2a126e79df5de3f64864fc5942f6f51a13ffc5b..2c6ce217381f4dcbf1f33bec50104eeee6c1987c 100644 (file)
@@ -22,7 +22,8 @@ namespace Msp {
 namespace Graphics {
 
 ImageLoader::ImageLoader():
-       source(0)
+       source(0),
+       state(INITIAL)
 { }
 
 ImageLoader::~ImageLoader()
@@ -83,6 +84,15 @@ ImageLoader *ImageLoader::open_io(IO::Seekable &io)
        return loader;
 }
 
+void ImageLoader::load(Image::Data &data)
+{
+       if(state>=FINISHED)
+               throw logic_error("already loaded");
+
+       load_(data);
+       state = FINISHED;
+}
+
 ImageLoader::Registry &ImageLoader::get_registry()
 {
        static Registry registry;
index 9dc17269ef7d8054224492ad792795f0ad133afd..cb3f54ac204f303afe23e5bfc30b111ece28f33a 100644 (file)
@@ -23,6 +23,13 @@ public:
 
 class ImageLoader
 {
+public:
+       enum State
+       {
+               INITIAL,
+               FINISHED
+       };
+
 protected:
        class RegisterBase
        {
@@ -56,6 +63,7 @@ protected:
 
 private:
        IO::Base *source;
+       State state;
 
 protected:
        ImageLoader();
@@ -65,7 +73,12 @@ public:
        static ImageLoader *open_file(const std::string &);
        static ImageLoader *open_io(IO::Seekable &);
 
-       virtual void load(Image::Data &) = 0;
+       virtual void load(Image::Data &);
+protected:
+       virtual void load_(Image::Data &) = 0;
+
+public:
+       State get_state() const { return state; }
 
        template<typename T>
        static void register_loader();
index 9b7150d40eb4cb590710e3e881e535f7ed822d4a..f61f651d5db13104c6ec6e54c397d5d10929d3fc 100644 (file)
@@ -119,7 +119,7 @@ bool JpegLoader::detect(const string &sig)
        return !sig.compare(0, sizeof(jpeg_sig), jpeg_sig, sizeof(jpeg_sig));
 }
 
-void JpegLoader::load(Image::Data &data)
+void JpegLoader::load_(Image::Data &data)
 {
        if(setjmp(priv->err_mgr.jmp))
                throw bad_image_data(priv->err_mgr.message);
index 04e891791564c9786ee80e3dc52d55bc303872f8..bf902d64c5b9b90f0ef95d241c6f4a7f7e28efde 100644 (file)
@@ -20,7 +20,7 @@ public:
        static unsigned get_signature_size() { return 3; }
        static bool detect(const std::string &);
 
-       virtual void load(Image::Data &);
+       virtual void load_(Image::Data &);
 };
 
 } // namespace Graphics
index 537dcc190958ffd525443b2ef1af3de5ccd67cac..16ad36bbeb4bd3e7e53463d1ab056340e4a7dfe4 100644 (file)
@@ -54,7 +54,7 @@ bool PngLoader::detect(const std::string &sig)
        return !png_sig_cmp(reinterpret_cast<png_byte *>(const_cast<char*>(sig.data())), 0, sig.size());
 }
 
-void PngLoader::load(Image::Data &data)
+void PngLoader::load_(Image::Data &data)
 {
        png_byte **rows = 0;
 
index 6ed57cccc2ec07794159482157bfdd3ea4554a5a..21c1c72346d23c399dbb08b4a84686f4c0990f75 100644 (file)
@@ -20,7 +20,7 @@ public:
        static unsigned get_signature_size() { return 8; }
        static bool detect(const std::string &);
 
-       virtual void load(Image::Data &);
+       virtual void load_(Image::Data &);
 };
 
 } // namespace Graphics
index 5493e45bace18709d00084fbc69d4a5ab0a6e6ae..472e066f49665a64356cf1c50d93fba878589487 100644 (file)
@@ -81,7 +81,7 @@ bool QuartzLoader::detect(const string &sig)
        return status==kCGImageStatusIncomplete || status==kCGImageStatusReadingHeader;
 }
 
-void QuartzLoader::load(Image::Data &data)
+void QuartzLoader::load_(Image::Data &data)
 {
        CGImageRef image = CGImageSourceCreateImageAtIndex(priv->source, 0, 0);
        if(!image)
index 4885ff5209fa9c936728199503f5543bf4e1f729..cf4a4479968eb5622576b0dd48605b5977a05beb 100644 (file)
@@ -22,7 +22,7 @@ public:
        static unsigned get_signature_size() { return 12; }
        static bool detect(const std::string &);
 
-       virtual void load(Image::Data &);
+       virtual void load_(Image::Data &);
 };
 
 } // namespace Graphics