diff options
author | Michael Natterer <mitch@imendio.com> | 2005-12-14 12:47:49 +0000 |
---|---|---|
committer | Michael Natterer <mitch@src.gnome.org> | 2005-12-14 12:47:49 +0000 |
commit | 49e4882358a2953f349dcb1fbe1c81979d9eaef9 (patch) | |
tree | 04bab92df3254123007cc4ec7387f5ac67f7e1c3 /gdk-pixbuf | |
parent | 2d53f521065d50227da191b359ee45aff6d41127 (diff) | |
download | gtk+-49e4882358a2953f349dcb1fbe1c81979d9eaef9.tar.gz |
applied patch from maemo-gtk which avoids the allocation of an
2005-12-14 Michael Natterer <mitch@imendio.com>
* gdk-pixbuf/io-jpeg.c: applied patch from maemo-gtk which avoids
the allocation of an intermediate buffer for non-progressive
jpegs. Fixed bug #305894.
* tests/test-images/valid_jpeg_progressive_test: new test image so
we can test both loading code paths in io-jpeg.c
Diffstat (limited to 'gdk-pixbuf')
-rw-r--r-- | gdk-pixbuf/io-jpeg.c | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/gdk-pixbuf/io-jpeg.c b/gdk-pixbuf/io-jpeg.c index fe49c256f0..9c3c064f93 100644 --- a/gdk-pixbuf/io-jpeg.c +++ b/gdk-pixbuf/io-jpeg.c @@ -694,7 +694,7 @@ gdk_pixbuf__jpeg_image_load_increment (gpointer data, int rc; /* start decompression */ - cinfo->buffered_image = TRUE; + cinfo->buffered_image = cinfo->progressive_mode; rc = jpeg_start_decompress (cinfo); cinfo->do_fancy_upsampling = FALSE; cinfo->do_block_smoothing = FALSE; @@ -703,8 +703,73 @@ gdk_pixbuf__jpeg_image_load_increment (gpointer data, continue; context->did_prescan = TRUE; + } else if (!cinfo->buffered_image) { + /* we're decompressing unbuffered so + * get scanline by scanline from jpeg lib + * + * except for handling multiple passes this is + * virtually identical to the next branch + */ + guchar *lines[4]; + guchar **lptr; + guchar *rowptr; + gint nlines, i; + + /* keep going until we've done all scanlines */ + while (cinfo->output_scanline < cinfo->output_height) { + lptr = lines; + rowptr = context->dptr; + for (i=0; i < cinfo->rec_outbuf_height; i++) { + *lptr++ = rowptr; + rowptr += context->pixbuf->rowstride; + } + + nlines = jpeg_read_scanlines (cinfo, lines, + cinfo->rec_outbuf_height); + if (nlines == 0) + break; + + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + explode_gray_into_buf (cinfo, lines); + break; + case JCS_RGB: + /* do nothing */ + break; + case JCS_CMYK: + convert_cmyk_to_rgb (cinfo, lines); + break; + default: + if (error && *error == NULL) { + g_set_error (error, + GDK_PIXBUF_ERROR, + GDK_PIXBUF_ERROR_UNKNOWN_TYPE, + _("Unsupported JPEG color space (%s)"), + colorspace_name (cinfo->out_color_space)); + } + + return FALSE; + } + + context->dptr += nlines * context->pixbuf->rowstride; + + /* send updated signal */ + (* context->updated_func) (context->pixbuf, + 0, + cinfo->output_scanline-1, + cinfo->image_width, + nlines, + context->user_data); + } + + if (cinfo->output_scanline >= cinfo->output_height) + return TRUE; } else { - /* we're decompressing so feed jpeg lib scanlines */ + /* we're decompressing so feed jpeg lib scanlines + * + * except for handling multiple passes this is + * virtually identical to the previous branch + */ guchar *lines[4]; guchar **lptr; guchar *rowptr; |