diff --git a/gtk/gtkcsscalcvalue.c b/gtk/gtkcsscalcvalue.c index e10e790b23..8a2741a89e 100644 --- a/gtk/gtkcsscalcvalue.c +++ b/gtk/gtkcsscalcvalue.c @@ -150,15 +150,6 @@ gtk_css_value_calc_equal (const GtkCssValue *value1, return TRUE; } -static GtkCssValue * -gtk_css_value_calc_transition (GtkCssValue *start, - GtkCssValue *end, - guint property_id, - double progress) -{ - return NULL; -} - static void gtk_css_value_calc_print (const GtkCssValue *value, GString *string) @@ -257,7 +248,7 @@ static const GtkCssNumberValueClass GTK_CSS_VALUE_CALC = { gtk_css_value_calc_free, gtk_css_value_calc_compute, gtk_css_value_calc_equal, - gtk_css_value_calc_transition, + gtk_css_number_value_transition, gtk_css_value_calc_print }, gtk_css_value_calc_get, diff --git a/gtk/gtkcssdimensionvalue.c b/gtk/gtkcssdimensionvalue.c index 87efb7a6d6..92c2d99cda 100644 --- a/gtk/gtkcssdimensionvalue.c +++ b/gtk/gtkcssdimensionvalue.c @@ -167,21 +167,6 @@ gtk_css_value_dimension_equal (const GtkCssValue *number1, number1->value == number2->value; } -static GtkCssValue * -gtk_css_value_dimension_transition (GtkCssValue *start, - GtkCssValue *end, - guint property_id, - double progress) -{ - /* FIXME: This needs to be supported at least for percentages, - * but for that we kinda need to support calc(5px + 50%) */ - if (start->unit != end->unit) - return NULL; - - return gtk_css_dimension_value_new (start->value + (end->value - start->value) * progress, - start->unit); -} - static void gtk_css_value_dimension_print (const GtkCssValue *number, GString *string) @@ -290,7 +275,7 @@ static const GtkCssNumberValueClass GTK_CSS_VALUE_DIMENSION = { gtk_css_value_dimension_free, gtk_css_value_dimension_compute, gtk_css_value_dimension_equal, - gtk_css_value_dimension_transition, + gtk_css_number_value_transition, gtk_css_value_dimension_print }, gtk_css_value_dimension_get, diff --git a/gtk/gtkcssnumbervalue.c b/gtk/gtkcssnumbervalue.c index d685fda902..80239d6f4d 100644 --- a/gtk/gtkcssnumbervalue.c +++ b/gtk/gtkcssnumbervalue.c @@ -106,6 +106,25 @@ _gtk_css_number_value_new (double value, return gtk_css_dimension_value_new (value, unit); } +GtkCssValue * +gtk_css_number_value_transition (GtkCssValue *start, + GtkCssValue *end, + guint property_id, + double progress) +{ + GtkCssValue *result, *mul_start, *mul_end; + + mul_start = gtk_css_number_value_multiply (start, 1 - progress); + mul_end = gtk_css_number_value_multiply (end, progress); + + result = gtk_css_number_value_add (mul_start, mul_end); + + _gtk_css_value_unref (mul_start); + _gtk_css_value_unref (mul_end); + + return result; +} + gboolean gtk_css_number_value_can_parse (GtkCssParser *parser) { diff --git a/gtk/gtkcssnumbervalueprivate.h b/gtk/gtkcssnumbervalueprivate.h index 7cb750f87c..ddded6674c 100644 --- a/gtk/gtkcssnumbervalueprivate.h +++ b/gtk/gtkcssnumbervalueprivate.h @@ -54,6 +54,10 @@ struct _GtkCssNumberValueClass { GtkCssValue * _gtk_css_number_value_new (double value, GtkCssUnit unit); +GtkCssValue * gtk_css_number_value_transition (GtkCssValue *start, + GtkCssValue *end, + guint property_id, + double progress); gboolean gtk_css_number_value_can_parse (GtkCssParser *parser); GtkCssValue * _gtk_css_number_value_parse (GtkCssParser *parser, GtkCssNumberParseFlags flags); diff --git a/gtk/gtkcssvalue.c b/gtk/gtkcssvalue.c index 97804157b3..b9755cf6c4 100644 --- a/gtk/gtkcssvalue.c +++ b/gtk/gtkcssvalue.c @@ -136,7 +136,9 @@ _gtk_css_value_transition (GtkCssValue *start, gtk_internal_return_val_if_fail (start != NULL, FALSE); gtk_internal_return_val_if_fail (end != NULL, FALSE); - if (start->class != end->class) + /* We compare functions here instead of classes so that number + * values can all transition to each other */ + if (start->class->transition != end->class->transition) return NULL; return start->class->transition (start, end, property_id, progress);