summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2016-04-21 22:28:58 +0200
committerMatthias Clasen <mclasen@redhat.com>2016-05-05 15:03:58 -0400
commit107b5d7397c2e7c64b3f0e4a54248eade03eb25e (patch)
tree4762b883f83d402619e0fa472d0f91ff1c1bf6a0
parent8efd10c9fdc2375230bca8fd33b8555853e9db68 (diff)
downloadgtk+-107b5d7397c2e7c64b3f0e4a54248eade03eb25e.tar.gz
cssshadowsvalue: Avoid allocating new value if not needed
-rw-r--r--gtk/gtkcssshadowsvalue.c31
-rw-r--r--gtk/gtkcssshadowvalue.c15
2 files changed, 41 insertions, 5 deletions
diff --git a/gtk/gtkcssshadowsvalue.c b/gtk/gtkcssshadowsvalue.c
index 083b536243..b58dde3f11 100644
--- a/gtk/gtkcssshadowsvalue.c
+++ b/gtk/gtkcssshadowsvalue.c
@@ -57,19 +57,40 @@ gtk_css_value_shadows_compute (GtkCssValue *value,
GtkCssStyle *style,
GtkCssStyle *parent_style)
{
- GtkCssValue *result;
- guint i;
+ GtkCssValue *result, *tmp;
+ guint i, j;
if (value->len == 0)
return _gtk_css_value_ref (value);
- result = gtk_css_shadows_value_new (value->values, value->len);
+ result = NULL;
for (i = 0; i < value->len; i++)
{
- result->values[i] = _gtk_css_value_compute (value->values[i], property_id, provider, style, parent_style);
+ tmp = _gtk_css_value_compute (value->values[i], property_id, provider, style, parent_style);
+
+ if (result)
+ {
+ result->values[i] = tmp;
+ }
+ else if (tmp != value->values[i])
+ {
+ result = gtk_css_shadows_value_new (value->values, value->len);
+ for (j = 0; j < i; j++)
+ {
+ _gtk_css_value_ref (result->values[j]);
+ }
+ result->values[i] = tmp;
+ }
+ else
+ {
+ _gtk_css_value_unref (tmp);
+ }
}
- return result;
+ if (result != NULL)
+ return result;
+ else
+ return _gtk_css_value_ref (value);
}
static gboolean
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c
index c06de2d0f1..93b4dcf927 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -77,6 +77,21 @@ gtk_css_value_shadow_compute (GtkCssValue *shadow,
spread = _gtk_css_value_compute (shadow->spread, property_id, provider, style, parent_style),
color = _gtk_css_value_compute (shadow->color, property_id, provider, style, parent_style);
+ if (hoffset == shadow->hoffset &&
+ voffset == shadow->voffset &&
+ radius == shadow->radius &&
+ spread == shadow->spread &&
+ color == shadow->color)
+ {
+ _gtk_css_value_unref (hoffset);
+ _gtk_css_value_unref (voffset);
+ _gtk_css_value_unref (radius);
+ _gtk_css_value_unref (spread);
+ _gtk_css_value_unref (color);
+
+ return _gtk_css_value_ref (shadow);
+ }
+
return gtk_css_shadow_value_new (hoffset, voffset, radius, spread, shadow->inset, color);
}