]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/devil/devilloader.cpp
Add some state checking to ImageLoader
[libs/gui.git] / source / graphics / devil / devilloader.cpp
index 88beb04802d47025c2995d886d227d3d6dc3d78d..423b108a5bf6ad13d960099c03070cfe2e30b96b 100644 (file)
@@ -1,4 +1,5 @@
 #include <algorithm>
+#include <msp/strings/format.h>
 #include <IL/il.h>
 #include "devilloader.h"
 
@@ -53,14 +54,26 @@ int tell(void *handle)
        return reinterpret_cast<Msp::IO::Seekable *>(handle)->tell();
 }
 
+std::string error_string(ILenum err)
+{
+       switch(err)
+       {
+       case IL_FORMAT_NOT_SUPPORTED: return "Format not supported";
+       case IL_INTERNAL_ERROR: return "DevIL internal error";
+       case IL_INVALID_FILE_HEADER: return "Invalid file header";
+       case IL_FILE_READ_ERROR: return "File read error";
+       case IL_LIB_PNG_ERROR: return "LibPNG error";
+       case IL_LIB_JPEG_ERROR: return "LibJPEG error";
+       default: return Msp::format("Unknown error (%04X)", err);
+       }
+}
+
 } // namespace
 
 
 namespace Msp {
 namespace Graphics {
 
-ImageLoader::Register<DevilLoader> DevilLoader::reg;
-
 DevilLoader::DevilLoader(IO::Seekable &i):
        io(i)
 {
@@ -88,11 +101,14 @@ 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);
-       ilLoadF(IL_TYPE_UNKNOWN, &io);
+
+       ilGetError();
+       if(!ilLoadF(IL_TYPE_UNKNOWN, &io))
+               throw bad_image_data(error_string(ilGetError()));
 
        switch(ilGetInteger(IL_IMAGE_FORMAT))
        {
@@ -108,10 +124,11 @@ void DevilLoader::load(Image::Data &data)
 
        data.width = ilGetInteger(IL_IMAGE_WIDTH);
        data.height = ilGetInteger(IL_IMAGE_HEIGHT);
-       unsigned data_size = data.width*data.height*ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL);
-       data.data = new char[data_size];
+       data.stride = data.width*ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL);
+       unsigned data_size = data.stride*data.height;
+       data.pixels = new char[data_size];
        ILubyte *il_data = ilGetData();
-       copy(il_data, il_data+data_size, data.data);
+       copy(il_data, il_data+data_size, data.pixels);
 
        ilBindImage(0);
        ilResetRead();