[mutter] shaped-texture: Fix the logic when the blended region is empty



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]