change stereo mode from menu
authorVladimir Nadvornik <nadvornik@suse.cz>
Sat, 5 Feb 2011 21:22:12 +0000 (22:22 +0100)
committerVladimir Nadvornik <nadvornik@suse.cz>
Tue, 27 Sep 2011 12:30:04 +0000 (14:30 +0200)
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

index 4f777af..8b2e2c4 100644 (file)
@@ -1424,6 +1424,24 @@ gdouble image_zoom_get_default(ImageWindow *imd)
        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)
index eec2a1b..1c9e710 100644 (file)
@@ -91,6 +91,11 @@ gdouble image_zoom_get_real(ImageWindow *imd);
 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);
 
index c6db03e..9c9405b 100644 (file)
@@ -902,7 +902,27 @@ gboolean layout_image_get_desaturate(LayoutWindow *lw)
        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)
 {
index fc01b5d..aff9ef2 100644 (file)
@@ -55,6 +55,10 @@ void layout_image_alter_orientation(LayoutWindow *lw, AlterType type);
 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);
index 491194e..d8b5503 100644 (file)
@@ -836,6 +836,23 @@ static void layout_menu_slideshow_pause_cb(GtkAction *action, gpointer data)
        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 @@ static GtkActionEntry menu_entries[] = {
   { "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 @@ static GtkToggleActionEntry menu_toggle_entries[] = {
   { "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 @@ static GtkRadioActionEntry menu_histogram_mode[] = {
   { "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 @@ static const gchar *menu_ui_description =
 "        <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 @@ void layout_actions_setup(LayoutWindow *lw)
        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();
index 3ab3c27..3f4b691 100644 (file)
@@ -429,12 +429,11 @@ static void pixbuf_renderer_init(PixbufRenderer *pr)
        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_zoom_set_limits(PixbufRenderer *pr, gdouble min, gdouble ma
                }
 }
 
+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)
 {
index 20e96a0..90840a9 100644 (file)
@@ -74,20 +74,6 @@ typedef enum {
        /* 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 @@ struct _RendererFuncs
        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);
 };
 
@@ -323,6 +311,10 @@ gboolean pixbuf_renderer_get_pixel_colors(PixbufRenderer *pr, gint x_pixel, gint
 
 void pixbuf_renderer_set_size_early(PixbufRenderer *pr, guint width, guint height);
 
+/* 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;
index fe418c0..b6de2c9 100644 (file)
@@ -2041,6 +2041,13 @@ static void renderer_update_sizes(void *renderer)
 
 }
 
+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 @@ static void renderer_free(void *renderer)
         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 @@ RendererFuncs *renderer_tiles_new(PixbufRenderer *pr, gint stereo_mode)
        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 @@ RendererFuncs *renderer_tiles_new(PixbufRenderer *pr, gint stereo_mode)
 
        rt->draw_idle_id = 0;
        
-       rt->stereo_mode = stereo_mode;
+       rt->stereo_mode = 0;
        rt->stereo_off_x = 0;
        rt->stereo_off_y = 0;
 
index 1bd4907..168023b 100644 (file)
@@ -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: */
index 5f9f212..8fc743a 100644 (file)
@@ -186,6 +186,21 @@ typedef enum {
        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;