summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt1
-rw-r--r--gdk-pixbuf/gdk-pixbuf-core.h5
-rw-r--r--gdk-pixbuf/gdk-pixbuf-io.c78
-rw-r--r--gdk-pixbuf/gdk-pixbuf.symbols1
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