From 23b0f15ee834bef11d3e5de3158a092d0b338cba Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Wed, 27 Oct 1999 17:31:07 +0000 Subject: [PATCH] Return a GdkPixbufLoader, not a GtkObject. 1999-10-27 Federico Mena Quintero * src/gdk-pixbuf-loader.c (gdk_pixbuf_loader_new): Return a GdkPixbufLoader, not a GtkObject. (gtk_marshal_NONE__INT_INT_INT_INT): Made static. (gdk_pixbuf_loader_get_type): Documented. (gdk_pixbuf_loader_class_init): Initialize the parent class correctly. (gdk_pixbuf_loader_destroy): Added sanity checks. Call the parent class destroy function. (gdk_pixbuf_loader_new): Documented. (gdk_pixbuf_loader_finalize): Call the parent class finalize function. (gdk_pixbuf_loader_write): Use size_t for count. --- gdk-pixbuf/ChangeLog | 15 +++ gdk-pixbuf/gdk-pixbuf-io.h | 4 +- gdk-pixbuf/gdk-pixbuf-loader.c | 186 ++++++++++++++++++------------- gdk-pixbuf/gdk-pixbuf-loader.h | 8 +- gdk-pixbuf/gnome-canvas-pixbuf.c | 4 +- gtk/gdk-pixbuf-loader.c | 186 ++++++++++++++++++------------- gtk/gdk-pixbuf-loader.h | 8 +- 7 files changed, 246 insertions(+), 165 deletions(-) diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index 80039d02dd..c06d221125 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,18 @@ +1999-10-27 Federico Mena Quintero + + * src/gdk-pixbuf-loader.c (gdk_pixbuf_loader_new): Return a + GdkPixbufLoader, not a GtkObject. + (gtk_marshal_NONE__INT_INT_INT_INT): Made static. + (gdk_pixbuf_loader_get_type): Documented. + (gdk_pixbuf_loader_class_init): Initialize the parent class + correctly. + (gdk_pixbuf_loader_destroy): Added sanity checks. Call the parent + class destroy function. + (gdk_pixbuf_loader_new): Documented. + (gdk_pixbuf_loader_finalize): Call the parent class finalize + function. + (gdk_pixbuf_loader_write): Use size_t for count. + 1999-10-27 Michael Fulbright * src/gdk-pixbuf-loader.c (gdk_pixbuf_loader_destroy): Fixed diff --git a/gdk-pixbuf/gdk-pixbuf-io.h b/gdk-pixbuf/gdk-pixbuf-io.h index e27c137a59..b3da91d645 100644 --- a/gdk-pixbuf/gdk-pixbuf-io.h +++ b/gdk-pixbuf/gdk-pixbuf-io.h @@ -26,13 +26,15 @@ #include "gdk-pixbuf.h" #include + + typedef void (* ModulePreparedNotifyFunc) (GdkPixbuf *pixbuf, gpointer user_data); typedef struct _ModuleType ModuleType; struct _ModuleType { char *module_name; - gboolean (* format_check) (guchar *buffer, int size); GModule *module; + gboolean (* format_check) (guchar *buffer, int size); GdkPixbuf *(* load) (FILE *f); GdkPixbuf *(* load_xpm_data) (const gchar **data); diff --git a/gdk-pixbuf/gdk-pixbuf-loader.c b/gdk-pixbuf/gdk-pixbuf-loader.c index a86736e0e9..2a9ac9e3e4 100644 --- a/gdk-pixbuf/gdk-pixbuf-loader.c +++ b/gdk-pixbuf/gdk-pixbuf-loader.c @@ -27,6 +27,8 @@ #include "gdk-pixbuf-io.h" #include + + enum { AREA_UPDATED, AREA_PREPARED, @@ -41,44 +43,52 @@ static void gdk_pixbuf_loader_init (GdkPixbufLoader *loader); static void gdk_pixbuf_loader_destroy (GtkObject *loader); static void gdk_pixbuf_loader_finalize (GtkObject *loader); +static guint pixbuf_loader_signals[LAST_SIGNAL] = { 0 }; + + /* Internal data */ -typedef struct _GdkPixbufLoaderPrivate GdkPixbufLoaderPrivate; -struct _GdkPixbufLoaderPrivate -{ +typedef struct { GdkPixbuf *pixbuf; gboolean closed; gchar buf[128]; gint buf_offset; ModuleType *image_module; gpointer context; -}; -static guint pixbuf_loader_signals[LAST_SIGNAL] = { 0 }; +} GdkPixbufLoaderPrivate; + /* our marshaller */ -typedef void (*GtkSignal_NONE__INT_INT_INT_INT) (GtkObject * object, - gint arg1, - gint arg2, - gint arg3, - gint arg4, - gpointer user_data); -void -gtk_marshal_NONE__INT_INT_INT_INT (GtkObject * object, - GtkSignalFunc func, - gpointer func_data, +typedef void (* GtkSignal_NONE__INT_INT_INT_INT) (GtkObject *object, + gint arg1, gint arg2, gint arg3, gint arg4, + gpointer user_data); +static void +gtk_marshal_NONE__INT_INT_INT_INT (GtkObject *object, GtkSignalFunc func, gpointer func_data, GtkArg * args) { - GtkSignal_NONE__INT_INT_INT_INT rfunc; - rfunc = (GtkSignal_NONE__INT_INT_INT_INT) func; - (*rfunc) (object, - GTK_VALUE_INT (args[0]), - GTK_VALUE_INT (args[1]), - GTK_VALUE_INT (args[2]), - GTK_VALUE_INT (args[3]), - func_data); + GtkSignal_NONE__INT_INT_INT_INT rfunc; + + rfunc = (GtkSignal_NONE__INT_INT_INT_INT) func; + (*rfunc) (object, + GTK_VALUE_INT (args[0]), + GTK_VALUE_INT (args[1]), + GTK_VALUE_INT (args[2]), + GTK_VALUE_INT (args[3]), + func_data); } + + +/** + * gdk_pixbuf_loader_get_type: + * @void: + * + * Registers the &GdkPixubfLoader class if necessary, and returns the type ID + * associated to it. + * + * Return value: The type ID of the &GdkPixbufLoader class. + **/ GtkType gdk_pixbuf_loader_get_type (void) { @@ -103,9 +113,13 @@ gdk_pixbuf_loader_get_type (void) } static void -gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass) +gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *class) { - parent_class = GTK_OBJECT_CLASS (klass); + GtkObjectClass *object_class; + + object_class = (GtkObjectClass *) class; + + parent_class = gtk_type_class (gtk_object_get_type ()); pixbuf_loader_signals[AREA_PREPARED] = gtk_signal_new ("area_prepared", @@ -121,7 +135,11 @@ gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass) parent_class->type, GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, area_updated), gtk_marshal_NONE__INT_INT_INT_INT, - GTK_TYPE_NONE, 4, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT); + GTK_TYPE_NONE, 4, + GTK_TYPE_INT, + GTK_TYPE_INT, + GTK_TYPE_INT, + GTK_TYPE_INT); pixbuf_loader_signals[CLOSED] = gtk_signal_new ("closed", @@ -131,10 +149,10 @@ gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass) gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); - gtk_object_class_add_signals (parent_class, pixbuf_loader_signals, LAST_SIGNAL); + gtk_object_class_add_signals (object_class, pixbuf_loader_signals, LAST_SIGNAL); - parent_class->destroy = gdk_pixbuf_loader_destroy; - parent_class->finalize = gdk_pixbuf_loader_finalize; + object_class->destroy = gdk_pixbuf_loader_destroy; + object_class->finalize = gdk_pixbuf_loader_finalize; } static void @@ -142,13 +160,8 @@ gdk_pixbuf_loader_init (GdkPixbufLoader *loader) { GdkPixbufLoaderPrivate *priv; - priv = g_new (GdkPixbufLoaderPrivate, 1); + priv = g_new0 (GdkPixbufLoaderPrivate, 1); loader->private = priv; - - priv->image_module=NULL; - priv->pixbuf = NULL; - priv->closed = FALSE; - priv->buf_offset = 0; } static void @@ -156,14 +169,19 @@ gdk_pixbuf_loader_destroy (GtkObject *loader) { GdkPixbufLoaderPrivate *priv = NULL; + g_return_if_fail (loader != NULL); + g_return_if_fail (GDK_IS_PIXBUF_LOADER (loader)); + priv = GDK_PIXBUF_LOADER (loader)->private; - /* We want to close it if it's not already closed */ if (!priv->closed) gdk_pixbuf_loader_close (GDK_PIXBUF_LOADER (loader)); if (priv->pixbuf) gdk_pixbuf_unref (priv->pixbuf); + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } static void @@ -173,6 +191,9 @@ gdk_pixbuf_loader_finalize (GtkObject *loader) priv = GDK_PIXBUF_LOADER (loader)->private; g_free (priv); + + if (GTK_OBJECT_CLASS (parent_class)->finalize) + (* GTK_OBJECT_CLASS (parent_class)->finalize) (object); } static void @@ -188,20 +209,25 @@ gdk_pixbuf_loader_prepare (GdkPixbuf *pixbuf, gpointer loader) gtk_signal_emit (GTK_OBJECT (loader), pixbuf_loader_signals[AREA_PREPARED]); } -/* Public functions */ -GtkObject * + + +/** + * gdk_pixbuf_loader_new: + * @void: + * + * Creates a new pixbuf loader object. + * + * Return value: A newly-created pixbuf loader. + **/ +GdkPixbufLoader * gdk_pixbuf_loader_new (void) { - GdkPixbufLoader *loader; - - loader = gtk_type_new (gdk_pixbuf_loader_get_type ()); - - return GTK_OBJECT (loader); + return gtk_type_new (gdk_pixbuf_loader_get_type ()); } /** * gdk_pixbuf_loader_write: - * @loader: A loader. + * @loader: A pixbuf loader. * @buf: The image data. * @count: The length of @buf in bytes. * @@ -213,7 +239,7 @@ gdk_pixbuf_loader_new (void) * cannot parse the buf. **/ gboolean -gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, gint count) +gdk_pixbuf_loader_write (GdkPixbufLoader *loader, guchar *buf, size_t count) { GdkPixbufLoaderPrivate *priv; @@ -230,54 +256,59 @@ gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, gint count) if (priv->image_module == NULL) { gboolean retval = TRUE; - g_print ("buf_offset:%d:\n", priv->buf_offset); memcpy (priv->buf + priv->buf_offset, buf, - (priv->buf_offset + count) > 128 ? 128 - priv->buf_offset : count); - if ((priv->buf_offset + count) >= 128) { + (priv->buf_offset + count > 128) ? (128 - priv->buf_offset) : count); + + if (priv->buf_offset + count >= 128) { /* We have enough data to start doing something with the image */ priv->image_module = gdk_pixbuf_get_module (priv->buf, 128); - if (priv->image_module == NULL) { + if (priv->image_module == NULL) return FALSE; - } else if ((priv->image_module->begin_load == NULL) || - (priv->image_module->stop_load == NULL) || - (priv->image_module->load_increment == NULL)) { - g_warning ("module %s does not support incremental loading.\n", priv->image_module->module_name); + else if ((priv->image_module->begin_load == NULL) || + (priv->image_module->stop_load == NULL) || + (priv->image_module->load_increment == NULL)) { + g_warning ("module %s does not support incremental loading.\n", + priv->image_module->module_name); return FALSE; } else { - g_print ("module loaded: name is %s\n", priv->image_module->module_name); - priv->context = (priv->image_module->begin_load) (gdk_pixbuf_loader_prepare, loader); + priv->context = (*priv->image_module->begin_load) ( + gdk_pixbuf_loader_prepare, loader); if (priv->context == NULL) { g_warning("Failed to begin progressive load"); return FALSE; } - retval = (priv->image_module->load_increment) (priv->context, priv->buf, 128); + retval = (* priv->image_module->load_increment) ( + priv->context, priv->buf, 128); + + /* if we had more then 128 bytes total, we want + * to send the rest of the buffer. + */ - /* if we had more then 128 bytes total, we want to send the rest of the buffer */ if (retval && (priv->buf_offset + count) >= 128) { - retval = (priv->image_module->load_increment) (priv->context, - buf, - count + priv->buf_offset - 128); + retval = (* priv->image_module->load_increment) ( + priv->context, + buf, + count + priv->buf_offset - 128); } } - } else { + } else priv->buf_offset += count; - } + return retval; } if (priv->image_module->load_increment) - return (priv->image_module->load_increment) (priv->context, - buf, - count); + return (* priv->image_module->load_increment) (priv->context, buf, count); + return (FALSE); } /** * gdk_pixbuf_loader_get_pixbuf: - * @loader: A loader. + * @loader: A pixbuf loader. * * Gets the GdkPixbuf that the loader is currently loading. If the loader * hasn't been enough data via gdk_pixbuf_loader_write, then NULL is returned. @@ -295,6 +326,7 @@ gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader) g_return_val_if_fail (loader != NULL, NULL); g_return_val_if_fail (GDK_IS_PIXBUF_LOADER (loader), NULL); + priv = loader->private; return priv->pixbuf; @@ -302,10 +334,9 @@ gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader) /** * gdk_pixbuf_loader_close: - * @loader: A loader. - * - * Tells the loader to stop accepting writes + * @loader: A pixbuf loader. * + * Tells the loader to stop accepting writes. **/ void gdk_pixbuf_loader_close (GdkPixbufLoader *loader) @@ -325,20 +356,21 @@ gdk_pixbuf_loader_close (GdkPixbufLoader *loader) priv->image_module = gdk_pixbuf_get_module (priv->buf, priv->buf_offset); if (priv->image_module && ((priv->image_module->begin_load == NULL) || - (priv->image_module->begin_load == NULL) || - (priv->image_module->begin_load == NULL) || - (priv->image_module->begin_load == NULL))) { - g_warning ("module %s does not support incremental loading.\n", priv->image_module->module_name); + (priv->image_module->stop_load == NULL) || + (priv->image_module->load_increment == NULL))) { + g_warning ("module %s does not support incremental loading.\n", + priv->image_module->module_name); } else if (priv->image_module) { g_print ("module loaded: name is %s\n", priv->image_module->module_name); - priv->context = (priv->image_module->begin_load) (gdk_pixbuf_loader_prepare, loader); - (priv->image_module->load_increment) (priv->context, priv->buf, priv->buf_offset); + priv->context = (* priv->image_module->begin_load) ( + gdk_pixbuf_loader_prepare, loader); + (* priv->image_module->load_increment) (priv->context, + priv->buf, priv->buf_offset); } } if (priv->image_module && priv->image_module->stop_load) - (priv->image_module->stop_load) (priv->context); + (* priv->image_module->stop_load) (priv->context); priv->closed = TRUE; } - diff --git a/gdk-pixbuf/gdk-pixbuf-loader.h b/gdk-pixbuf/gdk-pixbuf-loader.h index 83dd919063..3e947ec054 100644 --- a/gdk-pixbuf/gdk-pixbuf-loader.h +++ b/gdk-pixbuf/gdk-pixbuf-loader.h @@ -66,11 +66,11 @@ struct _GdkPixbufLoaderClass { -GtkType gdk_pixbuf_loader_get_type (void); -GtkObject *gdk_pixbuf_loader_new (void); -gboolean gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, gint count); +GtkType gdk_pixbuf_loader_get_type (void); +GdkPixbufLoader *gdk_pixbuf_loader_new (void); +gboolean gdk_pixbuf_loader_write (GdkPixbufLoader *loader, guchar *buf, size_t count); GdkPixbuf *gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader); -void gdk_pixbuf_loader_close (GdkPixbufLoader *loader); +void gdk_pixbuf_loader_close (GdkPixbufLoader *loader); diff --git a/gdk-pixbuf/gnome-canvas-pixbuf.c b/gdk-pixbuf/gnome-canvas-pixbuf.c index 35eca7c808..90c9128c98 100644 --- a/gdk-pixbuf/gnome-canvas-pixbuf.c +++ b/gdk-pixbuf/gnome-canvas-pixbuf.c @@ -607,6 +607,6 @@ gnome_canvas_pixbuf_draw (GnomeCanvasItem *item, GdkDrawable *drawable, art_affine_scale (scale, i_len, j_len); art_affine_multiply (final, i2c, scale); - buf = g_new0 (guchar, width * height * 3); - transform_pixbuf (buf, x, y, width, height, width * 3, priv->pixbuf, final); + buf = g_new0 (guchar, width * height * 4); + transform_pixbuf (buf, x, y, width, height, width * 4, priv->pixbuf, final); } diff --git a/gtk/gdk-pixbuf-loader.c b/gtk/gdk-pixbuf-loader.c index a86736e0e9..2a9ac9e3e4 100644 --- a/gtk/gdk-pixbuf-loader.c +++ b/gtk/gdk-pixbuf-loader.c @@ -27,6 +27,8 @@ #include "gdk-pixbuf-io.h" #include + + enum { AREA_UPDATED, AREA_PREPARED, @@ -41,44 +43,52 @@ static void gdk_pixbuf_loader_init (GdkPixbufLoader *loader); static void gdk_pixbuf_loader_destroy (GtkObject *loader); static void gdk_pixbuf_loader_finalize (GtkObject *loader); +static guint pixbuf_loader_signals[LAST_SIGNAL] = { 0 }; + + /* Internal data */ -typedef struct _GdkPixbufLoaderPrivate GdkPixbufLoaderPrivate; -struct _GdkPixbufLoaderPrivate -{ +typedef struct { GdkPixbuf *pixbuf; gboolean closed; gchar buf[128]; gint buf_offset; ModuleType *image_module; gpointer context; -}; -static guint pixbuf_loader_signals[LAST_SIGNAL] = { 0 }; +} GdkPixbufLoaderPrivate; + /* our marshaller */ -typedef void (*GtkSignal_NONE__INT_INT_INT_INT) (GtkObject * object, - gint arg1, - gint arg2, - gint arg3, - gint arg4, - gpointer user_data); -void -gtk_marshal_NONE__INT_INT_INT_INT (GtkObject * object, - GtkSignalFunc func, - gpointer func_data, +typedef void (* GtkSignal_NONE__INT_INT_INT_INT) (GtkObject *object, + gint arg1, gint arg2, gint arg3, gint arg4, + gpointer user_data); +static void +gtk_marshal_NONE__INT_INT_INT_INT (GtkObject *object, GtkSignalFunc func, gpointer func_data, GtkArg * args) { - GtkSignal_NONE__INT_INT_INT_INT rfunc; - rfunc = (GtkSignal_NONE__INT_INT_INT_INT) func; - (*rfunc) (object, - GTK_VALUE_INT (args[0]), - GTK_VALUE_INT (args[1]), - GTK_VALUE_INT (args[2]), - GTK_VALUE_INT (args[3]), - func_data); + GtkSignal_NONE__INT_INT_INT_INT rfunc; + + rfunc = (GtkSignal_NONE__INT_INT_INT_INT) func; + (*rfunc) (object, + GTK_VALUE_INT (args[0]), + GTK_VALUE_INT (args[1]), + GTK_VALUE_INT (args[2]), + GTK_VALUE_INT (args[3]), + func_data); } + + +/** + * gdk_pixbuf_loader_get_type: + * @void: + * + * Registers the &GdkPixubfLoader class if necessary, and returns the type ID + * associated to it. + * + * Return value: The type ID of the &GdkPixbufLoader class. + **/ GtkType gdk_pixbuf_loader_get_type (void) { @@ -103,9 +113,13 @@ gdk_pixbuf_loader_get_type (void) } static void -gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass) +gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *class) { - parent_class = GTK_OBJECT_CLASS (klass); + GtkObjectClass *object_class; + + object_class = (GtkObjectClass *) class; + + parent_class = gtk_type_class (gtk_object_get_type ()); pixbuf_loader_signals[AREA_PREPARED] = gtk_signal_new ("area_prepared", @@ -121,7 +135,11 @@ gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass) parent_class->type, GTK_SIGNAL_OFFSET (GdkPixbufLoaderClass, area_updated), gtk_marshal_NONE__INT_INT_INT_INT, - GTK_TYPE_NONE, 4, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT); + GTK_TYPE_NONE, 4, + GTK_TYPE_INT, + GTK_TYPE_INT, + GTK_TYPE_INT, + GTK_TYPE_INT); pixbuf_loader_signals[CLOSED] = gtk_signal_new ("closed", @@ -131,10 +149,10 @@ gdk_pixbuf_loader_class_init (GdkPixbufLoaderClass *klass) gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); - gtk_object_class_add_signals (parent_class, pixbuf_loader_signals, LAST_SIGNAL); + gtk_object_class_add_signals (object_class, pixbuf_loader_signals, LAST_SIGNAL); - parent_class->destroy = gdk_pixbuf_loader_destroy; - parent_class->finalize = gdk_pixbuf_loader_finalize; + object_class->destroy = gdk_pixbuf_loader_destroy; + object_class->finalize = gdk_pixbuf_loader_finalize; } static void @@ -142,13 +160,8 @@ gdk_pixbuf_loader_init (GdkPixbufLoader *loader) { GdkPixbufLoaderPrivate *priv; - priv = g_new (GdkPixbufLoaderPrivate, 1); + priv = g_new0 (GdkPixbufLoaderPrivate, 1); loader->private = priv; - - priv->image_module=NULL; - priv->pixbuf = NULL; - priv->closed = FALSE; - priv->buf_offset = 0; } static void @@ -156,14 +169,19 @@ gdk_pixbuf_loader_destroy (GtkObject *loader) { GdkPixbufLoaderPrivate *priv = NULL; + g_return_if_fail (loader != NULL); + g_return_if_fail (GDK_IS_PIXBUF_LOADER (loader)); + priv = GDK_PIXBUF_LOADER (loader)->private; - /* We want to close it if it's not already closed */ if (!priv->closed) gdk_pixbuf_loader_close (GDK_PIXBUF_LOADER (loader)); if (priv->pixbuf) gdk_pixbuf_unref (priv->pixbuf); + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } static void @@ -173,6 +191,9 @@ gdk_pixbuf_loader_finalize (GtkObject *loader) priv = GDK_PIXBUF_LOADER (loader)->private; g_free (priv); + + if (GTK_OBJECT_CLASS (parent_class)->finalize) + (* GTK_OBJECT_CLASS (parent_class)->finalize) (object); } static void @@ -188,20 +209,25 @@ gdk_pixbuf_loader_prepare (GdkPixbuf *pixbuf, gpointer loader) gtk_signal_emit (GTK_OBJECT (loader), pixbuf_loader_signals[AREA_PREPARED]); } -/* Public functions */ -GtkObject * + + +/** + * gdk_pixbuf_loader_new: + * @void: + * + * Creates a new pixbuf loader object. + * + * Return value: A newly-created pixbuf loader. + **/ +GdkPixbufLoader * gdk_pixbuf_loader_new (void) { - GdkPixbufLoader *loader; - - loader = gtk_type_new (gdk_pixbuf_loader_get_type ()); - - return GTK_OBJECT (loader); + return gtk_type_new (gdk_pixbuf_loader_get_type ()); } /** * gdk_pixbuf_loader_write: - * @loader: A loader. + * @loader: A pixbuf loader. * @buf: The image data. * @count: The length of @buf in bytes. * @@ -213,7 +239,7 @@ gdk_pixbuf_loader_new (void) * cannot parse the buf. **/ gboolean -gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, gint count) +gdk_pixbuf_loader_write (GdkPixbufLoader *loader, guchar *buf, size_t count) { GdkPixbufLoaderPrivate *priv; @@ -230,54 +256,59 @@ gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, gint count) if (priv->image_module == NULL) { gboolean retval = TRUE; - g_print ("buf_offset:%d:\n", priv->buf_offset); memcpy (priv->buf + priv->buf_offset, buf, - (priv->buf_offset + count) > 128 ? 128 - priv->buf_offset : count); - if ((priv->buf_offset + count) >= 128) { + (priv->buf_offset + count > 128) ? (128 - priv->buf_offset) : count); + + if (priv->buf_offset + count >= 128) { /* We have enough data to start doing something with the image */ priv->image_module = gdk_pixbuf_get_module (priv->buf, 128); - if (priv->image_module == NULL) { + if (priv->image_module == NULL) return FALSE; - } else if ((priv->image_module->begin_load == NULL) || - (priv->image_module->stop_load == NULL) || - (priv->image_module->load_increment == NULL)) { - g_warning ("module %s does not support incremental loading.\n", priv->image_module->module_name); + else if ((priv->image_module->begin_load == NULL) || + (priv->image_module->stop_load == NULL) || + (priv->image_module->load_increment == NULL)) { + g_warning ("module %s does not support incremental loading.\n", + priv->image_module->module_name); return FALSE; } else { - g_print ("module loaded: name is %s\n", priv->image_module->module_name); - priv->context = (priv->image_module->begin_load) (gdk_pixbuf_loader_prepare, loader); + priv->context = (*priv->image_module->begin_load) ( + gdk_pixbuf_loader_prepare, loader); if (priv->context == NULL) { g_warning("Failed to begin progressive load"); return FALSE; } - retval = (priv->image_module->load_increment) (priv->context, priv->buf, 128); + retval = (* priv->image_module->load_increment) ( + priv->context, priv->buf, 128); + + /* if we had more then 128 bytes total, we want + * to send the rest of the buffer. + */ - /* if we had more then 128 bytes total, we want to send the rest of the buffer */ if (retval && (priv->buf_offset + count) >= 128) { - retval = (priv->image_module->load_increment) (priv->context, - buf, - count + priv->buf_offset - 128); + retval = (* priv->image_module->load_increment) ( + priv->context, + buf, + count + priv->buf_offset - 128); } } - } else { + } else priv->buf_offset += count; - } + return retval; } if (priv->image_module->load_increment) - return (priv->image_module->load_increment) (priv->context, - buf, - count); + return (* priv->image_module->load_increment) (priv->context, buf, count); + return (FALSE); } /** * gdk_pixbuf_loader_get_pixbuf: - * @loader: A loader. + * @loader: A pixbuf loader. * * Gets the GdkPixbuf that the loader is currently loading. If the loader * hasn't been enough data via gdk_pixbuf_loader_write, then NULL is returned. @@ -295,6 +326,7 @@ gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader) g_return_val_if_fail (loader != NULL, NULL); g_return_val_if_fail (GDK_IS_PIXBUF_LOADER (loader), NULL); + priv = loader->private; return priv->pixbuf; @@ -302,10 +334,9 @@ gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader) /** * gdk_pixbuf_loader_close: - * @loader: A loader. - * - * Tells the loader to stop accepting writes + * @loader: A pixbuf loader. * + * Tells the loader to stop accepting writes. **/ void gdk_pixbuf_loader_close (GdkPixbufLoader *loader) @@ -325,20 +356,21 @@ gdk_pixbuf_loader_close (GdkPixbufLoader *loader) priv->image_module = gdk_pixbuf_get_module (priv->buf, priv->buf_offset); if (priv->image_module && ((priv->image_module->begin_load == NULL) || - (priv->image_module->begin_load == NULL) || - (priv->image_module->begin_load == NULL) || - (priv->image_module->begin_load == NULL))) { - g_warning ("module %s does not support incremental loading.\n", priv->image_module->module_name); + (priv->image_module->stop_load == NULL) || + (priv->image_module->load_increment == NULL))) { + g_warning ("module %s does not support incremental loading.\n", + priv->image_module->module_name); } else if (priv->image_module) { g_print ("module loaded: name is %s\n", priv->image_module->module_name); - priv->context = (priv->image_module->begin_load) (gdk_pixbuf_loader_prepare, loader); - (priv->image_module->load_increment) (priv->context, priv->buf, priv->buf_offset); + priv->context = (* priv->image_module->begin_load) ( + gdk_pixbuf_loader_prepare, loader); + (* priv->image_module->load_increment) (priv->context, + priv->buf, priv->buf_offset); } } if (priv->image_module && priv->image_module->stop_load) - (priv->image_module->stop_load) (priv->context); + (* priv->image_module->stop_load) (priv->context); priv->closed = TRUE; } - diff --git a/gtk/gdk-pixbuf-loader.h b/gtk/gdk-pixbuf-loader.h index 83dd919063..3e947ec054 100644 --- a/gtk/gdk-pixbuf-loader.h +++ b/gtk/gdk-pixbuf-loader.h @@ -66,11 +66,11 @@ struct _GdkPixbufLoaderClass { -GtkType gdk_pixbuf_loader_get_type (void); -GtkObject *gdk_pixbuf_loader_new (void); -gboolean gdk_pixbuf_loader_write (GdkPixbufLoader *loader, gchar *buf, gint count); +GtkType gdk_pixbuf_loader_get_type (void); +GdkPixbufLoader *gdk_pixbuf_loader_new (void); +gboolean gdk_pixbuf_loader_write (GdkPixbufLoader *loader, guchar *buf, size_t count); GdkPixbuf *gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader); -void gdk_pixbuf_loader_close (GdkPixbufLoader *loader); +void gdk_pixbuf_loader_close (GdkPixbufLoader *loader);