diff options
-rw-r--r-- | gdk-pixbuf/gdk-pixbuf-loader.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/gdk-pixbuf/gdk-pixbuf-loader.c b/gdk-pixbuf/gdk-pixbuf-loader.c index aab5303e7..81c5afb75 100644 --- a/gdk-pixbuf/gdk-pixbuf-loader.c +++ b/gdk-pixbuf/gdk-pixbuf-loader.c @@ -104,6 +104,8 @@ typedef struct gint header_buf_offset; GdkPixbufModule *image_module; gpointer context; + gint original_width; + gint original_height; gint width; gint height; gboolean size_fixed; @@ -216,6 +218,8 @@ gdk_pixbuf_loader_init (GdkPixbufLoader *loader) GdkPixbufLoaderPrivate *priv; priv = g_new0 (GdkPixbufLoaderPrivate, 1); + priv->original_width = -1; + priv->original_height = -1; priv->width = -1; priv->height = -1; @@ -284,6 +288,9 @@ gdk_pixbuf_loader_size_func (gint *width, gint *height, gpointer loader) { GdkPixbufLoaderPrivate *priv = GDK_PIXBUF_LOADER (loader)->priv; + priv->original_width = *width; + priv->original_height = *height; + /* allow calling gdk_pixbuf_loader_set_size() before the signal */ if (priv->width == -1 && priv->height == -1) { @@ -327,8 +334,25 @@ gdk_pixbuf_loader_prepare (GdkPixbuf *pixbuf, if (anim) g_object_ref (anim); - else + else { + if (priv->original_width > 0) { + char *original_width_str = NULL; + + original_width_str = g_strdup_printf ("%d", priv->original_width); + gdk_pixbuf_set_option (pixbuf, "original-width", original_width_str); + g_free (original_width_str); + } + + if (priv->original_height > 0) { + char *original_height_str = NULL; + + original_height_str = g_strdup_printf ("%d", priv->original_height); + gdk_pixbuf_set_option (pixbuf, "original-height", original_height_str); + g_free (original_height_str); + } + anim = gdk_pixbuf_non_anim_new (pixbuf); + } if (priv->needs_scale && width != 0 && height != 0) { priv->animation = GDK_PIXBUF_ANIMATION (_gdk_pixbuf_scaled_anim_new (anim, |