+#include "devilloader.h"
#include <algorithm>
+#include <msp/strings/format.h>
#include <IL/il.h>
-#include "devilloader.h"
using namespace std;
return reinterpret_cast<Msp::IO::Seekable *>(handle)->tell();
}
+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
return type!=IL_TYPE_UNKNOWN;
}
-void DevilLoader::load(Image::Data &data)
+void DevilLoader::load_headers_(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))
{
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];
- ILubyte *il_data = ilGetData();
- copy(il_data, il_data+data_size, data.data);
+ data.stride = data.width*ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL);
ilBindImage(0);
ilResetRead();
}
+void DevilLoader::load_pixels_(Image::Data &data)
+{
+ ilBindImage(id);
+
+ unsigned data_size = data.stride*data.height;
+ ILubyte *il_data = ilGetData();
+ copy(il_data, il_data+data_size, data.pixels);
+
+ ilBindImage(0);
+}
+
} // namespace Graphics
} // namespace Msp