summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-02-10 19:32:25 -0500
committerMatthias Clasen <mclasen@redhat.com>2020-05-17 22:52:55 -0400
commit91120d3f46570dcb3c12558bc384ad10adf0a40c (patch)
tree72c5ec44f0ea310d8b64b6d4be6f3b2d2faceec9
parent37c299dfcb14dd0b1540a97bb452a69071a8a73e (diff)
downloadgtk+-91120d3f46570dcb3c12558bc384ad10adf0a40c.tar.gz
cssnode: Reused cached lookups
When we determine that the lookup won't change, reuse the cached lookup by passing it to to gtk_css_static_style_new_compute.
-rw-r--r--gtk/gtkcssnode.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c
index 389eb4d722..d9bcac4489 100644
--- a/gtk/gtkcssnode.c
+++ b/gtk/gtkcssnode.c
@@ -356,20 +356,14 @@ store_in_global_parent_cache (GtkCssNode *node,
}
static GtkCssStyle *
-gtk_css_node_create_style (GtkCssNode *cssnode,
- GtkCssStyle *static_style,
- const GtkCountingBloomFilter *filter,
- GtkCssChange change)
+compute_style (GtkStyleProvider *provider,
+ const GtkCountingBloomFilter *filter,
+ GtkCssNode *cssnode,
+ GtkCssLookup *lookup,
+ GtkCssChange change)
{
const GtkCssNodeDeclaration *decl;
GtkCssStyle *style;
- GtkCssChange style_change;
-
- style_change = gtk_css_static_style_get_change (GTK_CSS_STATIC_STYLE (static_style));
-
- if ((change & GTK_CSS_RADICAL_CHANGE) == 0 &&
- (change & style_change) == 0)
- return g_object_ref (static_style);
decl = gtk_css_node_get_declaration (cssnode);
style = lookup_in_global_parent_cache (cssnode, decl);
@@ -378,20 +372,39 @@ gtk_css_node_create_style (GtkCssNode *cssnode,
created_styles++;
- if (change & GTK_CSS_CHANGE_NEEDS_RECOMPUTE)
- style_change = 0;
-
- style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode),
- filter,
- cssnode,
- NULL,
- style_change);
-
+ style = gtk_css_static_style_new_compute (provider, filter, cssnode, lookup, change);
store_in_global_parent_cache (cssnode, decl, style);
return style;
}
+static GtkCssStyle *
+gtk_css_node_create_style (GtkCssNode *cssnode,
+ GtkCssStyle *style,
+ const GtkCountingBloomFilter *filter,
+ GtkCssChange change)
+{
+ GtkCssStyle *new_style;
+ GtkCssChange style_change;
+ GtkCssLookup *lookup;
+ GtkStyleProvider *provider;
+
+ provider = gtk_css_node_get_style_provider (cssnode);
+ style_change = gtk_css_static_style_get_change (GTK_CSS_STATIC_STYLE (style));
+ lookup = gtk_css_static_style_get_lookup (GTK_CSS_STATIC_STYLE (style));
+
+ if (change & (GTK_CSS_RADICAL_CHANGE & ~GTK_CSS_CHANGE_PARENT_STYLE))
+ new_style = compute_style (provider, filter, cssnode, NULL, 0);
+ else if (change & style_change)
+ new_style = compute_style (provider, filter, cssnode, NULL, style_change);
+ else if (change & GTK_CSS_CHANGE_PARENT_STYLE)
+ new_style = compute_style (provider, filter, cssnode, lookup, style_change);
+ else
+ new_style = g_object_ref (style);
+
+ return new_style;
+}
+
static gboolean
should_create_transitions (GtkCssChange change)
{