summaryrefslogtreecommitdiff
path: root/gdk-pixbuf
diff options
context:
space:
mode:
Diffstat (limited to 'gdk-pixbuf')
-rw-r--r--gdk-pixbuf/ChangeLog9
-rw-r--r--gdk-pixbuf/gdk-pixbuf-animation.c58
-rw-r--r--gdk-pixbuf/gdk-pixbuf-loader.c166
-rw-r--r--gdk-pixbuf/gdk-pixbuf-loader.h21
-rw-r--r--gdk-pixbuf/gdk-pixbuf.h4
5 files changed, 159 insertions, 99 deletions
diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog
index 750c1a04c4..6232744098 100644
--- a/gdk-pixbuf/ChangeLog
+++ b/gdk-pixbuf/ChangeLog
@@ -1,3 +1,12 @@
+2000-12-16 Havoc Pennington <hp@pobox.com>
+
+ * gdk-pixbuf-animation.c (gdk_pixbuf_animation_new_from_file): ref
+ the pixbuf in the frame, so we can use gdk_pixbuf_frame_free
+ (gdk_pixbuf_frame_copy): new function
+ (gdk_pixbuf_frame_free): new function
+ (gdk_pixbuf_frame_get_type): new function
+ (GDK_TYPE_PIXBUF_FRAME): macro to get type for GdkPixbufFrame
+
Tue Nov 14 11:51:26 2000 Owen Taylor <otaylor@redhat.com>
* Makefile.am: Add -avoid-version for all modules.
diff --git a/gdk-pixbuf/gdk-pixbuf-animation.c b/gdk-pixbuf/gdk-pixbuf-animation.c
index 9d221d5c39..d0f7768f2c 100644
--- a/gdk-pixbuf/gdk-pixbuf-animation.c
+++ b/gdk-pixbuf/gdk-pixbuf-animation.c
@@ -193,6 +193,7 @@ gdk_pixbuf_animation_new_from_file (const char *filename,
frame = g_new (GdkPixbufFrame, 1);
frame->pixbuf = pixbuf;
+ g_object_ref (G_OBJECT (frame->pixbuf));
frame->x_offset = 0;
frame->y_offset = 0;
frame->delay_time = -1;
@@ -406,3 +407,60 @@ gdk_pixbuf_frame_get_action (GdkPixbufFrame *frame)
return frame->action;
}
+
+/**
+ * gdk_pixbuf_frame_copy:
+ * @src: a #GdkPixbufFrame to copy
+ *
+ * Copies a #GdkPixbufFrame. Free the result
+ * with gdk_pixbuf_frame_free().
+ *
+ * Return value: a new #GdkPixbufFrame
+ **/
+GdkPixbufFrame*
+gdk_pixbuf_frame_copy (GdkPixbufFrame *src)
+{
+ GdkPixbufFrame *frame;
+
+ frame = g_new (GdkPixbufFrame, 1);
+ frame->pixbuf = src->pixbuf;
+ g_object_ref (G_OBJECT (frame->pixbuf));
+ frame->x_offset = src->x_offset;
+ frame->y_offset = src->y_offset;
+ frame->delay_time = src->delay_time;
+ frame->action = src->action;
+
+ return frame;
+}
+
+/**
+ * gdk_pixbuf_frame_free:
+ * @frame: a #GdkPixbufFrame
+ *
+ * Frees a #GdkPixbufFrame. Don't do this with frames you got from
+ * #GdkPixbufAnimation, usually the animation owns those (it doesn't
+ * make a copy before returning the frame).
+ **/
+void
+gdk_pixbuf_frame_free (GdkPixbufFrame *frame)
+{
+ g_return_if_fail (frame != NULL);
+
+ g_object_unref (G_OBJECT (frame->pixbuf));
+ g_free (frame);
+}
+
+GType
+gdk_pixbuf_frame_get_type (void)
+{
+ static GType our_type = 0;
+
+ if (our_type == 0)
+ {
+ our_type = g_boxed_type_register_static ("GdkPixbufFrame",
+ gdk_pixbuf_frame_copy,
+ gdk_pixbuf_frame_free);
+ }
+
+ return our_type;
+}
diff --git a/gdk-pixbuf/gdk-pixbuf-loader.c b/gdk-pixbuf/gdk-pixbuf-loader.c
index 06f2e1df39..34cb3899a1 100644
--- a/gdk-pixbuf/gdk-pixbuf-loader.c
+++ b/gdk-pixbuf/gdk-pixbuf-loader.c
@@ -1,4 +1,4 @@
-/* GdkPixbuf library - Main header file
+/* GdkPixbuf library - Progressive loader object
*
* Copyright (C) 1999 The Free Software Foundation
*
@@ -43,7 +43,6 @@ enum {
static void gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass);
static void gdk_pixbuf_loader_init (GdkPixbufLoader *loader);
-static void gdk_pixbuf_loader_destroy (GtkObject *loader);
static void gdk_pixbuf_loader_finalize (GObject *loader);
static gpointer parent_class = NULL;
@@ -75,25 +74,29 @@ typedef struct
*
* Return value: The type ID of the #GdkPixbufLoader class.
**/
-GtkType
+GType
gdk_pixbuf_loader_get_type (void)
{
- static GtkType loader_type = 0;
+ static GType loader_type = 0;
if (!loader_type)
{
- static const GtkTypeInfo loader_info = {
- "GdkPixbufLoader",
- sizeof (GdkPixbufLoader),
- sizeof (GdkPixbufLoaderClass),
- (GtkClassInitFunc) gdk_pixbuf_loader_class_init,
- (GtkObjectInitFunc) gdk_pixbuf_loader_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
+ static const GTypeInfo loader_info = {
+ sizeof (GdkPixbufLoaderClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gdk_pixbuf_loader_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GdkPixbufLoader),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) gdk_pixbuf_loader_init
};
- loader_type = gtk_type_unique (GTK_TYPE_OBJECT, &loader_info);
+ loader_type = g_type_register_static (G_TYPE_OBJECT,
+ "GdkPixbufLoader",
+ &loader_info,
+ 0);
}
return loader_type;
@@ -102,61 +105,63 @@ gdk_pixbuf_loader_get_type (void)
static void
gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *class)
{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
+ GObjectClass *object_class;
- object_class = (GtkObjectClass *) class;
- gobject_class = (GObjectClass *) class;
+ object_class = (GObjectClass *) class;
- parent_class = gtk_type_class (GTK_TYPE_OBJECT);
+ parent_class = g_type_class_peek_parent (class);
- object_class->destroy = gdk_pixbuf_loader_destroy;
- gobject_class->finalize = gdk_pixbuf_loader_finalize;
+ object_class->finalize = gdk_pixbuf_loader_finalize;
pixbuf_loader_signals[AREA_PREPARED] =
- gtk_signal_new ("area_prepared",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, area_prepared),
- gtk_marshal_VOID__VOID,
- GTK_TYPE_NONE, 0);
+ g_signal_newc ("area_prepared",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, area_prepared),
+ NULL,
+ gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
pixbuf_loader_signals[AREA_UPDATED] =
- gtk_signal_new ("area_updated",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, area_updated),
- gtk_marshal_VOID__INT_INT_INT_INT,
- GTK_TYPE_NONE, 4,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_INT,
- GTK_TYPE_INT);
+ g_signal_newc ("area_updated",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, area_updated),
+ NULL,
+ gtk_marshal_VOID__INT_INT_INT_INT,
+ G_TYPE_NONE, 4,
+ G_TYPE_INT,
+ G_TYPE_INT,
+ G_TYPE_INT,
+ G_TYPE_INT);
pixbuf_loader_signals[FRAME_DONE] =
- gtk_signal_new ("frame_done",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, frame_done),
- gtk_marshal_VOID__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
+ g_signal_newc ("frame_done",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, frame_done),
+ NULL,
+ gtk_marshal_VOID__POINTER,
+ G_TYPE_NONE, 1,
+ GDK_TYPE_PIXBUF_FRAME);
pixbuf_loader_signals[ANIMATION_DONE] =
- gtk_signal_new ("animation_done",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, animation_done),
- gtk_marshal_VOID__VOID,
- GTK_TYPE_NONE, 0);
+ g_signal_newc ("animation_done",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, animation_done),
+ NULL,
+ gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
pixbuf_loader_signals[CLOSED] =
- gtk_signal_new ("closed",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, closed),
- gtk_marshal_VOID__VOID,
- GTK_TYPE_NONE, 0);
+ g_signal_newc ("closed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdkPixbufLoaderClass, closed),
+ NULL,
+ gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
static void
@@ -169,38 +174,23 @@ gdk_pixbuf_loader_init (GdkPixbufLoader *loader)
}
static void
-gdk_pixbuf_loader_destroy (GtkObject *object)
+gdk_pixbuf_loader_finalize (GObject *object)
{
GdkPixbufLoader *loader;
GdkPixbufLoaderPrivate *priv = NULL;
- g_return_if_fail (object != NULL);
- g_return_if_fail (GDK_IS_PIXBUF_LOADER (object));
-
loader = GDK_PIXBUF_LOADER (object);
priv = loader->private;
-
+
if (!priv->closed)
gdk_pixbuf_loader_close (loader);
if (priv->animation)
gdk_pixbuf_animation_unref (priv->animation);
+
if (priv->pixbuf)
gdk_pixbuf_unref (priv->pixbuf);
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-static void
-gdk_pixbuf_loader_finalize (GObject *object)
-{
- GdkPixbufLoader *loader;
- GdkPixbufLoaderPrivate *priv = NULL;
-
- loader = GDK_PIXBUF_LOADER (object);
- priv = loader->private;
-
g_free (priv);
if (G_OBJECT_CLASS (parent_class)->finalize)
@@ -219,7 +209,7 @@ gdk_pixbuf_loader_prepare (GdkPixbuf *pixbuf,
g_assert (priv->pixbuf == NULL);
priv->pixbuf = pixbuf;
- gtk_signal_emit (GTK_OBJECT (loader), pixbuf_loader_signals[AREA_PREPARED]);
+ g_signal_emit (G_OBJECT (loader), pixbuf_loader_signals[AREA_PREPARED], 0);
}
static void
@@ -234,12 +224,13 @@ gdk_pixbuf_loader_update (GdkPixbuf *pixbuf,
priv = GDK_PIXBUF_LOADER (loader)->private;
- gtk_signal_emit (GTK_OBJECT (loader),
- pixbuf_loader_signals[AREA_UPDATED],
- x, y,
- /* sanity check in here. Defend against an errant loader */
- MIN (width, gdk_pixbuf_get_width (priv->pixbuf)),
- MIN (height, gdk_pixbuf_get_height (priv->pixbuf)));
+ g_signal_emit (G_OBJECT (loader),
+ pixbuf_loader_signals[AREA_UPDATED],
+ 0,
+ x, y,
+ /* sanity check in here. Defend against an errant loader */
+ MIN (width, gdk_pixbuf_get_width (priv->pixbuf)),
+ MIN (height, gdk_pixbuf_get_height (priv->pixbuf)));
}
static void
@@ -278,9 +269,10 @@ gdk_pixbuf_loader_frame_done (GdkPixbufFrame *frame,
priv->animation->frames = g_list_append (priv->animation->frames, frame);
priv->animation->n_frames++;
- gtk_signal_emit (GTK_OBJECT (loader),
- pixbuf_loader_signals[FRAME_DONE],
- frame);
+ g_signal_emit (GTK_OBJECT (loader),
+ pixbuf_loader_signals[FRAME_DONE],
+ 0,
+ frame);
}
static void
@@ -312,7 +304,7 @@ gdk_pixbuf_loader_animation_done (GdkPixbuf *pixbuf,
current = current->next;
}
- gtk_signal_emit (GTK_OBJECT (loader), pixbuf_loader_signals[ANIMATION_DONE]);
+ g_signal_emit (G_OBJECT (loader), pixbuf_loader_signals[ANIMATION_DONE], 0);
}
static gint
@@ -605,7 +597,7 @@ gdk_pixbuf_loader_get_animation (GdkPixbufLoader *loader)
* gdk_pixbuf_loader_close:
* @loader: A pixbuf loader.
*
- * Informs a pixbuf loader that no further writes with gdk_pixbuf_load_write()
+ * Informs a pixbuf loader that no further writes with gdk_pixbuf_loader_write()
* will occur, so that it can free its internal loading structures.
**/
void
@@ -630,5 +622,5 @@ gdk_pixbuf_loader_close (GdkPixbufLoader *loader)
priv->closed = TRUE;
- gtk_signal_emit (GTK_OBJECT (loader), pixbuf_loader_signals[CLOSED]);
+ g_signal_emit (G_OBJECT (loader), pixbuf_loader_signals[CLOSED], 0);
}
diff --git a/gdk-pixbuf/gdk-pixbuf-loader.h b/gdk-pixbuf/gdk-pixbuf-loader.h
index 402b697256..01532ad782 100644
--- a/gdk-pixbuf/gdk-pixbuf-loader.h
+++ b/gdk-pixbuf/gdk-pixbuf-loader.h
@@ -1,4 +1,4 @@
-/* GdkPixbuf library - Main header file
+/* GdkPixbuf library - Progressive loader object
*
* Copyright (C) 1999 The Free Software Foundation
*
@@ -26,27 +26,24 @@
#ifndef GDK_PIXBUF_LOADER_H
#define GDK_PIXBUF_LOADER_H
-#include <gtk/gtkobject.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#ifdef __cplusplus
extern "C" {
#endif
-
-
#define GDK_TYPE_PIXBUF_LOADER (gdk_pixbuf_loader_get_type ())
-#define GDK_PIXBUF_LOADER(obj) (GTK_CHECK_CAST ((obj), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoader))
-#define GDK_PIXBUF_LOADER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoaderClass))
-#define GDK_IS_PIXBUF_LOADER(obj) (GTK_CHECK_TYPE ((obj), GDK_TYPE_PIXBUF_LOADER))
-#define GDK_IS_PIXBUF_LOADER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GDK_TYPE_PIXBUF_LOADER))
-#define GDK_PIXBUF_LOADER_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoaderClass))
+#define GDK_PIXBUF_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoader))
+#define GDK_PIXBUF_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoaderClass))
+#define GDK_IS_PIXBUF_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GDK_TYPE_PIXBUF_LOADER))
+#define GDK_IS_PIXBUF_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_PIXBUF_LOADER))
+#define GDK_PIXBUF_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_PIXBUF_LOADER, GdkPixbufLoaderClass))
typedef struct _GdkPixbufLoader GdkPixbufLoader;
struct _GdkPixbufLoader
{
- GtkObject object;
+ GObject parent_instance;
/*< private >*/
gpointer private;
@@ -55,7 +52,7 @@ struct _GdkPixbufLoader
typedef struct _GdkPixbufLoaderClass GdkPixbufLoaderClass;
struct _GdkPixbufLoaderClass
{
- GtkObjectClass parent_class;
+ GObjectClass parent_class;
void (*area_prepared) (GdkPixbufLoader *loader);
void (*area_updated) (GdkPixbufLoader *loader,
@@ -70,7 +67,7 @@ struct _GdkPixbufLoaderClass
};
-GtkType gdk_pixbuf_loader_get_type (void) G_GNUC_CONST;
+GType gdk_pixbuf_loader_get_type (void) G_GNUC_CONST;
GdkPixbufLoader * gdk_pixbuf_loader_new (void);
GdkPixbufLoader * gdk_pixbuf_loader_new_with_type (const char *image_type,
GError **error);
diff --git a/gdk-pixbuf/gdk-pixbuf.h b/gdk-pixbuf/gdk-pixbuf.h
index ee87b82bb2..f089dcf900 100644
--- a/gdk-pixbuf/gdk-pixbuf.h
+++ b/gdk-pixbuf/gdk-pixbuf.h
@@ -279,6 +279,10 @@ int gdk_pixbuf_frame_get_x_offset (GdkPixbufFrame *frame);
int gdk_pixbuf_frame_get_y_offset (GdkPixbufFrame *frame);
int gdk_pixbuf_frame_get_delay_time (GdkPixbufFrame *frame);
GdkPixbufFrameAction gdk_pixbuf_frame_get_action (GdkPixbufFrame *frame);
+GdkPixbufFrame *gdk_pixbuf_frame_copy (GdkPixbufFrame *frame);
+void gdk_pixbuf_frame_free (GdkPixbufFrame *frame);
+GType gdk_pixbuf_frame_get_type (void) G_GNUC_CONST;
+#define GDK_TYPE_PIXBUF_FRAME gdk_pixbuf_frame_get_type ()
/* General (presently empty) initialization hooks, primarily for gnome-libs */