From 31fc70721e91d09ff7e3e7df62ce8f9c8c8eb037 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 26 Jun 2013 16:33:50 +0200 Subject: [PATCH] GtkImage: Add new_from_surface() and set_from_surface() --- gtk/gtkimage.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ gtk/gtkimage.h | 5 ++++ 2 files changed, 82 insertions(+) diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c index f30ace2571..bffdb73769 100644 --- a/gtk/gtkimage.c +++ b/gtk/gtkimage.c @@ -26,6 +26,7 @@ #include #include +#include #include "gtkcontainer.h" #include "gtkiconhelperprivate.h" @@ -185,6 +186,7 @@ enum { PROP_0, PROP_PIXBUF, + PROP_SURFACE, PROP_FILE, PROP_STOCK, PROP_ICON_SET, @@ -231,6 +233,14 @@ gtk_image_class_init (GtkImageClass *class) GDK_TYPE_PIXBUF, GTK_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_SURFACE, + g_param_spec_boxed ("surface", + P_("Surface"), + P_("A cairo_surface_t to display"), + CAIRO_GOBJECT_TYPE_SURFACE, + GTK_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_FILE, g_param_spec_string ("file", @@ -430,6 +440,10 @@ gtk_image_set_property (GObject *object, gtk_image_set_from_pixbuf (image, g_value_get_object (value)); break; + case PROP_SURFACE: + gtk_image_set_from_surface (image, + g_value_get_boxed (value)); + break; case PROP_FILE: gtk_image_set_from_file (image, g_value_get_string (value)); break; @@ -491,6 +505,9 @@ gtk_image_get_property (GObject *object, case PROP_PIXBUF: g_value_set_object (value, _gtk_icon_helper_peek_pixbuf (priv->icon_helper)); break; + case PROP_SURFACE: + g_value_set_boxed (value, _gtk_icon_helper_peek_surface (priv->icon_helper)); + break; case PROP_FILE: g_value_set_string (value, priv->filename); break; @@ -632,6 +649,29 @@ gtk_image_new_from_pixbuf (GdkPixbuf *pixbuf) return GTK_WIDGET (image); } +/** + * gtk_image_new_from_surface: + * @surface: (allow-none): a #cairo_surface_t, or %NULL + * + * Creates a new #GtkImage displaying @surface. + * The #GtkImage does not assume a reference to the + * surface; you still need to unref it if you own references. + * #GtkImage will add its own reference rather than adopting yours. + * + * Return value: a new #GtkImage + **/ +GtkWidget* +gtk_image_new_from_surface (cairo_surface_t *surface) +{ + GtkImage *image; + + image = g_object_new (GTK_TYPE_IMAGE, NULL); + + gtk_image_set_from_surface (image, surface); + + return GTK_WIDGET (image); +} + /** * gtk_image_new_from_stock: * @stock_id: a stock icon name @@ -1128,6 +1168,43 @@ gtk_image_set_from_gicon (GtkImage *image, g_object_thaw_notify (G_OBJECT (image)); } +/** + * gtk_image_set_from_surface: + * @image: a #GtkImage + * @surface: a cairo_surface_t + * + * See gtk_image_new_from_surface() for details. + * + * Since: 3.10 + **/ +void +gtk_image_set_from_surface (GtkImage *image, + cairo_surface_t *surface) +{ + GtkImagePrivate *priv; + + g_return_if_fail (GTK_IS_IMAGE (image)); + + priv = image->priv; + + g_object_freeze_notify (G_OBJECT (image)); + + if (surface) + cairo_surface_reference (surface); + + gtk_image_clear (image); + + if (surface) + { + _gtk_icon_helper_set_surface (priv->icon_helper, surface); + cairo_surface_destroy (surface); + } + + g_object_notify (G_OBJECT (image), "surface"); + + g_object_thaw_notify (G_OBJECT (image)); +} + /** * gtk_image_get_storage_type: * @image: a #GtkImage diff --git a/gtk/gtkimage.h b/gtk/gtkimage.h index eb5be482c1..a7fede0a88 100644 --- a/gtk/gtkimage.h +++ b/gtk/gtkimage.h @@ -133,6 +133,8 @@ GtkWidget* gtk_image_new_from_icon_name (const gchar *icon_name, GDK_AVAILABLE_IN_ALL GtkWidget* gtk_image_new_from_gicon (GIcon *icon, GtkIconSize size); +GDK_AVAILABLE_IN_3_10 +GtkWidget* gtk_image_new_from_surface (cairo_surface_t *surface); GDK_AVAILABLE_IN_ALL void gtk_image_clear (GtkImage *image); @@ -164,6 +166,9 @@ GDK_AVAILABLE_IN_ALL void gtk_image_set_from_gicon (GtkImage *image, GIcon *icon, GtkIconSize size); +GDK_AVAILABLE_IN_3_10 +void gtk_image_set_from_surface (GtkImage *image, + cairo_surface_t *surface); GDK_AVAILABLE_IN_ALL void gtk_image_set_pixel_size (GtkImage *image, gint pixel_size);