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:
parent
2678a454e5
commit
52e3d2cf0e
29
gdk/gdkgc.c
29
gdk/gdkgc.c
@ -646,10 +646,26 @@ _gdk_gc_add_drawable_clip (GdkGC *gc,
|
|||||||
GdkPixmap *new_mask;
|
GdkPixmap *new_mask;
|
||||||
GdkGC *tmp_gc;
|
GdkGC *tmp_gc;
|
||||||
GdkColor black = {0, 0, 0, 0};
|
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);
|
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);
|
new_mask = gdk_pixmap_new (priv->old_clip_mask, w, h, -1);
|
||||||
tmp_gc = _gdk_drawable_get_scratch_gc ((GdkDrawable *)new_mask, FALSE);
|
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_region (tmp_gc, NULL);
|
||||||
gdk_gc_set_clip_mask (gc, new_mask);
|
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
|
else
|
||||||
{
|
{
|
||||||
priv->old_clip_region = priv->clip_region;
|
priv->old_clip_region = priv->clip_region;
|
||||||
|
Loading…
Reference in New Issue
Block a user