summaryrefslogtreecommitdiff
path: root/gdk/gdkcontentserializer.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2017-12-02 14:36:57 +0100
committerBenjamin Otte <otte@redhat.com>2017-12-03 05:46:49 +0100
commita34836f35bc619aea82ccc50ee019a0ec55dc1dc (patch)
treee63c81ad69f98ee95be2f41fba224588445a574b /gdk/gdkcontentserializer.c
parentead67a7c17f25a424507bb3d87b66325af0ae4b3 (diff)
downloadgtk+-a34836f35bc619aea82ccc50ee019a0ec55dc1dc.tar.gz
gdk: Add (de)serializers for GDK_TYPE_TEXTURE
We want to use textures more, so we should be able to use them for copy/paste and dnd.
Diffstat (limited to 'gdk/gdkcontentserializer.c')
-rw-r--r--gdk/gdkcontentserializer.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/gdk/gdkcontentserializer.c b/gdk/gdkcontentserializer.c
index 6153e82204..d4421cec9f 100644
--- a/gdk/gdkcontentserializer.c
+++ b/gdk/gdkcontentserializer.c
@@ -22,6 +22,8 @@
#include "gdkcontentserializer.h"
#include "gdkcontentformats.h"
+#include "gdkpixbuf.h"
+#include "gdktextureprivate.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <string.h>
@@ -449,9 +451,32 @@ pixbuf_serializer_finish (GObject *source,
static void
pixbuf_serializer (GdkContentSerializer *serializer)
{
- const char *name = gdk_content_serializer_get_user_data (serializer);
+ const GValue *value;
+ GdkPixbuf *pixbuf;
+ const char *name;
+
+ name = gdk_content_serializer_get_user_data (serializer);
+ value = gdk_content_serializer_get_value (serializer);
- gdk_pixbuf_save_to_stream_async (g_value_get_object (gdk_content_serializer_get_value (serializer)),
+ if (G_VALUE_HOLDS (value, GDK_TYPE_PIXBUF))
+ {
+ pixbuf = g_value_dup_object (value);
+ }
+ else if (G_VALUE_HOLDS (value, GDK_TYPE_TEXTURE))
+ {
+ GdkTexture *texture = g_value_get_object (value);
+ cairo_surface_t *surface = gdk_texture_download_surface (texture);
+ pixbuf = gdk_pixbuf_get_from_surface (surface,
+ 0, 0,
+ gdk_texture_get_width (texture), gdk_texture_get_height (texture));
+ cairo_surface_destroy (surface);
+ }
+ else
+ {
+ g_assert_not_reached ();
+ }
+
+ gdk_pixbuf_save_to_stream_async (pixbuf,
gdk_content_serializer_get_output_stream (serializer),
name,
gdk_content_serializer_get_cancellable (serializer),
@@ -459,6 +484,7 @@ pixbuf_serializer (GdkContentSerializer *serializer)
serializer,
g_str_equal (name, "png") ? "compression" : NULL, "2",
NULL);
+ g_object_unref (pixbuf);
}
static void
@@ -669,6 +695,11 @@ init (void)
mimes = gdk_pixbuf_format_get_mime_types (fmt);
for (m = mimes; *m; m++)
{
+ gdk_content_register_serializer (GDK_TYPE_TEXTURE,
+ *m,
+ pixbuf_serializer,
+ g_strdup (gdk_pixbuf_format_get_name (fmt)),
+ g_free);
gdk_content_register_serializer (GDK_TYPE_PIXBUF,
*m,
pixbuf_serializer,