}
}
+
+static void init_source (j_decompress_ptr cinfo) {}
+static boolean fill_input_buffer (j_decompress_ptr cinfo)
+{
+ ERREXIT(cinfo, JERR_INPUT_EMPTY);
+}
+static void skip_input_data (j_decompress_ptr cinfo, long num_bytes)
+{
+ struct jpeg_source_mgr* src = (struct jpeg_source_mgr*) cinfo->src;
+
+ if (num_bytes > 0)
+ {
+ src->next_input_byte += (size_t) num_bytes;
+ src->bytes_in_buffer -= (size_t) num_bytes;
+ }
+}
+static void term_source (j_decompress_ptr cinfo) {}
+static void set_mem_src (j_decompress_ptr cinfo, void* buffer, long nbytes)
+{
+ struct jpeg_source_mgr* src;
+
+ if (cinfo->src == NULL)
+ { /* first time for this JPEG object? */
+ cinfo->src = (struct jpeg_source_mgr *) (*cinfo->mem->alloc_small) (
+ (j_common_ptr) cinfo, JPOOL_PERMANENT,
+ sizeof(struct jpeg_source_mgr));
+ }
+
+ src = (struct jpeg_source_mgr*) cinfo->src;
+ src->init_source = init_source;
+ src->fill_input_buffer = fill_input_buffer;
+ src->skip_input_data = skip_input_data;
+ src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
+ src->term_source = term_source;
+ src->bytes_in_buffer = nbytes;
+ src->next_input_byte = (JOCTET*)buffer;
+}
+
+
static gboolean image_loader_jpeg_load (gpointer loader, const guchar *buf, gsize count, GError **error)
{
ImageLoaderJpeg *lj = (ImageLoaderJpeg *) loader;
jpeg_create_decompress(&cinfo);
- jpeg_mem_src(&cinfo, (unsigned char *)buf, count);
+ set_mem_src(&cinfo, (unsigned char *)buf, count);
jpeg_read_header(&cinfo, TRUE);
if (lj->stereo)
{
jpeg_create_decompress(&cinfo2);
- jpeg_mem_src(&cinfo2, stereo_buf2, stereo_length);
+ set_mem_src(&cinfo2, stereo_buf2, stereo_length);
jpeg_read_header(&cinfo2, TRUE);
if (cinfo.image_width != cinfo2.image_width ||