[gtk+/gtk-3-14] css: Avoid excessive shadow rendering
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gtk-3-14] css: Avoid excessive shadow rendering
- Date: Tue, 2 Dec 2014 19:29:16 +0000 (UTC)
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 == >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);
@@ -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]