Index: docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt
===================================================================
--- docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt	(revision 18338)
+++ docs/reference/gdk-pixbuf/gdk-pixbuf-sections.txt	(working copy)
@@ -105,9 +105,11 @@
 
 <SECTION>
 <FILE>util</FILE>
+GdkTransform
 gdk_pixbuf_add_alpha
 gdk_pixbuf_copy_area
 gdk_pixbuf_saturate_and_pixelate
+gdk_pixbuf_apply_embedded_orientation
 gdk_pixbuf_fill
 </SECTION>
 
Index: gdk-pixbuf/gdk-pixbuf.c
===================================================================
--- gdk-pixbuf/gdk-pixbuf.c	(revision 18338)
+++ gdk-pixbuf/gdk-pixbuf.c	(working copy)
@@ -593,7 +593,15 @@
  * @key: a nul-terminated string.
  * 
  * Looks up @key in the list of options that may have been attached to the
- * @pixbuf when it was loaded. 
+ * @pixbuf when it was loaded, or that may have been attached by another
+ * function using gdk_pixbuf_set_option().
+ *
+ * For instance, the ANI loader provides "Title" and "Artist" options. 
+ * The ICO, XBM, and XPM loaders provide "x_hot" and "y_hot" hot-spot 
+ * options for cursor definitions. The PNG loader provides the tEXt ancillary
+ * chunk key/value pairs as options. Since 2.12, the TIFF and JPEG loaders
+ * have returned an "orientation" option string that corresponds to the 
+ * embedded TIFF/Exif orientation tag (if present).
  * 
  * Return value: the value associated with @key. This is a nul-terminated 
  * string that should not be freed or %NULL if @key was not found.
Index: gdk-pixbuf/gdk-pixbuf-loader.c
===================================================================
--- gdk-pixbuf/gdk-pixbuf-loader.c	(revision 18338)
+++ gdk-pixbuf/gdk-pixbuf-loader.c	(working copy)
@@ -723,7 +723,7 @@
                         GError *tmp = NULL;
                         if (!priv->image_module->stop_load (priv->context, &tmp) || tmp)
                                 {
-					g_propagate_error (error, tmp);
+					//g_propagate_error (error, tmp);
                                         gdk_pixbuf_loader_ensure_error (loader, error);
                                         retval = FALSE;
                                 }
Index: gdk-pixbuf/gdk-pixbuf.symbols
===================================================================
--- gdk-pixbuf/gdk-pixbuf.symbols	(revision 18338)
+++ gdk-pixbuf/gdk-pixbuf.symbols	(working copy)
@@ -82,6 +82,7 @@
 gdk_pixbuf_add_alpha
 gdk_pixbuf_copy_area
 gdk_pixbuf_saturate_and_pixelate
+gdk_pixbuf_apply_embedded_orientation
 #endif
 #endif
 
Index: gdk-pixbuf/gdk-pixbuf-util.c
===================================================================
--- gdk-pixbuf/gdk-pixbuf-util.c	(revision 18338)
+++ gdk-pixbuf/gdk-pixbuf-util.c	(working copy)
@@ -245,6 +245,88 @@
         }
 }
 
+
+/**
+ * gdk_pixbuf_apply_embedded_orientation:
+ * @src: A #GdkPixbuf.
+ *
+ * Takes an existing pixbuf and checks for the presence of an
+ * associated "orientation" option, which may be provided by the 
+ * jpeg loader (which reads the exif orientation tag) or the 
+ * tiff loader (which reads the tiff orientation tag, and
+ * compensates it for the partial transforms performed by 
+ * libtiff). If an orientation option/tag is present, the
+ * appropriate transform will be performed so that the pixbuf
+ * is oriented correctly (using gdk_pixbuf_transform_orientation()).
+ *
+ * Return value: A newly-created pixbuf, or a reference to the
+ * input pixbuf (with an increased reference count).
+ *
+ * Since 2.12.
+ **/
+GdkPixbuf *
+gdk_pixbuf_apply_embedded_orientation (GdkPixbuf *src)
+{
+  	const gchar *orientation_string;
+	int          transform = 0;
+	GdkPixbuf   *temp;
+	GdkPixbuf   *dest;
+
+	g_return_val_if_fail (src != NULL, NULL);
+
+	/* Read the orientation option associated with the pixbuf */
+	orientation_string = gdk_pixbuf_get_option (src, "orientation");	
+
+	if (orientation_string) {
+		/* If an orientation option was found, convert the 
+		   orientation string into an integer. */
+		transform = (int) g_ascii_strtoll (orientation_string, NULL, 10);
+	}
+
+	/* Apply the actual transforms, which involve rotations and flips. 
+	   The meaning of orientation values 1-8 and the required transforms
+	   are defined by the TIFF and EXIF (for JPEGs) standards. */
+        switch (transform) {
+        case 1:
+                dest = src;
+                g_object_ref (dest);
+                break;
+        case 2:
+                dest = gdk_pixbuf_flip (src, TRUE);
+                break;
+        case 3:
+                dest = gdk_pixbuf_rotate_simple (src, GDK_PIXBUF_ROTATE_UPSIDEDOWN);
+                break;
+        case 4:
+                dest = gdk_pixbuf_flip (src, FALSE);
+                break;
+        case 5:
+                temp = gdk_pixbuf_rotate_simple (src, GDK_PIXBUF_ROTATE_CLOCKWISE);
+                dest = gdk_pixbuf_flip (temp, TRUE);
+                g_object_unref (temp);
+                break;
+        case 6:
+                dest = gdk_pixbuf_rotate_simple (src, GDK_PIXBUF_ROTATE_CLOCKWISE);
+                break;
+        case 7:
+                temp = gdk_pixbuf_rotate_simple (src, GDK_PIXBUF_ROTATE_CLOCKWISE);
+                dest = gdk_pixbuf_flip (temp, FALSE);
+                g_object_unref (temp);
+                break;
+        case 8:
+                dest = gdk_pixbuf_rotate_simple (src, GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE);
+                break;
+        default:
+		/* if no orientation tag was present */
+                dest = src;
+                g_object_ref (dest);
+                break;
+        }
+
+        return dest;
+}
+
+
 #define __GDK_PIXBUF_UTIL_C__
 #include "gdk-pixbuf-aliasdef.c"
 
Index: gdk-pixbuf/gdk-pixbuf-core.h
===================================================================
--- gdk-pixbuf/gdk-pixbuf-core.h	(revision 18338)
+++ gdk-pixbuf/gdk-pixbuf-core.h	(working copy)
@@ -231,6 +231,8 @@
                                        gfloat           saturation,
                                        gboolean         pixelate);
 
+/* Transform an image to agree with its embedded orientation option / tag */
+GdkPixbuf *gdk_pixbuf_apply_embedded_orientation (GdkPixbuf *src);
 
 G_CONST_RETURN gchar * gdk_pixbuf_get_option (GdkPixbuf   *pixbuf,
                                               const gchar *key);
