From cd50f460a5feed71868a6530e5baad08b1a326af Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 26 Aug 2004 05:33:13 +0000 Subject: [PATCH] Add gdk_pixbuf_new_from_file_at_scale(), which is just like Thu Aug 26 01:23:16 2004 Matthias Clasen * gdk-pixbuf-core.h: * gdk-pixbuf.symbols: * gdk-pixbuf-io.c (gdk_pixbuf_new_from_file_at_scale): Add gdk_pixbuf_new_from_file_at_scale(), which is just like gdk_pixbuf_new_from_file_at_size(), but optionally ignores the aspect ratio. (#136395, Dom Lachowicz) --- docs/reference/ChangeLog | 5 ++ .../gdk-pixbuf/gdk-pixbuf-sections.txt | 1 + gdk-pixbuf/ChangeLog | 9 +++ gdk-pixbuf/gdk-pixbuf-core.h | 5 ++ gdk-pixbuf/gdk-pixbuf-io.c | 78 +++++++++++++++---- gdk-pixbuf/gdk-pixbuf.symbols | 1 + 6 files changed, 82 insertions(+), 17 deletions(-) diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 920a675680..10d5992bfc 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,8 @@ +Thu Aug 26 01:31:42 2004 Matthias Clasen + + * gdk-pixbuf/gdk-pixbuf-sections.txt: Add + gdk_pixbuf_new_from_file_at_scale(). + 2004-08-25 Matthias Clasen * === Released 2.5.2 === diff --git a/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt b/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt index 2dc26b71ee..0b8f05c239 100644 --- a/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt +++ b/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt @@ -57,6 +57,7 @@ GdkPixbufDestroyNotify file-loading gdk_pixbuf_new_from_file gdk_pixbuf_new_from_file_at_size +gdk_pixbuf_new_from_file_at_scale gdk_pixbuf_get_file_info diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index 3717c4329b..a2967d28b5 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,12 @@ +Thu Aug 26 01:23:16 2004 Matthias Clasen + + * gdk-pixbuf-core.h: + * gdk-pixbuf.symbols: + * gdk-pixbuf-io.c (gdk_pixbuf_new_from_file_at_scale): + Add gdk_pixbuf_new_from_file_at_scale(), which is just + like gdk_pixbuf_new_from_file_at_size(), but optionally + ignores the aspect ratio. (#136395, Dom Lachowicz) + Wed Aug 25 17:23:23 2004 Manish Singh * io-gif.c: remove unused set_need_recomposite() function. diff --git a/gdk-pixbuf/gdk-pixbuf-core.h b/gdk-pixbuf/gdk-pixbuf-core.h index 3110a62380..c0f5668ba2 100644 --- a/gdk-pixbuf/gdk-pixbuf-core.h +++ b/gdk-pixbuf/gdk-pixbuf-core.h @@ -122,6 +122,11 @@ GdkPixbuf *gdk_pixbuf_new_from_file_at_size (const char *filename, int width, int height, GError **error); +GdkPixbuf *gdk_pixbuf_new_from_file_at_scale (const char *filename, + int width, + int height, + gboolean keep_aspect_ratio, + GError **error); GdkPixbuf *gdk_pixbuf_new_from_data (const guchar *data, GdkColorspace colorspace, diff --git a/gdk-pixbuf/gdk-pixbuf-io.c b/gdk-pixbuf/gdk-pixbuf-io.c index 88d223ee44..b22fc86aa0 100644 --- a/gdk-pixbuf/gdk-pixbuf-io.c +++ b/gdk-pixbuf/gdk-pixbuf-io.c @@ -868,49 +868,59 @@ size_prepared_cb (GdkPixbufLoader *loader, gpointer data) { struct { - int width; - int height; + gint width; + gint height; + gboolean preserve_aspect_ratio; } *info = data; g_return_if_fail (width > 0 && height > 0); - if ((double)height * (double)info->width > - (double)width * (double)info->height) { - width = 0.5 + (double)width * (double)info->height / (double)height; - height = info->height; + if(info->preserve_aspect_ratio) { + if ((double)height * (double)info->width > + (double)width * (double)info->height) { + width = 0.5 + (double)width * (double)info->height / (double)height; + height = info->height; + } else { + height = 0.5 + (double)height * (double)info->width / (double)width; + width = info->width; + } } else { - height = 0.5 + (double)height * (double)info->width / (double)width; width = info->width; + height = info->height; } - + gdk_pixbuf_loader_set_size (loader, width, height); } /** - * gdk_pixbuf_new_from_file_at_size: + * gdk_pixbuf_new_from_file_at_scale: * @filename: Name of file to load. * @width: The width the image should have * @height: The height the image should have + * @preserve_aspect_ratio: %TRUE to preserve the image's aspect ratio * @error: Return location for an error * * Creates a new pixbuf by loading an image from a file. The file format is * detected automatically. If %NULL is returned, then @error will be set. * Possible errors are in the #GDK_PIXBUF_ERROR and #G_FILE_ERROR domains. - * The image will be scaled to fit in the requested size, preserving its aspect ratio. + * The image will be scaled to fit in the requested size, optionally preserving + * the image's aspect ratio. * - * Return value: A newly-created pixbuf with a reference count of 1, or %NULL if - * any of several error conditions occurred: the file could not be opened, + * Return value: A newly-created pixbuf with a reference count of 1, or %NULL + * if any of several error conditions occurred: the file could not be opened, * there was no loader for the file's format, there was not enough memory to * allocate the image buffer, or the image file contained invalid data. * - * Since: 2.4 + * Since: 2.6 **/ GdkPixbuf * -gdk_pixbuf_new_from_file_at_size (const char *filename, - int width, - int height, - GError **error) +gdk_pixbuf_new_from_file_at_scale (const char *filename, + int width, + int height, + gboolean preserve_aspect_ratio, + GError **error) { + GdkPixbufLoader *loader; GdkPixbuf *pixbuf; @@ -920,6 +930,7 @@ gdk_pixbuf_new_from_file_at_size (const char *filename, struct { gint width; gint height; + gboolean preserve_aspect_ratio; } info; g_return_val_if_fail (filename != NULL, NULL); @@ -943,6 +954,7 @@ gdk_pixbuf_new_from_file_at_size (const char *filename, info.width = width; info.height = height; + info.preserve_aspect_ratio = preserve_aspect_ratio; g_signal_connect (loader, "size-prepared", G_CALLBACK (size_prepared_cb), &info); @@ -988,6 +1000,38 @@ gdk_pixbuf_new_from_file_at_size (const char *filename, return pixbuf; } +/** + * gdk_pixbuf_new_from_file_at_size: + * @filename: Name of file to load. + * @width: The width the image should have + * @height: The height the image should have + * @error: Return location for an error + * + * Creates a new pixbuf by loading an image from a file. The file format is + * detected automatically. If %NULL is returned, then @error will be set. + * Possible errors are in the #GDK_PIXBUF_ERROR and #G_FILE_ERROR domains. + * The image will be scaled to fit in the requested size, preserving + * the image's aspect ratio. + * + * Return value: A newly-created pixbuf with a reference count of 1, or + * %NULL if any of several error conditions occurred: the file could not + * be opened, there was no loader for the file's format, there was not + * enough memory to allocate the image buffer, or the image file contained + * invalid data. + * + * Since: 2.4 + **/ +GdkPixbuf * +gdk_pixbuf_new_from_file_at_size (const char *filename, + int width, + int height, + GError **error) +{ + return gdk_pixbuf_new_from_file_at_scale (filename, + width, height, + TRUE, error); +} + static void info_cb (GdkPixbufLoader *loader, int width, diff --git a/gdk-pixbuf/gdk-pixbuf.symbols b/gdk-pixbuf/gdk-pixbuf.symbols index f42c960239..2d14d2360f 100644 --- a/gdk-pixbuf/gdk-pixbuf.symbols +++ b/gdk-pixbuf/gdk-pixbuf.symbols @@ -61,6 +61,7 @@ gdk_pixbuf_new gdk_pixbuf_new_from_data gdk_pixbuf_new_from_file gdk_pixbuf_new_from_file_at_size +gdk_pixbuf_new_from_file_at_scale gdk_pixbuf_new_from_inline gdk_pixbuf_new_from_xpm_data gdk_pixbuf_new_subpixbuf