Work around bugs in the runlength encoder by forcing rowstride * height to

2004-08-24  Matthias Clasen  <mclasen@redhat.com>

	* gdk-pixdata.c (gdk_pixdata_from_pixbuf): Work around bugs in
	the runlength encoder by forcing rowstride * height to be
	divisible by bpp.  (#150882)
This commit is contained in:
Matthias Clasen 2004-08-24 13:54:26 +00:00 committed by Matthias Clasen
parent 684aaa4b71
commit 037d233cea
4 changed files with 35 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2004-08-24 Matthias Clasen <mclasen@redhat.com>
* gdk-pixbuf/gdk-pixbuf-csource.xml: Document bugs of
the runlength encoder.
Tue Aug 24 02:28:21 2004 Matthias Clasen <maclas@gmx.de>
* gtk/gtk-docs.sgml: Include visual index.

View File

@ -154,7 +154,9 @@ Gtk+ distribution, available from <ulink url="http://www.gtk.org">www.gtk.org</u
<refsect1><title>Bugs</title>
<para>
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.
</para>
</refsect1>

View File

@ -1,3 +1,9 @@
2004-08-24 Matthias Clasen <mclasen@redhat.com>
* 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 <maclas@gmx.de>
* pixops/pixops.c (pixops_scale_nearest): Fix a mixup in the handling

View File

@ -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
{