diff options
-rw-r--r-- | docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt | 1 | ||||
-rw-r--r-- | gdk-pixbuf/gdk-pixbuf-core.h | 5 | ||||
-rw-r--r-- | gdk-pixbuf/gdk-pixbuf-io.c | 78 | ||||
-rw-r--r-- | gdk-pixbuf/gdk-pixbuf.symbols | 1 |
4 files changed, 68 insertions, 17 deletions
diff --git a/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt b/docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt index 2dc26b71e..0b8f05c23 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>file-loading</FILE> gdk_pixbuf_new_from_file gdk_pixbuf_new_from_file_at_size +gdk_pixbuf_new_from_file_at_scale gdk_pixbuf_get_file_info </SECTION> diff --git a/gdk-pixbuf/gdk-pixbuf-core.h b/gdk-pixbuf/gdk-pixbuf-core.h index 3110a6238..c0f5668ba 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 88d223ee4..b22fc86aa 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 f42c96023..2d14d2360 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 |