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)
}
else
{
- src->io->seek(count, Msp::IO::S_CUR);
+ src->io->seek(count-src->bytes_in_buffer, Msp::IO::S_CUR);
src->bytes_in_buffer = 0;
}
}
};
-ImageLoader::Register<JpegLoader> JpegLoader::reg;
-
JpegLoader::JpegLoader(IO::Seekable &io):
priv(new Private)
{
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;
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);
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);
}