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
This commit is contained in:

committed by
Michael Natterer

parent
2d53f52106
commit
49e4882358
@ -1,3 +1,12 @@
|
|||||||
|
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
|
||||||
|
|
||||||
Tue Dec 13 09:47:20 2005 Tim Janik <timj@gtk.org>
|
Tue Dec 13 09:47:20 2005 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
* README.in: added a link to the fgloating reference docs in the
|
* README.in: added a link to the fgloating reference docs in the
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
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
|
||||||
|
|
||||||
Tue Dec 13 09:47:20 2005 Tim Janik <timj@gtk.org>
|
Tue Dec 13 09:47:20 2005 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
* README.in: added a link to the fgloating reference docs in the
|
* README.in: added a link to the fgloating reference docs in the
|
||||||
|
@ -694,7 +694,7 @@ gdk_pixbuf__jpeg_image_load_increment (gpointer data,
|
|||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* start decompression */
|
/* start decompression */
|
||||||
cinfo->buffered_image = TRUE;
|
cinfo->buffered_image = cinfo->progressive_mode;
|
||||||
rc = jpeg_start_decompress (cinfo);
|
rc = jpeg_start_decompress (cinfo);
|
||||||
cinfo->do_fancy_upsampling = FALSE;
|
cinfo->do_fancy_upsampling = FALSE;
|
||||||
cinfo->do_block_smoothing = FALSE;
|
cinfo->do_block_smoothing = FALSE;
|
||||||
@ -703,8 +703,73 @@ gdk_pixbuf__jpeg_image_load_increment (gpointer data,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
context->did_prescan = TRUE;
|
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 {
|
} 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 *lines[4];
|
||||||
guchar **lptr;
|
guchar **lptr;
|
||||||
guchar *rowptr;
|
guchar *rowptr;
|
||||||
|
BIN
tests/test-images/valid_jpeg_progressive_test
Normal file
BIN
tests/test-images/valid_jpeg_progressive_test
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
Reference in New Issue
Block a user