]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/jpeg/jpegloader.cpp
Add some state checking to ImageLoader
[libs/gui.git] / source / graphics / jpeg / jpegloader.cpp
index 844446ca50b8b91c33bf16ca7c2a61a4fc9d17eb..f61f651d5db13104c6ec6e54c397d5d10929d3fc 100644 (file)
@@ -40,12 +40,12 @@ void init_source(j_decompress_ptr jpeg)
        src->bytes_in_buffer = 0;
 }
 
-int fill_input_buffer(j_decompress_ptr jpeg)
+boolean fill_input_buffer(j_decompress_ptr jpeg)
 {
        SourceManager *src = reinterpret_cast<SourceManager *>(jpeg->src);
        src->next_input_byte = src->buffer;
        src->bytes_in_buffer = src->io->read(reinterpret_cast<char *>(src->buffer), sizeof(src->buffer));
-       return true;
+       return TRUE;
 }
 
 void skip_input_data(j_decompress_ptr jpeg, long count)
@@ -91,6 +91,9 @@ JpegLoader::JpegLoader(IO::Seekable &io):
        priv->err_mgr.error_exit = &error_exit;
        priv->err_mgr.emit_message = &emit_message;
 
+       if(setjmp(priv->err_mgr.jmp))
+               throw runtime_error("error creating jpeg decompressor: "+priv->err_mgr.message);
+
        jpeg_create_decompress(&priv->jpeg);
 
        priv->jpeg.src = &priv->src_mgr;
@@ -110,18 +113,18 @@ JpegLoader::~JpegLoader()
 
 bool JpegLoader::detect(const string &sig)
 {
-       static const char jpeg_sig[] = "\xFF\xD8\xFF";
+       static const char jpeg_sig[] = { '\xFF', '\xD8', '\xFF' };
        if(sig.size()<sizeof(jpeg_sig))
                return false;
-       return !sig.compare(0, 3, jpeg_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);
 
-       jpeg_read_header(&priv->jpeg, true);
+       jpeg_read_header(&priv->jpeg, TRUE);
        priv->jpeg.out_color_space = JCS_RGB;
        jpeg_start_decompress(&priv->jpeg);
 
@@ -130,14 +133,14 @@ void JpegLoader::load(Image::Data &data)
        data.stride = priv->jpeg.output_width*priv->jpeg.output_components;
        data.fmt = RGB;
 
-       data.data = new char[data.stride*data.height];
+       data.pixels = new char[data.stride*data.height];
        JSAMPROW rows[8];
        while(priv->jpeg.output_scanline<data.height)
        {
                unsigned y = data.height-priv->jpeg.output_scanline;
                unsigned count = min(y, 8U);
                for(unsigned i=0; i<count; ++i)
-                       rows[i] = reinterpret_cast<JSAMPROW>(data.data+(y-i-1)*data.stride);
+                       rows[i] = reinterpret_cast<JSAMPROW>(data.pixels+(y-i-1)*data.stride);
                jpeg_read_scanlines(&priv->jpeg, rows, count);
        }