gtk+ r19488 - in trunk: . gdk



Author: chpe
Date: Wed Feb  6 23:08:07 2008
New Revision: 19488
URL: http://svn.gnome.org/viewvc/gtk+?rev=19488&view=rev

Log:
2008-02-07  Christian Persch  <chpe gnome org>

	* gdk/gdkpixbuf-render.c:
	(gdk_pixbuf_render_pixmap_and_mask_for_colormap): If the pixbuf has an
	alpha channel, use gdk_draw_rgb_32_image to draw it to the pixmap;
	otherwise there will be random pixel values in the semi-transparent
	area of the pixbuf within the mask. Bug #487865.

Modified:
   trunk/ChangeLog
   trunk/gdk/gdkpixbuf-render.c

Modified: trunk/gdk/gdkpixbuf-render.c
==============================================================================
--- trunk/gdk/gdkpixbuf-render.c	(original)
+++ trunk/gdk/gdkpixbuf-render.c	Wed Feb  6 23:08:07 2008
@@ -305,11 +305,24 @@
 
       gdk_drawable_set_colormap (GDK_DRAWABLE (*pixmap_return), colormap);
       gc = _gdk_drawable_get_scratch_gc (*pixmap_return, FALSE);
-      gdk_draw_pixbuf (*pixmap_return, gc, pixbuf, 
-		       0, 0, 0, 0,
-		       gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf),
-		       GDK_RGB_DITHER_NORMAL,
-		       0, 0);
+
+      /* If the pixbuf has an alpha channel, using gdk_pixbuf_draw would give
+       * random pixel values in the area that are within the mask, but semi-
+       * transparent. So we treat the pixbuf like a pixbuf without alpha channel;
+       * see bug #487865.
+       */
+      if (gdk_pixbuf_get_has_alpha (pixbuf))
+        gdk_draw_rgb_32_image (*pixmap_return, gc,
+                               0, 0,
+                               gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf),
+                               GDK_RGB_DITHER_NORMAL,
+                               gdk_pixbuf_get_pixels (pixbuf), gdk_pixbuf_get_rowstride (pixbuf));
+      else
+        gdk_draw_pixbuf (*pixmap_return, gc, pixbuf, 
+                         0, 0, 0, 0,
+                         gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf),
+                         GDK_RGB_DITHER_NORMAL,
+                         0, 0);
     }
   
   if (mask_return)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]