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.
This commit is contained in:
Alexander Larsson 2009-07-07 14:51:38 +02:00
parent 5f12fe2b3b
commit 2678a454e5
3 changed files with 24 additions and 5 deletions

9
NEWS
View File

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

View File

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

View File

@ -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);
}
}