cssdimensionvalue: Implement transition()
authorTimm Bäder <mail@baedert.org>
Tue, 14 Jan 2020 14:35:38 +0000 (15:35 +0100)
committerTimm Bäder <mail@baedert.org>
Sat, 18 Jan 2020 07:49:52 +0000 (08:49 +0100)
Instead of falling back to the generic gtk_css_number_value_transition
(which can allocate multiple new css values), just implement this here.

gtk/gtkcssdimensionvalue.c

index e540a7316ceefbc986f31305e08218215433d362..708dd872f97d10facbf66634bd4be0f75a919589 100644 (file)
@@ -243,13 +243,34 @@ gtk_css_value_dimension_get_calc_term_order (const GtkCssValue *value)
   return 1000 + order_per_unit[value->unit];
 }
 
+static GtkCssValue *
+gtk_css_value_dimension_transition (GtkCssValue *start,
+                                    GtkCssValue *end,
+                                    guint        property_id,
+                                    double       progress)
+{
+  if (progress == 0)
+    return _gtk_css_value_ref (start);
+
+  if (progress == 1)
+    return _gtk_css_value_ref (end);
+
+  if (start == end)
+    return _gtk_css_value_ref (start);
+
+  if (start->unit != end->unit)
+    return NULL;
+
+  return gtk_css_dimension_value_new (start->value + (end->value - start->value) * progress, start->unit);
+}
+
 static const GtkCssNumberValueClass GTK_CSS_VALUE_DIMENSION = {
   {
     "GtkCssDimensionValue",
     gtk_css_value_dimension_free,
     gtk_css_value_dimension_compute,
     gtk_css_value_dimension_equal,
-    gtk_css_number_value_transition,
+    gtk_css_value_dimension_transition,
     NULL,
     NULL,
     gtk_css_value_dimension_print