Fix clipping of pixbuf drawing to windows

When the fallback for gdk_draw_pixbuf (gdk_drawable_real_draw_pixbuf)
is called with a window destination we have already applied any clip
regions and offsets for the window, but the window we get is a wrapper
and not an impl. We have to ensure we really draw to the impl, as
otherwise the pixbuf drawing will be clipped by client side subwindows.

This fixes bug 588553.
This commit is contained in:
Alexander Larsson 2009-07-23 21:53:46 +02:00
parent e71c5d3ab5
commit 9d69355e6f

View File

@ -1525,6 +1525,7 @@ gdk_drawable_real_draw_pixbuf (GdkDrawable *drawable,
GdkRegion *clip; GdkRegion *clip;
GdkRegion *drect; GdkRegion *drect;
GdkRectangle tmp_rect; GdkRectangle tmp_rect;
GdkDrawable *real_drawable;
g_return_if_fail (GDK_IS_PIXBUF (pixbuf)); g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
g_return_if_fail (pixbuf->colorspace == GDK_COLORSPACE_RGB); g_return_if_fail (pixbuf->colorspace == GDK_COLORSPACE_RGB);
@ -1597,6 +1598,16 @@ gdk_drawable_real_draw_pixbuf (GdkDrawable *drawable,
/* Actually draw */ /* Actually draw */
if (!gc) if (!gc)
gc = _gdk_drawable_get_scratch_gc (drawable, FALSE); gc = _gdk_drawable_get_scratch_gc (drawable, FALSE);
/* Drawable is a wrapper here, but at this time we
have already retargeted the destination to any
impl window and set the clip, so what we really
want to do is draw directly on the impl, ignoring
client side subwindows. */
if (GDK_IS_WINDOW (drawable))
real_drawable = GDK_WINDOW_OBJECT (drawable)->impl;
else
real_drawable = drawable;
if (pixbuf->has_alpha) if (pixbuf->has_alpha)
{ {
@ -1667,7 +1678,7 @@ gdk_drawable_real_draw_pixbuf (GdkDrawable *drawable,
image->bpl, image->bpl,
visual->byte_order, visual->byte_order,
width1, height1); width1, height1);
gdk_draw_image (drawable, gc, image, gdk_draw_image (real_drawable, gc, image,
xs0, ys0, xs0, ys0,
dest_x + x0, dest_y + y0, dest_x + x0, dest_y + y0,
width1, height1); width1, height1);
@ -1708,7 +1719,7 @@ gdk_drawable_real_draw_pixbuf (GdkDrawable *drawable,
{ {
guchar *buf = pixbuf->pixels + src_y * pixbuf->rowstride + src_x * 4; guchar *buf = pixbuf->pixels + src_y * pixbuf->rowstride + src_x * 4;
gdk_draw_rgb_32_image_dithalign (drawable, gc, gdk_draw_rgb_32_image_dithalign (real_drawable, gc,
dest_x, dest_y, dest_x, dest_y,
width, height, width, height,
dither, dither,
@ -1719,7 +1730,7 @@ gdk_drawable_real_draw_pixbuf (GdkDrawable *drawable,
{ {
guchar *buf = pixbuf->pixels + src_y * pixbuf->rowstride + src_x * 3; guchar *buf = pixbuf->pixels + src_y * pixbuf->rowstride + src_x * 3;
gdk_draw_rgb_image_dithalign (drawable, gc, gdk_draw_rgb_image_dithalign (real_drawable, gc,
dest_x, dest_y, dest_x, dest_y,
width, height, width, height,
dither, dither,