[gtk/css-style-split] css: Split style into groups



commit 929ef952249d2231428d26d849b026b3790f24b6
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Jan 25 23:16:06 2020 -0500

    css: Split style into groups

 gtk/gtkcsslookup.c             |   49 +-
 gtk/gtkcsslookupprivate.h      |   13 +-
 gtk/gtkcssprovider.c           |    3 -
 gtk/gtkcssstaticstyle.c        | 1056 +++++++++++++++++++++++++++++++++++++++-
 gtk/gtkcssstaticstyleprivate.h |  162 +++++-
 5 files changed, 1205 insertions(+), 78 deletions(-)
---
diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c
index cfe5bfc5c5..704de1560b 100644
--- a/gtk/gtkcsslookup.c
+++ b/gtk/gtkcsslookup.c
@@ -28,11 +28,14 @@ void
 _gtk_css_lookup_init (GtkCssLookup     *lookup)
 {
   memset (lookup, 0, sizeof (*lookup));
+
+  lookup->set_values = _gtk_bitmask_new ();
 }
 
 void
 _gtk_css_lookup_destroy (GtkCssLookup *lookup)
 {
+  _gtk_bitmask_free (lookup->set_values);
 }
 
 gboolean
@@ -41,13 +44,7 @@ _gtk_css_lookup_is_missing (const GtkCssLookup *lookup,
 {
   gtk_internal_return_val_if_fail (lookup != NULL, FALSE);
 
-  return lookup->values[id].value == NULL;
-}
-
-gboolean
-_gtk_css_lookup_all_set (const GtkCssLookup *lookup)
-{
-  return lookup->n_set_values == GTK_CSS_PROPERTY_N_PROPERTIES;
+  return !_gtk_bitmask_get (lookup->set_values, id);
 }
 
 /**
@@ -75,41 +72,5 @@ _gtk_css_lookup_set (GtkCssLookup  *lookup,
 
   lookup->values[id].value = value;
   lookup->values[id].section = section;
-  lookup->n_set_values ++;
-}
-
-/**
- * _gtk_css_lookup_resolve:
- * @lookup: the lookup
- * @context: the context the values are resolved for
- * @values: a new #GtkCssStyle to be filled with the new properties
- *
- * Resolves the current lookup into a styleproperties object. This is done
- * by converting from the “winning declaration” to the “computed value”.
- *
- * XXX: This bypasses the notion of “specified value”. If this ever becomes
- * an issue, go fix it.
- **/
-void
-_gtk_css_lookup_resolve (GtkCssLookup      *lookup,
-                         GtkStyleProvider  *provider,
-                         GtkCssStaticStyle *style,
-                         GtkCssStyle       *parent_style)
-{
-  guint i;
-
-  gtk_internal_return_if_fail (lookup != NULL);
-  gtk_internal_return_if_fail (GTK_IS_STYLE_PROVIDER (provider));
-  gtk_internal_return_if_fail (GTK_IS_CSS_STATIC_STYLE (style));
-  gtk_internal_return_if_fail (parent_style == NULL || GTK_IS_CSS_STYLE (parent_style));
-
-  for (i = 0; i < GTK_CSS_PROPERTY_N_PROPERTIES; i++)
-    {
-      gtk_css_static_style_compute_value (style,
-                                          provider,
-                                          parent_style,
-                                          i,
-                                          lookup->values[i].value,
-                                          lookup->values[i].section);
-    }
+  lookup->set_values = _gtk_bitmask_set (lookup->set_values, id, TRUE);
 }
diff --git a/gtk/gtkcsslookupprivate.h b/gtk/gtkcsslookupprivate.h
index 34acd504c3..b433264c55 100644
--- a/gtk/gtkcsslookupprivate.h
+++ b/gtk/gtkcsslookupprivate.h
@@ -36,7 +36,7 @@ typedef struct {
 } GtkCssLookupValue;
 
 struct _GtkCssLookup {
-  guint              n_set_values;
+  GtkBitmask *set_values;
   GtkCssLookupValue  values[GTK_CSS_PROPERTY_N_PROPERTIES];
 };
 
@@ -44,15 +44,16 @@ void                    _gtk_css_lookup_init                    (GtkCssLookup
 void                    _gtk_css_lookup_destroy                 (GtkCssLookup               *lookup);
 gboolean                _gtk_css_lookup_is_missing              (const GtkCssLookup         *lookup,
                                                                  guint                       id);
-gboolean                _gtk_css_lookup_all_set                 (const GtkCssLookup         *lookup);
 void                    _gtk_css_lookup_set                     (GtkCssLookup               *lookup,
                                                                  guint                       id,
                                                                  GtkCssSection              *section,
                                                                  GtkCssValue                *value);
-void                    _gtk_css_lookup_resolve                 (GtkCssLookup               *lookup,
-                                                                 GtkStyleProvider           *provider,
-                                                                 GtkCssStaticStyle          *style,
-                                                                 GtkCssStyle                *parent_style);
+
+static inline const GtkBitmask *
+_gtk_css_lookup_get_set_values (const GtkCssLookup *lookup)
+{
+  return lookup->set_values;
+}
 
 G_END_DECLS
 
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index 6c25afae67..71ecd5e84f 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -487,9 +487,6 @@ gtk_css_style_provider_lookup (GtkStyleProvider    *provider,
                                    ruleset->styles[j].section,
                                    ruleset->styles[j].value);
             }
-
-          if (_gtk_css_lookup_all_set (lookup))
-            break;
         }
 
       g_ptr_array_free (tree_rules, TRUE);
diff --git a/gtk/gtkcssstaticstyle.c b/gtk/gtkcssstaticstyle.c
index 0c6b8da04b..a2656963a5 100644
--- a/gtk/gtkcssstaticstyle.c
+++ b/gtk/gtkcssstaticstyle.c
@@ -39,6 +39,245 @@
 #include "gtkstyleproviderprivate.h"
 #include "gtkcssdimensionvalueprivate.h"
 
+static void gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
+                                                GtkStyleProvider  *provider,
+                                                GtkCssStyle       *parent_style,
+                                                guint              id,
+                                                GtkCssValue       *specified,
+                                                GtkCssSection     *section);
+
+static int core_props[] = {
+  GTK_CSS_PROPERTY_COLOR,
+  GTK_CSS_PROPERTY_DPI,
+  GTK_CSS_PROPERTY_FONT_SIZE,
+  GTK_CSS_PROPERTY_ICON_THEME,
+  GTK_CSS_PROPERTY_ICON_PALETTE
+};
+
+static int background_props[] = {
+  GTK_CSS_PROPERTY_BACKGROUND_COLOR,
+  GTK_CSS_PROPERTY_BOX_SHADOW,
+  GTK_CSS_PROPERTY_BACKGROUND_CLIP,
+  GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
+  GTK_CSS_PROPERTY_BACKGROUND_SIZE,
+  GTK_CSS_PROPERTY_BACKGROUND_POSITION,
+  GTK_CSS_PROPERTY_BACKGROUND_COLOR,
+  GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
+  GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
+  GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE
+};
+
+static int border_props[] = {
+  GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
+  GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
+  GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
+  GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
+  GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
+  GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
+  GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
+  GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
+  GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
+  GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
+  GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
+  GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
+  GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
+  GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
+  GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
+  GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
+  GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
+  GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
+  GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
+  GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH
+};
+
+static int icon_props[] = {
+  GTK_CSS_PROPERTY_ICON_SIZE,
+  GTK_CSS_PROPERTY_ICON_SHADOW,
+  GTK_CSS_PROPERTY_ICON_STYLE,
+};
+
+static int outline_props[] = {
+  GTK_CSS_PROPERTY_OUTLINE_STYLE,
+  GTK_CSS_PROPERTY_OUTLINE_WIDTH,
+  GTK_CSS_PROPERTY_OUTLINE_OFFSET,
+  GTK_CSS_PROPERTY_OUTLINE_TOP_LEFT_RADIUS,
+  GTK_CSS_PROPERTY_OUTLINE_TOP_RIGHT_RADIUS,
+  GTK_CSS_PROPERTY_OUTLINE_BOTTOM_RIGHT_RADIUS,
+  GTK_CSS_PROPERTY_OUTLINE_BOTTOM_LEFT_RADIUS,
+  GTK_CSS_PROPERTY_OUTLINE_COLOR,
+};
+
+static int font_props[] = {
+  GTK_CSS_PROPERTY_FONT_FAMILY,
+  GTK_CSS_PROPERTY_FONT_STYLE,
+  GTK_CSS_PROPERTY_FONT_WEIGHT,
+  GTK_CSS_PROPERTY_FONT_STRETCH,
+  GTK_CSS_PROPERTY_LETTER_SPACING,
+  GTK_CSS_PROPERTY_TEXT_SHADOW,  
+  GTK_CSS_PROPERTY_CARET_COLOR,
+  GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR,
+  GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS,
+  GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS,
+};
+static int font_variant_props[] = {
+  GTK_CSS_PROPERTY_TEXT_DECORATION_LINE,
+  GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR,
+  GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE,
+  GTK_CSS_PROPERTY_FONT_KERNING,
+  GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES,
+  GTK_CSS_PROPERTY_FONT_VARIANT_POSITION,
+  GTK_CSS_PROPERTY_FONT_VARIANT_CAPS,
+  GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC,
+  GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES,
+  GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN,
+};
+
+static int animation_props[] = {
+  GTK_CSS_PROPERTY_ANIMATION_NAME,
+  GTK_CSS_PROPERTY_ANIMATION_DURATION,
+  GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION,
+  GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT,
+  GTK_CSS_PROPERTY_ANIMATION_DIRECTION,
+  GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE,
+  GTK_CSS_PROPERTY_ANIMATION_DELAY,
+  GTK_CSS_PROPERTY_ANIMATION_FILL_MODE,
+};
+
+static int transition_props[] = {
+  GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
+  GTK_CSS_PROPERTY_TRANSITION_DURATION,
+  GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
+  GTK_CSS_PROPERTY_TRANSITION_DELAY,
+};
+
+static int size_props[] = {
+  GTK_CSS_PROPERTY_MARGIN_TOP,
+  GTK_CSS_PROPERTY_MARGIN_LEFT,
+  GTK_CSS_PROPERTY_MARGIN_BOTTOM,
+  GTK_CSS_PROPERTY_MARGIN_RIGHT,
+  GTK_CSS_PROPERTY_PADDING_TOP,
+  GTK_CSS_PROPERTY_PADDING_LEFT,
+  GTK_CSS_PROPERTY_PADDING_BOTTOM,
+  GTK_CSS_PROPERTY_PADDING_RIGHT,
+  GTK_CSS_PROPERTY_BORDER_SPACING,
+  GTK_CSS_PROPERTY_MIN_WIDTH,
+  GTK_CSS_PROPERTY_MIN_HEIGHT,
+};
+
+static int other_props[] = {
+  GTK_CSS_PROPERTY_ICON_SOURCE,
+  GTK_CSS_PROPERTY_ICON_TRANSFORM,
+  GTK_CSS_PROPERTY_ICON_FILTER,
+  GTK_CSS_PROPERTY_TRANSFORM,
+  GTK_CSS_PROPERTY_OPACITY,
+  GTK_CSS_PROPERTY_FILTER,
+};
+
+
+typedef struct {
+  int ref_count;
+  GtkCssValue *values[0];
+} GtkCssValues;
+
+#define DEFINE_VALUES(TYPE, NAME) \
+static inline TYPE * \
+gtk_css_ ## NAME ## _values_ref (TYPE *style) \
+{ \
+  style->ref_count++; \
+  return style; \
+} \
+\
+static void \
+gtk_css_ ## NAME ## _values_free (TYPE *style) \
+{ \
+  GtkCssValues *group = (GtkCssValues *)style; \
+  int i; \
+\
+  for (i = 0; i < G_N_ELEMENTS(NAME ## _props); i++) \
+    gtk_css_value_unref (group->values[i]); \
+\
+  g_free (style); \
+} \
+\
+static inline void \
+gtk_css_ ## NAME ## _values_unref (TYPE *style) \
+{ \
+  style->ref_count--; \
+  if (style->ref_count == 0) \
+    gtk_css_ ## NAME ## _values_free (style); \
+} \
+\
+static TYPE * \
+gtk_css_ ## NAME ## _values_new (void) \
+{ \
+  TYPE *style; \
+\
+  style = g_new0 (TYPE, 1); \
+  style->ref_count = 1; \
+\
+  return style; \
+} \
+\
+static inline void \
+gtk_css_ ## NAME ## _values_new_compute (GtkCssStaticStyle *style, \
+                                         GtkStyleProvider *provider, \
+                                         GtkCssStyle *parent_style, \
+                                         GtkCssLookup *lookup) \
+{ \
+  int i; \
+\
+  style->NAME = gtk_css_ ## NAME ## _values_new (); \
+\
+  for (i = 0; i < G_N_ELEMENTS (NAME ## _props); i++) \
+    { \
+      guint id = NAME ## _props[i]; \
+      gtk_css_static_style_compute_value (style, \
+                                          provider, \
+                                          parent_style, \
+                                          id, \
+                                          lookup->values[id].value, \
+                                          lookup->values[id].section); \
+    } \
+} \
+\
+static GtkBitmask * gtk_css_ ## NAME ## _values_mask; \
+static TYPE * gtk_css_ ## NAME ## _initial_values; \
+\
+static TYPE * gtk_css_ ## NAME ## _create_initial_values (void); \
+\
+static void \
+gtk_css_ ## NAME ## _values_init (void) \
+{ \
+  int i; \
+  gtk_css_ ## NAME ## _values_mask = _gtk_bitmask_new (); \
+  for (i = 0; i < G_N_ELEMENTS(NAME ## _props); i++) \
+    { \
+      guint id = NAME ## _props[i]; \
+      gtk_css_ ## NAME ## _values_mask = _gtk_bitmask_set (gtk_css_ ## NAME ## _values_mask, id, TRUE); \
+    } \
+\
+  gtk_css_ ## NAME ## _initial_values = gtk_css_ ## NAME ## _create_initial_values (); \
+} \
+\
+static inline gboolean \
+gtk_css_ ## NAME ## _values_unset (const GtkCssLookup *lookup) \
+{ \
+  const GtkBitmask *set_values = _gtk_css_lookup_get_set_values (lookup); \
+  return !_gtk_bitmask_intersects (set_values, gtk_css_ ## NAME ## _values_mask); \
+}
+
+DEFINE_VALUES (GtkCssCoreValues, core)
+DEFINE_VALUES (GtkCssBackgroundValues, background)
+DEFINE_VALUES (GtkCssBorderValues, border)
+DEFINE_VALUES (GtkCssIconValues, icon)
+DEFINE_VALUES (GtkCssOutlineValues, outline)
+DEFINE_VALUES (GtkCssFontValues, font)
+DEFINE_VALUES (GtkCssFontVariantValues, font_variant)
+DEFINE_VALUES (GtkCssAnimationValues, animation)
+DEFINE_VALUES (GtkCssTransitionValues, transition)
+DEFINE_VALUES (GtkCssSizeValues, size)
+DEFINE_VALUES (GtkCssOtherValues, other)
+
 G_DEFINE_TYPE (GtkCssStaticStyle, gtk_css_static_style, GTK_TYPE_CSS_STYLE)
 
 static GtkCssValue *
@@ -48,7 +287,200 @@ gtk_css_static_style_get_value (GtkCssStyle *style,
   /* This is called a lot, so we avoid a dynamic type check here */
   GtkCssStaticStyle *sstyle = (GtkCssStaticStyle *) style;
 
-  return sstyle->values[id];
+  switch (id)
+    {
+    case GTK_CSS_PROPERTY_COLOR:
+      return sstyle->core->color;
+    case GTK_CSS_PROPERTY_DPI:
+      return sstyle->core->dpi;
+    case GTK_CSS_PROPERTY_FONT_SIZE:
+      return sstyle->core->font_size;
+    case GTK_CSS_PROPERTY_ICON_THEME:
+      return sstyle->core->icon_theme;
+    case GTK_CSS_PROPERTY_ICON_PALETTE:
+      return sstyle->core->icon_palette;
+    case GTK_CSS_PROPERTY_BACKGROUND_COLOR:
+      return sstyle->background->background_color;
+    case GTK_CSS_PROPERTY_FONT_FAMILY:
+      return sstyle->font->font_family;
+    case GTK_CSS_PROPERTY_FONT_STYLE:
+      return sstyle->font->font_style;
+    case GTK_CSS_PROPERTY_FONT_WEIGHT:
+      return sstyle->font->font_weight;
+    case GTK_CSS_PROPERTY_FONT_STRETCH:
+      return sstyle->font->font_stretch;
+    case GTK_CSS_PROPERTY_LETTER_SPACING:
+      return sstyle->font->letter_spacing;
+    case GTK_CSS_PROPERTY_TEXT_DECORATION_LINE:
+      return sstyle->font_variant->text_decoration_line;
+    case GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR:
+      return sstyle->font_variant->text_decoration_color ? sstyle->font_variant->text_decoration_color : 
sstyle->core->color;
+    case GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE:
+      return sstyle->font_variant->text_decoration_style;
+    case GTK_CSS_PROPERTY_FONT_KERNING:
+      return sstyle->font_variant->font_kerning;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES:
+      return sstyle->font_variant->font_variant_ligatures;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_POSITION:
+      return sstyle->font_variant->font_variant_position;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_CAPS:
+      return sstyle->font_variant->font_variant_caps;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC:
+      return sstyle->font_variant->font_variant_numeric;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES:
+      return sstyle->font_variant->font_variant_alternates;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN:
+      return sstyle->font_variant->font_variant_east_asian;
+    case GTK_CSS_PROPERTY_TEXT_SHADOW:
+      return sstyle->font->text_shadow;
+    case GTK_CSS_PROPERTY_BOX_SHADOW:
+      return sstyle->background->box_shadow;
+    case GTK_CSS_PROPERTY_MARGIN_TOP:
+      return sstyle->size->margin_top;
+    case GTK_CSS_PROPERTY_MARGIN_LEFT:
+      return sstyle->size->margin_left;
+    case GTK_CSS_PROPERTY_MARGIN_BOTTOM:
+      return sstyle->size->margin_bottom;
+    case GTK_CSS_PROPERTY_MARGIN_RIGHT:
+      return sstyle->size->margin_right;
+    case GTK_CSS_PROPERTY_PADDING_TOP:
+      return sstyle->size->padding_top;
+    case GTK_CSS_PROPERTY_PADDING_LEFT:
+      return sstyle->size->padding_left;
+    case GTK_CSS_PROPERTY_PADDING_BOTTOM:
+      return sstyle->size->padding_bottom;
+    case GTK_CSS_PROPERTY_PADDING_RIGHT:
+      return sstyle->size->padding_right;
+    case GTK_CSS_PROPERTY_BORDER_TOP_STYLE:
+      return sstyle->border->border_top_style;
+    case GTK_CSS_PROPERTY_BORDER_TOP_WIDTH:
+      return sstyle->border->border_top_width;
+    case GTK_CSS_PROPERTY_BORDER_LEFT_STYLE:
+      return sstyle->border->border_left_style;
+    case GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH:
+      return sstyle->border->border_left_width;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE:
+      return sstyle->border->border_bottom_style;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH:
+      return sstyle->border->border_bottom_width;
+    case GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE:
+      return sstyle->border->border_right_style;
+    case GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH:
+      return sstyle->border->border_right_width;
+    case GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS:
+      return sstyle->border->border_top_left_radius;
+    case GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS:
+      return sstyle->border->border_top_right_radius;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS:
+      return sstyle->border->border_bottom_right_radius;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS:
+      return sstyle->border->border_bottom_left_radius;
+    case GTK_CSS_PROPERTY_OUTLINE_STYLE:
+      return sstyle->outline->outline_style;
+    case GTK_CSS_PROPERTY_OUTLINE_WIDTH:
+      return sstyle->outline->outline_width;
+    case GTK_CSS_PROPERTY_OUTLINE_OFFSET:
+      return sstyle->outline->outline_offset;
+    case GTK_CSS_PROPERTY_OUTLINE_TOP_LEFT_RADIUS:
+      return sstyle->outline->outline_top_left_radius;
+    case GTK_CSS_PROPERTY_OUTLINE_TOP_RIGHT_RADIUS:
+      return sstyle->outline->outline_top_right_radius;
+    case GTK_CSS_PROPERTY_OUTLINE_BOTTOM_RIGHT_RADIUS:
+      return sstyle->outline->outline_bottom_right_radius;
+    case GTK_CSS_PROPERTY_OUTLINE_BOTTOM_LEFT_RADIUS:
+      return sstyle->outline->outline_bottom_left_radius;
+    case GTK_CSS_PROPERTY_BACKGROUND_CLIP:
+      return sstyle->background->background_clip;
+    case GTK_CSS_PROPERTY_BACKGROUND_ORIGIN:
+      return sstyle->background->background_origin;
+    case GTK_CSS_PROPERTY_BACKGROUND_SIZE:
+      return sstyle->background->background_size;
+    case GTK_CSS_PROPERTY_BACKGROUND_POSITION:
+      return sstyle->background->background_position;
+    case GTK_CSS_PROPERTY_BORDER_TOP_COLOR:
+      return sstyle->border->border_top_color ? sstyle->border->border_top_color : sstyle->core->color;
+    case GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR:
+      return sstyle->border->border_right_color ? sstyle->border->border_right_color : sstyle->core->color;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR:
+      return sstyle->border->border_bottom_color ? sstyle->border->border_bottom_color : sstyle->core->color;
+    case GTK_CSS_PROPERTY_BORDER_LEFT_COLOR:
+      return sstyle->border->border_left_color ? sstyle->border->border_left_color: sstyle->core->color;
+    case GTK_CSS_PROPERTY_OUTLINE_COLOR:
+      return sstyle->outline->outline_color ? sstyle->outline->outline_color : sstyle->core->color;
+    case GTK_CSS_PROPERTY_BACKGROUND_REPEAT:
+      return sstyle->background->background_repeat;
+    case GTK_CSS_PROPERTY_BACKGROUND_IMAGE:
+      return sstyle->background->background_image;
+    case GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE:
+      return sstyle->background->background_blend_mode;
+    case GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE:
+      return sstyle->border->border_image_source;
+    case GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT:
+      return sstyle->border->border_image_repeat;
+    case GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE:
+      return sstyle->border->border_image_slice;
+    case GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH:
+      return sstyle->border->border_image_width;
+    case GTK_CSS_PROPERTY_ICON_SOURCE:
+      return sstyle->other->icon_source;
+    case GTK_CSS_PROPERTY_ICON_SIZE:
+      return sstyle->icon->icon_size;
+    case GTK_CSS_PROPERTY_ICON_SHADOW:
+      return sstyle->icon->icon_shadow;
+    case GTK_CSS_PROPERTY_ICON_STYLE:
+      return sstyle->icon->icon_style;
+    case GTK_CSS_PROPERTY_ICON_TRANSFORM:
+      return sstyle->other->icon_transform;
+    case GTK_CSS_PROPERTY_ICON_FILTER:
+      return sstyle->other->icon_filter;
+    case GTK_CSS_PROPERTY_BORDER_SPACING:
+      return sstyle->size->border_spacing;
+    case GTK_CSS_PROPERTY_TRANSFORM:
+      return sstyle->other->transform;
+    case GTK_CSS_PROPERTY_MIN_WIDTH:
+      return sstyle->size->min_width;
+    case GTK_CSS_PROPERTY_MIN_HEIGHT:
+      return sstyle->size->min_height;
+    case GTK_CSS_PROPERTY_TRANSITION_PROPERTY:
+      return sstyle->transition->transition_property;
+    case GTK_CSS_PROPERTY_TRANSITION_DURATION:
+      return sstyle->transition->transition_duration;
+    case GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION:
+      return sstyle->transition->transition_timing_function;
+    case GTK_CSS_PROPERTY_TRANSITION_DELAY:
+      return sstyle->transition->transition_delay;
+    case GTK_CSS_PROPERTY_ANIMATION_NAME:
+      return sstyle->animation->animation_name;
+    case GTK_CSS_PROPERTY_ANIMATION_DURATION:
+      return sstyle->animation->animation_duration;
+    case GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION:
+      return sstyle->animation->animation_timing_function;
+    case GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT:
+      return sstyle->animation->animation_iteration_count;
+    case GTK_CSS_PROPERTY_ANIMATION_DIRECTION:
+      return sstyle->animation->animation_direction;
+    case GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE:
+      return sstyle->animation->animation_play_state;
+    case GTK_CSS_PROPERTY_ANIMATION_DELAY:
+      return sstyle->animation->animation_delay;
+    case GTK_CSS_PROPERTY_ANIMATION_FILL_MODE:
+      return sstyle->animation->animation_fill_mode;
+    case GTK_CSS_PROPERTY_OPACITY:
+      return sstyle->other->opacity;
+    case GTK_CSS_PROPERTY_FILTER:
+      return sstyle->other->filter;
+    case GTK_CSS_PROPERTY_CARET_COLOR:
+      return sstyle->font->caret_color ? sstyle->font->caret_color : sstyle->core->color;
+    case GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR:
+      return sstyle->font->secondary_caret_color ? sstyle->font->secondary_caret_color : sstyle->core->color;
+    case GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS:
+      return sstyle->font->font_feature_settings;
+    case GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS:
+      return sstyle->font->font_variation_settings;
+
+    default:
+      g_assert_not_reached ();
+    }
 }
 
 static GtkCssSection *
@@ -68,13 +500,19 @@ static void
 gtk_css_static_style_dispose (GObject *object)
 {
   GtkCssStaticStyle *style = GTK_CSS_STATIC_STYLE (object);
-  guint i;
 
-  for (i = 0; i < GTK_CSS_PROPERTY_N_PROPERTIES; i++)
-    {
-      if (style->values[i])
-        _gtk_css_value_unref (style->values[i]);
-    }
+  gtk_css_core_values_unref (style->core);
+  gtk_css_background_values_unref (style->background);
+  gtk_css_border_values_unref (style->border);
+  gtk_css_icon_values_unref (style->icon);
+  gtk_css_outline_values_unref (style->outline);
+  gtk_css_font_values_unref (style->font);
+  gtk_css_font_variant_values_unref (style->font_variant);
+  gtk_css_animation_values_unref (style->animation);
+  gtk_css_transition_values_unref (style->transition);
+  gtk_css_size_values_unref (style->size);
+  gtk_css_other_values_unref (style->other);
+ 
   if (style->sections)
     {
       g_ptr_array_unref (style->sections);
@@ -101,6 +539,18 @@ gtk_css_static_style_class_init (GtkCssStaticStyleClass *klass)
   style_class->get_value = gtk_css_static_style_get_value;
   style_class->get_section = gtk_css_static_style_get_section;
   style_class->get_static_style = gtk_css_static_style_get_static_style;
+
+  gtk_css_core_values_init ();
+  gtk_css_background_values_init ();
+  gtk_css_border_values_init ();
+  gtk_css_icon_values_init ();
+  gtk_css_outline_values_init ();
+  gtk_css_font_values_init ();
+  gtk_css_font_variant_values_init ();
+  gtk_css_animation_values_init ();
+  gtk_css_transition_values_init ();
+  gtk_css_size_values_init ();
+  gtk_css_other_values_init ();
 }
 
 static void
@@ -115,16 +565,310 @@ maybe_unref_section (gpointer section)
     gtk_css_section_unref (section);
 }
 
+static inline void
+gtk_css_take_value (GtkCssValue **variable,
+                   GtkCssValue  *value)
+{
+  if (*variable)
+    gtk_css_value_unref (*variable);
+  *variable = value;
+}
+
 static void
 gtk_css_static_style_set_value (GtkCssStaticStyle *style,
                                 guint              id,
                                 GtkCssValue       *value,
                                 GtkCssSection     *section)
 {
-  if (style->values[id])
-    _gtk_css_value_unref (style->values[id]);
+  switch (id)
+    {
+    case GTK_CSS_PROPERTY_COLOR:
+      gtk_css_take_value (&style->core->color, value);
+      break;
+    case GTK_CSS_PROPERTY_DPI:
+      gtk_css_take_value (&style->core->dpi, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_SIZE:
+      gtk_css_take_value (&style->core->font_size, value);
+      break;
+    case GTK_CSS_PROPERTY_ICON_THEME:
+      gtk_css_take_value (&style->core->icon_theme, value);
+      break;
+    case GTK_CSS_PROPERTY_ICON_PALETTE:
+      gtk_css_take_value (&style->core->icon_palette, value);
+      break;
+    case GTK_CSS_PROPERTY_BACKGROUND_COLOR:
+      gtk_css_take_value (&style->background->background_color, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_FAMILY:
+      gtk_css_take_value (&style->font->font_family, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_STYLE:
+      gtk_css_take_value (&style->font->font_style, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_WEIGHT:
+      gtk_css_take_value (&style->font->font_weight, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_STRETCH:
+      gtk_css_take_value (&style->font->font_stretch, value);
+      break;
+    case GTK_CSS_PROPERTY_LETTER_SPACING:
+      gtk_css_take_value (&style->font->letter_spacing, value);
+      break;
+    case GTK_CSS_PROPERTY_TEXT_DECORATION_LINE:
+      gtk_css_take_value (&style->font_variant->text_decoration_line, value);
+      break;
+    case GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR:
+      gtk_css_take_value (&style->font_variant->text_decoration_color, value);
+      break;
+    case GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE:
+      gtk_css_take_value (&style->font_variant->text_decoration_style, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_KERNING:
+      gtk_css_take_value (&style->font_variant->font_kerning, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES:
+      gtk_css_take_value (&style->font_variant->font_variant_ligatures, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_POSITION:
+      gtk_css_take_value (&style->font_variant->font_variant_position, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_CAPS:
+      gtk_css_take_value (&style->font_variant->font_variant_caps, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC:
+      gtk_css_take_value (&style->font_variant->font_variant_numeric, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES:
+      gtk_css_take_value (&style->font_variant->font_variant_alternates, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN:
+      gtk_css_take_value (&style->font_variant->font_variant_east_asian, value);
+      break;
+    case GTK_CSS_PROPERTY_TEXT_SHADOW:
+      gtk_css_take_value (&style->font->text_shadow, value);
+      break;
+    case GTK_CSS_PROPERTY_BOX_SHADOW:
+      gtk_css_take_value (&style->background->box_shadow, value);
+      break;
+    case GTK_CSS_PROPERTY_MARGIN_TOP:
+      gtk_css_take_value (&style->size->margin_top, value);
+      break;
+    case GTK_CSS_PROPERTY_MARGIN_LEFT:
+      gtk_css_take_value (&style->size->margin_left, value);
+      break;
+    case GTK_CSS_PROPERTY_MARGIN_BOTTOM:
+      gtk_css_take_value (&style->size->margin_bottom, value);
+      break;
+    case GTK_CSS_PROPERTY_MARGIN_RIGHT:
+      gtk_css_take_value (&style->size->margin_right, value);
+      break;
+    case GTK_CSS_PROPERTY_PADDING_TOP:
+      gtk_css_take_value (&style->size->padding_top, value);
+      break;
+    case GTK_CSS_PROPERTY_PADDING_LEFT:
+      gtk_css_take_value (&style->size->padding_left, value);
+      break;
+    case GTK_CSS_PROPERTY_PADDING_BOTTOM:
+      gtk_css_take_value (&style->size->padding_bottom, value);
+      break;
+    case GTK_CSS_PROPERTY_PADDING_RIGHT:
+      gtk_css_take_value (&style->size->padding_right, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_TOP_STYLE:
+      gtk_css_take_value (&style->border->border_top_style, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_TOP_WIDTH:
+      gtk_css_take_value (&style->border->border_top_width, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_LEFT_STYLE:
+      gtk_css_take_value (&style->border->border_left_style, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH:
+      gtk_css_take_value (&style->border->border_left_width, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE:
+      gtk_css_take_value (&style->border->border_bottom_style, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH:
+      gtk_css_take_value (&style->border->border_bottom_width, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE:
+      gtk_css_take_value (&style->border->border_right_style, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH:
+      gtk_css_take_value (&style->border->border_right_width, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS:
+      gtk_css_take_value (&style->border->border_top_left_radius, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS:
+      gtk_css_take_value (&style->border->border_top_right_radius, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS:
+      gtk_css_take_value (&style->border->border_bottom_right_radius, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS:
+      gtk_css_take_value (&style->border->border_bottom_left_radius, value);
+      break;
+    case GTK_CSS_PROPERTY_OUTLINE_STYLE:
+      gtk_css_take_value (&style->outline->outline_style, value);
+      break;
+    case GTK_CSS_PROPERTY_OUTLINE_WIDTH:
+      gtk_css_take_value (&style->outline->outline_width, value);
+      break;
+    case GTK_CSS_PROPERTY_OUTLINE_OFFSET:
+      gtk_css_take_value (&style->outline->outline_offset, value);
+      break;
+    case GTK_CSS_PROPERTY_OUTLINE_TOP_LEFT_RADIUS:
+      gtk_css_take_value (&style->outline->outline_top_left_radius, value);
+      break;
+    case GTK_CSS_PROPERTY_OUTLINE_TOP_RIGHT_RADIUS:
+      gtk_css_take_value (&style->outline->outline_top_right_radius, value);
+      break;
+    case GTK_CSS_PROPERTY_OUTLINE_BOTTOM_RIGHT_RADIUS:
+      gtk_css_take_value (&style->outline->outline_bottom_right_radius, value);
+      break;
+    case GTK_CSS_PROPERTY_OUTLINE_BOTTOM_LEFT_RADIUS:
+      gtk_css_take_value (&style->outline->outline_bottom_left_radius, value);
+      break;
+    case GTK_CSS_PROPERTY_BACKGROUND_CLIP:
+      gtk_css_take_value (&style->background->background_clip, value);
+      break;
+    case GTK_CSS_PROPERTY_BACKGROUND_ORIGIN:
+      gtk_css_take_value (&style->background->background_origin, value);
+      break;
+    case GTK_CSS_PROPERTY_BACKGROUND_SIZE:
+      gtk_css_take_value (&style->background->background_size, value);
+      break;
+    case GTK_CSS_PROPERTY_BACKGROUND_POSITION:
+      gtk_css_take_value (&style->background->background_position, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_TOP_COLOR:
+      gtk_css_take_value (&style->border->border_top_color, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR:
+      gtk_css_take_value (&style->border->border_right_color, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR:
+      gtk_css_take_value (&style->border->border_bottom_color, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_LEFT_COLOR:
+      gtk_css_take_value (&style->border->border_left_color, value);
+      break;
+    case GTK_CSS_PROPERTY_OUTLINE_COLOR:
+      gtk_css_take_value (&style->outline->outline_color, value);
+      break;
+    case GTK_CSS_PROPERTY_BACKGROUND_REPEAT:
+      gtk_css_take_value (&style->background->background_repeat, value);
+      break;
+    case GTK_CSS_PROPERTY_BACKGROUND_IMAGE:
+      gtk_css_take_value (&style->background->background_image, value);
+      break;
+    case GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE:
+      gtk_css_take_value (&style->background->background_blend_mode, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE:
+      gtk_css_take_value (&style->border->border_image_source, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT:
+      gtk_css_take_value (&style->border->border_image_repeat, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE:
+      gtk_css_take_value (&style->border->border_image_slice, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH:
+      gtk_css_take_value (&style->border->border_image_width, value);
+      break;
+    case GTK_CSS_PROPERTY_ICON_SOURCE:
+      gtk_css_take_value (&style->other->icon_source, value);
+      break;
+    case GTK_CSS_PROPERTY_ICON_SIZE:
+      gtk_css_take_value (&style->icon->icon_size, value);
+      break;
+    case GTK_CSS_PROPERTY_ICON_SHADOW:
+      gtk_css_take_value (&style->icon->icon_shadow, value);
+      break;
+    case GTK_CSS_PROPERTY_ICON_STYLE:
+      gtk_css_take_value (&style->icon->icon_style, value);
+      break;
+    case GTK_CSS_PROPERTY_ICON_TRANSFORM:
+      gtk_css_take_value (&style->other->icon_transform, value);
+      break;
+    case GTK_CSS_PROPERTY_ICON_FILTER:
+      gtk_css_take_value (&style->other->icon_filter, value);
+      break;
+    case GTK_CSS_PROPERTY_BORDER_SPACING:
+      gtk_css_take_value (&style->size->border_spacing, value);
+      break;
+    case GTK_CSS_PROPERTY_TRANSFORM:
+      gtk_css_take_value (&style->other->transform, value);
+      break;
+    case GTK_CSS_PROPERTY_MIN_WIDTH:
+      gtk_css_take_value (&style->size->min_width, value);
+      break;
+    case GTK_CSS_PROPERTY_MIN_HEIGHT:
+      gtk_css_take_value (&style->size->min_height, value);
+      break;
+    case GTK_CSS_PROPERTY_TRANSITION_PROPERTY:
+      gtk_css_take_value (&style->transition->transition_property, value);
+      break;
+    case GTK_CSS_PROPERTY_TRANSITION_DURATION:
+      gtk_css_take_value (&style->transition->transition_duration, value);
+      break;
+    case GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION:
+      gtk_css_take_value (&style->transition->transition_timing_function, value);
+      break;
+    case GTK_CSS_PROPERTY_TRANSITION_DELAY:
+      gtk_css_take_value (&style->transition->transition_delay, value);
+      break;
+    case GTK_CSS_PROPERTY_ANIMATION_NAME:
+      gtk_css_take_value (&style->animation->animation_name, value);
+      break;
+    case GTK_CSS_PROPERTY_ANIMATION_DURATION:
+      gtk_css_take_value (&style->animation->animation_duration, value);
+      break;
+    case GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION:
+      gtk_css_take_value (&style->animation->animation_timing_function, value);
+      break;
+    case GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT:
+      gtk_css_take_value (&style->animation->animation_iteration_count, value);
+      break;
+    case GTK_CSS_PROPERTY_ANIMATION_DIRECTION:
+      gtk_css_take_value (&style->animation->animation_direction, value);
+      break;
+    case GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE:
+      gtk_css_take_value (&style->animation->animation_play_state, value);
+      break;
+    case GTK_CSS_PROPERTY_ANIMATION_DELAY:
+      gtk_css_take_value (&style->animation->animation_delay, value);
+      break;
+    case GTK_CSS_PROPERTY_ANIMATION_FILL_MODE:
+      gtk_css_take_value (&style->animation->animation_fill_mode, value);
+      break;
+    case GTK_CSS_PROPERTY_OPACITY:
+      gtk_css_take_value (&style->other->opacity, value);
+      break;
+    case GTK_CSS_PROPERTY_FILTER:
+      gtk_css_take_value (&style->other->filter, value);
+      break;
+    case GTK_CSS_PROPERTY_CARET_COLOR:
+      gtk_css_take_value (&style->font->caret_color, value);
+      break;
+    case GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR:
+      gtk_css_take_value (&style->font->secondary_caret_color, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS:
+      gtk_css_take_value (&style->font->font_feature_settings, value);
+      break;
+    case GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS:
+      gtk_css_take_value (&style->font->font_variation_settings, value);
+      break;
 
-  style->values[id] = value;
+    default:
+      g_assert_not_reached ();
+      break;
+    }
 
   if (style->sections && style->sections->len > id && g_ptr_array_index (style->sections, id))
     {
@@ -138,7 +882,6 @@ gtk_css_static_style_set_value (GtkCssStaticStyle *style,
         style->sections = g_ptr_array_new_with_free_func (maybe_unref_section);
       if (style->sections->len <= id)
         g_ptr_array_set_size (style->sections, id + 1);
-
       g_ptr_array_index (style->sections, id) = gtk_css_section_ref (section);
     }
 }
@@ -175,6 +918,286 @@ gtk_css_static_style_get_default (void)
   return default_style;
 }
 
+static GtkCssCoreValues *
+gtk_css_core_create_initial_values (void)
+{
+  return NULL;
+
+}
+static GtkCssBackgroundValues *
+gtk_css_background_create_initial_values (void)
+{
+  GtkCssBackgroundValues *style;
+
+  /* none of the initial values depend on the context */
+  style = gtk_css_background_values_new ();
+  style->background_color = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_COLOR, NULL, 
NULL, NULL);
+  style->box_shadow = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BOX_SHADOW, NULL, NULL, NULL);
+  style->background_clip = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_CLIP, NULL, NULL, 
NULL);
+  style->background_origin = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_ORIGIN, NULL, 
NULL, NULL);
+  style->background_size = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_SIZE, NULL, NULL, 
NULL);
+  style->background_position = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_POSITION, 
NULL, NULL, NULL);
+  style->background_repeat = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_REPEAT, NULL, 
NULL, NULL);
+  style->background_image = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_IMAGE, NULL, 
NULL, NULL);
+  style->background_blend_mode = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE, 
NULL, NULL, NULL);
+
+  return style;
+}
+
+static GtkCssBorderValues *
+gtk_css_border_create_initial_values (void)
+{
+  GtkCssBorderValues *border;
+
+  border = gtk_css_border_values_new ();
+
+  border->border_top_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_STYLE, NULL, 
NULL, NULL);
+  border->border_top_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_WIDTH, NULL, 
NULL, NULL);
+  border->border_left_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_LEFT_STYLE, NULL, 
NULL, NULL);
+  border->border_left_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH, NULL, 
NULL, NULL);
+  border->border_bottom_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE, 
NULL, NULL, NULL);
+  border->border_bottom_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH, 
NULL, NULL, NULL);
+  border->border_right_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE, 
NULL, NULL, NULL);
+  border->border_right_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH, 
NULL, NULL, NULL);
+  border->border_top_left_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS, NULL, NULL, NULL);
+  border->border_top_right_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS, NULL, NULL, NULL);
+  border->border_bottom_left_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS, NULL, NULL, NULL);
+  border->border_bottom_right_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS, NULL, NULL, NULL);
+  border->border_top_color = NULL;
+  border->border_right_color = NULL;
+  border->border_bottom_color = NULL;
+  border->border_left_color = NULL;
+  border->border_image_source = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE, 
NULL, NULL, NULL);
+  border->border_image_repeat = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE, 
NULL, NULL, NULL);
+  border->border_image_slice = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE, 
NULL, NULL, NULL);
+  border->border_image_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH, 
NULL, NULL, NULL);
+
+  return border;
+}
+
+static GtkCssOutlineValues *
+gtk_css_outline_create_initial_values (void)
+{
+  GtkCssOutlineValues *values;
+
+  values = gtk_css_outline_values_new ();
+
+  values->outline_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_STYLE, NULL, NULL, 
NULL);
+  values->outline_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_WIDTH, NULL, NULL, 
NULL);
+  values->outline_offset = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_OFFSET, NULL, NULL, 
NULL);
+  values->outline_top_left_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_OUTLINE_TOP_LEFT_RADIUS, NULL, NULL, NULL);
+  values->outline_top_right_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_OUTLINE_TOP_RIGHT_RADIUS, NULL, NULL, NULL);
+  values->outline_bottom_right_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_OUTLINE_BOTTOM_RIGHT_RADIUS, NULL, NULL, NULL);
+  values->outline_bottom_left_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_OUTLINE_BOTTOM_LEFT_RADIUS, NULL, NULL, NULL);
+  values->outline_color = NULL;
+
+  return values;
+}
+
+static GtkCssIconValues *
+gtk_css_icon_create_initial_values (void)
+{
+  return NULL;
+}
+
+static GtkCssFontValues *
+gtk_css_font_create_initial_values (void)
+{
+  return NULL;
+}
+
+static GtkCssFontVariantValues *
+gtk_css_font_variant_create_initial_values (void)
+{
+  GtkCssFontVariantValues *values;
+
+  values = gtk_css_font_variant_values_new ();
+
+  values->text_decoration_line = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TEXT_DECORATION_LINE, 
NULL, NULL, NULL);
+  values->text_decoration_color = NULL;
+  values->text_decoration_style = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE, NULL, NULL, NULL);
+  values->font_kerning = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_KERNING, NULL, NULL, 
NULL);
+  values->font_variant_ligatures = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES, NULL, NULL, NULL);
+  values->font_variant_position = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_FONT_VARIANT_POSITION, NULL, NULL, NULL);
+  values->font_variant_caps = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_CAPS, NULL, 
NULL, NULL);
+  values->font_variant_numeric = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC, 
NULL, NULL, NULL);
+  values->font_variant_alternates = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES, NULL, NULL, NULL);
+  values->font_variant_east_asian = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN, NULL, NULL, NULL);
+
+  return values;
+}
+
+static GtkCssAnimationValues *
+gtk_css_animation_create_initial_values (void)
+{
+  GtkCssAnimationValues *values;
+
+  values = gtk_css_animation_values_new ();
+
+  values->animation_name = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_NAME, NULL, NULL, 
NULL);
+  values->animation_duration = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_DURATION, 
NULL, NULL, NULL);
+  values->animation_timing_function = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION, NULL, NULL, NULL);
+  values->animation_iteration_count = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT, NULL, NULL, NULL);
+  values->animation_direction = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_DIRECTION, 
NULL, NULL, NULL);
+  values->animation_play_state = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE, 
NULL, NULL, NULL);
+  values->animation_delay = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_DELAY, NULL, 
NULL, NULL);
+  values->animation_fill_mode = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ANIMATION_FILL_MODE, 
NULL, NULL, NULL);
+
+  return values;
+}
+
+static GtkCssTransitionValues *
+gtk_css_transition_create_initial_values (void)
+{
+  GtkCssTransitionValues *values;
+
+  values = gtk_css_transition_values_new ();
+
+  values->transition_property = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_PROPERTY, 
NULL, NULL, NULL);
+  values->transition_duration = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_DURATION, 
NULL, NULL, NULL);
+  values->transition_timing_function = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION, NULL, NULL, NULL);
+  values->transition_delay = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSITION_DELAY, NULL, 
NULL, NULL);
+
+  return values;
+}
+
+static GtkCssSizeValues *
+gtk_css_size_create_initial_values (void)
+{
+  GtkCssSizeValues *values;
+
+  values = gtk_css_size_values_new ();
+
+  values->margin_top = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_TOP, NULL, NULL, NULL);
+  values->margin_left = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_LEFT, NULL, NULL, NULL);
+  values->margin_bottom = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_BOTTOM, NULL, NULL, 
NULL);
+  values->margin_right = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MARGIN_RIGHT, NULL, NULL, 
NULL);
+  values->padding_top = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_TOP, NULL, NULL, NULL);
+  values->padding_left = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_LEFT, NULL, NULL, 
NULL);
+  values->padding_bottom = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_BOTTOM, NULL, NULL, 
NULL);
+  values->padding_right = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_PADDING_RIGHT, NULL, NULL, 
NULL);
+  values->border_spacing = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_SPACING, NULL, NULL, 
NULL);
+  values->min_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MIN_WIDTH, NULL, NULL, NULL);
+  values->min_height = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_MIN_HEIGHT, NULL, NULL, NULL);
+
+  return values;
+}
+
+static GtkCssOtherValues *
+gtk_css_other_create_initial_values (void)
+{
+  GtkCssOtherValues *values;
+
+  values = gtk_css_other_values_new ();
+
+  values->icon_source = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_SOURCE, NULL, NULL, NULL);
+  values->icon_transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_TRANSFORM, NULL, NULL, 
NULL);
+  values->icon_filter = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_FILTER, NULL, NULL, NULL);
+  values->transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSFORM, NULL, NULL, NULL);
+  values->opacity = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OPACITY, NULL, NULL, NULL);
+  values->filter = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FILTER, NULL, NULL, NULL);
+
+  return values;
+}
+
+static void
+gtk_css_lookup_resolve (GtkCssLookup      *lookup,
+                        GtkStyleProvider  *provider,
+                        GtkCssStaticStyle *style,
+                        GtkCssStyle       *parent_style)
+{
+  gboolean parent_is_static;
+
+  gtk_internal_return_if_fail (lookup != NULL);
+  gtk_internal_return_if_fail (GTK_IS_STYLE_PROVIDER (provider));
+  gtk_internal_return_if_fail (GTK_IS_CSS_STATIC_STYLE (style));
+  gtk_internal_return_if_fail (parent_style == NULL || GTK_IS_CSS_STYLE (parent_style));
+
+  parent_is_static = GTK_IS_CSS_STATIC_STYLE (parent_style);
+
+  if (_gtk_bitmask_is_empty (_gtk_css_lookup_get_set_values (lookup)))
+    {
+      style->background = gtk_css_background_values_ref (gtk_css_background_initial_values);
+      style->border = gtk_css_border_values_ref (gtk_css_border_initial_values);
+      style->outline = gtk_css_outline_values_ref (gtk_css_outline_initial_values);
+      style->font_variant = gtk_css_font_variant_values_ref (gtk_css_font_variant_initial_values);
+      style->animation = gtk_css_animation_values_ref (gtk_css_animation_initial_values);
+      style->transition = gtk_css_transition_values_ref (gtk_css_transition_initial_values);
+      style->size = gtk_css_size_values_ref (gtk_css_size_initial_values);
+      style->other = gtk_css_other_values_ref (gtk_css_other_initial_values);
+
+      if (parent_is_static)
+        {
+          style->core = gtk_css_core_values_ref (GTK_CSS_STATIC_STYLE (parent_style)->core);
+          style->icon = gtk_css_icon_values_ref (GTK_CSS_STATIC_STYLE (parent_style)->icon);
+          style->font = gtk_css_font_values_ref (GTK_CSS_STATIC_STYLE (parent_style)->font);
+        }
+      else
+        {
+          gtk_css_core_values_new_compute (style, provider, parent_style, lookup);
+          gtk_css_icon_values_new_compute (style, provider, parent_style, lookup);
+          gtk_css_font_values_new_compute (style, provider, parent_style, lookup);
+        }
+
+      return;
+    }
+
+  if (parent_is_static && gtk_css_core_values_unset (lookup))
+    style->core = gtk_css_core_values_ref (GTK_CSS_STATIC_STYLE (parent_style)->core);
+  else
+    gtk_css_core_values_new_compute (style, provider, parent_style, lookup);
+
+  if (gtk_css_background_values_unset (lookup))
+    style->background = gtk_css_background_values_ref (gtk_css_background_initial_values);
+  else
+    gtk_css_background_values_new_compute (style, provider, parent_style, lookup);
+
+  if (gtk_css_border_values_unset (lookup))
+    style->border = gtk_css_border_values_ref (gtk_css_border_initial_values);
+  else
+    gtk_css_border_values_new_compute (style, provider, parent_style, lookup);
+
+  if (parent_is_static && gtk_css_icon_values_unset (lookup))
+    style->icon = gtk_css_icon_values_ref (GTK_CSS_STATIC_STYLE (parent_style)->icon);
+  else
+    gtk_css_icon_values_new_compute (style, provider, parent_style, lookup);
+
+  if (gtk_css_outline_values_unset (lookup))
+    style->outline = gtk_css_outline_values_ref (gtk_css_outline_initial_values);
+  else
+    gtk_css_outline_values_new_compute (style, provider, parent_style, lookup);
+
+  if (parent_is_static && gtk_css_font_values_unset (lookup))
+    style->font = gtk_css_font_values_ref (GTK_CSS_STATIC_STYLE (parent_style)->font);
+  else
+    gtk_css_font_values_new_compute (style, provider, parent_style, lookup);
+
+  if (gtk_css_font_variant_values_unset (lookup))
+    style->font_variant = gtk_css_font_variant_values_ref (gtk_css_font_variant_initial_values);
+  else
+    gtk_css_font_variant_values_new_compute (style, provider, parent_style, lookup);
+
+  if (gtk_css_animation_values_unset (lookup))
+    style->animation = gtk_css_animation_values_ref (gtk_css_animation_initial_values);
+  else
+    gtk_css_animation_values_new_compute (style, provider, parent_style, lookup);
+
+  if (gtk_css_transition_values_unset (lookup))
+    style->transition = gtk_css_transition_values_ref (gtk_css_transition_initial_values);
+  else
+    gtk_css_transition_values_new_compute (style, provider, parent_style, lookup);
+
+  if (gtk_css_size_values_unset (lookup))
+    style->size = gtk_css_size_values_ref (gtk_css_size_initial_values);
+  else
+    gtk_css_size_values_new_compute (style, provider, parent_style, lookup);
+
+  if (gtk_css_other_values_unset (lookup))
+    style->other = gtk_css_other_values_ref (gtk_css_other_initial_values);
+  else
+    gtk_css_other_values_new_compute (style, provider, parent_style, lookup);
+}
+
 GtkCssStyle *
 gtk_css_static_style_new_compute (GtkStyleProvider    *provider,
                                   const GtkCssMatcher *matcher,
@@ -196,10 +1219,10 @@ gtk_css_static_style_new_compute (GtkStyleProvider    *provider,
 
   result->change = change;
 
-  _gtk_css_lookup_resolve (&lookup,
-                           provider,
-                           result,
-                           parent);
+  gtk_css_lookup_resolve (&lookup,
+                          provider,
+                          result,
+                          parent);
 
   _gtk_css_lookup_destroy (&lookup);
 
@@ -212,7 +1235,7 @@ G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE == GTK_CSS_PROPERTY_BORDER
 G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_LEFT_STYLE == GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH - 1);
 G_STATIC_ASSERT (GTK_CSS_PROPERTY_OUTLINE_STYLE == GTK_CSS_PROPERTY_OUTLINE_WIDTH - 1);
 
-void
+static void
 gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
                                     GtkStyleProvider  *provider,
                                     GtkCssStyle       *parent_style,
@@ -251,7 +1274,6 @@ gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
         break;
     }
 
-
   /* http://www.w3.org/TR/css3-cascade/#cascade
    * Then, for every element, the value for each property can be found
    * by following this pseudo-algorithm:
diff --git a/gtk/gtkcssstaticstyleprivate.h b/gtk/gtkcssstaticstyleprivate.h
index 81c97bbdc0..7b798d0f7f 100644
--- a/gtk/gtkcssstaticstyleprivate.h
+++ b/gtk/gtkcssstaticstyleprivate.h
@@ -34,11 +34,164 @@ G_BEGIN_DECLS
 
 typedef struct _GtkCssStaticStyleClass      GtkCssStaticStyleClass;
 
+/* inherited */
+typedef struct {
+  int ref_count;
+  GtkCssValue *color;
+  GtkCssValue *dpi;
+  GtkCssValue *font_size;
+  GtkCssValue *icon_theme;
+  GtkCssValue *icon_palette;
+} GtkCssCoreValues;
+
+typedef struct {
+  int ref_count;
+  GtkCssValue *background_color;
+  GtkCssValue *box_shadow;
+  GtkCssValue *background_clip;
+  GtkCssValue *background_origin;
+  GtkCssValue *background_size;
+  GtkCssValue *background_position;
+  GtkCssValue *background_repeat;
+  GtkCssValue *background_image;
+  GtkCssValue *background_blend_mode;
+} GtkCssBackgroundValues;
+
+typedef struct {
+  int ref_count;
+  GtkCssValue *border_top_style;
+  GtkCssValue *border_top_width;
+  GtkCssValue *border_left_style;
+  GtkCssValue *border_left_width;
+  GtkCssValue *border_bottom_style;
+  GtkCssValue *border_bottom_width;
+  GtkCssValue *border_right_style;
+  GtkCssValue *border_right_width;
+  GtkCssValue *border_top_left_radius;
+  GtkCssValue *border_top_right_radius;
+  GtkCssValue *border_bottom_right_radius;
+  GtkCssValue *border_bottom_left_radius;
+  GtkCssValue *border_top_color;
+  GtkCssValue *border_right_color;
+  GtkCssValue *border_bottom_color;
+  GtkCssValue *border_left_color;
+  GtkCssValue *border_image_source;
+  GtkCssValue *border_image_repeat;
+  GtkCssValue *border_image_slice;
+  GtkCssValue *border_image_width;
+} GtkCssBorderValues;
+
+/* inherited */
+typedef struct {
+  int ref_count;
+  GtkCssValue *icon_size;
+  GtkCssValue *icon_shadow;
+  GtkCssValue *icon_style;
+} GtkCssIconValues;
+
+
+typedef struct {
+  int ref_count;
+  GtkCssValue *outline_style;
+  GtkCssValue *outline_width;
+  GtkCssValue *outline_offset;
+  GtkCssValue *outline_top_left_radius;
+  GtkCssValue *outline_top_right_radius;
+  GtkCssValue *outline_bottom_right_radius;
+  GtkCssValue *outline_bottom_left_radius;
+  GtkCssValue *outline_color;
+} GtkCssOutlineValues;
+
+/* inherited */
+typedef struct {
+  int ref_count;
+  GtkCssValue *font_family;
+  GtkCssValue *font_style;
+  GtkCssValue *font_weight;
+  GtkCssValue *font_stretch;
+  GtkCssValue *letter_spacing;
+  GtkCssValue *text_shadow;
+  GtkCssValue *caret_color;
+  GtkCssValue *secondary_caret_color;
+  GtkCssValue *font_feature_settings;
+  GtkCssValue *font_variation_settings;
+} GtkCssFontValues;
+
+typedef struct {
+  int ref_count;
+  GtkCssValue *text_decoration_line;
+  GtkCssValue *text_decoration_color;
+  GtkCssValue *text_decoration_style;
+  GtkCssValue *font_kerning;
+  GtkCssValue *font_variant_ligatures;
+  GtkCssValue *font_variant_position;
+  GtkCssValue *font_variant_caps;
+  GtkCssValue *font_variant_numeric;
+  GtkCssValue *font_variant_alternates;
+  GtkCssValue *font_variant_east_asian;
+} GtkCssFontVariantValues;
+
+typedef struct {
+  int ref_count;
+  GtkCssValue *animation_name;
+  GtkCssValue *animation_duration;
+  GtkCssValue *animation_timing_function;
+  GtkCssValue *animation_iteration_count;
+  GtkCssValue *animation_direction;
+  GtkCssValue *animation_play_state;
+  GtkCssValue *animation_delay;
+  GtkCssValue *animation_fill_mode;
+} GtkCssAnimationValues;
+
+typedef struct {
+  int ref_count;
+  GtkCssValue *transition_property;
+  GtkCssValue *transition_duration;
+  GtkCssValue *transition_timing_function;
+  GtkCssValue *transition_delay;
+} GtkCssTransitionValues;
+
+typedef struct {
+  int ref_count;
+  GtkCssValue *margin_top;
+  GtkCssValue *margin_left;
+  GtkCssValue *margin_bottom;
+  GtkCssValue *margin_right;
+  GtkCssValue *padding_top;
+  GtkCssValue *padding_left;
+  GtkCssValue *padding_bottom;
+  GtkCssValue *padding_right;
+  GtkCssValue *border_spacing;
+  GtkCssValue *min_width;
+  GtkCssValue *min_height;
+} GtkCssSizeValues;
+
+typedef struct {
+  int ref_count;
+  GtkCssValue *icon_source;
+  GtkCssValue *icon_transform;
+  GtkCssValue *icon_filter;
+  GtkCssValue *transform;
+  GtkCssValue *opacity;
+  GtkCssValue *filter;
+} GtkCssOtherValues;
+
 struct _GtkCssStaticStyle
 {
   GtkCssStyle parent;
 
-  GtkCssValue           *values[GTK_CSS_PROPERTY_N_PROPERTIES]; /* the values */
+  GtkCssCoreValues        *core;
+  GtkCssBackgroundValues  *background;
+  GtkCssBorderValues      *border;
+  GtkCssIconValues        *icon;
+  GtkCssOutlineValues     *outline;
+  GtkCssFontValues        *font;
+  GtkCssFontVariantValues *font_variant;
+  GtkCssAnimationValues   *animation;
+  GtkCssTransitionValues  *transition;
+  GtkCssSizeValues        *size;
+  GtkCssOtherValues       *other;
+
   GPtrArray             *sections;             /* sections the values are defined in */
 
   GtkCssChange           change;               /* change as returned by value lookup */
@@ -57,13 +210,6 @@ GtkCssStyle *           gtk_css_static_style_new_compute        (GtkStyleProvide
                                                                  GtkCssStyle            *parent,
                                                                  GtkCssChange            change);
 
-void                    gtk_css_static_style_compute_value      (GtkCssStaticStyle      *style,
-                                                                 GtkStyleProvider       *provider,
-                                                                 GtkCssStyle            *parent_style,
-                                                                 guint                   id,
-                                                                 GtkCssValue            *specified,
-                                                                 GtkCssSection          *section);
-
 GtkCssChange            gtk_css_static_style_get_change         (GtkCssStaticStyle      *style);
 
 G_END_DECLS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]