summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-03-11 00:08:20 +0100
committerBenjamin Otte <otte@redhat.com>2023-03-11 00:08:44 +0100
commitfc74eed4253b35fddbc792f7398c5bbeb9c54933 (patch)
treed227830021d86b887c6297f56a45e9a5f6fae39d
parent0db9677b3abd5851574ac98f59c56ea2460a1f4c (diff)
downloadgtk+-fc74eed4253b35fddbc792f7398c5bbeb9c54933.tar.gz
rendernode: Register PNG serializer
This allows dropping or copy/pasting rendernodes into apps that accept images.
-rw-r--r--gsk/gskrendernodeimpl.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c
index 9c091120c8..8e0b0a8415 100644
--- a/gsk/gskrendernodeimpl.c
+++ b/gsk/gskrendernodeimpl.c
@@ -21,8 +21,10 @@
#include "gskrendernodeprivate.h"
#include "gskcairoblurprivate.h"
+#include "gskcairorenderer.h"
#include "gskdebugprivate.h"
#include "gskdiffprivate.h"
+#include "gl/gskglrenderer.h"
#include "gskrendererprivate.h"
#include "gskroundedrectprivate.h"
#include "gsktransformprivate.h"
@@ -6315,6 +6317,36 @@ gsk_render_node_svg_serializer (GdkContentSerializer *serializer)
#endif
static void
+gsk_render_node_png_serializer (GdkContentSerializer *serializer)
+{
+ GskRenderNode *node;
+ GdkTexture *texture;
+ GskRenderer *renderer;
+ GBytes *bytes;
+
+ node = gsk_value_get_render_node (gdk_content_serializer_get_value (serializer));
+
+ renderer = gsk_gl_renderer_new ();
+ if (!gsk_renderer_realize (renderer, NULL, NULL))
+ {
+ g_object_unref (renderer);
+ renderer = gsk_cairo_renderer_new ();
+ if (!gsk_renderer_realize (renderer, NULL, NULL))
+ {
+ g_assert_not_reached ();
+ }
+ }
+ texture = gsk_renderer_render_texture (renderer, node, NULL);
+ gsk_renderer_unrealize (renderer);
+ g_object_unref (renderer);
+
+ bytes = gdk_texture_save_to_png_bytes (texture);
+ g_object_unref (texture);
+
+ gsk_render_node_serialize_bytes (serializer, bytes);
+}
+
+static void
gsk_render_node_content_serializer (GdkContentSerializer *serializer)
{
const GValue *value;
@@ -6402,6 +6434,11 @@ gsk_render_node_init_content_serializers (void)
NULL,
NULL);
#endif
+ gdk_content_register_serializer (GSK_TYPE_RENDER_NODE,
+ "image/png",
+ gsk_render_node_png_serializer,
+ NULL,
+ NULL);
gdk_content_register_deserializer ("application/x-gtk-render-node",
GSK_TYPE_RENDER_NODE,