cssshadowvalue: Only create 2 shadows values for transitions
authorTimm Bäder <mail@baedert.org>
Mon, 13 Jan 2020 07:37:52 +0000 (08:37 +0100)
committerTimm Bäder <mail@baedert.org>
Sat, 18 Jan 2020 07:49:52 +0000 (08:49 +0100)
This is for cases where we want to transition from "no shadow" to
"shadow", which we need quite a lot.

gtk/gtkcssshadowvalue.c

index cc123dc8ccee6e534960f17b241999cb26f132ba..e0213de8be90c8352a912c69ba95da80db42bad7 100644 (file)
@@ -192,17 +192,29 @@ gtk_css_shadow_value_new (GtkCssValue *hoffset,
   return retval;
 }
 
+
+static GtkCssValue transition_inset_singleton  = { &GTK_CSS_VALUE_SHADOW, 1, TRUE, .inset = TRUE };
+static GtkCssValue transition_outset_singleton = { &GTK_CSS_VALUE_SHADOW, 1, TRUE, .inset = FALSE };
+
 GtkCssValue *
 _gtk_css_shadow_value_new_for_transition (GtkCssValue *target)
 {
+  GtkCssValue *result;
+
   g_return_val_if_fail (target->class == &GTK_CSS_VALUE_SHADOW, NULL);
 
-  return gtk_css_shadow_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
-                                   _gtk_css_number_value_new (0, GTK_CSS_PX),
-                                   _gtk_css_number_value_new (0, GTK_CSS_PX),
-                                   _gtk_css_number_value_new (0, GTK_CSS_PX),
-                                   target->inset,
-                                   gtk_css_color_value_new_transparent ());
+  if (target->inset)
+    result = &transition_inset_singleton;
+  else
+    result = &transition_outset_singleton;
+
+  if (G_UNLIKELY (!result->hoffset))
+    {
+      result->hoffset = result->voffset = result->spread = result->radius = _gtk_css_number_value_new (0, GTK_CSS_PX);
+      result->color = gtk_css_color_value_new_transparent ();
+    }
+
+  return _gtk_css_value_ref (result);
 }
 
 enum {