1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 2011 Red Hat, Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
20 #include "gtkcssvalueprivate.h"
21 #include "gtktypebuiltins.h"
22 #include "gtkgradient.h"
23 #include <cairo-gobject.h>
24 #include "gtkprivatetypebuiltins.h"
28 volatile gint ref_count;
32 G_DEFINE_BOXED_TYPE (GtkCssValue, _gtk_css_value, _gtk_css_value_ref, _gtk_css_value_unref)
35 _gtk_css_value_new (void)
39 value = g_slice_new0 (GtkCssValue);
47 _gtk_css_value_new_from_gvalue (const GValue *g_value)
51 g_return_val_if_fail (g_value != NULL, NULL);
53 value = _gtk_css_value_new ();
55 g_value_init (&value->g_value, G_VALUE_TYPE (g_value));
56 g_value_copy (g_value, &value->g_value);
62 _gtk_css_value_new_take_gvalue (GValue *g_value)
66 g_return_val_if_fail (g_value != NULL, NULL);
68 value = _gtk_css_value_new ();
69 value->g_value = *g_value;
75 _gtk_css_value_new_from_int (gint val)
79 value = _gtk_css_value_new ();
80 g_value_init (&value->g_value, G_TYPE_INT);
81 g_value_set_int (&value->g_value, val);
87 _gtk_css_value_new_take_string (char *string)
91 value = _gtk_css_value_new ();
92 g_value_init (&value->g_value, G_TYPE_STRING);
93 g_value_take_string (&value->g_value, string);
99 _gtk_css_value_new_from_string (const char *string)
103 value = _gtk_css_value_new ();
104 g_value_init (&value->g_value, G_TYPE_STRING);
105 g_value_set_string (&value->g_value, string);
111 _gtk_css_value_new_from_border (const GtkBorder *border)
115 value = _gtk_css_value_new ();
116 g_value_init (&value->g_value, GTK_TYPE_BORDER);
117 g_value_set_boxed (&value->g_value, border);
123 _gtk_css_value_new_take_pattern (cairo_pattern_t *v)
127 value = _gtk_css_value_new ();
128 g_value_init (&value->g_value, CAIRO_GOBJECT_TYPE_PATTERN);
129 g_value_take_boxed (&value->g_value, v);
135 _gtk_css_value_new_from_pattern (const cairo_pattern_t *v)
139 value = _gtk_css_value_new ();
140 g_value_init (&value->g_value, CAIRO_GOBJECT_TYPE_PATTERN);
141 g_value_set_boxed (&value->g_value, v);
147 _gtk_css_value_new_take_shadow (GtkShadow *v)
151 value = _gtk_css_value_new ();
152 g_value_init (&value->g_value, GTK_TYPE_SHADOW);
153 g_value_take_boxed (&value->g_value, v);
159 _gtk_css_value_new_take_font_description (PangoFontDescription *v)
163 value = _gtk_css_value_new ();
164 g_value_init (&value->g_value, PANGO_TYPE_FONT_DESCRIPTION);
165 g_value_take_boxed (&value->g_value, v);
171 _gtk_css_value_new_take_image (GtkCssImage *v)
175 value = _gtk_css_value_new ();
176 g_value_init (&value->g_value, GTK_TYPE_CSS_IMAGE);
177 g_value_take_object (&value->g_value, v);
183 _gtk_css_value_new_from_number (const GtkCssNumber *v)
187 value = _gtk_css_value_new ();
188 g_value_init (&value->g_value, GTK_TYPE_CSS_NUMBER);
189 g_value_set_boxed (&value->g_value, v);
195 _gtk_css_value_new_from_rgba (const GdkRGBA *v)
199 value = _gtk_css_value_new ();
200 g_value_init (&value->g_value, GDK_TYPE_RGBA);
201 g_value_set_boxed (&value->g_value, v);
207 _gtk_css_value_new_from_color (const GdkColor *v)
211 value = _gtk_css_value_new ();
212 g_value_init (&value->g_value, GDK_TYPE_COLOR);
213 g_value_set_boxed (&value->g_value, v);
219 _gtk_css_value_new_from_background_size (const GtkCssBackgroundSize *v)
223 value = _gtk_css_value_new ();
224 g_value_init (&value->g_value, GTK_TYPE_CSS_BACKGROUND_SIZE);
225 g_value_set_boxed (&value->g_value, v);
231 _gtk_css_value_new_take_symbolic_color (GtkSymbolicColor *v)
235 value = _gtk_css_value_new ();
236 g_value_init (&value->g_value, GTK_TYPE_SYMBOLIC_COLOR);
237 g_value_take_boxed (&value->g_value, v);
243 _gtk_css_value_ref (GtkCssValue *value)
245 g_return_val_if_fail (value != NULL, NULL);
247 g_atomic_int_add (&value->ref_count, 1);
253 _gtk_css_value_unref (GtkCssValue *value)
258 if (!g_atomic_int_dec_and_test (&value->ref_count))
261 g_value_unset (&value->g_value);
262 g_slice_free (GtkCssValue, value);
266 _gtk_css_value_get_content_type (GtkCssValue *value)
268 return G_VALUE_TYPE (&value->g_value);
272 _gtk_css_value_holds (GtkCssValue *value, GType type)
274 return G_VALUE_HOLDS (&value->g_value, type);
278 _gtk_css_value_init_gvalue (GtkCssValue *value,
283 g_value_init (g_value, G_VALUE_TYPE (&value->g_value));
284 g_value_copy (&value->g_value, g_value);
289 _gtk_css_value_to_gvalue (GtkCssValue *value,
292 if (G_VALUE_TYPE (&value->g_value) == G_VALUE_TYPE (g_value))
293 g_value_copy (&value->g_value, g_value);
294 else if (g_value_type_transformable (G_VALUE_TYPE (&value->g_value), G_VALUE_TYPE (g_value)))
295 g_value_transform (&value->g_value, g_value);
297 g_warning ("can't convert css value of type `%s' as value of type `%s'",
298 G_VALUE_TYPE_NAME (&value->g_value),
299 G_VALUE_TYPE_NAME (g_value));
303 _gtk_css_value_is_special (GtkCssValue *value)
305 return _gtk_css_value_holds (value, GTK_TYPE_CSS_SPECIAL_VALUE);
309 _gtk_css_value_get_special_kind (GtkCssValue *value)
311 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_SPECIAL_VALUE), 0);
312 return g_value_get_enum (&value->g_value);
316 _gtk_css_value_get_number (GtkCssValue *value)
318 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_NUMBER), NULL);
319 return g_value_get_boxed (&value->g_value);
323 _gtk_css_value_get_symbolic_color (GtkCssValue *value)
325 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_SYMBOLIC_COLOR), NULL);
326 return g_value_get_boxed (&value->g_value);
330 _gtk_css_value_get_int (GtkCssValue *value)
332 g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_INT), 0);
333 return g_value_get_int (&value->g_value);
337 _gtk_css_value_get_double (GtkCssValue *value)
339 g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_DOUBLE), 0);
340 return g_value_get_double (&value->g_value);
344 _gtk_css_value_get_string (GtkCssValue *value)
346 g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_STRING), 0);
347 return g_value_get_string (&value->g_value);
351 _gtk_css_value_dup_object (GtkCssValue *value)
353 g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_OBJECT), NULL);
354 return g_value_dup_object (&value->g_value);
358 _gtk_css_value_get_object (GtkCssValue *value)
360 g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_OBJECT), NULL);
361 return g_value_get_object (&value->g_value);
365 _gtk_css_value_get_boxed (GtkCssValue *value)
367 g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_BOXED), NULL);
368 return g_value_get_boxed (&value->g_value);
372 _gtk_css_value_get_strv (GtkCssValue *value)
374 g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_STRV), NULL);
375 return g_value_get_boxed (&value->g_value);
379 _gtk_css_value_get_image (GtkCssValue *value)
381 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_IMAGE), NULL);
382 return g_value_get_object (&value->g_value);
386 _gtk_css_value_get_border_style (GtkCssValue *value)
388 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_BORDER_STYLE), 0);
389 return g_value_get_enum (&value->g_value);
392 GtkCssBackgroundSize *
393 _gtk_css_value_get_background_size (GtkCssValue *value)
395 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_BACKGROUND_SIZE), NULL);
396 return g_value_get_boxed (&value->g_value);
399 GtkCssBorderImageRepeat *
400 _gtk_css_value_get_border_image_repeat (GtkCssValue *value)
402 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_BORDER_IMAGE_REPEAT), NULL);
403 return g_value_get_boxed (&value->g_value);
406 GtkCssBorderCornerRadius *
407 _gtk_css_value_get_border_corner_radius (GtkCssValue *value)
409 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_BORDER_CORNER_RADIUS), NULL);
410 return g_value_get_boxed (&value->g_value);
413 PangoFontDescription *
414 _gtk_css_value_get_font_description (GtkCssValue *value)
416 g_return_val_if_fail (_gtk_css_value_holds (value, PANGO_TYPE_FONT_DESCRIPTION), 0);
417 return g_value_get_boxed (&value->g_value);
421 _gtk_css_value_get_pango_style (GtkCssValue *value)
423 g_return_val_if_fail (_gtk_css_value_holds (value, PANGO_TYPE_STYLE), 0);
424 return g_value_get_enum (&value->g_value);
428 _gtk_css_value_get_pango_variant (GtkCssValue *value)
430 g_return_val_if_fail (_gtk_css_value_holds (value, PANGO_TYPE_VARIANT), 0);
431 return g_value_get_enum (&value->g_value);
435 _gtk_css_value_get_pango_weight (GtkCssValue *value)
437 g_return_val_if_fail (_gtk_css_value_holds (value, PANGO_TYPE_WEIGHT), 0);
438 return g_value_get_enum (&value->g_value);
442 _gtk_css_value_get_rgba (GtkCssValue *value)
444 g_return_val_if_fail (_gtk_css_value_holds (value, GDK_TYPE_RGBA), NULL);
445 return g_value_get_boxed (&value->g_value);
449 _gtk_css_value_get_pattern (GtkCssValue *value)
451 g_return_val_if_fail (_gtk_css_value_holds (value, CAIRO_GOBJECT_TYPE_PATTERN), NULL);
452 return g_value_get_boxed (&value->g_value);
456 _gtk_css_value_get_gradient (GtkCssValue *value)
458 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_GRADIENT), NULL);
459 return g_value_get_boxed (&value->g_value);
463 _gtk_css_value_get_shadow (GtkCssValue *value)
465 g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_SHADOW), NULL);
466 return g_value_get_boxed (&value->g_value);