X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=blobdiff_plain;f=src%2Fimage_load_jpeg.c;h=4fbbd29fee0157000d7b7e8fa5482537fc1234d9;hp=0c3c3199ad360ac9615751293fee430b5122f865;hb=db38d12f83128e9890ce2d2c7acc5ad62062bc7e;hpb=e436ea53511e1dadab981af18b237fee83fde39b diff --git a/src/image_load_jpeg.c b/src/image_load_jpeg.c index 0c3c3199..4fbbd29f 100644 --- a/src/image_load_jpeg.c +++ b/src/image_load_jpeg.c @@ -55,16 +55,16 @@ struct _ImageLoaderJpeg { ImageLoaderBackendCbAreaUpdated area_updated_cb; ImageLoaderBackendCbSize size_cb; ImageLoaderBackendCbAreaPrepared area_prepared_cb; - + gpointer data; - + GdkPixbuf *pixbuf; guint requested_width; guint requested_height; - + gboolean abort; gboolean stereo; - + }; /* error handler data */ @@ -92,7 +92,7 @@ explode_gray_into_buf (struct jpeg_decompress_struct *cinfo, w = cinfo->output_width; for (i = cinfo->rec_outbuf_height - 1; i >= 0; i--) { guchar *from, *to; - + from = lines[i] + w - 1; to = lines[i] + (w - 1) * 3; for (j = w - 1; j >= 0; j--) { @@ -118,7 +118,7 @@ convert_cmyk_to_rgb (struct jpeg_decompress_struct *cinfo, for (i = cinfo->rec_outbuf_height - 1; i >= 0; i--) { guchar *p; - + p = lines[i]; for (j = 0; j < cinfo->output_width; j++) { int c, m, y, k; @@ -146,7 +146,7 @@ convert_cmyk_to_rgb (struct jpeg_decompress_struct *cinfo, static gpointer image_loader_jpeg_new(ImageLoaderBackendCbAreaUpdated area_updated_cb, ImageLoaderBackendCbSize size_cb, ImageLoaderBackendCbAreaPrepared area_prepared_cb, gpointer data) { ImageLoaderJpeg *loader = g_new0(ImageLoaderJpeg, 1); - + loader->area_updated_cb = area_updated_cb; loader->size_cb = size_cb; loader->area_prepared_cb = area_prepared_cb; @@ -159,9 +159,9 @@ fatal_error_handler (j_common_ptr cinfo) { struct error_handler_data *errmgr; char buffer[JMSG_LENGTH_MAX]; - + errmgr = (struct error_handler_data *) cinfo->err; - + /* Create the message */ (* cinfo->err->format_message) (cinfo, buffer); @@ -177,7 +177,7 @@ fatal_error_handler (j_common_ptr cinfo) _("Error interpreting JPEG image file (%s)"), buffer); } - + siglongjmp (errmgr->setjmp_buffer, 1); g_assert_not_reached (); @@ -278,7 +278,7 @@ static gboolean image_loader_jpeg_load (gpointer loader, const guchar *buf, gsiz guint stereo_length = 0; struct error_handler_data jerr; - + lj->stereo = FALSE; MPOData *mpo = jpeg_get_mpo_data(buf, count); @@ -287,7 +287,7 @@ static gboolean image_loader_jpeg_load (gpointer loader, const guchar *buf, gsiz guint i; gint idx1 = -1, idx2 = -1; guint num2 = 1; - + for (i = 0; i < mpo->num_images; i++) { if (mpo->images[i].type_code == 0x20002) @@ -303,7 +303,7 @@ static gboolean image_loader_jpeg_load (gpointer loader, const guchar *buf, gsiz } } } - + if (idx1 >= 0 && idx2 >= 0) { lj->stereo = TRUE; @@ -333,20 +333,20 @@ static gboolean image_loader_jpeg_load (gpointer loader, const guchar *buf, gsiz if (lj->stereo) jpeg_destroy_decompress(&cinfo2); return FALSE; } - + jpeg_create_decompress(&cinfo); set_mem_src(&cinfo, (unsigned char *)buf, count); jpeg_read_header(&cinfo, TRUE); - + if (lj->stereo) { jpeg_create_decompress(&cinfo2); set_mem_src(&cinfo2, stereo_buf2, stereo_length); jpeg_read_header(&cinfo2, TRUE); - + if (cinfo.image_width != cinfo2.image_width || cinfo.image_height != cinfo2.image_height) { @@ -356,12 +356,12 @@ static gboolean image_loader_jpeg_load (gpointer loader, const guchar *buf, gsiz } } - + lj->requested_width = lj->stereo ? cinfo.image_width * 2: cinfo.image_width; lj->requested_height = cinfo.image_height; lj->size_cb(loader, lj->requested_width, lj->requested_height, lj->data); - + cinfo.scale_num = 1; for (cinfo.scale_denom = 2; cinfo.scale_denom <= 8; cinfo.scale_denom *= 2) { jpeg_calc_output_dimensions(&cinfo); @@ -378,10 +378,10 @@ static gboolean image_loader_jpeg_load (gpointer loader, const guchar *buf, gsiz jpeg_calc_output_dimensions(&cinfo2); jpeg_start_decompress(&cinfo2); } - + jpeg_start_decompress(&cinfo); - + if (lj->stereo) { @@ -394,8 +394,8 @@ static gboolean image_loader_jpeg_load (gpointer loader, const guchar *buf, gsiz lj->stereo = FALSE; } } - - + + lj->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, cinfo.out_color_components == 4 ? TRUE : FALSE, 8, lj->stereo ? cinfo.output_width * 2: cinfo.output_width, cinfo.output_height); @@ -412,7 +412,7 @@ static gboolean image_loader_jpeg_load (gpointer loader, const guchar *buf, gsiz rowstride = gdk_pixbuf_get_rowstride(lj->pixbuf); dptr = gdk_pixbuf_get_pixels(lj->pixbuf); dptr2 = gdk_pixbuf_get_pixels(lj->pixbuf) + ((cinfo.out_color_components == 4) ? 4 * cinfo.output_width : 3 * cinfo.output_width); - + while (cinfo.output_scanline < cinfo.output_height && !lj->abort) { @@ -490,7 +490,7 @@ void image_loader_backend_set_jpeg(ImageLoaderBackend *funcs) funcs->close = image_loader_jpeg_close; funcs->abort = image_loader_jpeg_abort; funcs->free = image_loader_jpeg_free; - + funcs->get_format_name = image_loader_jpeg_get_format_name; funcs->get_format_mime_types = image_loader_jpeg_get_format_mime_types; }