diff options
author | Alexander Larsson <alexl@redhat.com> | 2013-06-26 16:33:50 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2013-07-03 14:39:26 +0200 |
commit | 31fc70721e91d09ff7e3e7df62ce8f9c8c8eb037 (patch) | |
tree | e37a6361d9fd27a4b38e0ea2d495cbc9044a0078 /gtk | |
parent | 031e1a98a0d26682572906b3a3853a284412aaf1 (diff) | |
download | gtk+-31fc70721e91d09ff7e3e7df62ce8f9c8c8eb037.tar.gz |
GtkImage: Add new_from_surface() and set_from_surface()
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkimage.c | 77 | ||||
-rw-r--r-- | gtk/gtkimage.h | 5 |
2 files changed, 82 insertions, 0 deletions
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 <math.h> #include <string.h> +#include <cairo-gobject.h> #include "gtkcontainer.h" #include "gtkiconhelperprivate.h" @@ -185,6 +186,7 @@ enum { PROP_0, PROP_PIXBUF, + PROP_SURFACE, PROP_FILE, PROP_STOCK, PROP_ICON_SET, @@ -232,6 +234,14 @@ gtk_image_class_init (GtkImageClass *class) 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", P_("Filename"), @@ -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; @@ -633,6 +650,29 @@ gtk_image_new_from_pixbuf (GdkPixbuf *pixbuf) } /** + * 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 * @size: (type int): a stock icon size @@ -1129,6 +1169,43 @@ gtk_image_set_from_gicon (GtkImage *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); |