summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2012-08-12 18:02:06 -0300
committerJasper St. Pierre <jstpierre@mecheye.net>2012-09-26 13:53:14 -0300
commit7938458eb8b5e9f0aa7380e2b1fc0559631d83a3 (patch)
tree458fc46f514cb5756e4595c3a08d5251be97d8da
parent165e117028573f407b86ede77ca90d7a9f918199 (diff)
downloadmutter-7938458eb8b5e9f0aa7380e2b1fc0559631d83a3.tar.gz
window-actor: Don't create a mask texture unnecessarily
Mask texture resources may be expensive. Don't create one if we don't need to, like on an unshaped window without a frame. https://bugzilla.gnome.org/show_bug.cgi?id=681676
-rw-r--r--src/compositor/meta-window-actor.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index f74b8c677..371233f45 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -2219,6 +2219,7 @@ check_needs_reshape (MetaWindowActor *self)
MetaFrameBorders borders;
cairo_region_t *region = NULL;
cairo_rectangle_int_t client_area;
+ gboolean needs_mask;
if (!priv->needs_reshape)
return;
@@ -2270,6 +2271,8 @@ check_needs_reshape (MetaWindowActor *self)
}
#endif
+ needs_mask = (region != NULL) || (priv->window->frame != NULL);
+
if (region == NULL)
{
/* If we don't have a shape on the server, that means that
@@ -2278,13 +2281,16 @@ check_needs_reshape (MetaWindowActor *self)
region = cairo_region_create_rectangle (&client_area);
}
- /* This takes the region, generates a mask using GTK+
- * and scans the mask looking for all opaque pixels,
- * adding it to region.
- */
- build_and_scan_frame_mask (self, &borders, &client_area, region);
- meta_window_actor_update_shape_region (self, region);
+ if (needs_mask)
+ {
+ /* This takes the region, generates a mask using GTK+
+ * and scans the mask looking for all opaque pixels,
+ * adding it to region.
+ */
+ build_and_scan_frame_mask (self, &borders, &client_area, region);
+ }
+ meta_window_actor_update_shape_region (self, region);
cairo_region_destroy (region);
priv->needs_reshape = FALSE;