[gtk/image-loading: 10/14] Use our tiff loader for content (de)serialization
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/image-loading: 10/14] Use our tiff loader for content (de)serialization
- Date: Sun, 12 Sep 2021 14:31:36 +0000 (UTC)
commit b3dcdb4e4aeae81ed26f43f7928f4e2fc35e36ec
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Sep 9 23:05:01 2021 -0400
Use our tiff loader for content (de)serialization
We still fall back to gdk-pixbuf for handling all
the other image formats.
gdk/gdkcontentdeserializer.c | 37 +++++++++++++++++++++++++
gdk/gdkcontentserializer.c | 65 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 102 insertions(+)
---
diff --git a/gdk/gdkcontentdeserializer.c b/gdk/gdkcontentdeserializer.c
index 158ec23f6e..a3db3145f0 100644
--- a/gdk/gdkcontentdeserializer.c
+++ b/gdk/gdkcontentdeserializer.c
@@ -26,6 +26,7 @@
#include "gdktexture.h"
#include "gdkrgbaprivate.h"
#include "gdkpng.h"
+#include "gdktiff.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
@@ -686,6 +687,36 @@ png_deserializer (GdkContentDeserializer *deserializer)
deserializer);
}
+static void
+tiff_deserializer_finish (GObject *source,
+ GAsyncResult *res,
+ gpointer deserializer)
+{
+ GdkTexture *texture;
+ GValue *value;
+ GError *error = NULL;
+
+ texture = gdk_load_tiff_finish (res, &error);
+ if (texture == NULL)
+ {
+ gdk_content_deserializer_return_error (deserializer, error);
+ return;
+ }
+
+ value = gdk_content_deserializer_get_value (deserializer);
+ g_value_take_object (value, texture);
+ gdk_content_deserializer_return_success (deserializer);
+}
+
+static void
+tiff_deserializer (GdkContentDeserializer *deserializer)
+{
+ gdk_load_tiff_async (gdk_content_deserializer_get_input_stream (deserializer),
+ gdk_content_deserializer_get_cancellable (deserializer),
+ tiff_deserializer_finish,
+ deserializer);
+}
+
static void
string_deserializer_finish (GObject *source,
GAsyncResult *result,
@@ -900,6 +931,12 @@ init (void)
NULL,
NULL);
+ gdk_content_register_deserializer ("image/tiff",
+ GDK_TYPE_TEXTURE,
+ tiff_deserializer,
+ NULL,
+ NULL);
+
formats = gdk_pixbuf_get_formats ();
/* Make sure png comes first */
diff --git a/gdk/gdkcontentserializer.c b/gdk/gdkcontentserializer.c
index 92e14c9e14..a911f9371a 100644
--- a/gdk/gdkcontentserializer.c
+++ b/gdk/gdkcontentserializer.c
@@ -27,6 +27,7 @@
#include "gdktextureprivate.h"
#include "gdkrgba.h"
#include "gdkpng.h"
+#include "gdktiff.h"
#include "gdkmemorytextureprivate.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
@@ -719,6 +720,65 @@ png_serializer (GdkContentSerializer *serializer)
data);
}
+typedef struct {
+ GdkContentSerializer *serializer;
+ GBytes *bytes;
+} TiffSerializerData;
+
+static void
+tiff_serializer_finish (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ TiffSerializerData *data = user_data;
+ GError *error = NULL;
+
+ if (!gdk_save_tiff_finish (res, &error))
+ gdk_content_serializer_return_error (data->serializer, error);
+ else
+ gdk_content_serializer_return_success (data->serializer);
+
+ g_bytes_unref (data->bytes);
+ g_free (data);
+}
+
+static void
+tiff_serializer (GdkContentSerializer *serializer)
+{
+ const GValue *value;
+ GdkTexture *texture;
+ int width, height;
+ guchar *buffer;
+ GBytes *bytes = NULL;
+ TiffSerializerData *data;
+
+ value = gdk_content_serializer_get_value (serializer);
+
+ texture = g_value_get_object (value);
+
+ width = gdk_texture_get_width (texture);
+ height = gdk_texture_get_height (texture);
+ buffer = g_malloc (width * height * 4);
+
+ gdk_texture_download (texture, buffer, width * 4);
+ bytes = g_bytes_new_take (buffer, width * height * 4);
+
+ data = g_new0 (TiffSerializerData, 1);
+ data->serializer = serializer;
+ data->bytes = bytes;
+
+ gdk_save_tiff_async (gdk_content_serializer_get_output_stream (serializer),
+ g_bytes_get_data (bytes, NULL),
+ width,
+ height,
+ width * 4,
+ GDK_MEMORY_DEFAULT,
+ gdk_content_serializer_get_cancellable (serializer),
+ tiff_serializer_finish,
+ data);
+ g_object_unref (texture);
+}
+
static void
string_serializer_finish (GObject *source,
GAsyncResult *result,
@@ -943,6 +1003,11 @@ init (void)
png_serializer,
NULL, NULL);
+ gdk_content_register_serializer (GDK_TYPE_TEXTURE,
+ "image/tiff",
+ tiff_serializer,
+ NULL, NULL);
+
formats = gdk_pixbuf_get_formats ();
/* Make sure png comes first */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]