X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fdevil%2Fdevilloader.cpp;h=a6693080748a001b87612615920e477e642b1018;hb=054fca09f0bbd64fdbd6406a0643de938a9cd4fb;hp=392bde8f8099b08422f359d19086abe695097039;hpb=8e403dbbcde6efee1862f6d501ce30a3e7ba81c4;p=libs%2Fgui.git diff --git a/source/graphics/devil/devilloader.cpp b/source/graphics/devil/devilloader.cpp index 392bde8..a669308 100644 --- a/source/graphics/devil/devilloader.cpp +++ b/source/graphics/devil/devilloader.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "devilloader.h" @@ -53,6 +54,20 @@ int tell(void *handle) return reinterpret_cast(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 @@ -86,11 +101,14 @@ bool DevilLoader::detect(const string &sig) 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)) { @@ -106,14 +124,23 @@ 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]; - 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; + data.pixels = new char[data_size]; + ILubyte *il_data = ilGetData(); + copy(il_data, il_data+data_size, data.pixels); + + ilBindImage(0); +} + } // namespace Graphics } // namespace Msp