From 2678a454e5447ba28cf1aa7c316a1e73b7b30018 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 7 Jul 2009 14:51:38 +0200 Subject: [PATCH] Make clipmasks work for pixbuf rendering This is more important in the client side windows world, as clip masks may be used for clipping to non-native subwindows. This fixes a bug in aisleriot where it uses masked pixbuf drawing and it ends up drawing over the moving card subwindow. --- NEWS | 9 +++++++++ gdk/gdkdraw.c | 3 --- gdk/x11/gdkdrawable-x11.c | 17 +++++++++++++++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 29b3fa6c61..06fae6705e 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,12 @@ +Overview of Changes from GTK+ 2.17.3 to 2.17.4 +============================================== + +* Support for clipmasks in gdk_draw_pixbuf now works, this will + introduce visual changes in code that uses clipmasks when drawing + pixbufs. However, since this never worked that is unlikely to happen. + Old code using gdk_pixbuf_render_threshold_alpha masks when rendering + pixbufs will now produce truncated results at the edges. + Overview of Changes from GTK+ 2.17.2 to 2.17.3 ============================================== diff --git a/gdk/gdkdraw.c b/gdk/gdkdraw.c index 869d535888..44652bcbe8 100644 --- a/gdk/gdkdraw.c +++ b/gdk/gdkdraw.c @@ -752,9 +752,6 @@ gdk_draw_image (GdkDrawable *drawable, * On older X servers, rendering pixbufs with an alpha channel involves round * trips to the X server, and may be somewhat slow. * - * The clip mask of @gc is ignored, but clip rectangles and clip regions work - * fine. - * * If GDK is built with the Sun mediaLib library, the gdk_draw_pixbuf * function is accelerated using mediaLib, which provides hardware * acceleration on Intel, AMD, and Sparc chipsets. If desired, mediaLib diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c index 537a47e0fb..b2cac294c3 100644 --- a/gdk/x11/gdkdrawable-x11.c +++ b/gdk/x11/gdkdrawable-x11.c @@ -388,9 +388,22 @@ gdk_x11_drawable_update_picture_clip (GdkDrawable *drawable, else { XRenderPictureAttributes pa; - pa.clip_mask = None; + GdkBitmap *mask; + gulong pa_mask; + + pa_mask = CPClipMask; + if (gc && (mask = _gdk_gc_get_clip_mask (gc))) + { + pa.clip_mask = GDK_PIXMAP_XID (mask); + pa.clip_x_origin = gc->clip_x_origin; + pa.clip_y_origin = gc->clip_y_origin; + pa_mask |= CPClipXOrigin | CPClipYOrigin; + } + else + pa.clip_mask = None; + XRenderChangePicture (xdisplay, picture, - CPClipMask, &pa); + pa_mask, &pa); } }