cssvalue: Implement dependency tracking for gradients
This commit is contained in:
parent
3cf6db8b1a
commit
3a65fbfc13
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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__ */
|
||||
|
Loading…
Reference in New Issue
Block a user