diff options
author | Benjamin Otte <otte@redhat.com> | 2012-08-27 18:39:46 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2012-08-28 15:42:25 +0200 |
commit | 3a65fbfc136b95b51a2248ad0b8382ab173c205a (patch) | |
tree | 7ebe5c19d27ec115da48cd4e20017731b21f2cc7 /gtk | |
parent | 3cf6db8b1a2a4c2b120a3d37310ddd9d63118e82 (diff) | |
download | gtk+-3a65fbfc136b95b51a2248ad0b8382ab173c205a.tar.gz |
cssvalue: Implement dependency tracking for gradients
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkcssstylefuncs.c | 5 | ||||
-rw-r--r-- | gtk/gtkgradient.c | 26 | ||||
-rw-r--r-- | gtk/gtkstylepropertiesprivate.h | 5 |
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__ */ |