changeset 1831:024f1752fe7b

temporarily disable stereo mode, added more stereo prefs
author Vladimir Nadvornik <nadvornik@suse.cz>
date Sun, 20 Mar 2011 00:18:13 +0100
parents c5a0d540907a
children 584bff9effee
files src/options.h src/pixbuf-renderer.c src/pixbuf-renderer.h src/preferences.c src/renderer-tiles.c src/typedefs.h
diffstat 6 files changed, 122 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/src/options.h	Sat Mar 19 21:42:13 2011 +0100
+++ b/src/options.h	Sun Mar 20 00:18:13 2011 +0100
@@ -184,13 +184,26 @@
 	
 	/* Stereo */
 	struct {
-		gint mode;
-		gboolean fallback;
+		gint mode;;
 		gint fsmode;
 		gboolean enable_fsmode;
 		gint fixed_w, fixed_h;
 		gint fixed_x1, fixed_y1;
 		gint fixed_x2, fixed_y2;
+		struct { /* options in this struct are packed to mode and fsmode entries */
+			gboolean mirror_right;
+			gboolean mirror_left;
+			gboolean flip_right;
+			gboolean flip_left;
+			gboolean swap;
+			gboolean temp_disable;
+			gboolean fs_mirror_right;
+			gboolean fs_mirror_left;
+			gboolean fs_flip_right;
+			gboolean fs_flip_left;
+			gboolean fs_swap;
+			gboolean fs_temp_disable;
+		} tmp; 
 	} stereo;
 };
 
--- a/src/pixbuf-renderer.c	Sat Mar 19 21:42:13 2011 +0100
+++ b/src/pixbuf-renderer.c	Sun Mar 20 00:18:13 2011 +0100
@@ -134,6 +134,7 @@
 static void pr_signals_connect(PixbufRenderer *pr);
 static void pr_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data);
 static void pixbuf_renderer_paint(PixbufRenderer *pr, GdkRectangle *area);
+static void pr_stereo_temp_disable(PixbufRenderer *pr, gboolean disable);
 
 
 /*
@@ -1864,8 +1865,8 @@
 {
 	gboolean zoom_changed = FALSE;
 
-	gint new_viewport_width = (pr->stereo_mode & PR_STEREO_HORIZ) ? new_width / 2 : new_width;
-	gint new_viewport_height = (pr->stereo_mode & PR_STEREO_VERT) ? new_height / 2 : new_height;
+	gint new_viewport_width = (!pr->stereo_temp_disable && (pr->stereo_mode & PR_STEREO_HORIZ)) ? new_width / 2 : new_width;
+	gint new_viewport_height =(!pr->stereo_temp_disable && (pr->stereo_mode & PR_STEREO_VERT)) ? new_height / 2 : new_height;
 	
 	if (pr->window_width == new_width && pr->window_height == new_height &&
 	    pr->viewport_width == new_viewport_width && pr->viewport_height == new_viewport_height) return;
@@ -2367,6 +2368,12 @@
 		return;
 		}
 
+        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"));
+        	pr_stereo_temp_disable(pr, disable);
+        	}
+
 	pr_pixbuf_size_sync(pr);
 	pr_zoom_sync(pr, zoom, flags | PR_ZOOM_FORCE | PR_ZOOM_NEW, 0, 0);
 }
@@ -2581,25 +2588,34 @@
 		}
 }
 
-void pixbuf_renderer_stereo_set(PixbufRenderer *pr, gint stereo_mode)
+static void pr_stereo_set(PixbufRenderer *pr)
 {
-	gboolean redraw = !(pr->stereo_mode == stereo_mode);
-	pr->stereo_mode = stereo_mode;
-	
 	if (!pr->renderer) pr->renderer = (void *)renderer_tiles_new(pr);
 	
-	pr->renderer->stereo_set(pr->renderer, pr->stereo_mode);
+	pr->renderer->stereo_set(pr->renderer, pr->stereo_mode & ~PR_STEREO_MIRROR_RIGHT & ~PR_STEREO_FLIP_RIGHT);
 	
 	if (pr->stereo_mode & (PR_STEREO_HORIZ | PR_STEREO_VERT))
 		{
 		if (!pr->renderer2) pr->renderer2 = (void *)renderer_tiles_new(pr);
-		pr->renderer2->stereo_set(pr->renderer2, pr->stereo_mode | PR_STEREO_RIGHT);
+		pr->renderer2->stereo_set(pr->renderer2, pr->stereo_mode & ~PR_STEREO_MIRROR_LEFT & ~PR_STEREO_FLIP_LEFT | PR_STEREO_RIGHT);
 		}
 	else
 		{
 		if (pr->renderer2) pr->renderer2->free(pr->renderer2);
 		pr->renderer2 = NULL;
 		}
+}
+
+void pixbuf_renderer_stereo_set(PixbufRenderer *pr, gint stereo_mode)
+{
+	gboolean redraw = !(pr->stereo_mode == stereo_mode) || pr->stereo_temp_disable;
+	pr->stereo_mode = stereo_mode;
+	if ((stereo_mode & PR_STEREO_TEMP_DISABLE) && pr->stereo_temp_disable) return;
+	
+	pr->stereo_temp_disable = FALSE;
+	
+	pr_stereo_set(pr);
+	
 	if (redraw) 
 		{
 		pr_size_sync(pr, pr->window_width, pr->window_height); /* recalculate new viewport */
@@ -2607,11 +2623,30 @@
 		}
 }
 
+
 gint pixbuf_renderer_stereo_get(PixbufRenderer *pr)
 {
 	return pr->stereo_mode;
 }
 
+static void pr_stereo_temp_disable(PixbufRenderer *pr, gboolean disable)
+{
+	if (pr->stereo_temp_disable == disable) return;
+	pr->stereo_temp_disable = disable;
+	if (disable)
+		{
+		if (!pr->renderer) pr->renderer = (void *)renderer_tiles_new(pr);
+		pr->renderer->stereo_set(pr->renderer, PR_STEREO_NONE);
+		if (pr->renderer2) pr->renderer2->free(pr->renderer2);
+		pr->renderer2 = NULL;
+		}
+	else
+		{
+		pr_stereo_set(pr);
+		}
+	pr_size_sync(pr, pr->window_width, pr->window_height); /* recalculate new viewport */
+}
+
 gboolean pixbuf_renderer_get_pixel_colors(PixbufRenderer *pr, gint x_pixel, gint y_pixel, 
                                           gint *r_mouse, gint *g_mouse, gint *b_mouse)
 {
--- a/src/pixbuf-renderer.h	Sat Mar 19 21:42:13 2011 +0100
+++ b/src/pixbuf-renderer.h	Sun Mar 20 00:18:13 2011 +0100
@@ -200,6 +200,7 @@
 	gint orientation;
 
 	gint stereo_mode;
+	gboolean stereo_temp_disable;
 	
 	RendererFuncs *renderer;
 	RendererFuncs *renderer2;
--- a/src/preferences.c	Sat Mar 19 21:42:13 2011 +0100
+++ b/src/preferences.c	Sun Mar 20 00:18:13 2011 +0100
@@ -305,10 +305,20 @@
 	options->metadata.confirm_on_dir_change = c_options->metadata.confirm_on_dir_change;
 	options->metadata.keywords_case_sensitive = c_options->metadata.keywords_case_sensitive;
 	options->metadata.write_orientation = c_options->metadata.write_orientation;
-
-	options->stereo.mode = c_options->stereo.mode;
-	options->stereo.fallback = c_options->stereo.fallback;
-	options->stereo.fsmode = c_options->stereo.fsmode;
+	options->stereo.mode = (c_options->stereo.mode & (PR_STEREO_HORIZ | PR_STEREO_VERT | PR_STEREO_FIXED | PR_STEREO_ANAGLYPH)) |
+	                       (c_options->stereo.tmp.mirror_right ? PR_STEREO_MIRROR_RIGHT : 0) |
+	                       (c_options->stereo.tmp.flip_right   ? PR_STEREO_FLIP_RIGHT : 0) |
+	                       (c_options->stereo.tmp.mirror_left  ? PR_STEREO_MIRROR_LEFT : 0) |
+	                       (c_options->stereo.tmp.flip_left    ? PR_STEREO_FLIP_LEFT : 0) |
+	                       (c_options->stereo.tmp.swap         ? PR_STEREO_SWAP : 0) |
+	                       (c_options->stereo.tmp.temp_disable ? PR_STEREO_TEMP_DISABLE : 0);
+	options->stereo.fsmode = (c_options->stereo.fsmode & (PR_STEREO_HORIZ | PR_STEREO_VERT | PR_STEREO_FIXED | PR_STEREO_ANAGLYPH)) |
+	                       (c_options->stereo.tmp.fs_mirror_right ? PR_STEREO_MIRROR_RIGHT : 0) |
+	                       (c_options->stereo.tmp.fs_flip_right   ? PR_STEREO_FLIP_RIGHT : 0) |
+	                       (c_options->stereo.tmp.fs_mirror_left  ? PR_STEREO_MIRROR_LEFT : 0) |
+	                       (c_options->stereo.tmp.fs_flip_left    ? PR_STEREO_FLIP_LEFT : 0) |
+	                       (c_options->stereo.tmp.fs_swap         ? PR_STEREO_SWAP : 0) |
+	                       (c_options->stereo.tmp.fs_temp_disable ? PR_STEREO_TEMP_DISABLE : 0);
 	options->stereo.enable_fsmode = c_options->stereo.enable_fsmode;
 	options->stereo.fixed_w = c_options->stereo.fixed_w;
 	options->stereo.fixed_h = c_options->stereo.fixed_h;
@@ -577,18 +587,20 @@
 	combo = gtk_combo_box_new_text();
 
 	gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Single image"));
-	if (option == PR_STEREO_NONE) current = 0;
+
 	gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Anaglyph"));
-	if (option == PR_STEREO_ANAGLYPH) current = 1;
+	if (option & PR_STEREO_ANAGLYPH) current = 1;
+
 	gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Side by Side"));
-	if (option == PR_STEREO_HORIZ) current = 2;
+	if (option & PR_STEREO_HORIZ) current = 2;
+
 	gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Above - below"));
-	if (option == PR_STEREO_VERT) current = 3;
+	if (option & PR_STEREO_VERT) current = 3;
 	
 	if (add_fixed)
 		{
 		gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Fixed position"));
-		if (option == PR_STEREO_FIXED) current = 4;
+		if (option & PR_STEREO_FIXED) current = 4;
 		}
 
 	gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
@@ -2050,14 +2062,36 @@
 	table = pref_table_new(group, 2, 1, FALSE, FALSE);
 	add_stereo_mode_menu(table, 0, 0, _("Windowed stereo mode"), options->stereo.mode, &c_options->stereo.mode, FALSE);
 
-	pref_checkbox_new_int(group, _("Fall back to single image mode on 2d"),
-			      options->stereo.fallback, &c_options->stereo.fallback);
+	pref_checkbox_new_int(group, _("Mirror left image"),
+			      options->stereo.mode & PR_STEREO_MIRROR_LEFT, &c_options->stereo.tmp.mirror_left);
+	pref_checkbox_new_int(group, _("Flip left image"),
+			      options->stereo.mode & PR_STEREO_FLIP_LEFT, &c_options->stereo.tmp.flip_left);
+	pref_checkbox_new_int(group, _("Mirror right image"),
+			      options->stereo.mode & PR_STEREO_MIRROR_RIGHT, &c_options->stereo.tmp.mirror_right);
+	pref_checkbox_new_int(group, _("Flip right image"),
+			      options->stereo.mode & PR_STEREO_FLIP_RIGHT, &c_options->stereo.tmp.flip_right);
+	pref_checkbox_new_int(group, _("Swap left and right images"),
+			      options->stereo.mode & PR_STEREO_SWAP, &c_options->stereo.tmp.swap);
+	pref_checkbox_new_int(group, _("Disable stereo mode on single image source"),
+			      options->stereo.mode & PR_STEREO_TEMP_DISABLE, &c_options->stereo.tmp.temp_disable);
 
 	group = pref_group_new(vbox, FALSE, _("Fullscreen stereo mode"), GTK_ORIENTATION_VERTICAL);
 	pref_checkbox_new_int(group, _("Use different settings for fullscreen"),
 			      options->stereo.enable_fsmode, &c_options->stereo.enable_fsmode);
 	table = pref_table_new(group, 2, 1, FALSE, FALSE);
 	add_stereo_mode_menu(table, 0, 0, _("Fullscreen stereo mode"), options->stereo.fsmode, &c_options->stereo.fsmode, TRUE);
+	pref_checkbox_new_int(group, _("Mirror left image"),
+			      options->stereo.fsmode & PR_STEREO_MIRROR_LEFT, &c_options->stereo.tmp.fs_mirror_left);
+	pref_checkbox_new_int(group, _("Flip left image"),
+			      options->stereo.fsmode & PR_STEREO_FLIP_LEFT, &c_options->stereo.tmp.fs_flip_left);
+	pref_checkbox_new_int(group, _("Mirror right image"),
+			      options->stereo.fsmode & PR_STEREO_MIRROR_RIGHT, &c_options->stereo.tmp.fs_mirror_right);
+	pref_checkbox_new_int(group, _("Flip right image"),
+			      options->stereo.fsmode & PR_STEREO_FLIP_RIGHT, &c_options->stereo.tmp.fs_flip_right);
+	pref_checkbox_new_int(group, _("Swap left and right images"),
+			      options->stereo.fsmode & PR_STEREO_SWAP, &c_options->stereo.tmp.fs_swap);
+	pref_checkbox_new_int(group, _("Disable stereo mode on single image source"),
+			      options->stereo.fsmode & PR_STEREO_TEMP_DISABLE, &c_options->stereo.tmp.fs_temp_disable);
 
 }
 
--- a/src/renderer-tiles.c	Sat Mar 19 21:42:13 2011 +0100
+++ b/src/renderer-tiles.c	Sun Mar 20 00:18:13 2011 +0100
@@ -2039,7 +2039,6 @@
 		}
 	rt_sync_scroll(rt);
 	rt_overlay_update_sizes(rt);
-
 }
 
 static void renderer_stereo_set(void *renderer, gint stereo_mode)
--- a/src/typedefs.h	Sat Mar 19 21:42:13 2011 +0100
+++ b/src/typedefs.h	Sun Mar 20 00:18:13 2011 +0100
@@ -187,17 +187,24 @@
 } ToolbarType;
 
 typedef enum {
-	PR_STEREO_NONE     = 0,	  /* do nothing */
-	PR_STEREO_DUAL     = 1 << 0, /* independent stereo buffers, for example nvidia opengl */
-	PR_STEREO_HORIZ    = 1 << 2, /* side by side */
-	PR_STEREO_VERT     = 1 << 3, /* above below */
-	PR_STEREO_FIXED    = 1 << 1, /* custom position */
-	/* flags for renderer: */
-	PR_STEREO_RIGHT    = 1 << 4, /* render right buffer */
-	PR_STEREO_ANAGLYPH = 1 << 5, /* anaglyph */
-	PR_STEREO_MIRROR   = 1 << 6, /* mirror */
-	PR_STEREO_FLIP     = 1 << 7, /* flip */
-	PR_STEREO_SWAP     = 1 << 8  /* swap left and right buffers */
+	PR_STEREO_NONE           = 0,	  /* do nothing */
+	PR_STEREO_DUAL           = 1 << 0, /* independent stereo buffers, for example nvidia opengl */
+	PR_STEREO_FIXED          = 1 << 1, /* custom position */
+	PR_STEREO_HORIZ          = 1 << 2, /* side by side */
+	PR_STEREO_VERT           = 1 << 3, /* above below */
+	PR_STEREO_RIGHT          = 1 << 4, /* render right buffer */
+	PR_STEREO_ANAGLYPH       = 1 << 5, /* anaglyph */
+
+	PR_STEREO_MIRROR_LEFT    = 1 << 6, /* mirror */
+	PR_STEREO_FLIP_LEFT      = 1 << 7, /* flip */
+
+	PR_STEREO_MIRROR_RIGHT   = 1 << 8, /* mirror */
+	PR_STEREO_FLIP_RIGHT     = 1 << 9, /* flip */
+
+	PR_STEREO_MIRROR         = PR_STEREO_MIRROR_LEFT | PR_STEREO_MIRROR_RIGHT, /* mirror mask*/
+	PR_STEREO_FLIP           = PR_STEREO_FLIP_LEFT | PR_STEREO_FLIP_RIGHT, /* flip mask*/
+	PR_STEREO_SWAP           = 1 << 10,  /* swap left and right buffers */
+	PR_STEREO_TEMP_DISABLE   = 1 << 11  /* temporarily disable stereo mode if source image is not stereo */
 	
 } PixbufRendererStereoMode;