[gtk+] css: Avoid excessive shadow rendering
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] css: Avoid excessive shadow rendering
- Date: Tue, 2 Dec 2014 13:34:44 +0000 (UTC)
commit cb3393f001b432cf863dc3d2e8eba63b5a8a6647
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 d3847ba..4ea2f76 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -638,9 +638,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 == >K_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);
@@ -658,7 +664,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);
@@ -667,12 +672,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]