[mutter/wip/carlosg/performance-improvements: 14/23] compositor: Ensure to clip partial shadow redraws



commit af973f92e7451aa0e63466875036a10095067ca5
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat May 6 17:34:56 2017 +0200

    compositor: Ensure to clip partial shadow redraws
    
    Otherwise we end up drawing too far outside the clip area, which
    brings in artifacts now that we have tighter regions instead of
    an overlapping rect.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=782344

 src/compositor/meta-window-actor.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)
---
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index 1184cd4..4306124 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -717,6 +717,7 @@ meta_window_actor_paint (ClutterActor *actor)
       cairo_rectangle_int_t shape_bounds;
       cairo_region_t *clip = priv->shadow_clip;
       MetaWindow *window = priv->window;
+      gboolean partially_drawn = FALSE;
 
       meta_window_actor_get_shape_bounds (self, &shape_bounds);
       meta_window_actor_get_shadow_params (self, appears_focused, &params);
@@ -734,6 +735,17 @@ meta_window_actor_paint (ClutterActor *actor)
 
           cairo_region_subtract (clip, frame_bounds);
         }
+      else if (clip)
+        {
+          cairo_rectangle_int_t shadow_bounds;
+          cairo_region_t *shadow_region;
+
+          meta_window_actor_get_shadow_bounds (self, appears_focused, &shadow_bounds);
+          shadow_region = cairo_region_create_rectangle (&shadow_bounds);
+          cairo_region_intersect (shadow_region, clip);
+          partially_drawn = !cairo_region_is_empty (shadow_region);
+          cairo_region_destroy (shadow_region);
+        }
 
       meta_shadow_paint (shadow,
                          params.x_offset + shape_bounds.x,
@@ -742,7 +754,7 @@ meta_window_actor_paint (ClutterActor *actor)
                          shape_bounds.height,
                          (clutter_actor_get_paint_opacity (actor) * params.opacity * window->opacity) / (255 
* 255),
                          clip,
-                         clip_shadow_under_window (self)); /* clip_strictly - not just as an optimization */
+                         clip_shadow_under_window (self) || partially_drawn);
 
       if (clip && clip != priv->shadow_clip)
         cairo_region_destroy (clip);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]