[gtk/wip/matthiasc/css-values: 2/5] css: Avoid computing change too often
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/matthiasc/css-values: 2/5] css: Avoid computing change too often
- Date: Wed, 15 Jan 2020 13:09:41 +0000 (UTC)
commit d0f75d9231bb8769f45ccc49563fe32ee124c170
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Jan 15 02:35:21 2020 -0500
css: Avoid computing change too often
Most of the time when styles need to be recreated,
the name and classes of the css node haven't changed.
In this case, the change value will not either, since
we are computing change under the assumption that
name and classes are unchanged, so there is no need
to recompute the change.
gtk/gtkcssnode.c | 20 ++++++++++++++++----
gtk/gtkcssstaticstyle.c | 8 +++++---
gtk/gtkcssstaticstyleprivate.h | 3 ++-
3 files changed, 23 insertions(+), 8 deletions(-)
---
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c
index ec8a74a237..43a4be5231 100644
--- a/gtk/gtkcssnode.c
+++ b/gtk/gtkcssnode.c
@@ -349,12 +349,14 @@ store_in_global_parent_cache (GtkCssNode *node,
}
static GtkCssStyle *
-gtk_css_node_create_style (GtkCssNode *cssnode)
+gtk_css_node_create_style (GtkCssNode *cssnode,
+ GtkCssChange change)
{
const GtkCssNodeDeclaration *decl;
GtkCssMatcher matcher;
GtkCssStyle *parent;
GtkCssStyle *style;
+ gboolean compute_change;
decl = gtk_css_node_get_declaration (cssnode);
@@ -364,14 +366,24 @@ gtk_css_node_create_style (GtkCssNode *cssnode)
parent = cssnode->parent ? cssnode->parent->style : NULL;
+ compute_change = change & GTK_CSS_RADICAL_CHANGE;
+
if (gtk_css_node_init_matcher (cssnode, &matcher))
style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode),
&matcher,
- parent);
+ parent,
+ compute_change);
else
style = gtk_css_static_style_new_compute (gtk_css_node_get_style_provider (cssnode),
NULL,
- parent);
+ parent,
+ compute_change);
+
+ if (!compute_change)
+ {
+ GtkCssStyle *old_style = gtk_css_style_get_static_style (cssnode->style);
+ ((GtkCssStaticStyle *)style)->change = ((GtkCssStaticStyle *)old_style)->change;
+ }
store_in_global_parent_cache (cssnode, decl, style);
@@ -411,7 +423,7 @@ gtk_css_node_real_update_style (GtkCssNode *cssnode,
static_style = gtk_css_style_get_static_style (style);
if (gtk_css_style_needs_recreation (static_style, change))
- new_static_style = gtk_css_node_create_style (cssnode);
+ new_static_style = gtk_css_node_create_style (cssnode, change);
else
new_static_style = g_object_ref (static_style);
diff --git a/gtk/gtkcssstaticstyle.c b/gtk/gtkcssstaticstyle.c
index e702953ba0..0aed811829 100644
--- a/gtk/gtkcssstaticstyle.c
+++ b/gtk/gtkcssstaticstyle.c
@@ -159,7 +159,8 @@ gtk_css_static_style_get_default (void)
settings = gtk_settings_get_default ();
default_style = gtk_css_static_style_new_compute (GTK_STYLE_PROVIDER (settings),
NULL,
- NULL);
+ NULL,
+ TRUE);
g_object_set_data_full (G_OBJECT (settings), I_("gtk-default-style"),
default_style, clear_default_style);
}
@@ -170,7 +171,8 @@ gtk_css_static_style_get_default (void)
GtkCssStyle *
gtk_css_static_style_new_compute (GtkStyleProvider *provider,
const GtkCssMatcher *matcher,
- GtkCssStyle *parent)
+ GtkCssStyle *parent,
+ gboolean compute_change)
{
GtkCssStaticStyle *result;
GtkCssLookup lookup;
@@ -182,7 +184,7 @@ gtk_css_static_style_new_compute (GtkStyleProvider *provider,
gtk_style_provider_lookup (provider,
matcher,
&lookup,
- &change);
+ compute_change ? &change : NULL);
result = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
diff --git a/gtk/gtkcssstaticstyleprivate.h b/gtk/gtkcssstaticstyleprivate.h
index 2a00dd0372..aae6dcd056 100644
--- a/gtk/gtkcssstaticstyleprivate.h
+++ b/gtk/gtkcssstaticstyleprivate.h
@@ -55,7 +55,8 @@ GType gtk_css_static_style_get_type (void) G_GNUC_CO
GtkCssStyle * gtk_css_static_style_get_default (void);
GtkCssStyle * gtk_css_static_style_new_compute (GtkStyleProvider *provider,
const GtkCssMatcher *matcher,
- GtkCssStyle *parent);
+ GtkCssStyle *parent,
+ gboolean compute_change);
void gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
GtkStyleProvider *provider,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]