summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2012-08-27 18:39:46 +0200
committerBenjamin Otte <otte@redhat.com>2012-08-28 15:42:25 +0200
commit3a65fbfc136b95b51a2248ad0b8382ab173c205a (patch)
tree7ebe5c19d27ec115da48cd4e20017731b21f2cc7 /gtk
parent3cf6db8b1a2a4c2b120a3d37310ddd9d63118e82 (diff)
downloadgtk+-3a65fbfc136b95b51a2248ad0b8382ab173c205a.tar.gz
cssvalue: Implement dependency tracking for gradients
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkcssstylefuncs.c5
-rw-r--r--gtk/gtkgradient.c26
-rw-r--r--gtk/gtkstylepropertiesprivate.h5
3 files changed, 28 insertions, 8 deletions
diff --git a/gtk/gtkcssstylefuncs.c b/gtk/gtkcssstylefuncs.c
index 8478ba3ec2..0320e0adc4 100644
--- a/gtk/gtkcssstylefuncs.c
+++ b/gtk/gtkcssstylefuncs.c
@@ -34,6 +34,7 @@
#include "gtkgradient.h"
#include "gtkprivatetypebuiltins.h"
#include "gtkstylecontextprivate.h"
+#include "gtkstylepropertiesprivate.h"
#include "gtksymboliccolorprivate.h"
#include "gtkthemingengine.h"
#include "gtktypebuiltins.h"
@@ -830,9 +831,7 @@ pattern_value_compute (GtkStyleContext *context,
GValue new_value = G_VALUE_INIT;
cairo_pattern_t *gradient;
- *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING;
-
- gradient = gtk_gradient_resolve_for_context (g_value_get_boxed (value), context);
+ gradient = _gtk_gradient_resolve_full (g_value_get_boxed (value), context, dependencies);
g_value_init (&new_value, CAIRO_GOBJECT_TYPE_PATTERN);
g_value_take_boxed (&new_value, gradient);
diff --git a/gtk/gtkgradient.c b/gtk/gtkgradient.c
index 9743654b6c..ba4e30340b 100644
--- a/gtk/gtkgradient.c
+++ b/gtk/gtkgradient.c
@@ -281,14 +281,16 @@ gtk_gradient_resolve (GtkGradient *gradient,
}
cairo_pattern_t *
-gtk_gradient_resolve_for_context (GtkGradient *gradient,
- GtkStyleContext *context)
+_gtk_gradient_resolve_full (GtkGradient *gradient,
+ GtkStyleContext *context,
+ GtkCssDependencies *dependencies)
{
cairo_pattern_t *pattern;
guint i;
- g_return_val_if_fail (gradient != NULL, FALSE);
- g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), FALSE);
+ g_return_val_if_fail (gradient != NULL, NULL);
+ g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+ g_return_val_if_fail (*dependencies == 0, NULL);
if (gradient->radius0 == 0 && gradient->radius1 == 0)
pattern = cairo_pattern_create_linear (gradient->x0, gradient->y0,
@@ -303,13 +305,15 @@ gtk_gradient_resolve_for_context (GtkGradient *gradient,
{
ColorStop *stop;
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, NULL))
+ if (!_gtk_style_context_resolve_color (context, stop->color, &rgba, &stop_deps))
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);
@@ -318,6 +322,18 @@ gtk_gradient_resolve_for_context (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,
diff --git a/gtk/gtkstylepropertiesprivate.h b/gtk/gtkstylepropertiesprivate.h
index c5b742e791..d459307cd7 100644
--- a/gtk/gtkstylepropertiesprivate.h
+++ b/gtk/gtkstylepropertiesprivate.h
@@ -33,6 +33,11 @@ void _gtk_style_properties_set_property_by_property (GtkStylePropertie
GtkStateFlags state,
GtkCssValue *value);
+cairo_pattern_t *
+ _gtk_gradient_resolve_full (GtkGradient *gradient,
+ GtkStyleContext *context,
+ GtkCssDependencies *dependencies);
+
G_END_DECLS
#endif /* __GTK_STYLE_PROPERTIES_PRIVATE_H__ */