From f5f37819bf9ede89c68114b079feb24d19e49343 Mon Sep 17 00:00:00 2001 From: Vladimir Nadvornik Date: Sat, 5 Feb 2011 22:22:12 +0100 Subject: [PATCH] change stereo mode from menu --- src/image.c | 18 ++++++++++++++++++ src/image.h | 5 +++++ src/layout_image.c | 20 ++++++++++++++++++++ src/layout_image.h | 4 ++++ src/layout_util.c | 37 +++++++++++++++++++++++++++++++++++++ src/pixbuf-renderer.c | 38 ++++++++++++++++++++++++++++++++++---- src/pixbuf-renderer.h | 20 ++++++-------------- src/renderer-tiles.c | 13 +++++++++++-- src/renderer-tiles.h | 2 +- src/typedefs.h | 15 +++++++++++++++ 10 files changed, 151 insertions(+), 21 deletions(-) diff --git a/src/image.c b/src/image.c index 4f777afd..8b2e2c4e 100644 --- a/src/image.c +++ b/src/image.c @@ -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) diff --git a/src/image.h b/src/image.h index eec2a1ba..1c9e710b 100644 --- a/src/image.h +++ b/src/image.h @@ -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); diff --git a/src/layout_image.c b/src/layout_image.c index c6db03ee..9c9405be 100644 --- a/src/layout_image.c +++ b/src/layout_image.c @@ -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) { diff --git a/src/layout_image.h b/src/layout_image.h index fc01b5d3..aff9ef2e 100644 --- a/src/layout_image.h +++ b/src/layout_image.h @@ -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); diff --git a/src/layout_util.c b/src/layout_util.c index 491194ed..d8b5503c 100644 --- a/src/layout_util.c +++ b/src/layout_util.c @@ -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"), "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 = " " " " " " +" " +" " +" " +" " +" " +" " +" " +" " " " " " " " @@ -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(); diff --git a/src/pixbuf-renderer.c b/src/pixbuf-renderer.c index 3ab3c270..3f4b6916 100644 --- a/src/pixbuf-renderer.c +++ b/src/pixbuf-renderer.c @@ -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) { diff --git a/src/pixbuf-renderer.h b/src/pixbuf-renderer.h index 20e96a07..90840a9f 100644 --- a/src/pixbuf-renderer.h +++ b/src/pixbuf-renderer.h @@ -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; diff --git a/src/renderer-tiles.c b/src/renderer-tiles.c index fe418c0a..b6de2c92 100644 --- a/src/renderer-tiles.c +++ b/src/renderer-tiles.c @@ -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; diff --git a/src/renderer-tiles.h b/src/renderer-tiles.h index 1bd49079..168023b2 100644 --- a/src/renderer-tiles.h +++ b/src/renderer-tiles.h @@ -19,7 +19,7 @@ #include -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: */ diff --git a/src/typedefs.h b/src/typedefs.h index 5f9f212d..8fc743ae 100644 --- a/src/typedefs.h +++ b/src/typedefs.h @@ -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; -- 2.20.1