summaryrefslogtreecommitdiff
path: root/gtk/gtkdnd.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2010-08-25 21:06:21 +0200
committerBenjamin Otte <otte@redhat.com>2010-09-26 15:11:11 +0200
commit804fd4b15a1d2b8399a4765cf925201fe3e9492f (patch)
treee3b9744b3e706215a9ce09c12db22eb54f444ad4 /gtk/gtkdnd.c
parentb370cb0d4cf4108849f8aee8e33b6951981a47c4 (diff)
downloadgtk+-804fd4b15a1d2b8399a4765cf925201fe3e9492f.tar.gz
dnd: Replace last pixmap usage with cairo surfaces.
Diffstat (limited to 'gtk/gtkdnd.c')
-rw-r--r--gtk/gtkdnd.c48
1 files changed, 34 insertions, 14 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index 79c48063eb..a76f172190 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -3070,29 +3070,49 @@ static void
icon_window_realize (GtkWidget *window,
GdkPixbuf *pixbuf)
{
- GdkPixmap *pixmap;
- GdkPixmap *mask;
+ cairo_surface_t *surface;
+ cairo_pattern_t *pattern;
+ cairo_t *cr;
- gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf,
- gtk_widget_get_colormap (window),
- &pixmap, &mask, 128);
+ surface = gdk_window_create_similar_surface (gtk_widget_get_window (window),
+ CAIRO_CONTENT_COLOR,
+ gdk_pixbuf_get_width (pixbuf),
+ gdk_pixbuf_get_height (pixbuf));
- gdk_window_set_back_pixmap (gtk_widget_get_window (window),
- pixmap, FALSE);
- g_object_unref (pixmap);
-
- if (mask)
+ cr = cairo_create (surface);
+ cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA);
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+ cairo_paint (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SATURATE);
+ cairo_paint (cr);
+ cairo_pop_group_to_source (cr);
+ cairo_paint (cr);
+ cairo_destroy (cr);
+
+ pattern = cairo_pattern_create_for_surface (surface);
+ gdk_window_set_background_pattern (gtk_widget_get_window (window), pattern);
+ cairo_pattern_destroy (pattern);
+
+ cairo_surface_destroy (surface);
+
+ if (gdk_pixbuf_get_has_alpha (pixbuf))
{
cairo_region_t *region;
- cairo_t *cr;
- /* XXX: Clean this up properly */
- cr = gdk_cairo_create (mask);
- region = gdk_cairo_region_create_from_surface (cairo_get_target (cr));
+ surface = cairo_image_surface_create (CAIRO_FORMAT_A1,
+ gdk_pixbuf_get_width (pixbuf),
+ gdk_pixbuf_get_height (pixbuf));
+
+ cr = cairo_create (surface);
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+ cairo_paint (cr);
cairo_destroy (cr);
+ region = gdk_cairo_region_create_from_surface (surface);
gtk_widget_shape_combine_region (window, region);
cairo_region_destroy (region);
+
+ cairo_surface_destroy (surface);
}
}