changeset 1833:e9962ddaf8c7

added fixed stereo mode
author Vladimir Nadvornik <nadvornik@suse.cz>
date Sun, 20 Mar 2011 10:15:07 +0100
parents 584bff9effee
children f19149b16223
files src/image.c src/options.c src/pixbuf-renderer.c src/pixbuf-renderer.h src/preferences.c src/renderer-tiles.c
diffstat 6 files changed, 81 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/image.c	Sun Mar 20 00:23:54 2011 +0100
+++ b/src/image.c	Sun Mar 20 10:15:07 2011 +0100
@@ -1699,6 +1699,10 @@
 	pixbuf_renderer_set_parent((PixbufRenderer *)imd->pr, (GtkWindow *)imd->top_window);
 	
 	image_stereo_set(imd, options->stereo.mode);
+	pixbuf_renderer_stereo_fixed_set((PixbufRenderer *)imd->pr, 
+					options->stereo.fixed_w, options->stereo.fixed_h, 
+					options->stereo.fixed_x1, options->stereo.fixed_y1,
+					options->stereo.fixed_x2, options->stereo.fixed_y2);
 }
 
 void image_options_sync(void)
--- a/src/options.c	Sun Mar 20 00:23:54 2011 +0100
+++ b/src/options.c	Sun Mar 20 10:15:07 2011 +0100
@@ -124,6 +124,13 @@
 
 	options->tree_descend_subdirs = FALSE;
 	options->update_on_time_change = TRUE;
+	
+	options->stereo.fixed_w = 640;
+	options->stereo.fixed_h = 200;
+	options->stereo.fixed_x1 = 0;
+	options->stereo.fixed_y1 = 20;
+	options->stereo.fixed_x2 = 0;
+	options->stereo.fixed_y2 = 260;
 
 	return options;
 }
--- a/src/pixbuf-renderer.c	Sun Mar 20 00:23:54 2011 +0100
+++ b/src/pixbuf-renderer.c	Sun Mar 20 10:15:07 2011 +0100
@@ -1865,9 +1865,26 @@
 {
 	gboolean zoom_changed = FALSE;
 
-	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;
-	
+	gint new_viewport_width = new_width;
+	gint new_viewport_height = new_height;
+
+	if (!pr->stereo_temp_disable)
+		{
+		if (pr->stereo_mode & PR_STEREO_HORIZ)
+			{
+			new_viewport_width = new_width;
+			}
+		else if (pr->stereo_mode & PR_STEREO_VERT)
+			{
+			new_viewport_height = new_height / 2;
+			}
+		else if (pr->stereo_mode & PR_STEREO_FIXED)
+			{
+			new_viewport_width = pr->stereo_fixed_width;
+			new_viewport_height = pr->stereo_fixed_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;
 
@@ -2594,10 +2611,10 @@
 	
 	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->stereo_mode & (PR_STEREO_HORIZ | PR_STEREO_VERT | PR_STEREO_FIXED))
 		{
 		if (!pr->renderer2) pr->renderer2 = (void *)renderer_tiles_new(pr);
-		pr->renderer2->stereo_set(pr->renderer2, pr->stereo_mode & ~PR_STEREO_MIRROR_LEFT & ~PR_STEREO_FLIP_LEFT | PR_STEREO_RIGHT);
+		pr->renderer2->stereo_set(pr->renderer2, (pr->stereo_mode & ~PR_STEREO_MIRROR_LEFT & ~PR_STEREO_FLIP_LEFT) | PR_STEREO_RIGHT);
 		}
 	else
 		{
@@ -2623,6 +2640,15 @@
 		}
 }
 
+void pixbuf_renderer_stereo_fixed_set(PixbufRenderer *pr, gint width, gint height, gint x1, gint y1, gint x2, gint y2)
+{
+	pr->stereo_fixed_width = width;
+	pr->stereo_fixed_height = height;
+	pr->stereo_fixed_x_left = x1;
+	pr->stereo_fixed_y_left = y1;
+	pr->stereo_fixed_x_right = x2;
+	pr->stereo_fixed_y_right = y2;
+}
 
 gint pixbuf_renderer_stereo_get(PixbufRenderer *pr)
 {
--- a/src/pixbuf-renderer.h	Sun Mar 20 00:23:54 2011 +0100
+++ b/src/pixbuf-renderer.h	Sun Mar 20 10:15:07 2011 +0100
@@ -201,6 +201,12 @@
 
 	gint stereo_mode;
 	gboolean stereo_temp_disable;
+	gint stereo_fixed_width;
+	gint stereo_fixed_height;
+	gint stereo_fixed_x_left;
+	gint stereo_fixed_y_left;
+	gint stereo_fixed_x_right;
+	gint stereo_fixed_y_right;
 	
 	RendererFuncs *renderer;
 	RendererFuncs *renderer2;
@@ -314,6 +320,7 @@
 /* stereo */
 void pixbuf_renderer_stereo_set(PixbufRenderer *pr, gint stereo_mode);
 gint pixbuf_renderer_stereo_get(PixbufRenderer *pr);
+void pixbuf_renderer_stereo_fixed_set(PixbufRenderer *pr, gint width, gint height, gint x1, gint y1, gint x2, gint y2);
 
 /* protected - for renderer use only*/
 
--- a/src/preferences.c	Sun Mar 20 00:23:54 2011 +0100
+++ b/src/preferences.c	Sun Mar 20 10:15:07 2011 +0100
@@ -2054,7 +2054,9 @@
 {
 	GtkWidget *vbox;
 	GtkWidget *group;
+	GtkWidget *group2;
 	GtkWidget *table;
+	GtkWidget *fs_button;
 	vbox = scrolled_notebook_page(notebook, _("Stereo"));
 
 	group = pref_group_new(vbox, FALSE, _("Windowed stereo mode"), GTK_ORIENTATION_VERTICAL);
@@ -2076,8 +2078,9 @@
 			      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"),
+	fs_button = pref_checkbox_new_int(group, _("Use different settings for fullscreen"),
 			      options->stereo.enable_fsmode, &c_options->stereo.enable_fsmode);
+	pref_checkbox_link_sensitivity(fs_button, group);
 	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"),
@@ -2093,6 +2096,20 @@
 	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);
 
+	group2 = pref_group_new(group, FALSE, _("Fixed mode"), GTK_ORIENTATION_VERTICAL);
+	pref_spin_new_int(group2, _("Width"), NULL,
+			  1, 5000, 1, options->stereo.fixed_w, &c_options->stereo.fixed_w);
+	pref_spin_new_int(group2, _("Height"), NULL,
+			  1, 5000, 1, options->stereo.fixed_h, &c_options->stereo.fixed_h);
+	pref_spin_new_int(group2, _("Left X"), NULL,
+			  0, 5000, 1, options->stereo.fixed_x1, &c_options->stereo.fixed_x1);
+	pref_spin_new_int(group2, _("Left Y"), NULL,
+			  0, 5000, 1, options->stereo.fixed_y1, &c_options->stereo.fixed_y1);
+	pref_spin_new_int(group2, _("Right X"), NULL,
+			  0, 5000, 1, options->stereo.fixed_x2, &c_options->stereo.fixed_x2);
+	pref_spin_new_int(group2, _("Right Y"), NULL,
+			  0, 5000, 1, options->stereo.fixed_y2, &c_options->stereo.fixed_y2);
+
 }
 
 /* Main preferences window */
--- a/src/renderer-tiles.c	Sun Mar 20 00:23:54 2011 +0100
+++ b/src/renderer-tiles.c	Sun Mar 20 10:15:07 2011 +0100
@@ -2036,7 +2036,21 @@
 			{
 			rt->stereo_off_y = rt->pr->viewport_height;
 			}
+		else if (rt->stereo_mode & PR_STEREO_FIXED) 
+			{
+			rt->stereo_off_x = rt->pr->stereo_fixed_x_right;
+			rt->stereo_off_y = rt->pr->stereo_fixed_y_right;
+			}
 		}
+	else
+		{
+		if (rt->stereo_mode & PR_STEREO_FIXED) 
+			{
+			rt->stereo_off_x = rt->pr->stereo_fixed_x_left;
+			rt->stereo_off_y = rt->pr->stereo_fixed_y_left;
+			}
+		}
+        DEBUG_1("update size: %p  %d %d   %d %d", rt, rt->stereo_off_x, rt->stereo_off_y, rt->pr->viewport_width, rt->pr->viewport_height);
 	rt_sync_scroll(rt);
 	rt_overlay_update_sizes(rt);
 }