summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim Woelders <kim@woelders.dk>2014-12-15 18:40:18 +0100
committerKim Woelders <kim@woelders.dk>2014-12-16 20:03:28 +0100
commit7b7d1aaf7b4a60a3609d45d86a9bb7191826336d (patch)
treede6a292c713ea8d8512bf4cc23742d16dbb4b574
parent534f6c42a361b6d91eb609704807bb4127b92d04 (diff)
downloadimlib2-7b7d1aaf7b4a60a3609d45d86a9bb7191826336d.tar.gz
JPEG loader: Fix load() return code when only reading header.
Also simplify exit/error handling.
-rw-r--r--src/modules/loaders/loader_jpeg.c80
1 files changed, 33 insertions, 47 deletions
diff --git a/src/modules/loaders/loader_jpeg.c b/src/modules/loaders/loader_jpeg.c
index 5fb550b..207864b 100644
--- a/src/modules/loaders/loader_jpeg.c
+++ b/src/modules/loaders/loader_jpeg.c
@@ -46,7 +46,7 @@ char
load(ImlibImage * im, ImlibProgressFunction progress,
char progress_granularity, char immediate_load)
{
- int w, h;
+ int w, h, rc;
struct jpeg_decompress_struct cinfo;
struct ImLib_JPEG_error_mgr jerr;
FILE *f;
@@ -56,71 +56,55 @@ load(ImlibImage * im, ImlibProgressFunction progress,
f = fopen(im->real_file, "rb");
if (!f)
return 0;
+
cinfo.err = jpeg_std_error(&(jerr.pub));
jerr.pub.error_exit = _JPEGFatalErrorHandler;
jerr.pub.emit_message = _JPEGErrorHandler2;
jerr.pub.output_message = _JPEGErrorHandler;
if (sigsetjmp(jerr.setjmp_buffer, 1))
- {
- jpeg_destroy_decompress(&cinfo);
- fclose(f);
- return 0;
- }
+ goto quit_error;
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, f);
jpeg_read_header(&cinfo, TRUE);
- cinfo.do_fancy_upsampling = FALSE;
- cinfo.do_block_smoothing = FALSE;
- jpeg_start_decompress(&cinfo);
+ im->w = w = cinfo.image_width;
+ im->h = h = cinfo.image_height;
+
+ rc = 1; /* Ok */
+
if ((!im->loader) && (!im->data))
{
- im->w = w = cinfo.output_width;
- im->h = h = cinfo.output_height;
if (!IMAGE_DIMENSIONS_OK(w, h))
- {
- im->w = im->h = 0;
- jpeg_destroy_decompress(&cinfo);
- fclose(f);
- return 0;
- }
+ goto quit_error;
UNSET_FLAG(im->flags, F_HAS_ALPHA);
im->format = strdup("jpeg");
}
+
if (((!im->data) && (im->loader)) || (immediate_load) || (progress))
{
DATA8 *ptr, *line[16], *data;
DATA32 *ptr2;
int x, y, l, i, scans, count, prevy;
- im->w = w = cinfo.output_width;
- im->h = h = cinfo.output_height;
+ cinfo.do_fancy_upsampling = FALSE;
+ cinfo.do_block_smoothing = FALSE;
+ jpeg_start_decompress(&cinfo);
if ((cinfo.rec_outbuf_height > 16) || (cinfo.output_components <= 0) ||
!IMAGE_DIMENSIONS_OK(w, h))
- {
- im->w = im->h = 0;
- jpeg_destroy_decompress(&cinfo);
- fclose(f);
- return 0;
- }
+ goto quit_error;
+
data = malloc(w * 16 * cinfo.output_components);
if (!data)
- {
- im->w = im->h = 0;
- jpeg_destroy_decompress(&cinfo);
- fclose(f);
- return 0;
- }
+ goto quit_error;
+
/* must set the im->data member before callign progress function */
ptr2 = im->data = malloc(w * h * sizeof(DATA32));
if (!im->data)
{
- im->w = im->h = 0;
free(data);
- jpeg_destroy_decompress(&cinfo);
- fclose(f);
- return 0;
+ goto quit_error;
}
+
count = 0;
prevy = 0;
if (cinfo.output_components > 1)
@@ -156,11 +140,8 @@ load(ImlibImage * im, ImlibProgressFunction progress,
if (!progress
(im, per, 0, prevy, w, scans + l - prevy))
{
- free(data);
- jpeg_finish_decompress(&cinfo);
- jpeg_destroy_decompress(&cinfo);
- fclose(f);
- return 2;
+ rc = 2;
+ goto done;
}
prevy = l + scans;
}
@@ -200,23 +181,28 @@ load(ImlibImage * im, ImlibProgressFunction progress,
if (!progress
(im, per, 0, prevy, w, l + scans - prevy))
{
- free(data);
- jpeg_finish_decompress(&cinfo);
- jpeg_destroy_decompress(&cinfo);
- fclose(f);
- return 2;
+ rc = 2;
+ goto done;
}
prevy = l + scans;
}
}
}
}
+ done:
+ jpeg_finish_decompress(&cinfo);
free(data);
}
- jpeg_finish_decompress(&cinfo);
+
+ quit:
jpeg_destroy_decompress(&cinfo);
fclose(f);
- return 1;
+ return rc;
+
+ quit_error:
+ rc = 0; /* Error */
+ im->w = im->h = 0;
+ goto quit;
}
char