]> Pileus Git - ~andy/gtk/commitdiff
css: Huge refactoring to avoid computing wrong values
authorBenjamin Otte <otte@redhat.com>
Fri, 28 Sep 2012 16:02:46 +0000 (18:02 +0200)
committerBenjamin Otte <otte@redhat.com>
Fri, 28 Sep 2012 16:27:49 +0000 (18:27 +0200)
Here's the shortest description of the bug I can come up with:
When computing values, we have 3 kinds of dependencies:
(1) other properties ("currentColor" or em values)
(2) inherited properties ("inherit")
(3) generic things from the theme (@keyframes or @define-color)
Previously, we passed the GtkStyleContext as an argument, because it
provided these 3 things using:
(1) _gtk_style_context_peek_property()
(2) _gtk_style_context_peek_property(gtk_style_context_get_parent())
(3) context->priv->cascade

However, this makes it impossible to lookup values other than the ones
accessible via _gtk_style_context_peek_property(). And this is exactly
what we are doing in gtk_style_context_update_cache(). So when the cache
updates encountered case (1), they were looking up the values from the
wrong style data.

So this large patch essentially does nothing but replace the
context argument in all compute functions with new arguments for the 3
cases above:
(1) values
(2) parent_values
(3) provider

We apparently have a lot of computing code.

37 files changed:
gtk/gtkcssarrayvalue.c
gtk/gtkcssbgsizevalue.c
gtk/gtkcssbordervalue.c
gtk/gtkcsscomputedvalues.c
gtk/gtkcsscomputedvaluesprivate.h
gtk/gtkcsscornervalue.c
gtk/gtkcsseasevalue.c
gtk/gtkcssenginevalue.c
gtk/gtkcssenumvalue.c
gtk/gtkcssimage.c
gtk/gtkcssimagegradient.c
gtk/gtkcssimagelinear.c
gtk/gtkcssimageprivate.h
gtk/gtkcssimagevalue.c
gtk/gtkcssinheritvalue.c
gtk/gtkcssinitialvalue.c
gtk/gtkcsskeyframes.c
gtk/gtkcsskeyframesprivate.h
gtk/gtkcsslookup.c
gtk/gtkcsslookupprivate.h
gtk/gtkcssnumbervalue.c
gtk/gtkcsspositionvalue.c
gtk/gtkcssrepeatvalue.c
gtk/gtkcssrgbavalue.c
gtk/gtkcssshadowsvalue.c
gtk/gtkcssshadowvalue.c
gtk/gtkcssstringvalue.c
gtk/gtkcssstylefuncs.c
gtk/gtkcssstylefuncsprivate.h
gtk/gtkcsstypedvalue.c
gtk/gtkcssvalue.c
gtk/gtkcssvalueprivate.h
gtk/gtkgradient.c
gtk/gtkstylecontext.c
gtk/gtkstylecontextprivate.h
gtk/gtkstylepropertiesprivate.h
gtk/gtksymboliccolor.c

index dadedba90d479769d1ae10ba6ecdb753e2c3f68b..e822619dff74ddcae241415a891bb32df66b47f8 100644 (file)
@@ -43,10 +43,12 @@ gtk_css_value_array_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_array_compute (GtkCssValue        *value,
-                             guint               property_id,
-                             GtkStyleContext    *context,
-                             GtkCssDependencies *dependencies)
+gtk_css_value_array_compute (GtkCssValue             *value,
+                             guint                    property_id,
+                             GtkStyleProviderPrivate *provider,
+                             GtkCssComputedValues    *values,
+                             GtkCssComputedValues    *parent_values,
+                             GtkCssDependencies      *dependencies)
 {
   GtkCssValue *result;
   gboolean changed = FALSE;
@@ -59,7 +61,7 @@ gtk_css_value_array_compute (GtkCssValue        *value,
   result = _gtk_css_array_value_new_from_array (value->values, value->n_values);
   for (i = 0; i < value->n_values; i++)
     {
-      result->values[i] = _gtk_css_value_compute (value->values[i], property_id, context, &child_deps);
+      result->values[i] = _gtk_css_value_compute (value->values[i], property_id, provider, values, parent_values, &child_deps);
 
       *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
 
index e545f61b344e8f81081a1c880bade99d35a1bca1..01db83d34f3f2961afafed302b710960776eb2ff 100644 (file)
@@ -41,10 +41,12 @@ gtk_css_value_bg_size_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_bg_size_compute (GtkCssValue        *value,
-                               guint               property_id,
-                               GtkStyleContext    *context,
-                               GtkCssDependencies *dependencies)
+gtk_css_value_bg_size_compute (GtkCssValue             *value,
+                               guint                    property_id,
+                               GtkStyleProviderPrivate *provider,
+                               GtkCssComputedValues    *values,
+                               GtkCssComputedValues    *parent_values,
+                               GtkCssDependencies      *dependencies)
 {
   GtkCssValue *x, *y;
   GtkCssDependencies x_deps, y_deps;
@@ -56,10 +58,10 @@ gtk_css_value_bg_size_compute (GtkCssValue        *value,
   x = y = NULL;
 
   if (value->x)
-    x = _gtk_css_value_compute (value->x, property_id, context, &x_deps);
+    x = _gtk_css_value_compute (value->x, property_id, provider, values, parent_values, &x_deps);
 
   if (value->y)
-    y = _gtk_css_value_compute (value->y, property_id, context, &y_deps);
+    y = _gtk_css_value_compute (value->y, property_id, provider, values, parent_values, &y_deps);
 
   *dependencies = _gtk_css_dependencies_union (x_deps, y_deps);
 
index 953ab53ca585b163a8e6b88cdd600b58817bc5b1..62487f8f8a59302a1c959772e9085197a6e8c4ee 100644 (file)
@@ -42,10 +42,12 @@ gtk_css_value_border_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_border_compute (GtkCssValue        *value,
-                              guint               property_id,
-                              GtkStyleContext    *context,
-                              GtkCssDependencies *dependencies)
+gtk_css_value_border_compute (GtkCssValue             *value,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies       *dependencies)
 {
   GtkCssValue *computed;
   GtkCssDependencies child_deps;
@@ -59,7 +61,7 @@ gtk_css_value_border_compute (GtkCssValue        *value,
     {
       if (value->values[i])
         {
-          computed->values[i] = _gtk_css_value_compute (value->values[i], property_id, context, &child_deps);
+          computed->values[i] = _gtk_css_value_compute (value->values[i], property_id, provider, values, parent_values, &child_deps);
           *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
           changed |= (computed->values[i] != value->values[i]);
         }
index 250b0b0d291d4488258da2afbd58438865bd4bc6..b60324eaa08e854a0bb334227f3810479c430a93 100644 (file)
@@ -110,17 +110,19 @@ maybe_unref_section (gpointer section)
 }
 
 void
-_gtk_css_computed_values_compute_value (GtkCssComputedValues *values,
-                                        GtkStyleContext      *context,
-                                        guint                 id,
-                                        GtkCssValue          *specified,
-                                        GtkCssSection        *section)
+_gtk_css_computed_values_compute_value (GtkCssComputedValues    *values,
+                                        GtkStyleProviderPrivate *provider,
+                                        GtkCssComputedValues    *parent_values,
+                                        guint                    id,
+                                        GtkCssValue             *specified,
+                                        GtkCssSection           *section)
 {
   GtkCssDependencies dependencies;
   GtkCssValue *value;
 
   g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
-  g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
+  g_return_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider));
+  g_return_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values));
 
   /* http://www.w3.org/TR/css3-cascade/#cascade
    * Then, for every element, the value for each property can be found
@@ -139,7 +141,7 @@ _gtk_css_computed_values_compute_value (GtkCssComputedValues *values,
   else
     _gtk_css_value_ref (specified);
 
-  value = _gtk_css_value_compute (specified, id, context, &dependencies);
+  value = _gtk_css_value_compute (specified, id, provider, values, parent_values, &dependencies);
 
   _gtk_css_computed_values_set_value (values, id, value, dependencies, section);
 
@@ -432,17 +434,16 @@ gtk_css_computed_values_find_animation (GtkCssComputedValues *values,
 }
 
 static void
-gtk_css_computed_values_create_css_animations (GtkCssComputedValues *values,
-                                               gint64                timestamp,
-                                               GtkCssComputedValues *source,
-                                               GtkStyleContext      *context)
+gtk_css_computed_values_create_css_animations (GtkCssComputedValues    *values,
+                                               GtkCssComputedValues    *parent_values,
+                                               gint64                   timestamp,
+                                               GtkStyleProviderPrivate *provider,
+                                               GtkCssComputedValues    *source)
 {
-  GtkStyleProviderPrivate *provider;
   GtkCssValue *durations, *delays, *timing_functions, *animations;
   GtkCssValue *iteration_counts, *directions, *play_states, *fill_modes;
   guint i;
 
-  provider = _gtk_style_context_get_style_provider (context);
   animations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_NAME);
   durations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_DURATION);
   delays = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_DELAY);
@@ -481,7 +482,7 @@ gtk_css_computed_values_create_css_animations (GtkCssComputedValues *values,
           if (keyframes == NULL)
             continue;
 
-          keyframes = _gtk_css_keyframes_compute (keyframes, context);
+          keyframes = _gtk_css_keyframes_compute (keyframes, provider, values, parent_values);
 
           animation = _gtk_css_animation_new (name,
                                               keyframes,
@@ -501,14 +502,15 @@ gtk_css_computed_values_create_css_animations (GtkCssComputedValues *values,
 /* PUBLIC API */
 
 void
-_gtk_css_computed_values_create_animations (GtkCssComputedValues *values,
-                                            gint64                timestamp,
-                                            GtkCssComputedValues *source,
-                                            GtkStyleContext      *context)
+_gtk_css_computed_values_create_animations (GtkCssComputedValues    *values,
+                                            GtkCssComputedValues    *parent_values,
+                                            gint64                   timestamp,
+                                            GtkStyleProviderPrivate *provider,
+                                            GtkCssComputedValues    *source)
 {
   if (source != NULL)
     gtk_css_computed_values_create_css_transitions (values, timestamp, source);
-  gtk_css_computed_values_create_css_animations (values, timestamp, source, context);
+  gtk_css_computed_values_create_css_animations (values, parent_values, timestamp, provider, source);
 }
 
 GtkBitmask *
index ef8130aef0c1351188d499da4cf9b78362066e3a..28afec3807157aaaad9fb62bbbdfbdfe3e15974c 100644 (file)
@@ -24,7 +24,6 @@
 
 #include "gtk/gtkbitmaskprivate.h"
 #include "gtk/gtkcsssection.h"
-#include "gtk/gtkstylecontext.h"
 #include "gtk/gtkcssvalueprivate.h"
 
 G_BEGIN_DECLS
@@ -66,7 +65,8 @@ GType                   _gtk_css_computed_values_get_type             (void) G_G
 GtkCssComputedValues *  _gtk_css_computed_values_new                  (void);
 
 void                    _gtk_css_computed_values_compute_value        (GtkCssComputedValues     *values,
-                                                                       GtkStyleContext          *context,
+                                                                       GtkStyleProviderPrivate  *provider,
+                                                                       GtkCssComputedValues     *parent_values,
                                                                        guint                     id,
                                                                        GtkCssValue              *specified,
                                                                        GtkCssSection            *section);
@@ -89,9 +89,10 @@ GtkBitmask *            _gtk_css_computed_values_get_difference       (GtkCssCom
                                                                        GtkCssComputedValues     *other);
 
 void                    _gtk_css_computed_values_create_animations    (GtkCssComputedValues     *values,
+                                                                       GtkCssComputedValues     *parent_values,
                                                                        gint64                    timestamp,
-                                                                       GtkCssComputedValues     *source,
-                                                                       GtkStyleContext          *context);
+                                                                       GtkStyleProviderPrivate  *provider,
+                                                                       GtkCssComputedValues     *source);
 GtkBitmask *            _gtk_css_computed_values_advance              (GtkCssComputedValues     *values,
                                                                        gint64                    timestamp);
 void                    _gtk_css_computed_values_cancel_animations    (GtkCssComputedValues     *values);
index 48586dfa12f8eaa2d2b4e5a7f2b9c0cdb4307fca..394675c71a08812a1f763bbfc10a01762cb8e214 100644 (file)
@@ -37,16 +37,18 @@ gtk_css_value_corner_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_corner_compute (GtkCssValue        *corner,
-                              guint               property_id,
-                              GtkStyleContext    *context,
-                              GtkCssDependencies *dependencies)
+gtk_css_value_corner_compute (GtkCssValue             *corner,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies      *dependencies)
 {
   GtkCssValue *x, *y;
   GtkCssDependencies x_deps, y_deps;
 
-  x = _gtk_css_value_compute (corner->x, property_id, context, &x_deps);
-  y = _gtk_css_value_compute (corner->y, property_id, context, &y_deps);
+  x = _gtk_css_value_compute (corner->x, property_id, provider, values, parent_values, &x_deps);
+  y = _gtk_css_value_compute (corner->y, property_id, provider, values, parent_values, &y_deps);
   *dependencies = _gtk_css_dependencies_union (x_deps, y_deps);
   if (x == corner->x && y == corner->y)
     {
index cea938f001c1622f17119024a1ffdb6132a5b50c..81cdea8e37c93bd4d9a134a35be3f29f230e3261 100644 (file)
@@ -50,10 +50,12 @@ gtk_css_value_ease_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_ease_compute (GtkCssValue        *value,
-                            guint               property_id,
-                            GtkStyleContext    *context,
-                            GtkCssDependencies *dependencies)
+gtk_css_value_ease_compute (GtkCssValue             *value,
+                            guint                    property_id,
+                            GtkStyleProviderPrivate *provider,
+                            GtkCssComputedValues    *values,
+                            GtkCssComputedValues    *parent_values,
+                            GtkCssDependencies      *dependencies)
 {
   return _gtk_css_value_ref (value);
 }
index 851c6310c5496a654974474cab42c9626ae56992..f382df9d94765ff2128dff66e80e8ec36a33a240 100644 (file)
@@ -35,10 +35,12 @@ gtk_css_value_engine_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_engine_compute (GtkCssValue        *value,
-                              guint               property_id,
-                              GtkStyleContext    *context,
-                              GtkCssDependencies *dependencies)
+gtk_css_value_engine_compute (GtkCssValue             *value,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies      *dependencies)
 {
   return _gtk_css_value_ref (value);
 }
index a101eaf27113b12fcf273630c4a61b4fa871671c..b739567970092e472b287184b3642aa02ea9a279 100644 (file)
@@ -36,10 +36,12 @@ gtk_css_value_enum_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_enum_compute (GtkCssValue        *value,
-                            guint               property_id,
-                            GtkStyleContext    *context,
-                            GtkCssDependencies *dependencies)
+gtk_css_value_enum_compute (GtkCssValue             *value,
+                            guint                    property_id,
+                            GtkStyleProviderPrivate *provider,
+                            GtkCssComputedValues    *values,
+                            GtkCssComputedValues    *parent_values,
+                            GtkCssDependencies      *dependencies)
 {
   return _gtk_css_value_ref (value);
 }
index d990fc79fe4724b6166b0ae7375980c5cb703073..89dc6f2699cc3d037f880d0ada381a51fc12e778 100644 (file)
@@ -21,6 +21,8 @@
 
 #include "gtkcssimageprivate.h"
 
+#include "gtkcsscomputedvaluesprivate.h"
+
 /* for the types only */
 #include "gtk/gtkcssimagecrossfadeprivate.h"
 #include "gtk/gtkcssimagegradientprivate.h"
@@ -57,10 +59,12 @@ gtk_css_image_real_get_aspect_ratio (GtkCssImage *image)
 }
 
 static GtkCssImage *
-gtk_css_image_real_compute (GtkCssImage        *image,
-                            guint               property_id,
-                            GtkStyleContext    *context,
-                            GtkCssDependencies *dependencies)
+gtk_css_image_real_compute (GtkCssImage             *image,
+                            guint                    property_id,
+                            GtkStyleProviderPrivate *provider,
+                            GtkCssComputedValues    *values,
+                            GtkCssComputedValues    *parent_values,
+                            GtkCssDependencies      *dependencies)
 {
   return g_object_ref (image);
 }
@@ -116,16 +120,19 @@ _gtk_css_image_get_aspect_ratio (GtkCssImage *image)
 }
 
 GtkCssImage *
-_gtk_css_image_compute (GtkCssImage        *image,
-                        guint               property_id,
-                        GtkStyleContext    *context,
-                        GtkCssDependencies *dependencies)
+_gtk_css_image_compute (GtkCssImage             *image,
+                        guint                    property_id,
+                        GtkStyleProviderPrivate *provider,
+                        GtkCssComputedValues    *values,
+                        GtkCssComputedValues    *parent_values,
+                        GtkCssDependencies      *dependencies)
 {
   GtkCssDependencies unused;
   GtkCssImageClass *klass;
 
   g_return_val_if_fail (GTK_IS_CSS_IMAGE (image), NULL);
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL);
 
   if (dependencies == NULL)
     dependencies = &unused;
@@ -133,7 +140,7 @@ _gtk_css_image_compute (GtkCssImage        *image,
 
   klass = GTK_CSS_IMAGE_GET_CLASS (image);
 
-  return klass->compute (image, property_id, context, dependencies);
+  return klass->compute (image, property_id, provider, values, parent_values, dependencies);
 }
 
 void
index d8db2e2d77906617c55ff2571193ecfe55778e30..2e710672cc274dc243bcf1bbd7576482a73de2e5 100644 (file)
 G_DEFINE_TYPE (GtkCssImageGradient, _gtk_css_image_gradient, GTK_TYPE_CSS_IMAGE)
 
 static GtkCssImage *
-gtk_css_image_gradient_compute (GtkCssImage        *image,
-                                guint               property_id,
-                                GtkStyleContext    *context,
-                                GtkCssDependencies *dependencies)
+gtk_css_image_gradient_compute (GtkCssImage             *image,
+                                guint                    property_id,
+                                GtkStyleProviderPrivate *provider,
+                                GtkCssComputedValues    *values,
+                                GtkCssComputedValues    *parent_values,
+                                GtkCssDependencies      *dependencies)
 {
   GtkCssImageGradient *gradient = GTK_CSS_IMAGE_GRADIENT (image);
   GtkCssImageGradient *copy;
@@ -41,7 +43,7 @@ gtk_css_image_gradient_compute (GtkCssImage        *image,
 
   copy = g_object_new (GTK_TYPE_CSS_IMAGE_GRADIENT, NULL);
   copy->gradient = gtk_gradient_ref (gradient->gradient);
-  copy->pattern = _gtk_gradient_resolve_full (copy->gradient, context, dependencies);
+  copy->pattern = _gtk_gradient_resolve_full (copy->gradient, provider, values, parent_values, dependencies);
 
   return GTK_CSS_IMAGE (copy);
 }
index 8dee6972bccc99a29b7078f3991a1f1a841e16ef..39b6b3e781bcfd020be97e86794536698bad8b5f 100644 (file)
@@ -409,10 +409,12 @@ gtk_css_image_linear_print (GtkCssImage *image,
 }
 
 static GtkCssImage *
-gtk_css_image_linear_compute (GtkCssImage        *image,
-                              guint               property_id,
-                              GtkStyleContext    *context,
-                              GtkCssDependencies *dependencies)
+gtk_css_image_linear_compute (GtkCssImage             *image,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies      *dependencies)
 {
   GtkCssImageLinear *linear = GTK_CSS_IMAGE_LINEAR (image);
   GtkCssImageLinear *copy;
@@ -421,7 +423,7 @@ gtk_css_image_linear_compute (GtkCssImage        *image,
   copy = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL);
   copy->repeating = linear->repeating;
 
-  copy->angle = _gtk_css_value_compute (linear->angle, property_id, context, dependencies);
+  copy->angle = _gtk_css_value_compute (linear->angle, property_id, provider, values, parent_values, dependencies);
   
   g_array_set_size (copy->stops, linear->stops->len);
   for (i = 0; i < linear->stops->len; i++)
@@ -432,12 +434,12 @@ gtk_css_image_linear_compute (GtkCssImage        *image,
       stop = &g_array_index (linear->stops, GtkCssImageLinearColorStop, i);
       scopy = &g_array_index (copy->stops, GtkCssImageLinearColorStop, i);
               
-      scopy->color = _gtk_css_value_compute (stop->color, property_id, context, &child_deps);
+      scopy->color = _gtk_css_value_compute (stop->color, property_id, provider, values, parent_values, &child_deps);
       *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
       
       if (stop->offset)
         {
-          scopy->offset = _gtk_css_value_compute (stop->offset, property_id, context, &child_deps);
+          scopy->offset = _gtk_css_value_compute (stop->offset, property_id, provider, values, parent_values, &child_deps);
           *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
         }
       else
index 2899ef2822ee266ea9a4087ed91fdc36c404db9c..4b8362b0decde971953377079f658fd9640827f0 100644 (file)
@@ -23,8 +23,8 @@
 #include <cairo.h>
 #include <glib-object.h>
 
-#include "gtk/gtkstylecontext.h"
 #include "gtk/gtkcssparserprivate.h"
+#include "gtk/gtkcsstypesprivate.h"
 
 G_BEGIN_DECLS
 
@@ -48,64 +48,68 @@ struct _GtkCssImageClass
   GObjectClass parent_class;
 
   /* width of image or 0 if it has no width (optional) */
-  int          (* get_width)                       (GtkCssImage        *image);
+  int          (* get_width)                       (GtkCssImage                *image);
   /* height of image or 0 if it has no height (optional) */
-  int          (* get_height)                      (GtkCssImage        *image);
+  int          (* get_height)                      (GtkCssImage                *image);
   /* aspect ratio (width / height) of image or 0 if it has no aspect ratio (optional) */
-  double       (* get_aspect_ratio)                (GtkCssImage        *image);
+  double       (* get_aspect_ratio)                (GtkCssImage                *image);
 
   /* create "computed value" in CSS terms, returns a new reference */
-  GtkCssImage *(* compute)                         (GtkCssImage        *image,
-                                                    guint               property_id,
-                                                    GtkStyleContext    *context,
-                                                    GtkCssDependencies *dependencies);
+  GtkCssImage *(* compute)                         (GtkCssImage                *image,
+                                                    guint                       property_id,
+                                                    GtkStyleProviderPrivate    *provider,
+                                                    GtkCssComputedValues       *values,
+                                                    GtkCssComputedValues       *parent_values,
+                                                    GtkCssDependencies         *dependencies);
 
   /* draw to 0,0 with the given width and height */
-  void         (* draw)                            (GtkCssImage        *image,
-                                                    cairo_t            *cr,
-                                                    double              width,
-                                                    double              height);
+  void         (* draw)                            (GtkCssImage                *image,
+                                                    cairo_t                    *cr,
+                                                    double                      width,
+                                                    double                      height);
   /* parse CSS, return TRUE on success */
-  gboolean     (* parse)                           (GtkCssImage        *image,
-                                                    GtkCssParser       *parser);
+  gboolean     (* parse)                           (GtkCssImage                *image,
+                                                    GtkCssParser               *parser);
   /* print to CSS */
-  void         (* print)                           (GtkCssImage        *image,
-                                                    GString            *string);
+  void         (* print)                           (GtkCssImage                *image,
+                                                    GString                    *string);
 };
 
 GType          _gtk_css_image_get_type             (void) G_GNUC_CONST;
 
-gboolean       _gtk_css_image_can_parse            (GtkCssParser       *parser);
-GtkCssImage *  _gtk_css_image_new_parse            (GtkCssParser       *parser);
-
-int            _gtk_css_image_get_width            (GtkCssImage        *image);
-int            _gtk_css_image_get_height           (GtkCssImage        *image);
-double         _gtk_css_image_get_aspect_ratio     (GtkCssImage        *image);
-
-GtkCssImage *  _gtk_css_image_compute              (GtkCssImage        *image,
-                                                    guint               property_id,
-                                                    GtkStyleContext    *context,
-                                                    GtkCssDependencies *dependencies);
-
-void           _gtk_css_image_draw                 (GtkCssImage        *image,
-                                                    cairo_t            *cr,
-                                                    double              width,
-                                                    double              height);
-void           _gtk_css_image_print                (GtkCssImage        *image,
-                                                    GString            *string);
-
-void           _gtk_css_image_get_concrete_size    (GtkCssImage        *image,
-                                                    double              specified_width,
-                                                    double              specified_height,
-                                                    double              default_width,
-                                                    double              default_height,
-                                                    double             *concrete_width,
-                                                    double             *concrete_height);
+gboolean       _gtk_css_image_can_parse            (GtkCssParser               *parser);
+GtkCssImage *  _gtk_css_image_new_parse            (GtkCssParser               *parser);
+
+int            _gtk_css_image_get_width            (GtkCssImage                *image);
+int            _gtk_css_image_get_height           (GtkCssImage                *image);
+double         _gtk_css_image_get_aspect_ratio     (GtkCssImage                *image);
+
+GtkCssImage *  _gtk_css_image_compute              (GtkCssImage                *image,
+                                                    guint                       property_id,
+                                                    GtkStyleProviderPrivate    *provider,
+                                                    GtkCssComputedValues       *values,
+                                                    GtkCssComputedValues       *parent_values,
+                                                    GtkCssDependencies         *dependencies);
+
+void           _gtk_css_image_draw                 (GtkCssImage                *image,
+                                                    cairo_t                    *cr,
+                                                    double                      width,
+                                                    double                      height);
+void           _gtk_css_image_print                (GtkCssImage                *image,
+                                                    GString                    *string);
+
+void           _gtk_css_image_get_concrete_size    (GtkCssImage                *image,
+                                                    double                      specified_width,
+                                                    double                      specified_height,
+                                                    double                      default_width,
+                                                    double                      default_height,
+                                                    double                     *concrete_width,
+                                                    double                     *concrete_height);
 cairo_surface_t *
-               _gtk_css_image_get_surface          (GtkCssImage        *image,
-                                                    cairo_surface_t    *target,
-                                                    int                 surface_width,
-                                                    int                 surface_height);
+               _gtk_css_image_get_surface          (GtkCssImage                *image,
+                                                    cairo_surface_t            *target,
+                                                    int                         surface_width,
+                                                    int                         surface_height);
 
 G_END_DECLS
 
index b8baa509f2d7a2cc91ae0500d823ee1aa595be65..d44e72be1e880a5e1010dff17c6305e4a6668206 100644 (file)
@@ -34,10 +34,12 @@ gtk_css_value_image_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_image_compute (GtkCssValue        *value,
-                             guint               property_id,
-                             GtkStyleContext    *context,
-                             GtkCssDependencies *dependencies)
+gtk_css_value_image_compute (GtkCssValue             *value,
+                             guint                    property_id,
+                             GtkStyleProviderPrivate *provider,
+                             GtkCssComputedValues    *values,
+                             GtkCssComputedValues    *parent_values,
+                             GtkCssDependencies      *dependencies)
 {
   GtkCssImage *image, *computed;
   
@@ -46,7 +48,7 @@ gtk_css_value_image_compute (GtkCssValue        *value,
   if (image == NULL)
     return _gtk_css_value_ref (value);
 
-  computed = _gtk_css_image_compute (image, property_id, context, dependencies);
+  computed = _gtk_css_image_compute (image, property_id, provider, values, parent_values, dependencies);
 
   if (computed == image)
     {
index 585a9760e5190232d98751488fef12bf2bffbb99..296b1e3f992850fa8884ffefdb6e990afe266d69 100644 (file)
@@ -34,23 +34,25 @@ gtk_css_value_inherit_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_inherit_compute (GtkCssValue        *value,
-                               guint               property_id,
-                               GtkStyleContext    *context,
-                               GtkCssDependencies *dependencies)
+gtk_css_value_inherit_compute (GtkCssValue             *value,
+                               guint                    property_id,
+                               GtkStyleProviderPrivate *provider,
+                               GtkCssComputedValues    *values,
+                               GtkCssComputedValues    *parent_values,
+                               GtkCssDependencies      *dependencies)
 {
-  GtkStyleContext *parent = gtk_style_context_get_parent (context);
-
-  if (parent)
+  if (parent_values)
     {
       *dependencies = GTK_CSS_EQUALS_PARENT;
-      return _gtk_css_value_ref (_gtk_style_context_peek_property (parent, property_id));
+      return _gtk_css_value_ref (_gtk_css_computed_values_get_value (parent_values, 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,
+                                     provider,
+                                     values,
+                                     parent_values,
                                      dependencies);
     }
 }
index d9d960f0fcff7b6e4d179502c72df7732ce994d4..36ca6a09a3c1593f480b60499889e76b1007e282 100644 (file)
@@ -33,14 +33,18 @@ gtk_css_value_initial_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_initial_compute (GtkCssValue        *value,
-                               guint               property_id,
-                               GtkStyleContext    *context,
-                               GtkCssDependencies *dependencies)
+gtk_css_value_initial_compute (GtkCssValue             *value,
+                               guint                    property_id,
+                               GtkStyleProviderPrivate *provider,
+                               GtkCssComputedValues    *values,
+                               GtkCssComputedValues    *parent_values,
+                               GtkCssDependencies      *dependencies)
 {
   return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)),
                                  property_id,
-                                 context,
+                                 provider,
+                                 values,
+                                 parent_values,
                                  dependencies);
 }
 
index f25ccef3f209e439d20e9c19a85d20b2e1b3dea6..f9098715946cf8dfbd1bdc55b603aa3f7b67215d 100644 (file)
@@ -414,14 +414,18 @@ _gtk_css_keyframes_print (GtkCssKeyframes *keyframes,
 }
 
 GtkCssKeyframes *
-_gtk_css_keyframes_compute (GtkCssKeyframes *keyframes,
-                            GtkStyleContext *context)
+_gtk_css_keyframes_compute (GtkCssKeyframes         *keyframes,
+                            GtkStyleProviderPrivate *provider,
+                            GtkCssComputedValues    *values,
+                            GtkCssComputedValues    *parent_values)
 {
   GtkCssKeyframes *resolved;
   guint k, p;
 
   g_return_val_if_fail (keyframes != NULL, NULL);
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+  g_return_val_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider), NULL);
+  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL);
 
   resolved = gtk_css_keyframes_new ();
   resolved->n_keyframes = keyframes->n_keyframes;
@@ -439,7 +443,9 @@ _gtk_css_keyframes_compute (GtkCssKeyframes *keyframes,
 
           KEYFRAMES_VALUE (resolved, k, p) =  _gtk_css_value_compute (KEYFRAMES_VALUE (keyframes, k, p),
                                                                       resolved->property_ids[p],
-                                                                      context,
+                                                                      provider,
+                                                                      values,
+                                                                      parent_values,
                                                                       NULL);
         }
     }
index b08ce09083dc4abf56e34f98006e27f4af7db657..9ec76fe6aafcb9fe1ab30903b748afd55b9c06d6 100644 (file)
@@ -36,8 +36,10 @@ void                _gtk_css_keyframes_unref                  (GtkCssKeyframes
 void                _gtk_css_keyframes_print                  (GtkCssKeyframes        *keyframes,
                                                                GString                *string);
 
-GtkCssKeyframes *   _gtk_css_keyframes_compute                (GtkCssKeyframes        *keyframes,
-                                                               GtkStyleContext        *context);
+GtkCssKeyframes *   _gtk_css_keyframes_compute                (GtkCssKeyframes         *keyframes,
+                                                               GtkStyleProviderPrivate *provider,
+                                                               GtkCssComputedValues    *values,
+                                                               GtkCssComputedValues    *parent_values);
 
 guint               _gtk_css_keyframes_get_n_properties       (GtkCssKeyframes        *keyframes);
 guint               _gtk_css_keyframes_get_property_id        (GtkCssKeyframes        *keyframes,
index 67d7b1c21b96274f1e7577d0b864ff4d33532be8..3b124ac0953b792c86927e29aad7f71223601666 100644 (file)
@@ -157,15 +157,17 @@ _gtk_css_lookup_set_computed (GtkCssLookup  *lookup,
  * an issue, go fix it.
  **/
 void
-_gtk_css_lookup_resolve (GtkCssLookup         *lookup,
-                         GtkStyleContext      *context,
-                         GtkCssComputedValues *values)
+_gtk_css_lookup_resolve (GtkCssLookup            *lookup,
+                         GtkStyleProviderPrivate *provider,
+                         GtkCssComputedValues    *values,
+                         GtkCssComputedValues    *parent_values)
 {
   guint i, n;
 
   g_return_if_fail (lookup != NULL);
-  g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
+  g_return_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider));
   g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
+  g_return_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values));
 
   n = _gtk_css_style_property_get_n_properties ();
 
@@ -180,7 +182,8 @@ _gtk_css_lookup_resolve (GtkCssLookup         *lookup,
       else if (lookup->values[i].value ||
                _gtk_bitmask_get (lookup->missing, i))
         _gtk_css_computed_values_compute_value (values,
-                                                context,
+                                                provider,
+                                                parent_values,
                                                 i,
                                                 lookup->values[i].value,
                                                 lookup->values[i].section);
index 72b0b18fc2f9d9d354e19e71403539d66ff7f290..aed2d51c8542d7658521bdbf8f4c825bb6de7659 100644 (file)
 #include "gtk/gtkbitmaskprivate.h"
 #include "gtk/gtkcsscomputedvaluesprivate.h"
 #include "gtk/gtkcsssection.h"
-#include "gtk/gtkstylecontext.h"
 
 
 G_BEGIN_DECLS
 
 typedef struct _GtkCssLookup GtkCssLookup;
 
-GtkCssLookup *          _gtk_css_lookup_new                     (const GtkBitmask   *relevant);
-void                    _gtk_css_lookup_free                    (GtkCssLookup       *lookup);
-
-const GtkBitmask *      _gtk_css_lookup_get_missing             (const GtkCssLookup *lookup);
-gboolean                _gtk_css_lookup_is_missing              (const GtkCssLookup *lookup,
-                                                                 guint               id);
-void                    _gtk_css_lookup_set                     (GtkCssLookup       *lookup,
-                                                                 guint               id,
-                                                                 GtkCssSection      *section,
-                                                                 GtkCssValue        *value);
-void                    _gtk_css_lookup_set_computed            (GtkCssLookup       *lookup,
-                                                                 guint               id,
-                                                                 GtkCssSection      *section,
-                                                                 GtkCssValue        *value);
-void                    _gtk_css_lookup_resolve                 (GtkCssLookup       *lookup,
-                                                                 GtkStyleContext    *context,
-                                                                 GtkCssComputedValues *values);
+GtkCssLookup *          _gtk_css_lookup_new                     (const GtkBitmask           *relevant);
+void                    _gtk_css_lookup_free                    (GtkCssLookup               *lookup);
+
+const GtkBitmask *      _gtk_css_lookup_get_missing             (const GtkCssLookup         *lookup);
+gboolean                _gtk_css_lookup_is_missing              (const GtkCssLookup         *lookup,
+                                                                 guint                       id);
+void                    _gtk_css_lookup_set                     (GtkCssLookup               *lookup,
+                                                                 guint                       id,
+                                                                 GtkCssSection              *section,
+                                                                 GtkCssValue                *value);
+void                    _gtk_css_lookup_set_computed            (GtkCssLookup               *lookup,
+                                                                 guint                       id,
+                                                                 GtkCssSection              *section,
+                                                                 GtkCssValue                *value);
+void                    _gtk_css_lookup_resolve                 (GtkCssLookup               *lookup,
+                                                                 GtkStyleProviderPrivate    *provider,
+                                                                 GtkCssComputedValues       *values,
+                                                                 GtkCssComputedValues       *parent_values);
 
 
 G_END_DECLS
index c84bce6a1b57cd7bc2976148be50274edd6ea1ac..58f4652511213e1ade5224156eae9629d52bb4a7 100644 (file)
@@ -35,10 +35,12 @@ gtk_css_value_number_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_number_compute (GtkCssValue        *number,
-                              guint               property_id,
-                              GtkStyleContext    *context,
-                              GtkCssDependencies *dependencies)
+gtk_css_value_number_compute (GtkCssValue             *number,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies      *dependencies)
 {
   GtkBorderStyle border_style;
 
@@ -46,27 +48,27 @@ gtk_css_value_number_compute (GtkCssValue        *number,
   switch (property_id)
     {
       case GTK_CSS_PROPERTY_BORDER_TOP_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_TOP_STYLE));
+        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_BORDER_TOP_STYLE));
         if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
           return _gtk_css_number_value_new (0, GTK_CSS_PX);
         break;
       case GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE));
+        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE));
         if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
           return _gtk_css_number_value_new (0, GTK_CSS_PX);
         break;
       case GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE));
+        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE));
         if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
           return _gtk_css_number_value_new (0, GTK_CSS_PX);
         break;
       case GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_LEFT_STYLE));
+        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_BORDER_LEFT_STYLE));
         if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
           return _gtk_css_number_value_new (0, GTK_CSS_PX);
         break;
       case GTK_CSS_PROPERTY_OUTLINE_WIDTH:
-        border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_OUTLINE_STYLE));
+        border_style = _gtk_css_border_style_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_OUTLINE_STYLE));
         if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN)
           return _gtk_css_number_value_new (0, GTK_CSS_PX);
         break;
@@ -107,14 +109,14 @@ gtk_css_value_number_compute (GtkCssValue        *number,
     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_number_value_get (_gtk_css_computed_values_get_value (values, 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_number_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_FONT_SIZE), 100),
                                         GTK_CSS_PX);
     case GTK_CSS_RAD:
       return _gtk_css_number_value_new (number->value * 360.0 / (2 * G_PI),
index 077ab8429b4e61516fe62b200c410771d09e6fd5..6f33de73a1e2a2c7881fb1d4fd9fcc402ebd84ab 100644 (file)
@@ -37,16 +37,18 @@ gtk_css_value_position_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_position_compute (GtkCssValue        *position,
-                                guint               property_id,
-                                GtkStyleContext    *context,
-                                GtkCssDependencies *dependencies)
+gtk_css_value_position_compute (GtkCssValue             *position,
+                                guint                    property_id,
+                                GtkStyleProviderPrivate *provider,
+                                GtkCssComputedValues    *values,
+                                GtkCssComputedValues    *parent_values,
+                                GtkCssDependencies      *dependencies)
 {
   GtkCssValue *x, *y;
   GtkCssDependencies x_deps, y_deps;
 
-  x = _gtk_css_value_compute (position->x, property_id, context, &x_deps);
-  y = _gtk_css_value_compute (position->y, property_id, context, &y_deps);
+  x = _gtk_css_value_compute (position->x, property_id, provider, values, parent_values, &x_deps);
+  y = _gtk_css_value_compute (position->y, property_id, provider, values, parent_values, &y_deps);
   *dependencies = _gtk_css_dependencies_union (x_deps, y_deps);
   if (x == position->x && y == position->y)
     {
index b9387eb7dec7729ea382fc1b2c46fc587c682174..eda6fef4238c8c907952915ece5b0710a97fbf24 100644 (file)
@@ -34,10 +34,12 @@ gtk_css_value_repeat_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_repeat_compute (GtkCssValue        *value,
-                              guint               property_id,
-                              GtkStyleContext    *context,
-                              GtkCssDependencies *dependencies)
+gtk_css_value_repeat_compute (GtkCssValue             *value,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies      *dependencies)
 {
   return _gtk_css_value_ref (value);
 }
index 99bcfa2b00a092018f76c35abe1f1eeb3e282b50..ccccac2fe85d006c4a3f538f64523bc0c41bfcfc 100644 (file)
@@ -35,10 +35,12 @@ gtk_css_value_rgba_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_rgba_compute (GtkCssValue        *value,
-                            guint               property_id,
-                            GtkStyleContext    *context,
-                            GtkCssDependencies *dependencies)
+gtk_css_value_rgba_compute (GtkCssValue             *value,
+                            guint                    property_id,
+                            GtkStyleProviderPrivate *provider,
+                            GtkCssComputedValues    *values,
+                            GtkCssComputedValues    *parent_values,
+                            GtkCssDependencies      *dependencies)
 {
   return _gtk_css_value_ref (value);
 }
index d565d89d72c3f60c85f189bd937622ab34ea4db5..267c41c43991b04a8d6bfea8c8493fcfc10be8a1 100644 (file)
@@ -48,10 +48,12 @@ gtk_css_value_shadows_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_shadows_compute (GtkCssValue        *value,
-                               guint               property_id,
-                               GtkStyleContext    *context,
-                               GtkCssDependencies *dependencies)
+gtk_css_value_shadows_compute (GtkCssValue             *value,
+                               guint                    property_id,
+                               GtkStyleProviderPrivate *provider,
+                               GtkCssComputedValues    *values,
+                               GtkCssComputedValues    *parent_values,
+                               GtkCssDependencies      *dependencies)
 {
   GtkCssValue *result;
   GtkCssDependencies child_deps;
@@ -63,7 +65,7 @@ gtk_css_value_shadows_compute (GtkCssValue        *value,
   result = gtk_css_shadows_value_new (value->values, value->len);
   for (i = 0; i < value->len; i++)
     {
-      result->values[i] = _gtk_css_value_compute (value->values[i], property_id, context, &child_deps);
+      result->values[i] = _gtk_css_value_compute (value->values[i], property_id, provider, values, parent_values, &child_deps);
       *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
     }
 
index 56ebe3af1b73859d4bbf7ef7d7f5828ae14a7ea0..be215972adf0eb029e756fa1706f71bad34a4eae 100644 (file)
@@ -61,32 +61,34 @@ gtk_css_value_shadow_free (GtkCssValue *shadow)
 }
 
 static GtkCssValue *
-gtk_css_value_shadow_compute (GtkCssValue        *shadow,
-                              guint               property_id,
-                              GtkStyleContext    *context,
-                              GtkCssDependencies *dependencies)
+gtk_css_value_shadow_compute (GtkCssValue             *shadow,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies      *dependencies)
 {
   GtkCssValue *hoffset, *voffset, *radius, *spread, *color;
   GtkCssDependencies child_deps;
 
   child_deps = 0;
-  hoffset = _gtk_css_value_compute (shadow->hoffset, property_id, context, &child_deps);
+  hoffset = _gtk_css_value_compute (shadow->hoffset, property_id, provider, values, parent_values, &child_deps);
   *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
 
   child_deps = 0;
-  voffset = _gtk_css_value_compute (shadow->voffset, property_id, context, &child_deps);
+  voffset = _gtk_css_value_compute (shadow->voffset, property_id, provider, values, parent_values, &child_deps);
   *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
 
   child_deps = 0;
-  radius = _gtk_css_value_compute (shadow->radius, property_id, context, &child_deps);
+  radius = _gtk_css_value_compute (shadow->radius, property_id, provider, values, parent_values, &child_deps);
   *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
 
   child_deps = 0;
-  spread = _gtk_css_value_compute (shadow->spread, property_id, context, &child_deps),
+  spread = _gtk_css_value_compute (shadow->spread, property_id, provider, values, parent_values, &child_deps),
   *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
 
   child_deps = 0;
-  color = _gtk_css_value_compute (shadow->color, property_id, context, &child_deps);
+  color = _gtk_css_value_compute (shadow->color, property_id, provider, values, parent_values, &child_deps);
   *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
 
   return gtk_css_shadow_value_new (hoffset, voffset, radius, spread, shadow->inset, color);
index 02405f4106f1cf1f23b64df25ae3bca230d6e709..82e7c37b6ed59edb163e939a87b4787f1c9ed50d 100644 (file)
@@ -34,10 +34,12 @@ gtk_css_value_string_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_string_compute (GtkCssValue        *value,
-                              guint               property_id,
-                              GtkStyleContext    *context,
-                              GtkCssDependencies *dependencies)
+gtk_css_value_string_compute (GtkCssValue             *value,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies      *dependencies)
 {
   return _gtk_css_value_ref (value);
 }
index e893a2c29202f0ba0c09c940759dc21c6a9931da..182837a16c6429d14d370a528c826e10e31361ec 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "gtkcssimagegradientprivate.h"
 #include "gtkcssprovider.h"
+#include "gtkcssrgbavalueprivate.h"
 #include "gtkcsstypedvalueprivate.h"
 #include "gtkcsstypesprivate.h"
 #include "gtkgradient.h"
@@ -49,13 +50,15 @@ static GHashTable *parse_funcs = NULL;
 static GHashTable *print_funcs = NULL;
 static GHashTable *compute_funcs = NULL;
 
-typedef gboolean         (* GtkStyleParseFunc)             (GtkCssParser           *parser,
-                                                            GValue                 *value);
-typedef void             (* GtkStylePrintFunc)             (const GValue           *value,
-                                                            GString                *string);
-typedef GtkCssValue *    (* GtkStyleComputeFunc)           (GtkStyleContext        *context,
-                                                            GtkCssValue            *specified,
-                                                            GtkCssDependencies     *dependencies);
+typedef gboolean         (* GtkStyleParseFunc)             (GtkCssParser            *parser,
+                                                            GValue                  *value);
+typedef void             (* GtkStylePrintFunc)             (const GValue            *value,
+                                                            GString                 *string);
+typedef GtkCssValue *    (* GtkStyleComputeFunc)           (GtkStyleProviderPrivate *provider,
+                                                            GtkCssComputedValues    *values,
+                                                            GtkCssComputedValues    *parent_values,
+                                                            GtkCssValue             *specified,
+                                                            GtkCssDependencies      *dependencies);
 
 static void
 register_conversion_function (GType               type,
@@ -204,9 +207,11 @@ rgba_value_print (const GValue *value,
 }
 
 static GtkCssValue *
-rgba_value_compute (GtkStyleContext    *context,
-                    GtkCssValue        *specified,
-                    GtkCssDependencies *dependencies)
+rgba_value_compute (GtkStyleProviderPrivate *provider,
+                    GtkCssComputedValues    *values,
+                    GtkCssComputedValues    *parent_values,
+                    GtkCssValue             *specified,
+                    GtkCssDependencies      *dependencies)
 {
   GdkRGBA white = { 1, 1, 1, 1 };
   const GValue *value;
@@ -216,10 +221,21 @@ rgba_value_compute (GtkStyleContext    *context,
   if (G_VALUE_HOLDS (value, GTK_TYPE_SYMBOLIC_COLOR))
     {
       GtkSymbolicColor *symbolic = g_value_get_boxed (value);
+      GtkCssValue *val;
       GValue new_value = G_VALUE_INIT;
       GdkRGBA rgba;
 
-      if (!_gtk_style_context_resolve_color (context, symbolic, &rgba, dependencies))
+      val = _gtk_symbolic_color_resolve_full (symbolic,
+                                              provider,
+                                              _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
+                                              GTK_CSS_DEPENDS_ON_COLOR,
+                                              dependencies);
+      if (val != NULL)
+        {
+          rgba = *_gtk_css_rgba_value_get_rgba (val);
+          _gtk_css_value_unref (val);
+        }
+      else
         rgba = white;
 
       g_value_init (&new_value, GDK_TYPE_RGBA);
@@ -278,11 +294,12 @@ color_value_print (const GValue *value,
 }
 
 static GtkCssValue *
-color_value_compute (GtkStyleContext    *context,
-                     GtkCssValue        *specified,
-                     GtkCssDependencies *dependencies)
+color_value_compute (GtkStyleProviderPrivate *provider,
+                     GtkCssComputedValues    *values,
+                     GtkCssComputedValues    *parent_values,
+                     GtkCssValue             *specified,
+                     GtkCssDependencies      *dependencies)
 {
-  GdkRGBA rgba;
   GdkColor color = { 0, 65535, 65535, 65535 };
   const GValue *value;
 
@@ -291,15 +308,20 @@ color_value_compute (GtkStyleContext    *context,
   if (G_VALUE_HOLDS (value, GTK_TYPE_SYMBOLIC_COLOR))
     {
       GValue new_value = G_VALUE_INIT;
-
-      if (_gtk_style_context_resolve_color (context,
-                                            g_value_get_boxed (value),
-                                            &rgba,
-                                            dependencies))
+      GtkCssValue *val;
+
+      val = _gtk_symbolic_color_resolve_full ((GtkSymbolicColor *) g_value_get_boxed (value),
+                                              provider,
+                                              _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
+                                              GTK_CSS_DEPENDS_ON_COLOR,
+                                              dependencies);
+      if (val != NULL)
         {
-          color.red = rgba.red * 65535. + 0.5;
-          color.green = rgba.green * 65535. + 0.5;
-          color.blue = rgba.blue * 65535. + 0.5;
+          const GdkRGBA *rgba = _gtk_css_rgba_value_get_rgba (val);
+          color.red = rgba->red * 65535. + 0.5;
+          color.green = rgba->green * 65535. + 0.5;
+          color.blue = rgba->blue * 65535. + 0.5;
+          _gtk_css_value_unref (val);
         }
       
       g_value_init (&new_value, GDK_TYPE_COLOR);
@@ -822,9 +844,11 @@ pattern_value_print (const GValue *value,
 }
 
 static GtkCssValue *
-pattern_value_compute (GtkStyleContext    *context,
-                       GtkCssValue        *specified,
-                       GtkCssDependencies *dependencies)
+pattern_value_compute (GtkStyleProviderPrivate *provider,
+                       GtkCssComputedValues    *values,
+                       GtkCssComputedValues    *parent_values,
+                       GtkCssValue             *specified,
+                       GtkCssDependencies      *dependencies)
 {
   const GValue *value = _gtk_css_typed_value_get (specified);
 
@@ -833,7 +857,7 @@ pattern_value_compute (GtkStyleContext    *context,
       GValue new_value = G_VALUE_INIT;
       cairo_pattern_t *gradient;
       
-      gradient = _gtk_gradient_resolve_full (g_value_get_boxed (value), context, dependencies);
+      gradient = _gtk_gradient_resolve_full (g_value_get_boxed (value), provider, values, parent_values, dependencies);
 
       g_value_init (&new_value, CAIRO_GOBJECT_TYPE_PATTERN);
       g_value_take_boxed (&new_value, gradient);
@@ -1088,7 +1112,9 @@ _gtk_css_style_print_value (const GValue *value,
 
 /**
  * _gtk_css_style_compute_value:
- * @context: the context to use for computing the value
+ * @provider: Style provider to look up information from
+ * @values: The values to compute for
+ * @parent_values: Values to look up inherited values from
  * @target_type: Type the resulting value should have
  * @specified: the value to use for the computation
  * @dependencies: (out): Value initialized with 0 to take the dependencies
@@ -1102,14 +1128,18 @@ _gtk_css_style_print_value (const GValue *value,
  * Returns: the resulting value
  **/
 GtkCssValue *
-_gtk_css_style_compute_value (GtkStyleContext    *context,
-                             GType               target_type,
-                              GtkCssValue        *specified,
-                              GtkCssDependencies *dependencies)
+_gtk_css_style_compute_value (GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                             GType                    target_type,
+                              GtkCssValue             *specified,
+                              GtkCssDependencies      *dependencies)
 {
   GtkStyleComputeFunc func;
 
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+  g_return_val_if_fail (GTK_IS_STYLE_PROVIDER (provider), NULL);
+  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL);
   g_return_val_if_fail (*dependencies == 0, NULL);
 
   gtk_css_style_funcs_init ();
@@ -1121,7 +1151,7 @@ _gtk_css_style_compute_value (GtkStyleContext    *context,
                                 GSIZE_TO_POINTER (g_type_fundamental (target_type)));
 
   if (func)
-    return func (context, specified, dependencies);
+    return func (provider, values, parent_values, specified, dependencies);
   else
     return _gtk_css_value_ref (specified);
 }
index e4f1ec46cee7885f1ee6db7f2a2f5b081edd8fb6..df13b809490bf6c90228df51fd8f54989d665a88 100644 (file)
 
 G_BEGIN_DECLS
 
-gboolean            _gtk_css_style_parse_value             (GValue                 *value,
-                                                            GtkCssParser           *parser);
-void                _gtk_css_style_print_value             (const GValue           *value,
-                                                            GString                *string);
-GtkCssValue *       _gtk_css_style_compute_value           (GtkStyleContext        *context,
-                                                           GType                   target_type,
-                                                            GtkCssValue            *specified,
-                                                            GtkCssDependencies     *dependencies);
+gboolean            _gtk_css_style_parse_value             (GValue                  *value,
+                                                            GtkCssParser            *parser);
+void                _gtk_css_style_print_value             (const GValue            *value,
+                                                            GString                 *string);
+GtkCssValue *       _gtk_css_style_compute_value           (GtkStyleProviderPrivate *provider,
+                                                            GtkCssComputedValues    *values,
+                                                            GtkCssComputedValues    *parent_values,
+                                                           GType                    target_type,
+                                                            GtkCssValue             *specified,
+                                                            GtkCssDependencies      *dependencies);
 
 G_END_DECLS
 
index 5ce5effae515b55fc332118aa6e38796d8f47025..aecee31d738d33a2bb0636874e4546f439f930ce 100644 (file)
@@ -35,14 +35,16 @@ gtk_css_value_typed_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_typed_compute (GtkCssValue        *value,
-                             guint               property_id,
-                             GtkStyleContext    *context,
-                             GtkCssDependencies *dependencies)
+gtk_css_value_typed_compute (GtkCssValue             *value,
+                             guint                    property_id,
+                             GtkStyleProviderPrivate *provider,
+                             GtkCssComputedValues    *values,
+                             GtkCssComputedValues    *parent_values,
+                             GtkCssDependencies      *dependencies)
 {
   GtkCssCustomProperty *custom = GTK_CSS_CUSTOM_PROPERTY (_gtk_css_style_property_lookup_by_id (property_id));
 
-  return _gtk_css_style_compute_value (context, custom->pspec->value_type, value, dependencies);
+  return _gtk_css_style_compute_value (provider, values, parent_values, custom->pspec->value_type, value, dependencies);
 }
 
 static gboolean
index 0dcbe0c4990879bf30a6b7decc7c706449ef0992..c5e5bdcfc1531eb5c5f1382faaf0d3531479bdae 100644 (file)
@@ -19,6 +19,9 @@
 
 #include "gtkcssvalueprivate.h"
 
+#include "gtkcsscomputedvaluesprivate.h"
+#include "gtkstyleproviderprivate.h"
+
 struct _GtkCssValue {
   GTK_CSS_VALUE_BASE
 };
@@ -65,7 +68,9 @@ _gtk_css_value_unref (GtkCssValue *value)
  * _gtk_css_value_compute:
  * @value: the value to compute from
  * @property_id: the ID of the property to compute
- * @context: the context to use for resolving
+ * @provider: Style provider for looking up extra information
+ * @values: values to compute for
+ * @parent_values: parent values to use for inherited values
  * @dependencies: (out) (allow-none): Set to the dependencies of the
  *     computed values that indicate when this value needs to be
  *     recomputed and how.
@@ -79,21 +84,25 @@ _gtk_css_value_unref (GtkCssValue *value)
  * Returns: the computed value
  **/
 GtkCssValue *
-_gtk_css_value_compute (GtkCssValue        *value,
-                        guint               property_id,
-                        GtkStyleContext    *context,
-                        GtkCssDependencies *dependencies)
+_gtk_css_value_compute (GtkCssValue             *value,
+                        guint                    property_id,
+                        GtkStyleProviderPrivate *provider,
+                        GtkCssComputedValues    *values,
+                        GtkCssComputedValues    *parent_values,
+                        GtkCssDependencies      *dependencies)
 {
   GtkCssDependencies fallback;
 
   g_return_val_if_fail (value != NULL, NULL);
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+  g_return_val_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider), NULL);
+  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL);
 
   if (dependencies == NULL)
     dependencies = &fallback;
   *dependencies = 0;
 
-  return value->class->compute (value, property_id, context, dependencies);
+  return value->class->compute (value, property_id, provider, values, parent_values, dependencies);
 }
 
 gboolean
index 35a0f7f794435e6e922c1fff0bd2fae4488e27b3..1d2424e5f7944333eca7e074a7167cf010ec113a 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <glib-object.h>
 #include "gtkcsstypesprivate.h"
-#include "gtktypes.h"
 
 G_BEGIN_DECLS
 
@@ -43,7 +42,9 @@ struct _GtkCssValueClass {
 
   GtkCssValue * (* compute)                           (GtkCssValue                *value,
                                                        guint                       property_id,
-                                                       GtkStyleContext            *context,
+                                                       GtkStyleProviderPrivate    *provider,
+                                                       GtkCssComputedValues       *values,
+                                                       GtkCssComputedValues       *parent_values,
                                                        GtkCssDependencies         *dependencies);
   gboolean      (* equal)                             (const GtkCssValue          *value1,
                                                        const GtkCssValue          *value2);
@@ -66,7 +67,9 @@ void         _gtk_css_value_unref                     (GtkCssValue
 
 GtkCssValue *_gtk_css_value_compute                   (GtkCssValue                *value,
                                                        guint                       property_id,
-                                                       GtkStyleContext            *context,
+                                                       GtkStyleProviderPrivate    *provider,
+                                                       GtkCssComputedValues       *values,
+                                                       GtkCssComputedValues       *parent_values,
                                                        GtkCssDependencies         *dependencies);
 gboolean     _gtk_css_value_equal                     (const GtkCssValue          *value1,
                                                        const GtkCssValue          *value2);
index ba4e30340b39fff04d3dfcea76c38e1a589470d5..1586757c9b59f7cef44c3598f2e5c2da1d568c3f 100644 (file)
 
 #include "config.h"
 #include "gtkgradient.h"
+#include "gtkcssrgbavalueprivate.h"
 #include "gtkstylecontextprivate.h"
 #include "gtkstyleproperties.h"
-#include "gtkintl.h"
+#include "gtkstylepropertiesprivate.h"
 
 /**
  * SECTION:gtkgradient
@@ -281,15 +282,19 @@ gtk_gradient_resolve (GtkGradient         *gradient,
 }
 
 cairo_pattern_t *
-_gtk_gradient_resolve_full (GtkGradient        *gradient,
-                            GtkStyleContext    *context,
-                            GtkCssDependencies *dependencies)
+_gtk_gradient_resolve_full (GtkGradient             *gradient,
+                            GtkStyleProviderPrivate *provider,
+                            GtkCssComputedValues    *values,
+                            GtkCssComputedValues    *parent_values,
+                            GtkCssDependencies      *dependencies)
 {
   cairo_pattern_t *pattern;
   guint i;
 
   g_return_val_if_fail (gradient != NULL, NULL);
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+  g_return_val_if_fail (GTK_IS_STYLE_PROVIDER (provider), NULL);
+  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+  g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL);
   g_return_val_if_fail (*dependencies == 0, NULL);
 
   if (gradient->radius0 == 0 && gradient->radius1 == 0)
@@ -304,16 +309,28 @@ _gtk_gradient_resolve_full (GtkGradient        *gradient,
   for (i = 0; i < gradient->stops->len; i++)
     {
       ColorStop *stop;
+      GtkCssValue *val;
       GdkRGBA rgba;
       GtkCssDependencies stop_deps;
 
       stop = &g_array_index (gradient->stops, ColorStop, i);
 
       /* if color resolving fails, assume transparency */
-      if (!_gtk_style_context_resolve_color (context, stop->color, &rgba, &stop_deps))
-        rgba.red = rgba.green = rgba.blue = rgba.alpha = 0.0;
+      val = _gtk_symbolic_color_resolve_full (stop->color,
+                                              provider,
+                                              _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
+                                              GTK_CSS_DEPENDS_ON_COLOR,
+                                              &stop_deps);
+      if (val)
+        {
+          rgba = *_gtk_css_rgba_value_get_rgba (val);
+          *dependencies = _gtk_css_dependencies_union (*dependencies, stop_deps);
+        }
+      else
+        {
+          rgba.red = rgba.green = rgba.blue = rgba.alpha = 0.0;
+        }
 
-      *dependencies = _gtk_css_dependencies_union (*dependencies, stop_deps);
       cairo_pattern_add_color_stop_rgba (pattern, stop->offset,
                                          rgba.red, rgba.green,
                                          rgba.blue, rgba.alpha);
@@ -322,18 +339,6 @@ _gtk_gradient_resolve_full (GtkGradient        *gradient,
   return pattern;
 }
 
-cairo_pattern_t *
-gtk_gradient_resolve_for_context (GtkGradient     *gradient,
-                                  GtkStyleContext *context)
-{
-  GtkCssDependencies ignored = 0;
-
-  g_return_val_if_fail (gradient != NULL, NULL);
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
-
-  return _gtk_gradient_resolve_full (gradient, context, &ignored);
-}
-
 static void
 append_number (GString    *str,
                double      d,
index 99b2091741bb52537bc67d4f9d1dde94900a2a75..ebaeb1bef139b256b351cb9a48ab829fab12838c 100644 (file)
@@ -697,14 +697,6 @@ gtk_style_context_set_cascade (GtkStyleContext *context,
     gtk_style_context_cascade_changed (cascade, context);
 }
 
-GtkStyleProviderPrivate *
-_gtk_style_context_get_style_provider (GtkStyleContext *context)
-{
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
-
-  return GTK_STYLE_PROVIDER_PRIVATE (context->priv->cascade);
-}
-
 static void
 gtk_style_context_init (GtkStyleContext *style_context)
 {
@@ -987,7 +979,10 @@ build_properties (GtkStyleContext      *context,
                                         &matcher,
                                         lookup);
 
-  _gtk_css_lookup_resolve (lookup, context, values);
+  _gtk_css_lookup_resolve (lookup, 
+                           GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
+                           values,
+                           priv->parent ? style_data_lookup (priv->parent)->store : NULL);
 
   _gtk_css_lookup_free (lookup);
   gtk_widget_path_free (path);
@@ -3146,9 +3141,10 @@ _gtk_style_context_validate (GtkStyleContext  *context,
       data = style_data_lookup (context);
 
       _gtk_css_computed_values_create_animations (data->store,
+                                                  priv->parent ? style_data_lookup (priv->parent)->store : NULL,
                                                   timestamp,
-                                                  current && gtk_style_context_should_create_transitions (context) ? current->store : NULL,
-                                                  context);
+                                                  GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
+                                                  current && gtk_style_context_should_create_transitions (context) ? current->store : NULL);
       if (_gtk_css_computed_values_is_static (data->store))
         change &= ~GTK_CSS_CHANGE_ANIMATE;
       else
@@ -4584,3 +4580,21 @@ _gtk_style_context_get_attributes (AtkAttributeSet *attributes,
 
   return attributes;
 }
+
+cairo_pattern_t *
+gtk_gradient_resolve_for_context (GtkGradient     *gradient,
+                                  GtkStyleContext *context)
+{
+  GtkStyleContextPrivate *priv = context->priv;
+  GtkCssDependencies ignored = 0;
+
+  g_return_val_if_fail (gradient != NULL, NULL);
+  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+
+  return _gtk_gradient_resolve_full (gradient,
+                                     GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
+                                     style_data_lookup (context)->store,
+                                     priv->parent ? style_data_lookup (priv->parent)->store : NULL,
+                                     &ignored);
+}
+
index bd73dfc750e38002353b8b2816a1b0a2c415f852..7987b713b9063df1407a7d38b7196bb65186d2aa 100644 (file)
@@ -58,9 +58,6 @@ void           _gtk_style_context_get_cursor_color           (GtkStyleContext
                                                               GdkRGBA            *primary_color,
                                                               GdkRGBA            *secondary_color);
 
-GtkStyleProviderPrivate *
-               _gtk_style_context_get_style_provider         (GtkStyleContext    *context);
-
 void           _gtk_style_context_update_animating           (GtkStyleContext    *context);
 
 G_END_DECLS
index d459307cd7f17a603b555d52d8df7623f111cfd5..2e1bd97af797f5040b1caf4421b892413809b2f2 100644 (file)
@@ -34,9 +34,11 @@ void           _gtk_style_properties_set_property_by_property (GtkStylePropertie
                                                                GtkCssValue             *value);
 
 cairo_pattern_t *
-              _gtk_gradient_resolve_full  (GtkGradient         *gradient,
-                                           GtkStyleContext     *context,
-                                           GtkCssDependencies  *dependencies);
+               _gtk_gradient_resolve_full                     (GtkGradient             *gradient,
+                                                               GtkStyleProviderPrivate *provider,
+                                                               GtkCssComputedValues    *values,
+                                                               GtkCssComputedValues    *parent_values,
+                                                               GtkCssDependencies      *dependencies);
 
 G_END_DECLS
 
index 6a7b4c11fed2d90203722f71d42966ed9f501ec0..e68eb9155e8edda9341a003bf7fb7695ef8436a6 100644 (file)
@@ -120,8 +120,10 @@ gtk_css_value_symbolic_free (GtkCssValue *value)
 }
 
 static GtkCssValue *
-gtk_css_value_symbolic_get_fallback (guint            property_id,
-                                     GtkStyleContext *context)
+gtk_css_value_symbolic_get_fallback (guint                    property_id,
+                                     GtkStyleProviderPrivate *provider,
+                                     GtkCssComputedValues    *values,
+                                     GtkCssComputedValues    *parent_values)
 {
   static const GdkRGBA transparent = { 0, 0, 0, 0 };
 
@@ -142,7 +144,9 @@ gtk_css_value_symbolic_get_fallback (guint            property_id,
       case GTK_CSS_PROPERTY_OUTLINE_COLOR:
         return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)),
                                        property_id,
-                                       context,
+                                       provider,
+                                       values,
+                                       parent_values,
                                        NULL);
       default:
         if (property_id < GTK_CSS_PROPERTY_N_PROPERTIES)
@@ -153,10 +157,12 @@ gtk_css_value_symbolic_get_fallback (guint            property_id,
 }
 
 static GtkCssValue *
-gtk_css_value_symbolic_compute (GtkCssValue        *value,
-                                guint               property_id,
-                                GtkStyleContext    *context,
-                                GtkCssDependencies *dependencies)
+gtk_css_value_symbolic_compute (GtkCssValue             *value,
+                                guint                    property_id,
+                                GtkStyleProviderPrivate *provider,
+                                GtkCssComputedValues    *values,
+                                GtkCssComputedValues    *parent_values,
+                                GtkCssDependencies      *dependencies)
 {
   GtkCssValue *resolved, *current;
   GtkCssDependencies current_deps;
@@ -167,11 +173,9 @@ gtk_css_value_symbolic_compute (GtkCssValue        *value,
    */
   if (property_id == GTK_CSS_PROPERTY_COLOR)
     {
-      GtkStyleContext *parent = gtk_style_context_get_parent (context);
-
-      if (parent)
+      if (parent_values)
         {
-          current = _gtk_style_context_peek_property (parent, GTK_CSS_PROPERTY_COLOR);
+          current = _gtk_css_computed_values_get_value (parent_values, GTK_CSS_PROPERTY_COLOR);
           current_deps = GTK_CSS_EQUALS_PARENT;
         }
       else
@@ -182,14 +186,18 @@ gtk_css_value_symbolic_compute (GtkCssValue        *value,
     }
   else
     {
-      current = _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR);
+      current = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR);
       current_deps = GTK_CSS_DEPENDS_ON_COLOR;
     }
   
-  resolved = _gtk_style_context_resolve_color_value (context, current, current_deps, value, dependencies);
+  resolved = _gtk_symbolic_color_resolve_full ((GtkSymbolicColor *) value,
+                                               provider,
+                                               current,
+                                               current_deps,
+                                               dependencies);
 
   if (resolved == NULL)
-    return gtk_css_value_symbolic_get_fallback (property_id, context);
+    return gtk_css_value_symbolic_get_fallback (property_id, provider, values, parent_values);
 
   return resolved;
 }