changeset 1828:e1855b7d835c

change stereo mode from menu
author Vladimir Nadvornik <nadvornik@suse.cz>
date Sat, 05 Feb 2011 22:22:12 +0100
parents b33c3624405f
children c8b1f56466ef
files src/image.c src/image.h src/layout_image.c src/layout_image.h src/layout_util.c src/pixbuf-renderer.c src/pixbuf-renderer.h src/renderer-tiles.c src/renderer-tiles.h src/typedefs.h
diffstat 10 files changed, 151 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/image.c	Sat Feb 05 18:20:16 2011 +0100
+++ b/src/image.c	Sat Feb 05 22:22:12 2011 +0100
@@ -1415,6 +1415,24 @@
 	return zoom;
 }
 
+/* stereo */
+gint image_stereo_get(ImageWindow *imd)
+{
+	return pixbuf_renderer_stereo_get((PixbufRenderer *)imd->pr);
+}
+
+void image_stereo_set(ImageWindow *imd, gint stereo_mode)
+{
+	pixbuf_renderer_stereo_set((PixbufRenderer *)imd->pr, stereo_mode);
+}
+
+void image_stereo_swap(ImageWindow *imd)
+{
+	gint stereo_mode = pixbuf_renderer_stereo_get((PixbufRenderer *)imd->pr);
+	stereo_mode ^= PR_STEREO_SWAP;
+	pixbuf_renderer_stereo_set((PixbufRenderer *)imd->pr, stereo_mode);
+}
+
 /* read ahead */
 
 void image_prebuffer_set(ImageWindow *imd, FileData *fd)
--- a/src/image.h	Sat Feb 05 18:20:16 2011 +0100
+++ b/src/image.h	Sat Feb 05 22:22:12 2011 +0100
@@ -91,6 +91,11 @@
 gchar *image_zoom_get_as_text(ImageWindow *imd);
 gdouble image_zoom_get_default(ImageWindow *imd);
 
+/* stereo */
+gint image_stereo_get(ImageWindow *imd);
+void image_stereo_set(ImageWindow *imd, gint stereo_mode);
+void image_stereo_swap(ImageWindow *imd);
+
 /* read ahead, pass NULL to cancel */
 void image_prebuffer_set(ImageWindow *imd, FileData *fd);
 
--- a/src/layout_image.c	Sat Feb 05 18:20:16 2011 +0100
+++ b/src/layout_image.c	Sat Feb 05 22:22:12 2011 +0100
@@ -902,7 +902,27 @@
 	return image_get_desaturate(lw->image);
 }
 
+/* stereo */
+gint layout_image_stereo_get(LayoutWindow *lw)
+{
+	if (!layout_valid(&lw)) return 0;
 
+	return image_stereo_get(lw->image);
+}
+
+void layout_image_stereo_set(LayoutWindow *lw, gint stereo_mode)
+{
+	if (!layout_valid(&lw)) return;
+
+	image_stereo_set(lw->image, stereo_mode);
+}
+
+void layout_image_stereo_swap(LayoutWindow *lw)
+{
+	if (!layout_valid(&lw)) return;
+
+	image_stereo_swap(lw->image);
+}
 
 const gchar *layout_image_get_path(LayoutWindow *lw)
 {
--- a/src/layout_image.h	Sat Feb 05 18:20:16 2011 +0100
+++ b/src/layout_image.h	Sat Feb 05 22:22:12 2011 +0100
@@ -55,6 +55,10 @@
 void layout_image_set_desaturate(LayoutWindow *lw, gboolean desaturate);
 gboolean layout_image_get_desaturate(LayoutWindow *lw);
 
+gint layout_image_stereo_get(LayoutWindow *lw);
+void layout_image_stereo_set(LayoutWindow *lw, gint stereo_mode);
+void layout_image_stereo_swap(LayoutWindow *lw);
+
 void layout_image_next(LayoutWindow *lw);
 void layout_image_prev(LayoutWindow *lw);
 void layout_image_first(LayoutWindow *lw);
--- a/src/layout_util.c	Sat Feb 05 18:20:16 2011 +0100
+++ b/src/layout_util.c	Sat Feb 05 22:22:12 2011 +0100
@@ -836,6 +836,23 @@
 	layout_image_slideshow_pause_toggle(lw);
 }
 
+static void layout_menu_stereo_swap_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	layout_image_stereo_swap(lw);
+}
+
+static void layout_menu_stereo_mode_cb(GtkRadioAction *action, GtkRadioAction *current, gpointer data)
+{
+	LayoutWindow *lw = data;
+	gint mode = gtk_radio_action_get_current_value(action);
+	layout_image_stereo_set(lw, (layout_image_stereo_get(lw) & ~(PR_STEREO_ANAGLYPH | PR_STEREO_HORIZ | PR_STEREO_VERT)) | mode);
+}
+
+
+
+
 static void layout_menu_help_cb(GtkAction *action, gpointer data)
 {
 	LayoutWindow *lw = data;
@@ -1256,6 +1273,7 @@
   { "ColorMenu",	NULL,			N_("_Color Management"),		NULL, 			NULL,					NULL },
   { "ConnectZoomMenu",	NULL,			N_("_Connected Zoom"),			NULL, 			NULL,					NULL },
   { "SplitMenu",	NULL,			N_("Spli_t"),				NULL, 			NULL,					NULL },
+  { "StereoMenu",	NULL,			N_("Stere_o"),				NULL, 			NULL,					NULL },
   { "OverlayMenu",	NULL,			N_("Image _Overlay"),			NULL, 			NULL,					NULL },
   { "HelpMenu",		NULL,			N_("_Help"),				NULL, 			NULL,					NULL },
 
@@ -1372,6 +1390,7 @@
   { "Grayscale",	NULL,			N_("Toggle _grayscale"),		"<shift>G",		N_("Toggle grayscale"),			CB(layout_menu_alter_desaturate_cb), FALSE},
   { "ImageOverlay",	NULL,			N_("Image _Overlay"),			NULL,			N_("Image Overlay"),			CB(layout_menu_overlay_cb),	 FALSE },
   { "ImageHistogram",	NULL,			N_("_Show Histogram"),			NULL,			N_("Show Histogram"),			CB(layout_menu_histogram_cb),	 FALSE },
+  { "StereoSwap",	NULL,			N_("Swap stereo images"),		NULL,			N_("Swap stereo images"),		CB(layout_menu_stereo_swap_cb),	 FALSE },
 };
 
 static GtkRadioActionEntry menu_radio_entries[] = {
@@ -1413,6 +1432,13 @@
   { "HistogramModeLog",	NULL,			N_("_Log Histogram"),			NULL,			N_("Log Histogram"),		1 },
 };
 
+static GtkRadioActionEntry menu_stereo_mode_entries[] = {
+  { "StereoNone",	NULL,			N_("_None"),				NULL,			N_("Stereo Off"),		PR_STEREO_NONE },
+  { "StereoAnaglyph",	NULL,			N_("_Anaglyph"),			NULL,			N_("Stereo Anaglyph"),		PR_STEREO_ANAGLYPH },
+  { "StereoHoriz",	NULL,			N_("_Side by Side"),			NULL,			N_("Stereo Side by Side"),	PR_STEREO_HORIZ },
+  { "StereoVert",	NULL,			N_("Above-_Below"),			NULL,			N_("Stereo Above-Below"),	PR_STEREO_VERT }
+};
+
 
 #undef CB
 
@@ -1551,6 +1577,14 @@
 "        <menuitem action='SplitQuad'/>"
 "        <menuitem action='SplitSingle'/>"
 "      </menu>"
+"      <menu action='StereoMenu'>"
+"        <menuitem action='StereoSwap'/>"
+"        <separator/>"
+"        <menuitem action='StereoNone'/>"
+"        <menuitem action='StereoAnaglyph'/>"
+"        <menuitem action='StereoHoriz'/>"
+"        <menuitem action='StereoVert'/>"
+"      </menu>"
 "      <menu action='ColorMenu'>"
 "        <menuitem action='UseColorProfiles'/>"
 "        <menuitem action='UseImageProfile'/>"
@@ -1915,6 +1949,9 @@
 	gtk_action_group_add_radio_actions(lw->action_group,
 					   menu_histogram_mode, G_N_ELEMENTS(menu_histogram_mode),
 					   0, G_CALLBACK(layout_menu_histogram_mode_cb), lw);
+	gtk_action_group_add_radio_actions(lw->action_group,
+					   menu_stereo_mode_entries, G_N_ELEMENTS(menu_stereo_mode_entries),
+					   0, G_CALLBACK(layout_menu_stereo_mode_cb), lw);
 
 
 	lw->ui_manager = gtk_ui_manager_new();
--- a/src/pixbuf-renderer.c	Sat Feb 05 18:20:16 2011 +0100
+++ b/src/pixbuf-renderer.c	Sat Feb 05 22:22:12 2011 +0100
@@ -429,12 +429,11 @@
 	pr->norm_center_x = 0.5;
 	pr->norm_center_y = 0.5;
 	
-	pr->stereo_mode = PR_STEREO_HORIZ;
+	pr->stereo_mode = PR_STEREO_NONE;
 	
-	pr->renderer = (void *)renderer_tiles_new(pr, pr->stereo_mode);
+	pr->renderer = (void *)renderer_tiles_new(pr);
 	
-	pr->renderer2 = (pr->stereo_mode & (PR_STEREO_HORIZ | PR_STEREO_VERT)) ?
-	              (void *)renderer_tiles_new(pr, pr->stereo_mode | PR_STEREO_RIGHT) : NULL;
+	pr->renderer2 = NULL;
 
 	gtk_widget_set_double_buffered(box, FALSE);
 	g_signal_connect_after(G_OBJECT(box), "size_allocate",
@@ -2570,6 +2569,37 @@
 		}
 }
 
+void pixbuf_renderer_stereo_set(PixbufRenderer *pr, gint stereo_mode)
+{
+	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);
+	
+	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);
+		}
+	else
+		{
+		if (pr->renderer2) pr->renderer2->free(pr->renderer2);
+		pr->renderer2 = NULL;
+		}
+	if (redraw) 
+		{
+		pr_size_sync(pr, pr->window_width, pr->window_height); /* recalculate new viewport */
+		pr_zoom_sync(pr, pr->zoom, PR_ZOOM_FORCE | PR_ZOOM_NEW, 0, 0);
+		}
+}
+
+gint pixbuf_renderer_stereo_get(PixbufRenderer *pr)
+{
+	return pr->stereo_mode;
+}
+
 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 Feb 05 18:20:16 2011 +0100
+++ b/src/pixbuf-renderer.h	Sat Feb 05 22:22:12 2011 +0100
@@ -74,20 +74,6 @@
 	/* OVL_HIDE_ON_SCROLL = 1 << 1*/ /* hide temporarily when scrolling (not yet implemented) */
 } OverlayRendererFlags;
 
-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 */
-	/* 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 */
-	
-} PixbufRendererStereoMode;
-
 struct _RendererFuncs
 {
 	void (*queue)(void *renderer, gint x, gint y, gint w, gint h,
@@ -104,6 +90,8 @@
 	gboolean (*overlay_get)(void *renderer, gint id, GdkPixbuf **pixbuf, gint *x, gint *y);
 	void (*overlay_draw)(void *renderer, gint x, gint y, gint w, gint h);
 
+	void (*stereo_set)(void *renderer, gint stereo_mode);
+
 	void (*free)(void *renderer);
 };
 
@@ -321,6 +309,10 @@
 gboolean pixbuf_renderer_get_pixel_colors(PixbufRenderer *pr, gint x_pixel, gint y_pixel,
 	 				gint *r_mouse, gint *g_mouse, gint *b_mouse);
 
+/* stereo */
+void pixbuf_renderer_stereo_set(PixbufRenderer *pr, gint stereo_mode);
+gint pixbuf_renderer_stereo_get(PixbufRenderer *pr);
+
 /* protected - for renderer use only*/
 
 typedef struct _SourceTile SourceTile;
--- a/src/renderer-tiles.c	Sat Feb 05 18:20:16 2011 +0100
+++ b/src/renderer-tiles.c	Sat Feb 05 22:22:12 2011 +0100
@@ -2041,6 +2041,13 @@
 
 }
 
+static void renderer_stereo_set(void *renderer, gint stereo_mode)
+{
+	RendererTiles *rt = (RendererTiles *)renderer;
+
+	rt->stereo_mode = stereo_mode;
+}
+
 static void renderer_free(void *renderer)
 {
 	RendererTiles *rt = (RendererTiles *)renderer;
@@ -2055,7 +2062,7 @@
         g_free(rt);
 }
 
-RendererFuncs *renderer_tiles_new(PixbufRenderer *pr, gint stereo_mode)
+RendererFuncs *renderer_tiles_new(PixbufRenderer *pr)
 {
 	RendererTiles *rt = g_new0(RendererTiles, 1);
 	
@@ -2075,6 +2082,8 @@
 	rt->f.overlay_set = renderer_tiles_overlay_set;
 	rt->f.overlay_get = renderer_tiles_overlay_get;
 	rt->f.overlay_draw = renderer_overlay_draw;
+
+	rt->f.stereo_set = renderer_stereo_set;
 	
 	rt->tile_width = PR_TILE_SIZE;
 	rt->tile_height = PR_TILE_SIZE;
@@ -2086,7 +2095,7 @@
 
 	rt->draw_idle_id = 0;
 	
-	rt->stereo_mode = stereo_mode;
+	rt->stereo_mode = 0;
 	rt->stereo_off_x = 0;
 	rt->stereo_off_y = 0;
 
--- a/src/renderer-tiles.h	Sat Feb 05 18:20:16 2011 +0100
+++ b/src/renderer-tiles.h	Sat Feb 05 22:22:12 2011 +0100
@@ -19,7 +19,7 @@
 #include <pixbuf-renderer.h>
 
 
-RendererFuncs *renderer_tiles_new(PixbufRenderer *pr, gint stereo_flags);
+RendererFuncs *renderer_tiles_new(PixbufRenderer *pr);
 
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/typedefs.h	Sat Feb 05 18:20:16 2011 +0100
+++ b/src/typedefs.h	Sat Feb 05 22:22:12 2011 +0100
@@ -186,6 +186,21 @@
 	TOOLBAR_COUNT
 } 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 */
+	/* 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 */
+	
+} PixbufRendererStereoMode;
+
+
 #define MAX_SPLIT_IMAGES 4
 
 typedef struct _ImageLoader ImageLoader;