Mercurial > hg > forks > geeqie
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;