Add support for client side graphics exposures in gdk_draw_drawable
This commit is contained in:
parent
44c7264bc7
commit
0b586a5ad7
@ -663,16 +663,18 @@ gdk_draw_drawable (GdkDrawable *drawable,
|
|||||||
composite_impl = GDK_WINDOW_OBJECT (src)->impl;
|
composite_impl = GDK_WINDOW_OBJECT (src)->impl;
|
||||||
else
|
else
|
||||||
composite_impl = composite;
|
composite_impl = composite;
|
||||||
|
|
||||||
/* TODO: For non-native windows this may copy stuff from other overlapping
|
/* TODO: For non-native windows this may copy stuff from other overlapping
|
||||||
windows. We should clip that and clear that area in the destination instead. */
|
windows. We should clip that and (for windows with bg != None) clear that
|
||||||
|
area in the destination instead. */
|
||||||
GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable (drawable, gc, composite_impl,
|
|
||||||
|
GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable (drawable, gc,
|
||||||
|
composite_impl, src,
|
||||||
xsrc - composite_x_offset,
|
xsrc - composite_x_offset,
|
||||||
ysrc - composite_y_offset,
|
ysrc - composite_y_offset,
|
||||||
xdest, ydest,
|
xdest, ydest,
|
||||||
width, height);
|
width, height);
|
||||||
|
|
||||||
g_object_unref (composite);
|
g_object_unref (composite);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,6 +100,7 @@ struct _GdkDrawableClass
|
|||||||
void (*draw_drawable) (GdkDrawable *drawable,
|
void (*draw_drawable) (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkDrawable *src,
|
GdkDrawable *src,
|
||||||
|
GdkDrawable *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
|
@ -72,6 +72,7 @@ static void gdk_pixmap_draw_text_wc (GdkDrawable *drawable,
|
|||||||
static void gdk_pixmap_draw_drawable (GdkDrawable *drawable,
|
static void gdk_pixmap_draw_drawable (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkPixmap *src,
|
GdkPixmap *src,
|
||||||
|
GdkPixmap *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
@ -374,6 +375,7 @@ static void
|
|||||||
gdk_pixmap_draw_drawable (GdkDrawable *drawable,
|
gdk_pixmap_draw_drawable (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkPixmap *src,
|
GdkPixmap *src,
|
||||||
|
GdkPixmap *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
|
@ -126,6 +126,7 @@ static void gdk_window_draw_text_wc (GdkDrawable *drawable,
|
|||||||
static void gdk_window_draw_drawable (GdkDrawable *drawable,
|
static void gdk_window_draw_drawable (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkPixmap *src,
|
GdkPixmap *src,
|
||||||
|
GdkDrawable *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
@ -3426,6 +3427,7 @@ static void
|
|||||||
gdk_window_draw_drawable (GdkDrawable *drawable,
|
gdk_window_draw_drawable (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkPixmap *src,
|
GdkPixmap *src,
|
||||||
|
GdkDrawable *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
@ -3435,7 +3437,7 @@ gdk_window_draw_drawable (GdkDrawable *drawable,
|
|||||||
{
|
{
|
||||||
GdkWindowObject *private = (GdkWindowObject *)drawable;
|
GdkWindowObject *private = (GdkWindowObject *)drawable;
|
||||||
OFFSET_GC (gc);
|
OFFSET_GC (gc);
|
||||||
|
|
||||||
if (GDK_WINDOW_DESTROYED (drawable))
|
if (GDK_WINDOW_DESTROYED (drawable))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -3445,9 +3447,8 @@ gdk_window_draw_drawable (GdkDrawable *drawable,
|
|||||||
GdkWindowPaint *paint = private->paint_stack->data;
|
GdkWindowPaint *paint = private->paint_stack->data;
|
||||||
SETUP_PAINT_GC_CLIP (gc);
|
SETUP_PAINT_GC_CLIP (gc);
|
||||||
gdk_draw_drawable (pixmap_impl (paint->pixmap), gc,
|
gdk_draw_drawable (pixmap_impl (paint->pixmap), gc,
|
||||||
src, xsrc, ysrc,
|
src, xsrc, ysrc,
|
||||||
xdest - x_offset, ydest - y_offset, width, height);
|
xdest - x_offset, ydest - y_offset, width, height);
|
||||||
|
|
||||||
RESTORE_PAINT_GC_CLIP (gc);
|
RESTORE_PAINT_GC_CLIP (gc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -3458,6 +3459,59 @@ gdk_window_draw_drawable (GdkDrawable *drawable,
|
|||||||
xdest - x_offset, ydest - y_offset,
|
xdest - x_offset, ydest - y_offset,
|
||||||
width, height);
|
width, height);
|
||||||
RESTORE_DIRECT_GC_CLIP(gc);
|
RESTORE_DIRECT_GC_CLIP(gc);
|
||||||
|
|
||||||
|
/* We might have drawn from an obscured part of a client
|
||||||
|
side window, if so we need to send graphics exposures */
|
||||||
|
if (_gdk_gc_get_exposures (gc) &&
|
||||||
|
GDK_IS_WINDOW (original_src))
|
||||||
|
{
|
||||||
|
GdkRegion *exposure_region;
|
||||||
|
GdkRegion *clip;
|
||||||
|
GdkRectangle r;
|
||||||
|
|
||||||
|
r.x = xdest;
|
||||||
|
r.y = ydest;
|
||||||
|
r.width = width;
|
||||||
|
r.height = height;
|
||||||
|
exposure_region = gdk_region_rectangle (&r);
|
||||||
|
|
||||||
|
if (_gdk_gc_get_subwindow (gc) == GDK_CLIP_BY_CHILDREN)
|
||||||
|
clip = private->clip_region_with_children;
|
||||||
|
else
|
||||||
|
clip = private->clip_region;
|
||||||
|
gdk_region_intersect (exposure_region, clip);
|
||||||
|
|
||||||
|
clip = _gdk_gc_get_clip_region (gc);
|
||||||
|
if (clip)
|
||||||
|
{
|
||||||
|
gdk_region_offset (exposure_region,
|
||||||
|
old_clip_x,
|
||||||
|
old_clip_y);
|
||||||
|
gdk_region_intersect (exposure_region, clip);
|
||||||
|
gdk_region_offset (exposure_region,
|
||||||
|
-old_clip_x,
|
||||||
|
-old_clip_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Note: We don't clip by the clip mask if set, so this
|
||||||
|
may invalidate to much */
|
||||||
|
|
||||||
|
/* Remove the area that is correctly copied from the src.
|
||||||
|
* Note that xsrc/ysrc has been corrected for abs_x/y offsets already,
|
||||||
|
* which need to be undone */
|
||||||
|
clip = gdk_drawable_get_visible_region (original_src);
|
||||||
|
gdk_region_offset (clip,
|
||||||
|
xdest - (xsrc - GDK_WINDOW_OBJECT (original_src)->abs_x),
|
||||||
|
ydest - (ysrc - GDK_WINDOW_OBJECT (original_src)->abs_y));
|
||||||
|
gdk_region_subtract (exposure_region, clip);
|
||||||
|
gdk_region_destroy (clip);
|
||||||
|
|
||||||
|
gdk_window_invalidate_region (GDK_WINDOW (private),
|
||||||
|
exposure_region,
|
||||||
|
_gdk_gc_get_subwindow (gc) == GDK_INCLUDE_INFERIORS);
|
||||||
|
|
||||||
|
gdk_region_destroy (exposure_region);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RESTORE_GC (gc);
|
RESTORE_GC (gc);
|
||||||
@ -5012,8 +5066,10 @@ gdk_window_invalidate_maybe_recurse (GdkWindow *window,
|
|||||||
|
|
||||||
if (GDK_WINDOW_DESTROYED (window))
|
if (GDK_WINDOW_DESTROYED (window))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (private->input_only || !GDK_WINDOW_IS_MAPPED (window))
|
if (private->input_only ||
|
||||||
|
!GDK_WINDOW_IS_MAPPED (window) ||
|
||||||
|
gdk_region_empty (region))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
visible_region = gdk_drawable_get_visible_region (window);
|
visible_region = gdk_drawable_get_visible_region (window);
|
||||||
@ -5086,7 +5142,7 @@ gdk_window_invalidate_maybe_recurse (GdkWindow *window,
|
|||||||
gdk_window_schedule_update ((GdkWindow *)impl_window);
|
gdk_window_schedule_update ((GdkWindow *)impl_window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gdk_region_destroy (visible_region);
|
gdk_region_destroy (visible_region);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,6 +326,7 @@ static void
|
|||||||
gdk_quartz_draw_drawable (GdkDrawable *drawable,
|
gdk_quartz_draw_drawable (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkPixmap *src,
|
GdkPixmap *src,
|
||||||
|
GdkDrawable *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
|
@ -87,6 +87,7 @@ static void gdk_win32_draw_text_wc (GdkDrawable *drawable,
|
|||||||
static void gdk_win32_draw_drawable (GdkDrawable *drawable,
|
static void gdk_win32_draw_drawable (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkPixmap *src,
|
GdkPixmap *src,
|
||||||
|
GdkDrawable *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
@ -1143,6 +1144,7 @@ static void
|
|||||||
gdk_win32_draw_drawable (GdkDrawable *drawable,
|
gdk_win32_draw_drawable (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkPixmap *src,
|
GdkPixmap *src,
|
||||||
|
GdkDrawable *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
|
@ -88,6 +88,7 @@ static void gdk_x11_draw_text_wc (GdkDrawable *drawable,
|
|||||||
static void gdk_x11_draw_drawable (GdkDrawable *drawable,
|
static void gdk_x11_draw_drawable (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkPixmap *src,
|
GdkPixmap *src,
|
||||||
|
GdkDrawable *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
@ -618,6 +619,7 @@ static void
|
|||||||
gdk_x11_draw_drawable (GdkDrawable *drawable,
|
gdk_x11_draw_drawable (GdkDrawable *drawable,
|
||||||
GdkGC *gc,
|
GdkGC *gc,
|
||||||
GdkPixmap *src,
|
GdkPixmap *src,
|
||||||
|
GdkDrawable *original_src,
|
||||||
gint xsrc,
|
gint xsrc,
|
||||||
gint ysrc,
|
gint ysrc,
|
||||||
gint xdest,
|
gint xdest,
|
||||||
|
Loading…
Reference in New Issue
Block a user