gtkcssrgbavalueprivate.h \
gtkcsssectionprivate.h \
gtkcssselectorprivate.h \
+ gtkcssshadowsvalueprivate.h \
gtkcssshadowvalueprivate.h \
gtkcssshorthandpropertyprivate.h \
gtkcssstringvalueprivate.h \
gtkcsssection.c \
gtkcssselector.c \
gtkcssstringvalue.c \
+ gtkcssshadowsvalue.c \
gtkcssshadowvalue.c \
gtkcssshorthandproperty.c \
gtkcssshorthandpropertyimpl.c \
--- /dev/null
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2011 Red Hat, Inc.
+ *
+ * Author: Cosimo Cecchi <cosimoc@gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gtkcssshadowsvalueprivate.h"
+
+#include "gtkcssshadowvalueprivate.h"
+
+#include <string.h>
+
+struct _GtkCssValue {
+ GTK_CSS_VALUE_BASE
+ guint len;
+ GtkCssValue *values[1];
+};
+
+static void
+gtk_css_value_shadows_free (GtkCssValue *value)
+{
+ guint i;
+
+ for (i = 0; i < value->len; i++)
+ {
+ _gtk_css_value_unref (value->values[i]);
+ }
+
+ g_slice_free1 (sizeof (GtkCssValue) + sizeof (GtkCssValue *) * (value->len - 1), value);
+}
+
+static gboolean
+gtk_css_value_shadows_equal (const GtkCssValue *value1,
+ const GtkCssValue *value2)
+{
+ guint i;
+
+ /* XXX: Should we fill up here? */
+ if (value1->len != value2->len)
+ return FALSE;
+
+ for (i = 0; i < value1->len; i++)
+ {
+ if (!_gtk_css_value_equal (value1->values[i],
+ value2->values[i]))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static GtkCssValue *
+gtk_css_value_shadows_transition (GtkCssValue *start,
+ GtkCssValue *end,
+ double progress)
+{
+ return NULL;
+}
+
+static void
+gtk_css_value_shadows_print (const GtkCssValue *value,
+ GString *string)
+{
+ guint i;
+
+ if (value->len == 0)
+ {
+ g_string_append (string, "none");
+ return;
+ }
+
+ for (i = 0; i < value->len; i++)
+ {
+ if (i > 0)
+ g_string_append (string, ", ");
+ _gtk_css_value_print (value->values[i], string);
+ }
+}
+
+static const GtkCssValueClass GTK_CSS_VALUE_SHADOWS = {
+ gtk_css_value_shadows_free,
+ gtk_css_value_shadows_equal,
+ gtk_css_value_shadows_transition,
+ gtk_css_value_shadows_print
+};
+
+static GtkCssValue none_singleton = { >K_CSS_VALUE_SHADOWS, 1, 0, { NULL } };
+
+GtkCssValue *
+_gtk_css_shadows_value_new_none (void)
+{
+ return _gtk_css_value_ref (&none_singleton);
+}
+
+GtkCssValue *
+gtk_css_shadows_value_new (GtkCssValue **values,
+ guint len)
+{
+ GtkCssValue *result;
+
+ g_return_val_if_fail (values != NULL, NULL);
+ g_return_val_if_fail (len > 0, NULL);
+
+ result = _gtk_css_value_alloc (>K_CSS_VALUE_SHADOWS, sizeof (GtkCssValue) + sizeof (GtkCssValue *) * (len - 1));
+ result->len = len;
+ memcpy (&result->values[0], values, sizeof (GtkCssValue *) * len);
+
+ return result;
+}
+
+GtkCssValue *
+_gtk_css_shadows_value_parse (GtkCssParser *parser)
+{
+ GtkCssValue *value, *result;
+ GPtrArray *values;
+
+ if (_gtk_css_parser_try (parser, "none", TRUE))
+ return _gtk_css_shadows_value_new_none ();
+
+ values = g_ptr_array_new ();
+
+ do {
+ value = _gtk_css_shadow_value_parse (parser);
+
+ if (value == NULL)
+ {
+ g_ptr_array_set_free_func (values, (GDestroyNotify) _gtk_css_value_unref);
+ g_ptr_array_free (values, TRUE);
+ return NULL;
+ }
+
+ g_ptr_array_add (values, value);
+ } while (_gtk_css_parser_try (parser, ",", TRUE));
+
+ result = gtk_css_shadows_value_new ((GtkCssValue **) values->pdata, values->len);
+ g_ptr_array_free (values, TRUE);
+ return result;
+}
+
+GtkCssValue *
+_gtk_css_shadows_value_compute (GtkCssValue *value,
+ GtkStyleContext *context)
+{
+ GtkCssValue *result;
+ guint i;
+
+ g_return_val_if_fail (value->class == >K_CSS_VALUE_SHADOWS, NULL);
+
+ if (value->len == 0)
+ return _gtk_css_value_ref (value);
+
+ result = gtk_css_shadows_value_new (value->values, value->len);
+ for (i = 0; i < value->len; i++)
+ {
+ result->values[i] = _gtk_css_shadow_value_compute (value->values[i], context);
+ }
+
+ return result;
+}
+
+void
+_gtk_css_shadows_value_paint_layout (const GtkCssValue *shadows,
+ cairo_t *cr,
+ PangoLayout *layout)
+{
+ guint i;
+
+ g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
+
+ for (i = 0; i < shadows->len; i++)
+ {
+ _gtk_css_shadow_value_paint_layout (shadows->values[i], cr, layout);
+ }
+}
+
+void
+_gtk_css_shadows_value_paint_icon (const GtkCssValue *shadows,
+ cairo_t *cr)
+{
+ guint i;
+
+ g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
+
+ for (i = 0; i < shadows->len; i++)
+ {
+ _gtk_css_shadow_value_paint_icon (shadows->values[i], cr);
+ }
+}
+
+void
+_gtk_css_shadows_value_paint_spinner (const GtkCssValue *shadows,
+ cairo_t *cr,
+ gdouble radius,
+ gdouble progress)
+{
+ guint i;
+
+ g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
+
+ for (i = 0; i < shadows->len; i++)
+ {
+ _gtk_css_shadow_value_paint_spinner (shadows->values[i], cr, radius, progress);
+ }
+}
+
+void
+_gtk_css_shadows_value_paint_box (const GtkCssValue *shadows,
+ cairo_t *cr,
+ const GtkRoundedBox *padding_box)
+{
+ guint i;
+
+ g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
+
+ for (i = 0; i < shadows->len; i++)
+ {
+ _gtk_css_shadow_value_paint_box (shadows->values[i], cr, padding_box);
+ }
+}
--- /dev/null
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2011 Red Hat, Inc.
+ *
+ * Author: Cosimo Cecchi <cosimoc@gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GTK_CSS_SHADOWS_VALUE_H__
+#define __GTK_CSS_SHADOWS_VALUE_H__
+
+#include <cairo.h>
+#include <pango/pango.h>
+
+#include "gtktypes.h"
+#include "gtkcssparserprivate.h"
+#include "gtkcssvalueprivate.h"
+#include "gtkroundedboxprivate.h"
+
+G_BEGIN_DECLS
+
+GtkCssValue * _gtk_css_shadows_value_new_none (void);
+GtkCssValue * _gtk_css_shadows_value_parse (GtkCssParser *parser);
+
+GtkCssValue * _gtk_css_shadows_value_compute (GtkCssValue *shadows,
+ GtkStyleContext *context);
+
+void _gtk_css_shadows_value_paint_layout (const GtkCssValue *shadows,
+ cairo_t *cr,
+ PangoLayout *layout);
+
+void _gtk_css_shadows_value_paint_icon (const GtkCssValue *shadows,
+ cairo_t *cr);
+
+void _gtk_css_shadows_value_paint_spinner (const GtkCssValue *shadows,
+ cairo_t *cr,
+ gdouble radius,
+ gdouble progress);
+void _gtk_css_shadows_value_paint_box (const GtkCssValue *shadows,
+ cairo_t *cr,
+ const GtkRoundedBox *padding_box);
+
+G_END_DECLS
+
+#endif /* __GTK_CSS_SHADOWS_VALUE_H__ */
#include "gtkcssenumvalueprivate.h"
#include "gtkcssnumbervalueprivate.h"
#include "gtkcssrgbavalueprivate.h"
-#include "gtkcssshadowvalueprivate.h"
+#include "gtkcssshadowsvalueprivate.h"
#include "gtkcssstringvalueprivate.h"
#include "gtksymboliccolorprivate.h"
#include "gtkthemingengine.h"
GtkCssParser *parser,
GFile *base)
{
- return _gtk_css_array_value_parse (parser, _gtk_css_shadow_value_parse, TRUE);
+ return _gtk_css_shadows_value_parse (parser);
}
static GtkCssValue *
GtkStyleContext *context,
GtkCssValue *specified)
{
- return _gtk_css_array_value_compute (specified, _gtk_css_shadow_value_compute, context);
+ return _gtk_css_shadows_value_compute (specified, context);
}
static GtkCssValue *
NULL,
NULL,
NULL,
- _gtk_css_array_value_new (NULL));
+ _gtk_css_shadows_value_new_none ());
gtk_css_style_property_register ("icon-shadow",
GTK_CSS_PROPERTY_ICON_SHADOW,
NULL,
NULL,
NULL,
- _gtk_css_array_value_new (NULL));
+ _gtk_css_shadows_value_new_none ());
gtk_css_style_property_register ("box-shadow",
GTK_CSS_PROPERTY_BOX_SHADOW,
NULL,
NULL,
NULL,
- _gtk_css_array_value_new (NULL));
+ _gtk_css_shadows_value_new_none ());
gtk_css_style_property_register ("margin-top",
GTK_CSS_PROPERTY_MARGIN_TOP,
#include "gtkcssarrayvalueprivate.h"
#include "gtkcssenumvalueprivate.h"
#include "gtkcssimagevalueprivate.h"
+#include "gtkcssshadowsvalueprivate.h"
#include "gtkcsstypesprivate.h"
#include "gtkthemingengineprivate.h"
_gtk_theming_background_apply_shadow (GtkThemingBackground *bg,
cairo_t *cr)
{
- GtkCssValue *shadows;
- guint i;
-
- shadows = _gtk_style_context_peek_property (bg->context, GTK_CSS_PROPERTY_BOX_SHADOW);
-
- for (i = 0; i < _gtk_css_array_value_get_n_values (shadows); i++)
- {
- _gtk_css_shadow_value_paint_box (_gtk_css_array_value_get_nth (shadows, i),
- cr,
- &bg->padding_box);
- }
+ _gtk_css_shadows_value_paint_box (_gtk_style_context_peek_property (bg->context, GTK_CSS_PROPERTY_BOX_SHADOW),
+ cr,
+ &bg->padding_box);
}
static void
#include "gtkcssimageprivate.h"
#include "gtkstylecontextprivate.h"
#include "gtkroundedboxprivate.h"
-#include "gtkcssshadowvalueprivate.h"
G_BEGIN_DECLS
#include "gtkcssarrayvalueprivate.h"
#include "gtkcssenumvalueprivate.h"
#include "gtkcssrgbavalueprivate.h"
-#include "gtkcssshadowvalueprivate.h"
+#include "gtkcssshadowsvalueprivate.h"
#include "gtkcsstypesprivate.h"
#include "gtkthemingengineprivate.h"
#include "gtkroundedboxprivate.h"
PangoLayout *layout)
{
GdkRGBA fg_color;
- GtkCssValue *shadows;
GtkStateFlags flags;
gdouble progress;
gboolean running;
- guint i;
cairo_save (cr);
flags = gtk_theming_engine_get_state (engine);
fg_color.alpha = CLAMP (fg_color.alpha + ((other_fg.alpha - fg_color.alpha) * progress), 0, 1);
}
- shadows = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_TEXT_SHADOW);
-
prepare_context_for_layout (cr, x, y, layout);
- for (i = 0; i < _gtk_css_array_value_get_n_values (shadows); i++)
- {
- _gtk_css_shadow_value_paint_layout (_gtk_css_array_value_get_nth (shadows, i), cr, layout);
- }
+ _gtk_css_shadows_value_paint_layout (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_TEXT_SHADOW),
+ cr, layout);
gdk_cairo_set_source_rgba (cr, &fg_color);
pango_cairo_show_layout (cr, layout);
gdouble height)
{
GtkStateFlags state;
- GtkCssValue *shadows;
GdkRGBA color;
gdouble progress;
gdouble radius;
- guint i;
state = gtk_theming_engine_get_state (engine);
radius = MIN (width / 2, height / 2);
gtk_theming_engine_get_color (engine, state, &color);
- shadows = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_ICON_SHADOW);
cairo_save (cr);
cairo_translate (cr, x + width / 2, y + height / 2);
- for (i = 0; i < _gtk_css_array_value_get_n_values (shadows); i++)
- {
- _gtk_css_shadow_value_paint_spinner (_gtk_css_array_value_get_nth (shadows, i),
- cr,
- radius,
- progress);
- }
+ _gtk_css_shadows_value_paint_spinner (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_ICON_SHADOW),
+ cr,
+ radius,
+ progress);
_gtk_theming_engine_paint_spinner (cr,
radius,
gdouble x,
gdouble y)
{
- GtkCssValue *shadows;
- guint i;
-
cairo_save (cr);
gdk_cairo_set_source_pixbuf (cr, pixbuf, x, y);
- shadows = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_ICON_SHADOW);
- for (i = 0; i < _gtk_css_array_value_get_n_values (shadows); i++)
- {
- _gtk_css_shadow_value_paint_icon (_gtk_css_array_value_get_nth (shadows, i), cr);
- }
+ _gtk_css_shadows_value_paint_icon (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_ICON_SHADOW), cr);
cairo_paint (cr);