From 91120d3f46570dcb3c12558bc384ad10adf0a40c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 10 Feb 2020 19:32:25 -0500 Subject: 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. --- gtk/gtkcssnode.c | 53 +++++++++++++++++++++++++++++++++-------------------- 1 file 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) { -- cgit v1.2.1