From ffe50c3b674fe23596fd0af855ee8c1a678c3283 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 27 Mar 2012 01:43:12 +0200 Subject: [PATCH] cssvalue: Add _gtk_css_value_equal() For now, we return FALSE for all default css values, so this is not very useful. I also think of this as an optimization equal, not a guaranteed equal, because we don't even have a notion of what "equal" means. For example, for background-repeat, "repeat, repeat" and "repeat" are functionally equivalent. But the cssvalue has no idea that it's used for background-repeat. As a more complicated example, "repeat, no-repeat" and "repeat" are equal to what one sees as long as there's only one image listed background-image-source. But once you start transition'ing to an image with 2 sources, it's different... --- gtk/gtkcssarrayvalue.c | 20 ++++++++++++++++++++ gtk/gtkcssinheritvalue.c | 8 ++++++++ gtk/gtkcssinitialvalue.c | 8 ++++++++ gtk/gtkcssstyleproperty.c | 2 +- gtk/gtkcssvalue.c | 21 +++++++++++++++++++++ gtk/gtkcssvalueprivate.h | 5 +++++ 6 files changed, 63 insertions(+), 1 deletion(-) diff --git a/gtk/gtkcssarrayvalue.c b/gtk/gtkcssarrayvalue.c index ba919da45e..922fdfdeda 100644 --- a/gtk/gtkcssarrayvalue.c +++ b/gtk/gtkcssarrayvalue.c @@ -40,6 +40,25 @@ gtk_css_value_array_free (GtkCssValue *value) g_slice_free1 (sizeof (GtkCssValue) + sizeof (GtkCssValue *) * (value->n_values - 1), value); } +static gboolean +gtk_css_value_array_equal (const GtkCssValue *value1, + const GtkCssValue *value2) +{ + guint i; + + if (value1->n_values != value2->n_values) + return FALSE; + + for (i = 0; i < value1->n_values; i++) + { + if (!_gtk_css_value_equal (value1->values[i], + value2->values[i])) + return FALSE; + } + + return TRUE; +} + static void gtk_css_value_array_print (const GtkCssValue *value, GString *string) @@ -62,6 +81,7 @@ gtk_css_value_array_print (const GtkCssValue *value, static const GtkCssValueClass GTK_CSS_VALUE_ARRAY = { gtk_css_value_array_free, + gtk_css_value_array_equal, gtk_css_value_array_print }; diff --git a/gtk/gtkcssinheritvalue.c b/gtk/gtkcssinheritvalue.c index 99405bbb87..427f7ec09f 100644 --- a/gtk/gtkcssinheritvalue.c +++ b/gtk/gtkcssinheritvalue.c @@ -30,6 +30,13 @@ gtk_css_value_inherit_free (GtkCssValue *value) g_assert_not_reached (); } +static gboolean +gtk_css_value_inherit_equal (const GtkCssValue *value1, + const GtkCssValue *value2) +{ + return TRUE; +} + static void gtk_css_value_inherit_print (const GtkCssValue *value, GString *string) @@ -39,6 +46,7 @@ gtk_css_value_inherit_print (const GtkCssValue *value, static const GtkCssValueClass GTK_CSS_VALUE_INHERIT = { gtk_css_value_inherit_free, + gtk_css_value_inherit_equal, gtk_css_value_inherit_print }; diff --git a/gtk/gtkcssinitialvalue.c b/gtk/gtkcssinitialvalue.c index 32fb1c99fe..73fd38b3ae 100644 --- a/gtk/gtkcssinitialvalue.c +++ b/gtk/gtkcssinitialvalue.c @@ -30,6 +30,13 @@ gtk_css_value_initial_free (GtkCssValue *value) g_assert_not_reached (); } +static gboolean +gtk_css_value_initial_equal (const GtkCssValue *value1, + const GtkCssValue *value2) +{ + return TRUE; +} + static void gtk_css_value_initial_print (const GtkCssValue *value, GString *string) @@ -39,6 +46,7 @@ gtk_css_value_initial_print (const GtkCssValue *value, static const GtkCssValueClass GTK_CSS_VALUE_INITIAL = { gtk_css_value_initial_free, + gtk_css_value_initial_equal, gtk_css_value_initial_print }; diff --git a/gtk/gtkcssstyleproperty.c b/gtk/gtkcssstyleproperty.c index 933dbd47a5..a8bcf2f1cc 100644 --- a/gtk/gtkcssstyleproperty.c +++ b/gtk/gtkcssstyleproperty.c @@ -311,7 +311,7 @@ gtk_css_style_property_real_equal (GtkCssStyleProperty *property, GtkCssValue *value1, GtkCssValue *value2) { - return FALSE; + return _gtk_css_value_equal (value1, value2); } static void diff --git a/gtk/gtkcssvalue.c b/gtk/gtkcssvalue.c index a797f65534..be0d71afdb 100644 --- a/gtk/gtkcssvalue.c +++ b/gtk/gtkcssvalue.c @@ -79,6 +79,13 @@ gtk_css_value_default_free (GtkCssValue *value) g_slice_free (GtkCssValue, value); } +static gboolean +gtk_css_value_default_equal (const GtkCssValue *value1, + const GtkCssValue *value2) +{ + return FALSE; +} + static void gtk_css_value_default_print (const GtkCssValue *value, GString *string) @@ -92,6 +99,7 @@ gtk_css_value_default_print (const GtkCssValue *value, static const GtkCssValueClass GTK_CSS_VALUE_DEFAULT = { gtk_css_value_default_free, + gtk_css_value_default_equal, gtk_css_value_default_print }; @@ -438,6 +446,19 @@ _gtk_css_value_unref (GtkCssValue *value) value->class->free (value); } +gboolean +_gtk_css_value_equal (const GtkCssValue *value1, + const GtkCssValue *value2) +{ + g_return_val_if_fail (value1 != NULL, FALSE); + g_return_val_if_fail (value2 != NULL, FALSE); + + if (value1->class != value2->class) + return FALSE; + + return value1->class->equal (value1, value2); +} + void _gtk_css_value_print (const GtkCssValue *value, GString *string) diff --git a/gtk/gtkcssvalueprivate.h b/gtk/gtkcssvalueprivate.h index 90517b5746..c726e18176 100644 --- a/gtk/gtkcssvalueprivate.h +++ b/gtk/gtkcssvalueprivate.h @@ -48,6 +48,8 @@ typedef struct _GtkCssValueClass GtkCssValueClass; struct _GtkCssValueClass { void (* free) (GtkCssValue *value); + gboolean (* equal) (const GtkCssValue *value1, + const GtkCssValue *value2); void (* print) (const GtkCssValue *value, GString *string); }; @@ -61,6 +63,9 @@ GtkCssValue *_gtk_css_value_alloc (const GtkCssValueClass GtkCssValue *_gtk_css_value_ref (GtkCssValue *value); void _gtk_css_value_unref (GtkCssValue *value); +gboolean _gtk_css_value_equal (const GtkCssValue *value1, + const GtkCssValue *value2); + void _gtk_css_value_print (const GtkCssValue *value, GString *string);