summaryrefslogtreecommitdiff
path: root/gtk/gtkcssprovider.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2012-12-10 11:27:43 +0100
committerAlexander Larsson <alexl@redhat.com>2012-12-10 12:11:02 +0100
commiteb4667b6e1672043a9d9ff75a959e82b133618a7 (patch)
treeb3de73953df014d2312a329ba3c7513264be36f2 /gtk/gtkcssprovider.c
parent03c626bb15277c41c11aaee5a6ac6f220a2c4be7 (diff)
downloadgtk+-eb4667b6e1672043a9d9ff75a959e82b133618a7.tar.gz
css: Do get_change directly on the tree without matching first
Rather than first collecting matches and then getting the change for them we do the change collection directly on the tree. This is about twice as fast.
Diffstat (limited to 'gtk/gtkcssprovider.c')
-rw-r--r--gtk/gtkcssprovider.c70
1 files changed, 46 insertions, 24 deletions
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index a8e13edfab..7512668474 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -1273,12 +1273,6 @@ gtk_css_ruleset_add (GtkCssRuleset *ruleset,
ruleset->styles[i].section = NULL;
}
-static GtkCssChange
-gtk_css_ruleset_get_change (GtkCssRuleset *ruleset)
-{
- return _gtk_css_selector_tree_match_get_change (ruleset->selector_match);
-}
-
static void
gtk_css_scanner_destroy (GtkCssScanner *scanner)
{
@@ -1441,6 +1435,49 @@ verify_tree_match_results (GtkCssProvider *provider,
#endif
}
+static void
+verify_tree_get_change_results (GtkCssProvider *provider,
+ const GtkCssMatcher *matcher,
+ GtkCssChange change)
+{
+#ifdef VERIFY_TREE
+ {
+ GtkCssChange verify_change = 0;
+ GPtrArray *tree_rules;
+ int i;
+
+ tree_rules = _gtk_css_selector_tree_match_all (provider->priv->tree, matcher);
+ verify_tree_match_results (provider, matcher, tree_rules);
+
+ for (i = tree_rules->len - 1; i >= 0; i--)
+ {
+ GtkCssRuleset *ruleset;
+
+ ruleset = tree_rules->pdata[i];
+
+ verify_change |= _gtk_css_selector_tree_match_get_change (ruleset->selector_match);
+ }
+
+ if (change != verify_change)
+ {
+ GString *s;
+
+ s = g_string_new ("");
+ g_string_append_printf (s, "expected change 0x%x, but it was 0x%x", verify_change, change);
+ if ((change & ~verify_change) != 0)
+ g_string_append_printf (s, ", unexpectedly set: 0x%x", change & ~verify_change);
+ if ((~change & verify_change) != 0)
+ g_string_append_printf (s, ", unexpectedly no set: 0x%x", ~change & verify_change);
+ g_warning (s->str);
+ g_string_free (s, TRUE);
+ }
+
+ g_ptr_array_free (tree_rules, TRUE);
+ }
+#endif
+}
+
+
static gboolean
gtk_css_provider_get_style_property (GtkStyleProvider *provider,
GtkWidgetPath *path,
@@ -1585,29 +1622,14 @@ gtk_css_style_provider_get_change (GtkStyleProviderPrivate *provider,
{
GtkCssProvider *css_provider;
GtkCssProviderPrivate *priv;
- GtkCssChange change = 0;
- GPtrArray *tree_rules;
- int i;
+ GtkCssChange change;
css_provider = GTK_CSS_PROVIDER (provider);
priv = css_provider->priv;
- tree_rules = _gtk_css_selector_tree_match_all (priv->tree, matcher);
- verify_tree_match_results (css_provider, matcher, tree_rules);
-
- for (i = tree_rules->len - 1; i >= 0; i--)
- {
- GtkCssRuleset *ruleset;
-
- ruleset = tree_rules->pdata[i];
+ change = _gtk_css_selector_tree_get_change_all (priv->tree, matcher);
- if (ruleset->styles == NULL)
- continue;
-
- change |= gtk_css_ruleset_get_change (ruleset);
- }
-
- g_ptr_array_free (tree_rules, TRUE);
+ verify_tree_get_change_results (css_provider, matcher, change);
return change;
}