From ccd443796c0d305e48a1d675c087801d0a72ab35 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 28 Mar 2012 01:56:57 +0200 Subject: [PATCH] shadow: Make this a GtkCssValue --- gtk/gtkcssstylepropertyimpl.c | 45 ++++--------- gtk/gtkcssvalue.c | 17 ----- gtk/gtkcssvalueprivate.h | 4 +- gtk/gtkshadow.c | 117 +++++++++++++++++----------------- gtk/gtkshadowprivate.h | 13 +--- gtk/gtkthemingbackground.c | 11 +--- gtk/gtkthemingengine.c | 27 ++------ 7 files changed, 86 insertions(+), 148 deletions(-) diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index 4f97622de3..6f5e9c225d 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -428,7 +428,7 @@ shadow_value_parse (GtkCssStyleProperty *property, guint i; if (_gtk_css_parser_try (parser, "none", TRUE)) - return _gtk_css_value_new_take_shadow (NULL); + return _gtk_shadow_new_none (); shadow = _gtk_shadow_new (); @@ -453,7 +453,7 @@ shadow_value_parse (GtkCssStyleProperty *property, if (!_gtk_css_parser_try_double (parser, &voffset)) { _gtk_css_parser_error (parser, "Horizontal and vertical offsets are required"); - _gtk_shadow_unref (shadow); + _gtk_css_value_unref (shadow); return NULL; } @@ -477,7 +477,7 @@ shadow_value_parse (GtkCssStyleProperty *property, if (color == NULL) { - _gtk_shadow_unref (shadow); + _gtk_css_value_unref (shadow); return NULL; } } @@ -486,7 +486,7 @@ shadow_value_parse (GtkCssStyleProperty *property, if (!have_color || !have_lengths) { _gtk_css_parser_error (parser, "Must specify at least color and offsets"); - _gtk_shadow_unref (shadow); + _gtk_css_value_unref (shadow); return NULL; } @@ -500,22 +500,7 @@ shadow_value_parse (GtkCssStyleProperty *property, } while (_gtk_css_parser_try (parser, ",", TRUE)); - return _gtk_css_value_new_take_shadow (shadow); -} - -static void -shadow_value_print (GtkCssStyleProperty *property, - const GtkCssValue *value, - GString *string) -{ - GtkShadow *shadow; - - shadow = _gtk_css_value_get_shadow (value); - - if (shadow == NULL) - g_string_append (string, "none"); - else - _gtk_shadow_print (shadow, string); + return shadow; } static GtkCssValue * @@ -523,13 +508,7 @@ shadow_value_compute (GtkCssStyleProperty *property, GtkStyleContext *context, GtkCssValue *specified) { - GtkShadow *shadow; - - shadow = _gtk_css_value_get_shadow (specified); - if (shadow) - shadow = _gtk_shadow_resolve (shadow, context); - - return _gtk_css_value_new_take_shadow (shadow); + return _gtk_shadow_resolve (specified, context); } static GtkCssValue * @@ -1310,31 +1289,31 @@ _gtk_css_style_property_init_properties (void) G_TYPE_NONE, GTK_STYLE_PROPERTY_INHERIT, shadow_value_parse, - shadow_value_print, + NULL, shadow_value_compute, NULL, NULL, - _gtk_css_value_new_take_shadow (NULL)); + _gtk_shadow_new_none ()); gtk_css_style_property_register ("icon-shadow", G_TYPE_NONE, GTK_STYLE_PROPERTY_INHERIT, shadow_value_parse, - shadow_value_print, + NULL, shadow_value_compute, NULL, NULL, - _gtk_css_value_new_take_shadow (NULL)); + _gtk_shadow_new_none ()); gtk_css_style_property_register ("box-shadow", G_TYPE_NONE, 0, shadow_value_parse, - shadow_value_print, + NULL, shadow_value_compute, NULL, NULL, - _gtk_css_value_new_take_shadow (NULL)); + _gtk_shadow_new_none ()); gtk_css_style_property_register ("margin-top", G_TYPE_INT, diff --git a/gtk/gtkcssvalue.c b/gtk/gtkcssvalue.c index 7f3197d6e6..d85f30d37d 100644 --- a/gtk/gtkcssvalue.c +++ b/gtk/gtkcssvalue.c @@ -269,17 +269,6 @@ _gtk_css_value_new_take_pattern (cairo_pattern_t *v) return value; } -GtkCssValue * -_gtk_css_value_new_take_shadow (GtkShadow *v) -{ - GtkCssValue *value; - - value = gtk_css_value_new (GTK_TYPE_SHADOW); - value->u.ptr = v; - - return value; -} - GtkCssValue * _gtk_css_value_new_take_image (GtkCssImage *v) { @@ -664,9 +653,3 @@ _gtk_css_value_get_gradient (const GtkCssValue *value) return value->u.ptr; } -GtkShadow * -_gtk_css_value_get_shadow (const GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_SHADOW), NULL); - return value->u.ptr; -} diff --git a/gtk/gtkcssvalueprivate.h b/gtk/gtkcssvalueprivate.h index e962326852..a9dc8425fa 100644 --- a/gtk/gtkcssvalueprivate.h +++ b/gtk/gtkcssvalueprivate.h @@ -24,7 +24,7 @@ #include "gtkcsstypesprivate.h" #include "gtksymboliccolor.h" #include "gtkcssimageprivate.h" -#include "gtkshadowprivate.h" +#include "gtkthemingengine.h" G_BEGIN_DECLS @@ -85,7 +85,6 @@ GtkCssValue *_gtk_css_value_new_from_rgba (const GdkRGBA GtkCssValue *_gtk_css_value_new_from_color (const GdkColor *v); GtkCssValue *_gtk_css_value_new_take_symbolic_color (GtkSymbolicColor *v); GtkCssValue *_gtk_css_value_new_take_pattern (cairo_pattern_t *v); -GtkCssValue *_gtk_css_value_new_take_shadow (GtkShadow *v); GtkCssValue *_gtk_css_value_new_take_image (GtkCssImage *v); GtkCssValue *_gtk_css_value_new_from_theming_engine (GtkThemingEngine *v); GtkCssValue *_gtk_css_value_new_take_binding_sets (GPtrArray *array); @@ -118,7 +117,6 @@ PangoWeight _gtk_css_value_get_pango_weight (const const GdkRGBA *_gtk_css_value_get_rgba (const GtkCssValue *value); cairo_pattern_t *_gtk_css_value_get_pattern (const GtkCssValue *value); GtkGradient *_gtk_css_value_get_gradient (const GtkCssValue *value); -GtkShadow *_gtk_css_value_get_shadow (const GtkCssValue *value); G_END_DECLS diff --git a/gtk/gtkshadow.c b/gtk/gtkshadow.c index c3b1f0970f..f274c9f0c1 100644 --- a/gtk/gtkshadow.c +++ b/gtk/gtkshadow.c @@ -108,49 +108,74 @@ shadow_element_new (gdouble hoffset, * GtkShadow * ****************/ -G_DEFINE_BOXED_TYPE (GtkShadow, _gtk_shadow, - _gtk_shadow_ref, _gtk_shadow_unref) - -struct _GtkShadow { +struct _GtkCssValue { + GTK_CSS_VALUE_BASE GList *elements; - guint ref_count; + gboolean resolved; }; +static void +gtk_css_value_shadow_free (GtkCssValue *shadow) +{ + g_list_free_full (shadow->elements, + (GDestroyNotify) shadow_element_free); + g_slice_free (GtkShadow, shadow); +} + +static gboolean +gtk_css_value_shadow_equal (const GtkCssValue *shadow1, + const GtkCssValue *shadow2) +{ + /* FIXME */ + return shadow1 == shadow2; +} + +static void +gtk_css_value_shadow_print (const GtkCssValue *shadow, + GString *string) +{ + gint length; + GList *l; + + length = g_list_length (shadow->elements); + + if (length == 0) + { + g_string_append (string, "none"); + return; + } + + shadow_element_print (shadow->elements->data, string); + + if (length == 1) + return; + + for (l = g_list_next (shadow->elements); l != NULL; l = l->next) + { + g_string_append (string, ", "); + shadow_element_print (l->data, string); + } +} + +static const GtkCssValueClass GTK_CSS_VALUE_SHADOW = { + gtk_css_value_shadow_free, + gtk_css_value_shadow_equal, + gtk_css_value_shadow_print +}; + +static GtkCssValue none_singleton = { >K_CSS_VALUE_SHADOW, 1, NULL, FALSE }; + GtkShadow * _gtk_shadow_new (void) { - GtkShadow *retval; - - retval = g_slice_new0 (GtkShadow); - retval->ref_count = 1; - - return retval; + return _gtk_css_value_new (GtkShadow, >K_CSS_VALUE_SHADOW); } GtkShadow * -_gtk_shadow_ref (GtkShadow *shadow) +_gtk_shadow_new_none (void) { - g_return_val_if_fail (shadow != NULL, NULL); - - shadow->ref_count++; - - return shadow; -} - -void -_gtk_shadow_unref (GtkShadow *shadow) -{ - g_return_if_fail (shadow != NULL); - - shadow->ref_count--; - - if (shadow->ref_count == 0) - { - g_list_free_full (shadow->elements, - (GDestroyNotify) shadow_element_free); - g_slice_free (GtkShadow, shadow); - } + return _gtk_css_value_ref (&none_singleton); } void @@ -193,7 +218,7 @@ _gtk_shadow_resolve (GtkShadow *shadow, element->symbolic_color, &color)) { - _gtk_shadow_unref (resolved_shadow); + _gtk_css_value_unref (resolved_shadow); return NULL; } @@ -206,33 +231,11 @@ _gtk_shadow_resolve (GtkShadow *shadow, g_list_append (resolved_shadow->elements, resolved_element); } + resolved_shadow->resolved = TRUE; + return resolved_shadow; } -void -_gtk_shadow_print (GtkShadow *shadow, - GString *str) -{ - gint length; - GList *l; - - length = g_list_length (shadow->elements); - - if (length == 0) - return; - - shadow_element_print (shadow->elements->data, str); - - if (length == 1) - return; - - for (l = g_list_next (shadow->elements); l != NULL; l = l->next) - { - g_string_append (str, ", "); - shadow_element_print (l->data, str); - } -} - void _gtk_text_shadow_paint_layout (GtkShadow *shadow, cairo_t *cr, diff --git a/gtk/gtkshadowprivate.h b/gtk/gtkshadowprivate.h index c4fc035ebf..b279bc982d 100644 --- a/gtk/gtkshadowprivate.h +++ b/gtk/gtkshadowprivate.h @@ -26,19 +26,15 @@ #include "gtksymboliccolor.h" #include "gtkicontheme.h" #include "gtkcsstypesprivate.h" +#include "gtkcssvalueprivate.h" #include "gtkroundedboxprivate.h" G_BEGIN_DECLS -typedef struct _GtkShadow GtkShadow; - -#define GTK_TYPE_SHADOW (_gtk_shadow_get_type ()) - -GType _gtk_shadow_get_type (void) G_GNUC_CONST; +typedef GtkCssValue GtkShadow; GtkShadow *_gtk_shadow_new (void); -GtkShadow *_gtk_shadow_ref (GtkShadow *shadow); -void _gtk_shadow_unref (GtkShadow *shadow); +GtkShadow *_gtk_shadow_new_none (void); void _gtk_shadow_append (GtkShadow *shadow, gdouble hoffset, @@ -48,9 +44,6 @@ void _gtk_shadow_append (GtkShadow *shadow, gboolean inset, GtkSymbolicColor *color); -void _gtk_shadow_print (GtkShadow *shadow, - GString *string); - GtkShadow *_gtk_shadow_resolve (GtkShadow *shadow, GtkStyleContext *context); diff --git a/gtk/gtkthemingbackground.c b/gtk/gtkthemingbackground.c index 151542939f..c23569dd30 100644 --- a/gtk/gtkthemingbackground.c +++ b/gtk/gtkthemingbackground.c @@ -301,14 +301,9 @@ static void _gtk_theming_background_apply_shadow (GtkThemingBackground *bg, cairo_t *cr) { - GtkShadow *box_shadow; - - box_shadow = _gtk_css_value_get_shadow (_gtk_style_context_peek_property (bg->context, "box-shadow")); - - if (box_shadow != NULL) - { - _gtk_box_shadow_render (box_shadow, cr, &bg->padding_box); - } + _gtk_box_shadow_render (_gtk_style_context_peek_property (bg->context, "box-shadow"), + cr, + &bg->padding_box); } static void diff --git a/gtk/gtkthemingengine.c b/gtk/gtkthemingengine.c index e951105c84..9540dfde57 100644 --- a/gtk/gtkthemingengine.c +++ b/gtk/gtkthemingengine.c @@ -2132,14 +2132,11 @@ gtk_theming_engine_render_layout (GtkThemingEngine *engine, fg_color.alpha = CLAMP (fg_color.alpha + ((other_fg.alpha - fg_color.alpha) * progress), 0, 1); } - text_shadow = _gtk_css_value_get_shadow (_gtk_theming_engine_peek_property (engine, "text-shadow")); + text_shadow = _gtk_theming_engine_peek_property (engine, "text-shadow"); prepare_context_for_layout (cr, x, y, layout); - if (text_shadow != NULL) - { - _gtk_text_shadow_paint_layout (text_shadow, cr, layout); - } + _gtk_text_shadow_paint_layout (text_shadow, cr, layout); gdk_cairo_set_source_rgba (cr, &fg_color); pango_cairo_show_layout (cr, layout); @@ -2766,17 +2763,14 @@ render_spinner (GtkThemingEngine *engine, radius = MIN (width / 2, height / 2); gtk_theming_engine_get_color (engine, state, &color); - shadow = _gtk_css_value_get_shadow (_gtk_theming_engine_peek_property (engine, "icon-shadow")); + shadow = _gtk_theming_engine_peek_property (engine, "icon-shadow"); cairo_save (cr); cairo_translate (cr, x + width / 2, y + height / 2); - if (shadow != NULL) - { - _gtk_icon_shadow_paint_spinner (shadow, cr, - radius, - progress); - } + _gtk_icon_shadow_paint_spinner (shadow, cr, + radius, + progress); _gtk_theming_engine_paint_spinner (cr, radius, @@ -2943,18 +2937,11 @@ gtk_theming_engine_render_icon (GtkThemingEngine *engine, gdouble x, gdouble y) { - GtkShadow *icon_shadow; - cairo_save (cr); gdk_cairo_set_source_pixbuf (cr, pixbuf, x, y); - icon_shadow = _gtk_css_value_get_shadow (_gtk_theming_engine_peek_property (engine, "icon-shadow")); - - if (icon_shadow != NULL) - { - _gtk_icon_shadow_paint (icon_shadow, cr); - } + _gtk_icon_shadow_paint (_gtk_theming_engine_peek_property (engine, "icon-shadow"), cr); cairo_paint (cr);