cssvalue: Implement dependency tracking for gradients
This commit is contained in:
parent
3cf6db8b1a
commit
3a65fbfc13
@ -34,6 +34,7 @@
|
|||||||
#include "gtkgradient.h"
|
#include "gtkgradient.h"
|
||||||
#include "gtkprivatetypebuiltins.h"
|
#include "gtkprivatetypebuiltins.h"
|
||||||
#include "gtkstylecontextprivate.h"
|
#include "gtkstylecontextprivate.h"
|
||||||
|
#include "gtkstylepropertiesprivate.h"
|
||||||
#include "gtksymboliccolorprivate.h"
|
#include "gtksymboliccolorprivate.h"
|
||||||
#include "gtkthemingengine.h"
|
#include "gtkthemingengine.h"
|
||||||
#include "gtktypebuiltins.h"
|
#include "gtktypebuiltins.h"
|
||||||
@ -830,9 +831,7 @@ pattern_value_compute (GtkStyleContext *context,
|
|||||||
GValue new_value = G_VALUE_INIT;
|
GValue new_value = G_VALUE_INIT;
|
||||||
cairo_pattern_t *gradient;
|
cairo_pattern_t *gradient;
|
||||||
|
|
||||||
*dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING;
|
gradient = _gtk_gradient_resolve_full (g_value_get_boxed (value), context, dependencies);
|
||||||
|
|
||||||
gradient = gtk_gradient_resolve_for_context (g_value_get_boxed (value), context);
|
|
||||||
|
|
||||||
g_value_init (&new_value, CAIRO_GOBJECT_TYPE_PATTERN);
|
g_value_init (&new_value, CAIRO_GOBJECT_TYPE_PATTERN);
|
||||||
g_value_take_boxed (&new_value, gradient);
|
g_value_take_boxed (&new_value, gradient);
|
||||||
|
@ -281,14 +281,16 @@ gtk_gradient_resolve (GtkGradient *gradient,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cairo_pattern_t *
|
cairo_pattern_t *
|
||||||
gtk_gradient_resolve_for_context (GtkGradient *gradient,
|
_gtk_gradient_resolve_full (GtkGradient *gradient,
|
||||||
GtkStyleContext *context)
|
GtkStyleContext *context,
|
||||||
|
GtkCssDependencies *dependencies)
|
||||||
{
|
{
|
||||||
cairo_pattern_t *pattern;
|
cairo_pattern_t *pattern;
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
g_return_val_if_fail (gradient != NULL, FALSE);
|
g_return_val_if_fail (gradient != NULL, NULL);
|
||||||
g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), FALSE);
|
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)
|
if (gradient->radius0 == 0 && gradient->radius1 == 0)
|
||||||
pattern = cairo_pattern_create_linear (gradient->x0, gradient->y0,
|
pattern = cairo_pattern_create_linear (gradient->x0, gradient->y0,
|
||||||
@ -303,13 +305,15 @@ gtk_gradient_resolve_for_context (GtkGradient *gradient,
|
|||||||
{
|
{
|
||||||
ColorStop *stop;
|
ColorStop *stop;
|
||||||
GdkRGBA rgba;
|
GdkRGBA rgba;
|
||||||
|
GtkCssDependencies stop_deps;
|
||||||
|
|
||||||
stop = &g_array_index (gradient->stops, ColorStop, i);
|
stop = &g_array_index (gradient->stops, ColorStop, i);
|
||||||
|
|
||||||
/* if color resolving fails, assume transparency */
|
/* 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;
|
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,
|
cairo_pattern_add_color_stop_rgba (pattern, stop->offset,
|
||||||
rgba.red, rgba.green,
|
rgba.red, rgba.green,
|
||||||
rgba.blue, rgba.alpha);
|
rgba.blue, rgba.alpha);
|
||||||
@ -318,6 +322,18 @@ gtk_gradient_resolve_for_context (GtkGradient *gradient,
|
|||||||
return pattern;
|
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
|
static void
|
||||||
append_number (GString *str,
|
append_number (GString *str,
|
||||||
double d,
|
double d,
|
||||||
|
@ -33,6 +33,11 @@ void _gtk_style_properties_set_property_by_property (GtkStylePropertie
|
|||||||
GtkStateFlags state,
|
GtkStateFlags state,
|
||||||
GtkCssValue *value);
|
GtkCssValue *value);
|
||||||
|
|
||||||
|
cairo_pattern_t *
|
||||||
|
_gtk_gradient_resolve_full (GtkGradient *gradient,
|
||||||
|
GtkStyleContext *context,
|
||||||
|
GtkCssDependencies *dependencies);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GTK_STYLE_PROPERTIES_PRIVATE_H__ */
|
#endif /* __GTK_STYLE_PROPERTIES_PRIVATE_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user