diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 1532f00ca2..f359fe4c05 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -431,6 +431,7 @@ gtk_private_h_sources = \ gtkcssimagelinearprivate.h \ gtkcssimageprivate.h \ gtkcssimageurlprivate.h \ + gtkcssimagevalueprivate.h \ gtkcssimagewin32private.h \ gtkcssinheritvalueprivate.h \ gtkcssinitialvalueprivate.h \ @@ -634,6 +635,7 @@ gtk_base_c_sources = \ gtkcssimagegradient.c \ gtkcssimagelinear.c \ gtkcssimageurl.c \ + gtkcssimagevalue.c \ gtkcssimagewin32.c \ gtkcssinheritvalue.c \ gtkcssinitialvalue.c \ diff --git a/gtk/gtkborderimage.c b/gtk/gtkborderimage.c index a05c9d5bfe..399e869c4a 100644 --- a/gtk/gtkborderimage.c +++ b/gtk/gtkborderimage.c @@ -25,6 +25,7 @@ #include #include "gtkborderimageprivate.h" +#include "gtkcssimagevalueprivate.h" #include "gtkstylepropertiesprivate.h" #include "gtkthemingengineprivate.h" @@ -39,7 +40,7 @@ _gtk_border_image_init (GtkBorderImage *image, { GtkBorder *width; - image->source = _gtk_css_value_get_object (_gtk_theming_engine_peek_property (engine, "border-image-source")); + image->source = _gtk_css_image_value_get_image (_gtk_theming_engine_peek_property (engine, "border-image-source")); if (image->source == NULL) return FALSE; diff --git a/gtk/gtkcssimagevalue.c b/gtk/gtkcssimagevalue.c new file mode 100644 index 0000000000..f9028ae55a --- /dev/null +++ b/gtk/gtkcssimagevalue.c @@ -0,0 +1,81 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2011 Red Hat, Inc. + * + * 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 . + */ + +#include "config.h" + +#include "gtkcssimagevalueprivate.h" + +#include "gtkstylepropertyprivate.h" + +struct _GtkCssValue { + GTK_CSS_VALUE_BASE + GtkCssImage *image; +}; + +static void +gtk_css_value_image_free (GtkCssValue *value) +{ + g_object_unref (value->image); + g_slice_free (GtkCssValue, value); +} + +static gboolean +gtk_css_value_image_equal (const GtkCssValue *value1, + const GtkCssValue *value2) +{ + return value1->image == value2->image; +} + +static void +gtk_css_value_image_print (const GtkCssValue *value, + GString *string) +{ + if (value->image) + _gtk_css_image_print (value->image, string); + else + g_string_append (string, "none"); +} + +static const GtkCssValueClass GTK_CSS_VALUE_IMAGE = { + gtk_css_value_image_free, + gtk_css_value_image_equal, + gtk_css_value_image_print +}; + +GtkCssValue * +_gtk_css_image_value_new (GtkCssImage *image) +{ + static GtkCssValue none_singleton = { >K_CSS_VALUE_IMAGE, 1, NULL }; + GtkCssValue *value; + + if (image == NULL) + return _gtk_css_value_ref (&none_singleton); + + value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_IMAGE); + value->image = image; + + return value; +} + +GtkCssImage * +_gtk_css_image_value_get_image (const GtkCssValue *value) +{ + g_return_val_if_fail (value->class == >K_CSS_VALUE_IMAGE, NULL); + + return value->image; +} + diff --git a/gtk/gtkcssimagevalueprivate.h b/gtk/gtkcssimagevalueprivate.h new file mode 100644 index 0000000000..2e3485094f --- /dev/null +++ b/gtk/gtkcssimagevalueprivate.h @@ -0,0 +1,35 @@ +/* + * Copyright © 2012 Red Hat Inc. + * + * 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.1 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 . + * + * Authors: Alexander Larsson + */ + +#ifndef __GTK_CSS_IMAGE_VALUE_PRIVATE_H__ +#define __GTK_CSS_IMAGE_VALUE_PRIVATE_H__ + +#include "gtkcssimageprivate.h" +#include "gtkcssvalueprivate.h" + +G_BEGIN_DECLS + +GtkCssValue * _gtk_css_image_value_new (GtkCssImage *image); + +GtkCssImage * _gtk_css_image_value_get_image (const GtkCssValue *image); + + +G_END_DECLS + +#endif /* __GTK_CSS_IMAGE_VALUE_PRIVATE_H__ */ diff --git a/gtk/gtkcssshorthandpropertyimpl.c b/gtk/gtkcssshorthandpropertyimpl.c index e4d98a091f..fe6707083b 100644 --- a/gtk/gtkcssshorthandpropertyimpl.c +++ b/gtk/gtkcssshorthandpropertyimpl.c @@ -26,6 +26,7 @@ #include "gtkcssenumvalueprivate.h" #include "gtkcssimageprivate.h" +#include "gtkcssimagevalueprivate.h" #include "gtkcssnumbervalueprivate.h" #include "gtkcssstylefuncsprivate.h" #include "gtkcsstypesprivate.h" @@ -275,7 +276,7 @@ parse_border_image (GtkCssShorthandProperty *shorthand, if (!image) return FALSE; } - values[0] = _gtk_css_value_new_take_image (image); + values[0] = _gtk_css_image_value_new (image); if (value_is_done_parsing (parser)) return TRUE; @@ -484,7 +485,7 @@ parse_background (GtkCssShorthandProperty *shorthand, return FALSE; } - values[0] = _gtk_css_value_new_take_image (image); + values[0] = _gtk_css_image_value_new (image); } else if (values[1] == NULL && _gtk_css_parser_try_enum (parser, GTK_TYPE_CSS_BACKGROUND_REPEAT, &enum_value)) diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index b055ed1a01..a2e35b1175 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -42,7 +42,7 @@ #include "gtkbindings.h" #include "gtkcssimagegradientprivate.h" #include "gtkcssimageprivate.h" -#include "gtkcssimageprivate.h" +#include "gtkcssimagevalueprivate.h" #include "gtkcssenumvalueprivate.h" #include "gtkcssnumbervalueprivate.h" #include "gtkcssrgbavalueprivate.h" @@ -563,20 +563,7 @@ css_image_value_parse (GtkCssStyleProperty *property, return FALSE; } - return _gtk_css_value_new_take_image (image); -} - -static void -css_image_value_print (GtkCssStyleProperty *property, - const GtkCssValue *value, - GString *string) -{ - GtkCssImage *image = _gtk_css_value_get_image (value); - - if (image) - _gtk_css_image_print (image, string); - else - g_string_append (string, "none"); + return _gtk_css_image_value_new (image); } static GtkCssValue * @@ -586,7 +573,7 @@ css_image_value_compute (GtkCssStyleProperty *property, { GtkCssImage *image, *computed; - image = _gtk_css_value_get_image (specified); + image = _gtk_css_image_value_get_image (specified); if (image == NULL) return _gtk_css_value_ref (specified); @@ -599,7 +586,7 @@ css_image_value_compute (GtkCssStyleProperty *property, return _gtk_css_value_ref (specified); } - return _gtk_css_value_new_take_image (computed); + return _gtk_css_image_value_new (computed); } static void @@ -607,7 +594,7 @@ css_image_value_query (GtkCssStyleProperty *property, const GtkCssValue *css_value, GValue *value) { - GtkCssImage *image = _gtk_css_value_get_image (css_value); + GtkCssImage *image = _gtk_css_image_value_get_image (css_value); cairo_pattern_t *pattern; cairo_surface_t *surface; cairo_matrix_t matrix; @@ -636,7 +623,7 @@ css_image_value_assign (GtkCssStyleProperty *property, const GValue *value) { g_warning ("FIXME: assigning images is not implemented"); - return _gtk_css_value_new_take_image (NULL); + return _gtk_css_image_value_new (NULL); } static GtkCssValue * @@ -1673,23 +1660,23 @@ _gtk_css_style_property_init_properties (void) CAIRO_GOBJECT_TYPE_PATTERN, 0, css_image_value_parse, - css_image_value_print, + NULL, css_image_value_compute, css_image_value_query, css_image_value_assign, NULL, - _gtk_css_value_new_take_image (NULL)); + _gtk_css_image_value_new (NULL)); gtk_css_style_property_register ("border-image-source", CAIRO_GOBJECT_TYPE_PATTERN, 0, css_image_value_parse, - css_image_value_print, + NULL, css_image_value_compute, css_image_value_query, css_image_value_assign, NULL, - _gtk_css_value_new_take_image (NULL)); + _gtk_css_image_value_new (NULL)); gtk_css_style_property_register ("border-image-repeat", GTK_TYPE_CSS_BORDER_IMAGE_REPEAT, 0, diff --git a/gtk/gtkcssvalue.c b/gtk/gtkcssvalue.c index 069a8a2fe2..0ab7f56273 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_image (GtkCssImage *v) -{ - GtkCssValue *value; - - value = gtk_css_value_new (GTK_TYPE_CSS_IMAGE); - value->u.ptr = v; - - return value; -} - GtkCssValue * _gtk_css_value_new_from_theming_engine (GtkThemingEngine *v) { @@ -563,13 +552,6 @@ _gtk_css_value_get_strv (const GtkCssValue *value) return value->u.ptr; } -GtkCssImage * -_gtk_css_value_get_image (const GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_IMAGE), NULL); - return value->u.ptr; -} - GtkBorderStyle _gtk_css_value_get_border_style (const GtkCssValue *value) { diff --git a/gtk/gtkcssvalueprivate.h b/gtk/gtkcssvalueprivate.h index 22e885ac9f..4fa5589ff8 100644 --- a/gtk/gtkcssvalueprivate.h +++ b/gtk/gtkcssvalueprivate.h @@ -23,7 +23,6 @@ #include #include "gtkcsstypesprivate.h" #include "gtksymboliccolor.h" -#include "gtkcssimageprivate.h" #include "gtkthemingengine.h" G_BEGIN_DECLS @@ -84,7 +83,6 @@ GtkCssValue *_gtk_css_value_new_from_boxed (GType 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_image (GtkCssImage *v); GtkCssValue *_gtk_css_value_new_from_theming_engine (GtkThemingEngine *v); GtkCssValue *_gtk_css_value_new_take_binding_sets (GPtrArray *array); GtkCssValue *_gtk_css_value_new_from_background_size (const GtkCssBackgroundSize *v); @@ -103,7 +101,6 @@ gpointer _gtk_css_value_get_object (const gpointer _gtk_css_value_get_boxed (const GtkCssValue *value); const char ** _gtk_css_value_get_strv (const GtkCssValue *value); GtkSymbolicColor *_gtk_css_value_get_symbolic_color (const GtkCssValue *value); -GtkCssImage *_gtk_css_value_get_image (const GtkCssValue *value); const GtkCssBackgroundSize *_gtk_css_value_get_background_size (const GtkCssValue *value); const GtkCssBackgroundPosition *_gtk_css_value_get_background_position (const GtkCssValue *value); const GtkCssBorderCornerRadius *_gtk_css_value_get_border_corner_radius (const GtkCssValue *value); diff --git a/gtk/gtkthemingbackground.c b/gtk/gtkthemingbackground.c index 4fee2eea12..63050fa8c4 100644 --- a/gtk/gtkthemingbackground.c +++ b/gtk/gtkthemingbackground.c @@ -21,8 +21,10 @@ #include "config.h" -#include "gtkcsstypesprivate.h" #include "gtkthemingbackgroundprivate.h" + +#include "gtkcssimagevalueprivate.h" +#include "gtkcsstypesprivate.h" #include "gtkthemingengineprivate.h" #include @@ -335,7 +337,7 @@ _gtk_theming_background_init_context (GtkThemingBackground *bg) _gtk_theming_background_apply_clip (bg); _gtk_theming_background_apply_origin (bg); - bg->image = _gtk_css_value_get_image (_gtk_style_context_peek_property (bg->context, "background-image")); + bg->image = _gtk_css_image_value_get_image (_gtk_style_context_peek_property (bg->context, "background-image")); } void