1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 2011 Red Hat, Inc.
4 * Author: Cosimo Cecchi <cosimoc@gnome.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
22 #include "gtkcssshadowsvalueprivate.h"
24 #include "gtkcssshadowvalueprivate.h"
31 GtkCssValue *values[1];
34 static GtkCssValue * gtk_css_shadows_value_new (GtkCssValue **values,
38 gtk_css_value_shadows_free (GtkCssValue *value)
42 for (i = 0; i < value->len; i++)
44 _gtk_css_value_unref (value->values[i]);
47 g_slice_free1 (sizeof (GtkCssValue) + sizeof (GtkCssValue *) * (value->len - 1), value);
51 gtk_css_value_shadows_compute (GtkCssValue *value,
53 GtkStyleProviderPrivate *provider,
54 GtkCssComputedValues *values,
55 GtkCssComputedValues *parent_values,
56 GtkCssDependencies *dependencies)
59 GtkCssDependencies child_deps;
63 return _gtk_css_value_ref (value);
65 result = gtk_css_shadows_value_new (value->values, value->len);
66 for (i = 0; i < value->len; i++)
68 result->values[i] = _gtk_css_value_compute (value->values[i], property_id, provider, values, parent_values, &child_deps);
69 *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
76 gtk_css_value_shadows_equal (const GtkCssValue *value1,
77 const GtkCssValue *value2)
81 /* XXX: Should we fill up here? */
82 if (value1->len != value2->len)
85 for (i = 0; i < value1->len; i++)
87 if (!_gtk_css_value_equal (value1->values[i],
96 gtk_css_value_shadows_transition (GtkCssValue *start,
102 GtkCssValue **values;
104 /* catches the important case of 2 none values */
106 return _gtk_css_value_ref (start);
108 if (start->len > end->len)
113 values = g_newa (GtkCssValue *, len);
115 for (i = 0; i < MIN (start->len, end->len); i++)
117 values[i] = _gtk_css_value_transition (start->values[i], end->values[i], property_id, progress);
118 if (values[i] == NULL)
121 _gtk_css_value_unref (values[i]);
125 if (start->len > end->len)
129 GtkCssValue *fill = _gtk_css_shadow_value_new_for_transition (start->values[i]);
130 values[i] = _gtk_css_value_transition (start->values[i], fill, property_id, progress);
131 _gtk_css_value_unref (fill);
133 if (values[i] == NULL)
136 _gtk_css_value_unref (values[i]);
145 GtkCssValue *fill = _gtk_css_shadow_value_new_for_transition (end->values[i]);
146 values[i] = _gtk_css_value_transition (fill, end->values[i], property_id, progress);
147 _gtk_css_value_unref (fill);
149 if (values[i] == NULL)
152 _gtk_css_value_unref (values[i]);
158 return gtk_css_shadows_value_new (values, len);
162 gtk_css_value_shadows_print (const GtkCssValue *value,
169 g_string_append (string, "none");
173 for (i = 0; i < value->len; i++)
176 g_string_append (string, ", ");
177 _gtk_css_value_print (value->values[i], string);
181 static const GtkCssValueClass GTK_CSS_VALUE_SHADOWS = {
182 gtk_css_value_shadows_free,
183 gtk_css_value_shadows_compute,
184 gtk_css_value_shadows_equal,
185 gtk_css_value_shadows_transition,
186 gtk_css_value_shadows_print
189 static GtkCssValue none_singleton = { >K_CSS_VALUE_SHADOWS, 1, 0, { NULL } };
192 _gtk_css_shadows_value_new_none (void)
194 return _gtk_css_value_ref (&none_singleton);
198 gtk_css_shadows_value_new (GtkCssValue **values,
203 g_return_val_if_fail (values != NULL, NULL);
204 g_return_val_if_fail (len > 0, NULL);
206 result = _gtk_css_value_alloc (>K_CSS_VALUE_SHADOWS, sizeof (GtkCssValue) + sizeof (GtkCssValue *) * (len - 1));
208 memcpy (&result->values[0], values, sizeof (GtkCssValue *) * len);
214 _gtk_css_shadows_value_parse (GtkCssParser *parser)
216 GtkCssValue *value, *result;
219 if (_gtk_css_parser_try (parser, "none", TRUE))
220 return _gtk_css_shadows_value_new_none ();
222 values = g_ptr_array_new ();
225 value = _gtk_css_shadow_value_parse (parser);
229 g_ptr_array_set_free_func (values, (GDestroyNotify) _gtk_css_value_unref);
230 g_ptr_array_free (values, TRUE);
234 g_ptr_array_add (values, value);
235 } while (_gtk_css_parser_try (parser, ",", TRUE));
237 result = gtk_css_shadows_value_new ((GtkCssValue **) values->pdata, values->len);
238 g_ptr_array_free (values, TRUE);
243 _gtk_css_shadows_value_paint_layout (const GtkCssValue *shadows,
249 g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
251 for (i = 0; i < shadows->len; i++)
253 _gtk_css_shadow_value_paint_layout (shadows->values[i], cr, layout);
258 _gtk_css_shadows_value_paint_icon (const GtkCssValue *shadows,
263 g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
265 for (i = 0; i < shadows->len; i++)
267 _gtk_css_shadow_value_paint_icon (shadows->values[i], cr);
272 _gtk_css_shadows_value_paint_spinner (const GtkCssValue *shadows,
279 g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
281 for (i = 0; i < shadows->len; i++)
283 _gtk_css_shadow_value_paint_spinner (shadows->values[i], cr, radius, progress);
288 _gtk_css_shadows_value_paint_box (const GtkCssValue *shadows,
290 const GtkRoundedBox *padding_box)
294 g_return_if_fail (shadows->class == >K_CSS_VALUE_SHADOWS);
296 for (i = 0; i < shadows->len; i++)
298 _gtk_css_shadow_value_paint_box (shadows->values[i], cr, padding_box);