mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-16 13:40:31 +00:00
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.
This commit is contained in:
parent
73e6a05e38
commit
cb3393f001
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user