changeset 1859:22fe1d41cfa1

do not mix autodetected and user-defined stereo mode
author Vladimir Nadvornik <nadvornik@suse.cz>
date Sat, 14 May 2011 21:53:45 +0200
parents bba0f67aae5d
children 01a8b98abf09
files src/image.c src/pixbuf-renderer.c src/pixbuf-renderer.h
diffstat 3 files changed, 33 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/image.c	Sun Apr 10 21:11:50 2011 +0200
+++ b/src/image.c	Sat May 14 21:53:45 2011 +0200
@@ -1096,7 +1096,7 @@
 
 void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom, gboolean lazy)
 {
-
+	StereoPixbufData stereo_data = STEREO_PIXBUF_DEFAULT;
 	/* read_exif and similar functions can actually notice that the file has changed and trigger
 	   a notification that removes the pixbuf from cache and unrefs it. Therefore we must ref it
 	   here before it is taken over by the renderer. */
@@ -1115,9 +1115,13 @@
 			}
 		}
 
-	if (pixbuf && imd->user_stereo)
+	if (pixbuf)
 		{
-		g_object_set_data(G_OBJECT(pixbuf), "stereo_data", GINT_TO_POINTER(imd->user_stereo));
+		stereo_data = imd->user_stereo;
+		if (stereo_data == STEREO_PIXBUF_DEFAULT)
+			{
+			stereo_data = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(pixbuf), "stereo_data"));
+			}
 		}
 
 	pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, NULL, NULL, FALSE);
@@ -1129,12 +1133,13 @@
 
 	if (lazy)
 		{
-		pixbuf_renderer_set_pixbuf_lazy((PixbufRenderer *)imd->pr, pixbuf, zoom, imd->orientation);
+		pixbuf_renderer_set_pixbuf_lazy((PixbufRenderer *)imd->pr, pixbuf, zoom, imd->orientation, stereo_data);
 		}
 	else
 		{
 		pixbuf_renderer_set_pixbuf((PixbufRenderer *)imd->pr, pixbuf, zoom);
 		pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, imd->orientation);
+		pixbuf_renderer_set_stereo_data((PixbufRenderer *)imd->pr, stereo_data);
 		}
 
 	if (pixbuf) g_object_unref(pixbuf);
--- a/src/pixbuf-renderer.c	Sun Apr 10 21:11:50 2011 +0200
+++ b/src/pixbuf-renderer.c	Sat May 14 21:53:45 2011 +0200
@@ -2388,7 +2388,6 @@
 	pr->stereo_pixbuf_offset_left = 0;
 	pr->stereo_pixbuf_offset_right = 0;
 	if (!pr->pixbuf) return;
-	gint stereo_data = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(pr->pixbuf), "stereo_data"));
 	switch (pr->orientation)
 		{
 		case EXIF_ORIENTATION_LEFT_TOP:
@@ -2397,12 +2396,12 @@
 		case EXIF_ORIENTATION_LEFT_BOTTOM:
 			pr->image_width = gdk_pixbuf_get_height(pr->pixbuf);
 			pr->image_height = gdk_pixbuf_get_width(pr->pixbuf);
-			if (stereo_data == STEREO_PIXBUF_SBS) 
+			if (pr->stereo_data == STEREO_PIXBUF_SBS) 
 				{
 				pr->image_height /= 2;
 				pr->stereo_pixbuf_offset_right = pr->image_height;
 				}
-			else if (stereo_data == STEREO_PIXBUF_CROSS) 
+			else if (pr->stereo_data == STEREO_PIXBUF_CROSS) 
 				{
 				pr->image_height /= 2;
 				pr->stereo_pixbuf_offset_left = pr->image_height;
@@ -2412,12 +2411,12 @@
 		default:
 			pr->image_width = gdk_pixbuf_get_width(pr->pixbuf);
 			pr->image_height = gdk_pixbuf_get_height(pr->pixbuf);
-			if (stereo_data == STEREO_PIXBUF_SBS) 
+			if (pr->stereo_data == STEREO_PIXBUF_SBS) 
 				{
 				pr->image_width /= 2;
 				pr->stereo_pixbuf_offset_right = pr->image_width;
 				}
-			else if (stereo_data == STEREO_PIXBUF_CROSS) 
+			else if (pr->stereo_data == STEREO_PIXBUF_CROSS) 
 				{
 				pr->image_width /= 2;
 				pr->stereo_pixbuf_offset_left = pr->image_width;
@@ -2462,7 +2461,7 @@
 
         if (pr->stereo_mode & PR_STEREO_TEMP_DISABLE) 
         	{
-        	gint disable = !pr->pixbuf || ! GPOINTER_TO_INT(g_object_get_data(G_OBJECT(pr->pixbuf), "stereo_data"));
+        	gint disable = !pr->pixbuf || ! pr->stereo_data;
         	pr_stereo_temp_disable(pr, disable);
         	}
 
@@ -2481,13 +2480,14 @@
 	pr_update_signal(pr);
 }
 
-void pixbuf_renderer_set_pixbuf_lazy(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, gint orientation)
+void pixbuf_renderer_set_pixbuf_lazy(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, gint orientation, StereoPixbufData stereo_data)
 {
 	g_return_if_fail(IS_PIXBUF_RENDERER(pr));
 
 	pr_source_tile_unset(pr);
 
 	pr->orientation = orientation;
+	pr->stereo_data = stereo_data;
 	pr_set_pixbuf(pr, pixbuf, zoom, PR_ZOOM_LAZY);
 
 	pr_update_signal(pr);
@@ -2516,6 +2516,16 @@
 	return pr->orientation;
 }
 
+void pixbuf_renderer_set_stereo_data(PixbufRenderer *pr, StereoPixbufData stereo_data)
+{
+	g_return_if_fail(IS_PIXBUF_RENDERER(pr));
+
+	pr->stereo_data = stereo_data;
+
+	pr_pixbuf_size_sync(pr);
+	pr_zoom_sync(pr, pr->zoom, PR_ZOOM_FORCE, 0, 0);
+}
+
 void pixbuf_renderer_set_post_process_func(PixbufRenderer *pr, PixbufRendererPostProcessFunc func, gpointer user_data, gboolean slow)
 {
 	g_return_if_fail(IS_PIXBUF_RENDERER(pr));
@@ -2557,6 +2567,7 @@
 	pr->post_process_user_data = source->post_process_user_data;
 	pr->post_process_slow = source->post_process_slow;
 	pr->orientation = source->orientation;
+	pr->stereo_data = source->stereo_data;
 
 	if (source->source_tiles_enabled)
 		{
--- a/src/pixbuf-renderer.h	Sun Apr 10 21:11:50 2011 +0200
+++ b/src/pixbuf-renderer.h	Sat May 14 21:53:45 2011 +0200
@@ -201,6 +201,8 @@
 	gint orientation;
 
 	gint stereo_mode;
+	
+	StereoPixbufData stereo_data;
 	gboolean stereo_temp_disable;
 	gint stereo_fixed_width;
 	gint stereo_fixed_height;
@@ -241,7 +243,7 @@
 void pixbuf_renderer_set_pixbuf(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom);
 
 /* same as pixbuf_renderer_set_pixbuf but waits with redrawing for pixbuf_renderer_area_changed */
-void pixbuf_renderer_set_pixbuf_lazy(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, gint orientation);
+void pixbuf_renderer_set_pixbuf_lazy(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, gint orientation, StereoPixbufData stereo_data);
 
 
 GdkPixbuf *pixbuf_renderer_get_pixbuf(PixbufRenderer *pr);
@@ -249,6 +251,9 @@
 void pixbuf_renderer_set_orientation(PixbufRenderer *pr, gint orientation);
 gint pixbuf_renderer_get_orientation(PixbufRenderer *pr);
 
+/* sets the format of stereo data in the input pixbuf */
+void pixbuf_renderer_set_stereo_data(PixbufRenderer *pr, StereoPixbufData stereo_data);
+
 void pixbuf_renderer_set_post_process_func(PixbufRenderer *pr, PixbufRendererPostProcessFunc func, gpointer user_data, gboolean slow);
 
 /* display an on-request array of pixbuf tiles */