[mutter] shaped-texture: Fix the logic when the blended region is empty
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] shaped-texture: Fix the logic when the blended region is empty
- Date: Mon, 25 Aug 2014 13:36:30 +0000 (UTC)
commit c15b3b4a09f324a8556f3ef0b65c1ed817fdeaaa
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Mon Aug 25 09:25:55 2014 -0400
shaped-texture: Fix the logic when the blended region is empty
When the blended region was empty, meaning we didn't have to paint
anything blended -- the case for an app update -- was drawing the
entire window blended, because of a think-o in the complex and
complicated logic.
Fix this so that we don't draw anything for the blended region when
empty.
src/compositor/meta-shaped-texture.c | 106 +++++++++++++++++++---------------
1 files changed, 59 insertions(+), 47 deletions(-)
---
diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
index afa08de..7799544 100644
--- a/src/compositor/meta-shaped-texture.c
+++ b/src/compositor/meta-shaped-texture.c
@@ -430,53 +430,65 @@ meta_shaped_texture_paint (ClutterActor *actor)
}
/* Now, go ahead and paint the blended parts. */
- {
- CoglPipeline *blended_pipeline;
-
- if (priv->mask_texture == NULL)
- {
- blended_pipeline = get_unmasked_pipeline (ctx);
- }
- else
- {
- blended_pipeline = get_masked_pipeline (ctx);
- cogl_pipeline_set_layer_texture (blended_pipeline, 1, priv->mask_texture);
- cogl_pipeline_set_layer_filters (blended_pipeline, 1, filter, filter);
- }
-
- cogl_pipeline_set_layer_texture (blended_pipeline, 0, paint_tex);
- cogl_pipeline_set_layer_filters (blended_pipeline, 0, filter, filter);
-
- CoglColor color;
- cogl_color_init_from_4ub (&color, opacity, opacity, opacity, opacity);
- cogl_pipeline_set_color (blended_pipeline, &color);
-
- if (blended_region != NULL && !cairo_region_is_empty (blended_region))
- {
- int i;
- int n_rects = cairo_region_num_rectangles (blended_region);
-
- for (i = 0; i < n_rects; i++)
- {
- cairo_rectangle_int_t rect;
- cairo_region_get_rectangle (blended_region, i, &rect);
-
- if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
- continue;
-
- paint_clipped_rectangle (fb, blended_pipeline, &rect, &alloc);
- }
- }
- else
- {
- cogl_framebuffer_draw_rectangle (fb, blended_pipeline,
- 0, 0,
- alloc.x2 - alloc.x1,
- alloc.y2 - alloc.y1);
- }
-
- cogl_object_unref (blended_pipeline);
- }
+
+ /* We have three cases:
+ * 1) blended_region has rectangles - paint the rectangles.
+ * 2) blended_region is empty - don't paint anything
+ * 3) blended_region is NULL - paint fully-blended.
+ *
+ * 1) and 3) are the times where we have to paint stuff. This tests
+ * for 1) and 3).
+ */
+ if (blended_region == NULL || !cairo_region_is_empty (blended_region))
+ {
+ CoglPipeline *blended_pipeline;
+
+ if (priv->mask_texture == NULL)
+ {
+ blended_pipeline = get_unmasked_pipeline (ctx);
+ }
+ else
+ {
+ blended_pipeline = get_masked_pipeline (ctx);
+ cogl_pipeline_set_layer_texture (blended_pipeline, 1, priv->mask_texture);
+ cogl_pipeline_set_layer_filters (blended_pipeline, 1, filter, filter);
+ }
+
+ cogl_pipeline_set_layer_texture (blended_pipeline, 0, paint_tex);
+ cogl_pipeline_set_layer_filters (blended_pipeline, 0, filter, filter);
+
+ CoglColor color;
+ cogl_color_init_from_4ub (&color, opacity, opacity, opacity, opacity);
+ cogl_pipeline_set_color (blended_pipeline, &color);
+
+ if (blended_region != NULL)
+ {
+ /* 1) blended_region is NULL and not empty. Paint the rectangles. */
+ int i;
+ int n_rects = cairo_region_num_rectangles (blended_region);
+
+ for (i = 0; i < n_rects; i++)
+ {
+ cairo_rectangle_int_t rect;
+ cairo_region_get_rectangle (blended_region, i, &rect);
+
+ if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
+ continue;
+
+ paint_clipped_rectangle (fb, blended_pipeline, &rect, &alloc);
+ }
+ }
+ else
+ {
+ /* 3) blended_region is NULL. Do a full paint. */
+ cogl_framebuffer_draw_rectangle (fb, blended_pipeline,
+ 0, 0,
+ alloc.x2 - alloc.x1,
+ alloc.y2 - alloc.y1);
+ }
+
+ cogl_object_unref (blended_pipeline);
+ }
if (blended_region != NULL)
cairo_region_destroy (blended_region);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]