[gtk+/gtk-3-14] css: Avoid excessive shadow rendering



commit 40aadf8502a05b9c230665e068a11bbb1cb15ca2
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Dec 2 08:29:24 2014 -0500

    css: Avoid excessive shadow rendering
    
    The shadow rendering code had code to exit early if we determine
    that the shadow is entirely clipped away. Unfortunately, the check
    based on cairo clip extents fails for any clip regions that are
    more complicated than axis-aligned rectangles, and we are using
    a hollow rounded rectangle here. So, instead, do the check manually,
    using the just-introduced API in GtkRoundedBox.

 gtk/gtkcssshadowvalue.c |   13 ++++++-------
 1 files changed, 6 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c
index 7f72698..2432f10 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -527,9 +527,15 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue   *shadow,
 {
   GtkRoundedBox box, clip_box;
   double spread, radius, clip_radius, x, y, outside;
+  double x1, y1, x2, y2;
 
   g_return_if_fail (shadow->class == &GTK_CSS_VALUE_SHADOW);
 
+  cairo_clip_extents (cr, &x1, &y1, &x2, &y2);
+  if ((shadow->inset && !_gtk_rounded_box_intersects_rectangle (padding_box, x1, y1, x2, y2)) ||
+      (!shadow->inset && _gtk_rounded_box_contains_rectangle (padding_box, x1, y1, x2, y2)))
+    return;
+
   cairo_save (cr);
 
   spread = _gtk_css_number_value_get (shadow->spread, 0);
@@ -547,7 +553,6 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue   *shadow,
     {
       cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
       _gtk_rounded_box_path (padding_box, cr);
-
       outside = spread + clip_radius + MAX (fabs (x), fabs (y));
       clip_box = *padding_box;
       _gtk_rounded_box_grow (&clip_box, outside, outside, outside, outside);
@@ -556,12 +561,6 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue   *shadow,
       cairo_clip (cr);
     }
 
-  if (has_empty_clip (cr))
-    {
-      cairo_restore (cr);
-      return;
-    }
-
   box = *padding_box;
   _gtk_rounded_box_move (&box, x, y);
 


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