Optimize clip-to-window with clipmask case when fully visible or obscured

This avoids creating alot of bitmaps in common trivial cases.
This commit is contained in:
Alexander Larsson 2009-07-07 15:14:16 +02:00
parent 2678a454e5
commit 52e3d2cf0e

View File

@ -646,10 +646,26 @@ _gdk_gc_add_drawable_clip (GdkGC *gc,
GdkPixmap *new_mask;
GdkGC *tmp_gc;
GdkColor black = {0, 0, 0, 0};
GdkRectangle r;
GdkOverlapType overlap;
gdk_drawable_get_size (priv->clip_mask, &w, &h);
r.x = 0;
r.y = 0;
r.width = w;
r.height = h;
/* Its quite common to expose areas that are completely in or outside
* the region, so we try to avoid allocating bitmaps that are just fully
* set or completely unset.
*/
overlap = gdk_region_rect_in (region, &r);
if (overlap == GDK_OVERLAP_RECTANGLE_PART)
{
/* The region and the mask intersect, create a new clip mask that
includes both areas */
priv->old_clip_mask = g_object_ref (priv->clip_mask);
gdk_drawable_get_size (priv->old_clip_mask, &w, &h);
new_mask = gdk_pixmap_new (priv->old_clip_mask, w, h, -1);
tmp_gc = _gdk_drawable_get_scratch_gc ((GdkDrawable *)new_mask, FALSE);
@ -665,6 +681,15 @@ _gdk_gc_add_drawable_clip (GdkGC *gc,
gdk_gc_set_clip_region (tmp_gc, NULL);
gdk_gc_set_clip_mask (gc, new_mask);
}
else if (overlap == GDK_OVERLAP_RECTANGLE_OUT)
{
GdkRegion *empty = gdk_region_new ();
priv->old_clip_mask = g_object_ref (priv->clip_mask);
_gdk_windowing_gc_set_clip_region (gc, empty, FALSE);
gdk_region_destroy (empty);
}
}
else
{
priv->old_clip_region = priv->clip_region;