diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index dcfb8c0658..f568b06dd9 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,8 @@ +2004-08-24 Matthias Clasen + + * gdk-pixbuf/gdk-pixbuf-csource.xml: Document bugs of + the runlength encoder. + Tue Aug 24 02:28:21 2004 Matthias Clasen * gtk/gtk-docs.sgml: Include visual index. diff --git a/docs/reference/gdk-pixbuf/gdk-pixbuf-csource.xml b/docs/reference/gdk-pixbuf/gdk-pixbuf-csource.xml index fdb785405d..74463b1670 100644 --- a/docs/reference/gdk-pixbuf/gdk-pixbuf-csource.xml +++ b/docs/reference/gdk-pixbuf/gdk-pixbuf-csource.xml @@ -154,7 +154,9 @@ Gtk+ distribution, available from www.gtk.orgBugs -None known yet. +The runlength encoder gets out of sync with the pixel boundaries, since +it includes the rowstride padding in the encoded stream. Furthermore, it +generates pixbufs with suboptimal rowstride in some cases. diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index 7afc519bc5..81b029153a 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,9 @@ +2004-08-24 Matthias Clasen + + * gdk-pixdata.c (gdk_pixdata_from_pixbuf): Work around bugs in + the runlength encoder by forcing rowstride * height to be + divisible by bpp. (#150882) + Sun Aug 22 03:20:56 2004 Matthias Clasen * pixops/pixops.c (pixops_scale_nearest): Fix a mixup in the handling diff --git a/gdk-pixbuf/gdk-pixdata.c b/gdk-pixbuf/gdk-pixdata.c index 66f665877f..e027ed659d 100644 --- a/gdk-pixbuf/gdk-pixdata.c +++ b/gdk-pixbuf/gdk-pixdata.c @@ -328,16 +328,36 @@ gdk_pixdata_from_pixbuf (GdkPixdata *pixdata, { guint pad, n_bytes = rowstride * height; guint8 *img_buffer_end, *data; + GdkPixbuf *buf = NULL; + if (n_bytes % bpp != 0) + { + rowstride = pixbuf->width * bpp; + n_bytes = rowstride * height; + data = g_malloc (n_bytes); + buf = gdk_pixbuf_new_from_data (data, + GDK_COLORSPACE_RGB, + pixbuf->has_alpha, 8, + pixbuf->width, + pixbuf->height, + rowstride, + NULL, NULL); + gdk_pixbuf_copy_area (pixbuf, 0, 0, pixbuf->width, pixbuf->height, + buf, 0, 0); + } + else + buf = pixbuf; pad = rowstride; pad = MAX (pad, 130 + n_bytes / 127); data = g_new (guint8, pad + n_bytes); free_me = data; img_buffer = data; img_buffer_end = rl_encode_rgbx (img_buffer, - pixbuf->pixels, pixbuf->pixels + n_bytes, + buf->pixels, buf->pixels + n_bytes, bpp); length = img_buffer_end - img_buffer; + if (buf != pixbuf) + g_object_unref (buf); } else {