[gdk-pixbuf] API: Add gdk_pixbuf_animation_new_from_stream()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdk-pixbuf] API: Add gdk_pixbuf_animation_new_from_stream()
- Date: Fri, 1 Feb 2013 16:43:37 +0000 (UTC)
commit ff01866f4a5aef10c1a4a86fc2fe66e49a634bd1
Author: Benjamin Otte <otte redhat com>
Date: Wed Jan 30 03:00:54 2013 +0100
API: Add gdk_pixbuf_animation_new_from_stream()
docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt | 1 +
gdk-pixbuf/gdk-pixbuf-animation.c | 85 +++++++++++++++++++++
gdk-pixbuf/gdk-pixbuf-animation.h | 3 +
gdk-pixbuf/gdk-pixbuf-io.c | 1 -
gdk-pixbuf/gdk-pixbuf-private.h | 2 +
5 files changed, 91 insertions(+), 1 deletions(-)
---
diff --git a/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt b/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt
index 5b5c58c..6b41f16 100644
--- a/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt
+++ b/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt
@@ -129,6 +129,7 @@ gdk_pixbuf_fill
GdkPixbufAnimation
GdkPixbufAnimationIter
gdk_pixbuf_animation_new_from_file
+gdk_pixbuf_animation_new_from_stream
gdk_pixbuf_animation_ref
gdk_pixbuf_animation_unref
gdk_pixbuf_animation_get_width
diff --git a/gdk-pixbuf/gdk-pixbuf-animation.c b/gdk-pixbuf/gdk-pixbuf-animation.c
index e47a9f1..60ef4a1 100644
--- a/gdk-pixbuf/gdk-pixbuf-animation.c
+++ b/gdk-pixbuf/gdk-pixbuf-animation.c
@@ -26,6 +26,7 @@
#include <errno.h>
#include "gdk-pixbuf-private.h"
#include "gdk-pixbuf-animation.h"
+#include "gdk-pixbuf-loader.h"
#include <glib/gstdio.h>
@@ -311,6 +312,90 @@ gdk_pixbuf_animation_new_from_file (const char *filename,
#endif
/**
+ * gdk_pixbuf_animation_new_from_stream:
+ * @stream: a #GInputStream to load the pixbuf from
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore
+ * @error: Return location for an error
+ *
+ * Creates a new animation by loading it from an input stream.
+ *
+ * The file format is detected automatically. If %NULL is returned, then
+ * @error will be set. The @cancellable can be used to abort the operation
+ * from another thread. If the operation was cancelled, the error
+ * %G_IO_ERROR_CANCELLED will be returned. Other possible errors are in
+ * the #GDK_PIXBUF_ERROR and %G_IO_ERROR domains.
+ *
+ * The stream is not closed.
+ *
+ * Return value: A newly-created pixbuf, or %NULL if any of several error
+ * conditions occurred: the file could not be opened, the image format is
+ * not supported, there was not enough memory to allocate the image buffer,
+ * the stream contained invalid data, or the operation was cancelled.
+ *
+ * Since: 2.28
+ **/
+GdkPixbufAnimation *
+gdk_pixbuf_animation_new_from_stream (GInputStream *stream,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GdkPixbufAnimation *animation;
+ GdkPixbufLoader *loader;
+ gssize n_read;
+ guchar buffer[LOAD_BUFFER_SIZE];
+ gboolean res;
+
+ g_return_val_if_fail (G_IS_INPUT_STREAM (stream), NULL);
+ g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ loader = gdk_pixbuf_loader_new ();
+
+ res = TRUE;
+ while (1) {
+ n_read = g_input_stream_read (stream,
+ buffer,
+ sizeof (buffer),
+ cancellable,
+ error);
+ if (n_read < 0) {
+ res = FALSE;
+ error = NULL; /* Ignore further errors */
+ break;
+ }
+
+ if (n_read == 0)
+ break;
+
+ if (!gdk_pixbuf_loader_write (loader,
+ buffer,
+ n_read,
+ error)) {
+ res = FALSE;
+ error = NULL;
+ break;
+ }
+ }
+
+ if (!gdk_pixbuf_loader_close (loader, error)) {
+ res = FALSE;
+ error = NULL;
+ }
+
+ if (res) {
+ animation = gdk_pixbuf_loader_get_animation (loader);
+ if (animation)
+ g_object_ref (animation);
+ } else {
+ animation = NULL;
+ }
+
+ g_object_unref (loader);
+
+ return animation;
+}
+
+/**
* gdk_pixbuf_animation_ref: (skip)
* @animation: An animation.
*
diff --git a/gdk-pixbuf/gdk-pixbuf-animation.h b/gdk-pixbuf/gdk-pixbuf-animation.h
index 1f0c00f..38dfc02 100644
--- a/gdk-pixbuf/gdk-pixbuf-animation.h
+++ b/gdk-pixbuf/gdk-pixbuf-animation.h
@@ -72,6 +72,9 @@ GType gdk_pixbuf_animation_get_type (void) G_GNUC_CONST;
GdkPixbufAnimation *gdk_pixbuf_animation_new_from_file (const char *filename,
GError **error);
+GdkPixbufAnimation *gdk_pixbuf_animation_new_from_stream (GInputStream *stream,
+ GCancellable *cancellable,
+ GError **error);
#ifndef GDK_PIXBUF_DISABLE_DEPRECATED
G_DEPRECATED_FOR(g_object_ref)
diff --git a/gdk-pixbuf/gdk-pixbuf-io.c b/gdk-pixbuf/gdk-pixbuf-io.c
index 0714afd..2dc7cd8 100644
--- a/gdk-pixbuf/gdk-pixbuf-io.c
+++ b/gdk-pixbuf/gdk-pixbuf-io.c
@@ -48,7 +48,6 @@
#endif
#define SNIFF_BUFFER_SIZE 4096
-#define LOAD_BUFFER_SIZE 65536
/**
* SECTION:file-loading
diff --git a/gdk-pixbuf/gdk-pixbuf-private.h b/gdk-pixbuf/gdk-pixbuf-private.h
index bb6eafa..001e747 100644
--- a/gdk-pixbuf/gdk-pixbuf-private.h
+++ b/gdk-pixbuf/gdk-pixbuf-private.h
@@ -35,6 +35,8 @@
#include "gdk-pixbuf-io.h"
#include "gdk-pixbuf-i18n.h"
+#define LOAD_BUFFER_SIZE 65536
+
typedef struct _GdkPixbufClass GdkPixbufClass;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]