[gtk+] cssvalue: First step of proper dependency tracking
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] cssvalue: First step of proper dependency tracking
- Date: Tue, 28 Aug 2012 13:47:47 +0000 (UTC)
commit 012526241a1024256459c127065603a5fd11cfd3
Author: Benjamin Otte <otte redhat com>
Date: Sat Aug 25 01:59:13 2012 +0200
cssvalue: First step of proper dependency tracking
Instead of using the EVERYTHING aka FIXME value for tdependencies,
actually compute the dependencies in a bunch of simple cases.
gtk/gtkcssbordervalue.c | 6 +++---
gtk/gtkcsscornervalue.c | 8 ++++----
gtk/gtkcssinheritvalue.c | 17 ++++++++++-------
gtk/gtkcssnumbervalue.c | 4 ++--
gtk/gtkcsspositionvalue.c | 8 ++++----
gtk/gtkcsstypes.c | 8 ++++++++
gtk/gtkcsstypesprivate.h | 6 ++++--
7 files changed, 35 insertions(+), 22 deletions(-)
---
diff --git a/gtk/gtkcssbordervalue.c b/gtk/gtkcssbordervalue.c
index 085e3f2..dab4631 100644
--- a/gtk/gtkcssbordervalue.c
+++ b/gtk/gtkcssbordervalue.c
@@ -48,11 +48,10 @@ gtk_css_value_border_compute (GtkCssValue *value,
GtkCssDependencies *dependencies)
{
GtkCssValue *computed;
+ GtkCssDependencies child_deps;
gboolean changed = FALSE;
guint i;
- *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING;
-
computed = _gtk_css_border_value_new (NULL, NULL, NULL, NULL);
computed->fill = value->fill;
@@ -60,7 +59,8 @@ gtk_css_value_border_compute (GtkCssValue *value,
{
if (value->values[i])
{
- computed->values[i] = _gtk_css_value_compute (value->values[i], property_id, context, NULL);
+ computed->values[i] = _gtk_css_value_compute (value->values[i], property_id, context, &child_deps);
+ *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
changed |= (computed->values[i] != value->values[i]);
}
}
diff --git a/gtk/gtkcsscornervalue.c b/gtk/gtkcsscornervalue.c
index 8710243..d26dffd 100644
--- a/gtk/gtkcsscornervalue.c
+++ b/gtk/gtkcsscornervalue.c
@@ -43,11 +43,11 @@ gtk_css_value_corner_compute (GtkCssValue *corner,
GtkCssDependencies *dependencies)
{
GtkCssValue *x, *y;
+ GtkCssDependencies x_deps, y_deps;
- *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING;
-
- x = _gtk_css_value_compute (corner->x, property_id, context, NULL);
- y = _gtk_css_value_compute (corner->y, property_id, context, NULL);
+ x = _gtk_css_value_compute (corner->x, property_id, context, &x_deps);
+ y = _gtk_css_value_compute (corner->y, property_id, context, &y_deps);
+ *dependencies = _gtk_css_dependencies_union (x_deps, y_deps);
if (x == corner->x && y == corner->y)
{
_gtk_css_value_unref (x);
diff --git a/gtk/gtkcssinheritvalue.c b/gtk/gtkcssinheritvalue.c
index 58964be..d70200d 100644
--- a/gtk/gtkcssinheritvalue.c
+++ b/gtk/gtkcssinheritvalue.c
@@ -41,15 +41,18 @@ gtk_css_value_inherit_compute (GtkCssValue *value,
{
GtkStyleContext *parent = gtk_style_context_get_parent (context);
- *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING;
-
if (parent)
- return _gtk_css_value_ref (_gtk_style_context_peek_property (parent, property_id));
+ {
+ *dependencies = GTK_CSS_EQUALS_PARENT;
+ return _gtk_css_value_ref (_gtk_style_context_peek_property (parent, property_id));
+ }
else
- return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)),
- property_id,
- context,
- NULL);
+ {
+ return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)),
+ property_id,
+ context,
+ dependencies);
+ }
}
static gboolean
diff --git a/gtk/gtkcssnumbervalue.c b/gtk/gtkcssnumbervalue.c
index 535c205..db9e154 100644
--- a/gtk/gtkcssnumbervalue.c
+++ b/gtk/gtkcssnumbervalue.c
@@ -74,8 +74,6 @@ gtk_css_value_number_compute (GtkCssValue *number,
break;
}
- *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING;
-
switch (number->unit)
{
default:
@@ -107,12 +105,14 @@ gtk_css_value_number_compute (GtkCssValue *number,
GTK_CSS_PX);
break;
case GTK_CSS_EM:
+ *dependencies = GTK_CSS_DEPENDS_ON_FONT_SIZE;
return _gtk_css_number_value_new (number->value *
_gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_FONT_SIZE), 100),
GTK_CSS_PX);
break;
case GTK_CSS_EX:
/* for now we pretend ex is half of em */
+ *dependencies = GTK_CSS_DEPENDS_ON_FONT_SIZE;
return _gtk_css_number_value_new (number->value * 0.5 *
_gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_FONT_SIZE), 100),
GTK_CSS_PX);
diff --git a/gtk/gtkcsspositionvalue.c b/gtk/gtkcsspositionvalue.c
index 6a6cbe3..e69147a 100644
--- a/gtk/gtkcsspositionvalue.c
+++ b/gtk/gtkcsspositionvalue.c
@@ -43,9 +43,11 @@ gtk_css_value_position_compute (GtkCssValue *position,
GtkCssDependencies *dependencies)
{
GtkCssValue *x, *y;
+ GtkCssDependencies x_deps, y_deps;
- x = _gtk_css_value_compute (position->x, property_id, context, NULL);
- y = _gtk_css_value_compute (position->y, property_id, context, NULL);
+ x = _gtk_css_value_compute (position->x, property_id, context, &x_deps);
+ y = _gtk_css_value_compute (position->y, property_id, context, &y_deps);
+ *dependencies = _gtk_css_dependencies_union (x_deps, y_deps);
if (x == position->x && y == position->y)
{
_gtk_css_value_unref (x);
@@ -53,8 +55,6 @@ gtk_css_value_position_compute (GtkCssValue *position,
return _gtk_css_value_ref (position);
}
- *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING;
-
return _gtk_css_position_value_new (x, y);
}
diff --git a/gtk/gtkcsstypes.c b/gtk/gtkcsstypes.c
index b69b0fe..e67dcea 100644
--- a/gtk/gtkcsstypes.c
+++ b/gtk/gtkcsstypes.c
@@ -82,3 +82,11 @@ _gtk_css_change_for_child (GtkCssChange match)
return gtk_css_change_translate (match, table, G_N_ELEMENTS (table));
}
+GtkCssDependencies
+_gtk_css_dependencies_union (GtkCssDependencies first,
+ GtkCssDependencies second)
+{
+ return (first & ~GTK_CSS_EQUALS_PARENT) | ((first & GTK_CSS_EQUALS_PARENT) ? GTK_CSS_DEPENDS_ON_PARENT : 0)
+ | (second & ~GTK_CSS_EQUALS_PARENT) | ((second & GTK_CSS_EQUALS_PARENT) ? GTK_CSS_DEPENDS_ON_PARENT : 0);
+}
+
diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h
index dfc9527..a77bd8c 100644
--- a/gtk/gtkcsstypesprivate.h
+++ b/gtk/gtkcsstypesprivate.h
@@ -170,8 +170,10 @@ typedef enum /*< skip >*/ {
GTK_CSS_MS,
} GtkCssUnit;
-GtkCssChange _gtk_css_change_for_sibling (GtkCssChange match);
-GtkCssChange _gtk_css_change_for_child (GtkCssChange match);
+GtkCssChange _gtk_css_change_for_sibling (GtkCssChange match);
+GtkCssChange _gtk_css_change_for_child (GtkCssChange match);
+GtkCssDependencies _gtk_css_dependencies_union (GtkCssDependencies first,
+ GtkCssDependencies second);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]