added fixed stereo mode
authorVladimir Nadvornik <nadvornik@suse.cz>
Sun, 20 Mar 2011 09:15:07 +0000 (10:15 +0100)
committerVladimir Nadvornik <nadvornik@suse.cz>
Tue, 27 Sep 2011 12:30:08 +0000 (14:30 +0200)
src/image.c
src/options.c
src/pixbuf-renderer.c
src/pixbuf-renderer.h
src/preferences.c
src/renderer-tiles.c

index b1a8c8b..6e4d1c2 100644 (file)
@@ -1708,6 +1708,10 @@ static void image_options_set(ImageWindow *imd)
        pixbuf_renderer_set_parent((PixbufRenderer *)imd->pr, (GtkWindow *)imd->top_window);
        
        image_stereo_set(imd, options->stereo.mode);
+       pixbuf_renderer_stereo_fixed_set((PixbufRenderer *)imd->pr, 
+                                       options->stereo.fixed_w, options->stereo.fixed_h, 
+                                       options->stereo.fixed_x1, options->stereo.fixed_y1,
+                                       options->stereo.fixed_x2, options->stereo.fixed_y2);
 }
 
 void image_options_sync(void)
index ea652c3..d333caf 100644 (file)
@@ -124,6 +124,13 @@ ConfOptions *init_options(ConfOptions *options)
 
        options->tree_descend_subdirs = FALSE;
        options->update_on_time_change = TRUE;
+       
+       options->stereo.fixed_w = 640;
+       options->stereo.fixed_h = 200;
+       options->stereo.fixed_x1 = 0;
+       options->stereo.fixed_y1 = 20;
+       options->stereo.fixed_x2 = 0;
+       options->stereo.fixed_y2 = 260;
 
        return options;
 }
index 2f91194..efc64e9 100644 (file)
@@ -1865,9 +1865,26 @@ static void pr_size_sync(PixbufRenderer *pr, gint new_width, gint new_height)
 {
        gboolean zoom_changed = FALSE;
 
-       gint new_viewport_width = (!pr->stereo_temp_disable && (pr->stereo_mode & PR_STEREO_HORIZ)) ? new_width / 2 : new_width;
-       gint new_viewport_height =(!pr->stereo_temp_disable && (pr->stereo_mode & PR_STEREO_VERT)) ? new_height / 2 : new_height;
-       
+       gint new_viewport_width = new_width;
+       gint new_viewport_height = new_height;
+
+       if (!pr->stereo_temp_disable)
+               {
+               if (pr->stereo_mode & PR_STEREO_HORIZ)
+                       {
+                       new_viewport_width = new_width;
+                       }
+               else if (pr->stereo_mode & PR_STEREO_VERT)
+                       {
+                       new_viewport_height = new_height / 2;
+                       }
+               else if (pr->stereo_mode & PR_STEREO_FIXED)
+                       {
+                       new_viewport_width = pr->stereo_fixed_width;
+                       new_viewport_height = pr->stereo_fixed_height;
+                       }
+               }
+               
        if (pr->window_width == new_width && pr->window_height == new_height &&
            pr->viewport_width == new_viewport_width && pr->viewport_height == new_viewport_height) return;
 
@@ -2594,10 +2611,10 @@ static void pr_stereo_set(PixbufRenderer *pr)
        
        pr->renderer->stereo_set(pr->renderer, pr->stereo_mode & ~PR_STEREO_MIRROR_RIGHT & ~PR_STEREO_FLIP_RIGHT);
        
-       if (pr->stereo_mode & (PR_STEREO_HORIZ | PR_STEREO_VERT))
+       if (pr->stereo_mode & (PR_STEREO_HORIZ | PR_STEREO_VERT | PR_STEREO_FIXED))
                {
                if (!pr->renderer2) pr->renderer2 = (void *)renderer_tiles_new(pr);
-               pr->renderer2->stereo_set(pr->renderer2, pr->stereo_mode & ~PR_STEREO_MIRROR_LEFT & ~PR_STEREO_FLIP_LEFT | PR_STEREO_RIGHT);
+               pr->renderer2->stereo_set(pr->renderer2, (pr->stereo_mode & ~PR_STEREO_MIRROR_LEFT & ~PR_STEREO_FLIP_LEFT) | PR_STEREO_RIGHT);
                }
        else
                {
@@ -2623,6 +2640,15 @@ void pixbuf_renderer_stereo_set(PixbufRenderer *pr, gint stereo_mode)
                }
 }
 
+void pixbuf_renderer_stereo_fixed_set(PixbufRenderer *pr, gint width, gint height, gint x1, gint y1, gint x2, gint y2)
+{
+       pr->stereo_fixed_width = width;
+       pr->stereo_fixed_height = height;
+       pr->stereo_fixed_x_left = x1;
+       pr->stereo_fixed_y_left = y1;
+       pr->stereo_fixed_x_right = x2;
+       pr->stereo_fixed_y_right = y2;
+}
 
 gint pixbuf_renderer_stereo_get(PixbufRenderer *pr)
 {
index da7da4c..b5086dd 100644 (file)
@@ -201,6 +201,12 @@ struct _PixbufRenderer
 
        gint stereo_mode;
        gboolean stereo_temp_disable;
+       gint stereo_fixed_width;
+       gint stereo_fixed_height;
+       gint stereo_fixed_x_left;
+       gint stereo_fixed_y_left;
+       gint stereo_fixed_x_right;
+       gint stereo_fixed_y_right;
        
        RendererFuncs *renderer;
        RendererFuncs *renderer2;
@@ -316,6 +322,7 @@ void pixbuf_renderer_set_size_early(PixbufRenderer *pr, guint width, guint heigh
 /* stereo */
 void pixbuf_renderer_stereo_set(PixbufRenderer *pr, gint stereo_mode);
 gint pixbuf_renderer_stereo_get(PixbufRenderer *pr);
+void pixbuf_renderer_stereo_fixed_set(PixbufRenderer *pr, gint width, gint height, gint x1, gint y1, gint x2, gint y2);
 
 /* protected - for renderer use only*/
 
index 8405f91..8a44ac7 100644 (file)
@@ -2054,7 +2054,9 @@ static void config_tab_stereo(GtkWidget *notebook)
 {
        GtkWidget *vbox;
        GtkWidget *group;
+       GtkWidget *group2;
        GtkWidget *table;
+       GtkWidget *fs_button;
        vbox = scrolled_notebook_page(notebook, _("Stereo"));
 
        group = pref_group_new(vbox, FALSE, _("Windowed stereo mode"), GTK_ORIENTATION_VERTICAL);
@@ -2076,8 +2078,9 @@ static void config_tab_stereo(GtkWidget *notebook)
                              options->stereo.mode & PR_STEREO_TEMP_DISABLE, &c_options->stereo.tmp.temp_disable);
 
        group = pref_group_new(vbox, FALSE, _("Fullscreen stereo mode"), GTK_ORIENTATION_VERTICAL);
-       pref_checkbox_new_int(group, _("Use different settings for fullscreen"),
+       fs_button = pref_checkbox_new_int(group, _("Use different settings for fullscreen"),
                              options->stereo.enable_fsmode, &c_options->stereo.enable_fsmode);
+       pref_checkbox_link_sensitivity(fs_button, group);
        table = pref_table_new(group, 2, 1, FALSE, FALSE);
        add_stereo_mode_menu(table, 0, 0, _("Fullscreen stereo mode"), options->stereo.fsmode, &c_options->stereo.fsmode, TRUE);
        pref_checkbox_new_int(group, _("Mirror left image"),
@@ -2093,6 +2096,20 @@ static void config_tab_stereo(GtkWidget *notebook)
        pref_checkbox_new_int(group, _("Disable stereo mode on single image source"),
                              options->stereo.fsmode & PR_STEREO_TEMP_DISABLE, &c_options->stereo.tmp.fs_temp_disable);
 
+       group2 = pref_group_new(group, FALSE, _("Fixed mode"), GTK_ORIENTATION_VERTICAL);
+       pref_spin_new_int(group2, _("Width"), NULL,
+                         1, 5000, 1, options->stereo.fixed_w, &c_options->stereo.fixed_w);
+       pref_spin_new_int(group2, _("Height"), NULL,
+                         1, 5000, 1, options->stereo.fixed_h, &c_options->stereo.fixed_h);
+       pref_spin_new_int(group2, _("Left X"), NULL,
+                         0, 5000, 1, options->stereo.fixed_x1, &c_options->stereo.fixed_x1);
+       pref_spin_new_int(group2, _("Left Y"), NULL,
+                         0, 5000, 1, options->stereo.fixed_y1, &c_options->stereo.fixed_y1);
+       pref_spin_new_int(group2, _("Right X"), NULL,
+                         0, 5000, 1, options->stereo.fixed_x2, &c_options->stereo.fixed_x2);
+       pref_spin_new_int(group2, _("Right Y"), NULL,
+                         0, 5000, 1, options->stereo.fixed_y2, &c_options->stereo.fixed_y2);
+
 }
 
 /* Main preferences window */
index 0d8a78b..886bfd2 100644 (file)
@@ -2036,7 +2036,21 @@ static void renderer_update_sizes(void *renderer)
                        {
                        rt->stereo_off_y = rt->pr->viewport_height;
                        }
+               else if (rt->stereo_mode & PR_STEREO_FIXED) 
+                       {
+                       rt->stereo_off_x = rt->pr->stereo_fixed_x_right;
+                       rt->stereo_off_y = rt->pr->stereo_fixed_y_right;
+                       }
+               }
+       else
+               {
+               if (rt->stereo_mode & PR_STEREO_FIXED) 
+                       {
+                       rt->stereo_off_x = rt->pr->stereo_fixed_x_left;
+                       rt->stereo_off_y = rt->pr->stereo_fixed_y_left;
+                       }
                }
+        DEBUG_1("update size: %p  %d %d   %d %d", rt, rt->stereo_off_x, rt->stereo_off_y, rt->pr->viewport_width, rt->pr->viewport_height);
        rt_sync_scroll(rt);
        rt_overlay_update_sizes(rt);
 }