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)
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);
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)
{
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);
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;
{ "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 },
{ "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[] = {
{ "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
" <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'/>"
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();
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",
}
}
+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)
{
/* 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,
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);
};
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;
}
+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;
g_free(rt);
}
-RendererFuncs *renderer_tiles_new(PixbufRenderer *pr, gint stereo_mode)
+RendererFuncs *renderer_tiles_new(PixbufRenderer *pr)
{
RendererTiles *rt = g_new0(RendererTiles, 1);
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;
rt->draw_idle_id = 0;
- rt->stereo_mode = stereo_mode;
+ rt->stereo_mode = 0;
rt->stereo_off_x = 0;
rt->stereo_off_y = 0;
#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: */
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;