]> Pileus Git - ~andy/gtk/commitdiff
If the pixbuf has an alpha channel, use gdk_draw_rgb_32_image to draw it
authorChristian Persch <chpe@gnome.org>
Wed, 6 Feb 2008 23:08:07 +0000 (23:08 +0000)
committerChristian Persch <chpe@src.gnome.org>
Wed, 6 Feb 2008 23:08:07 +0000 (23:08 +0000)
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.

svn path=/trunk/; revision=19488

ChangeLog
gdk/gdkpixbuf-render.c

index 7427e6afc302802ecde7c5d563ef330ca3bb66cf..f5a96a6312c9c2da938d4e6da2d665b3d05e8f5d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+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.
+
 2008-02-06  Cody Russell  <bratsche@gnome.org>
 
        * gdk/win32/gdkevents-win32.c: Check if the window is a temp window,
index 2904e712f134f16aaa84087514704dc431e47ebd..0c883a4f927e522fd664ce7fbdce39a1adcb6839 100644 (file)
@@ -305,11 +305,24 @@ gdk_pixbuf_render_pixmap_and_mask_for_colormap (GdkPixbuf   *pixbuf,
 
       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)