From: Vladimir Nadvornik Date: Sat, 14 May 2011 19:53:45 +0000 (+0200) Subject: do not mix autodetected and user-defined stereo mode X-Git-Tag: 1.1~46 X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=commitdiff_plain;h=e9780e09d7e57bd5f5c3594bdd773bb2541ec232 do not mix autodetected and user-defined stereo mode --- diff --git a/src/image.c b/src/image.c index 1a2aa209..5c4355a9 100644 --- a/src/image.c +++ b/src/image.c @@ -1105,7 +1105,7 @@ GdkPixbuf *image_get_pixbuf(ImageWindow *imd) void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom, gboolean lazy) { - + StereoPixbufData stereo_data = STEREO_PIXBUF_DEFAULT; /* read_exif and similar functions can actually notice that the file has changed and trigger a notification that removes the pixbuf from cache and unrefs it. Therefore we must ref it here before it is taken over by the renderer. */ @@ -1124,9 +1124,13 @@ void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom, gboo } } - if (pixbuf && imd->user_stereo) + if (pixbuf) { - g_object_set_data(G_OBJECT(pixbuf), "stereo_data", GINT_TO_POINTER(imd->user_stereo)); + stereo_data = imd->user_stereo; + if (stereo_data == STEREO_PIXBUF_DEFAULT) + { + stereo_data = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(pixbuf), "stereo_data")); + } } pixbuf_renderer_set_post_process_func((PixbufRenderer *)imd->pr, NULL, NULL, FALSE); @@ -1138,12 +1142,13 @@ void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom, gboo if (lazy) { - pixbuf_renderer_set_pixbuf_lazy((PixbufRenderer *)imd->pr, pixbuf, zoom, imd->orientation); + pixbuf_renderer_set_pixbuf_lazy((PixbufRenderer *)imd->pr, pixbuf, zoom, imd->orientation, stereo_data); } else { pixbuf_renderer_set_pixbuf((PixbufRenderer *)imd->pr, pixbuf, zoom); pixbuf_renderer_set_orientation((PixbufRenderer *)imd->pr, imd->orientation); + pixbuf_renderer_set_stereo_data((PixbufRenderer *)imd->pr, stereo_data); } if (pixbuf) g_object_unref(pixbuf); diff --git a/src/pixbuf-renderer.c b/src/pixbuf-renderer.c index ffee8fee..c796e7fe 100644 --- a/src/pixbuf-renderer.c +++ b/src/pixbuf-renderer.c @@ -2388,7 +2388,6 @@ static void pr_pixbuf_size_sync(PixbufRenderer *pr) pr->stereo_pixbuf_offset_left = 0; pr->stereo_pixbuf_offset_right = 0; if (!pr->pixbuf) return; - gint stereo_data = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(pr->pixbuf), "stereo_data")); switch (pr->orientation) { case EXIF_ORIENTATION_LEFT_TOP: @@ -2397,12 +2396,12 @@ static void pr_pixbuf_size_sync(PixbufRenderer *pr) case EXIF_ORIENTATION_LEFT_BOTTOM: pr->image_width = gdk_pixbuf_get_height(pr->pixbuf); pr->image_height = gdk_pixbuf_get_width(pr->pixbuf); - if (stereo_data == STEREO_PIXBUF_SBS) + if (pr->stereo_data == STEREO_PIXBUF_SBS) { pr->image_height /= 2; pr->stereo_pixbuf_offset_right = pr->image_height; } - else if (stereo_data == STEREO_PIXBUF_CROSS) + else if (pr->stereo_data == STEREO_PIXBUF_CROSS) { pr->image_height /= 2; pr->stereo_pixbuf_offset_left = pr->image_height; @@ -2412,12 +2411,12 @@ static void pr_pixbuf_size_sync(PixbufRenderer *pr) default: pr->image_width = gdk_pixbuf_get_width(pr->pixbuf); pr->image_height = gdk_pixbuf_get_height(pr->pixbuf); - if (stereo_data == STEREO_PIXBUF_SBS) + if (pr->stereo_data == STEREO_PIXBUF_SBS) { pr->image_width /= 2; pr->stereo_pixbuf_offset_right = pr->image_width; } - else if (stereo_data == STEREO_PIXBUF_CROSS) + else if (pr->stereo_data == STEREO_PIXBUF_CROSS) { pr->image_width /= 2; pr->stereo_pixbuf_offset_left = pr->image_width; @@ -2462,7 +2461,7 @@ static void pr_set_pixbuf(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, P if (pr->stereo_mode & PR_STEREO_TEMP_DISABLE) { - gint disable = !pr->pixbuf || ! GPOINTER_TO_INT(g_object_get_data(G_OBJECT(pr->pixbuf), "stereo_data")); + gint disable = !pr->pixbuf || ! pr->stereo_data; pr_stereo_temp_disable(pr, disable); } @@ -2481,13 +2480,14 @@ void pixbuf_renderer_set_pixbuf(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble z pr_update_signal(pr); } -void pixbuf_renderer_set_pixbuf_lazy(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, gint orientation) +void pixbuf_renderer_set_pixbuf_lazy(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, gint orientation, StereoPixbufData stereo_data) { g_return_if_fail(IS_PIXBUF_RENDERER(pr)); pr_source_tile_unset(pr); pr->orientation = orientation; + pr->stereo_data = stereo_data; pr_set_pixbuf(pr, pixbuf, zoom, PR_ZOOM_LAZY); pr_update_signal(pr); @@ -2516,6 +2516,16 @@ gint pixbuf_renderer_get_orientation(PixbufRenderer *pr) return pr->orientation; } +void pixbuf_renderer_set_stereo_data(PixbufRenderer *pr, StereoPixbufData stereo_data) +{ + g_return_if_fail(IS_PIXBUF_RENDERER(pr)); + + pr->stereo_data = stereo_data; + + pr_pixbuf_size_sync(pr); + pr_zoom_sync(pr, pr->zoom, PR_ZOOM_FORCE, 0, 0); +} + void pixbuf_renderer_set_post_process_func(PixbufRenderer *pr, PixbufRendererPostProcessFunc func, gpointer user_data, gboolean slow) { g_return_if_fail(IS_PIXBUF_RENDERER(pr)); @@ -2557,6 +2567,7 @@ void pixbuf_renderer_move(PixbufRenderer *pr, PixbufRenderer *source) pr->post_process_user_data = source->post_process_user_data; pr->post_process_slow = source->post_process_slow; pr->orientation = source->orientation; + pr->stereo_data = source->stereo_data; if (source->source_tiles_enabled) { diff --git a/src/pixbuf-renderer.h b/src/pixbuf-renderer.h index f03a015b..390de230 100644 --- a/src/pixbuf-renderer.h +++ b/src/pixbuf-renderer.h @@ -201,6 +201,8 @@ struct _PixbufRenderer gint orientation; gint stereo_mode; + + StereoPixbufData stereo_data; gboolean stereo_temp_disable; gint stereo_fixed_width; gint stereo_fixed_height; @@ -241,7 +243,7 @@ GtkWindow *pixbuf_renderer_get_parent(PixbufRenderer *pr); void pixbuf_renderer_set_pixbuf(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom); /* same as pixbuf_renderer_set_pixbuf but waits with redrawing for pixbuf_renderer_area_changed */ -void pixbuf_renderer_set_pixbuf_lazy(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, gint orientation); +void pixbuf_renderer_set_pixbuf_lazy(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, gint orientation, StereoPixbufData stereo_data); GdkPixbuf *pixbuf_renderer_get_pixbuf(PixbufRenderer *pr); @@ -249,6 +251,9 @@ GdkPixbuf *pixbuf_renderer_get_pixbuf(PixbufRenderer *pr); void pixbuf_renderer_set_orientation(PixbufRenderer *pr, gint orientation); gint pixbuf_renderer_get_orientation(PixbufRenderer *pr); +/* sets the format of stereo data in the input pixbuf */ +void pixbuf_renderer_set_stereo_data(PixbufRenderer *pr, StereoPixbufData stereo_data); + void pixbuf_renderer_set_post_process_func(PixbufRenderer *pr, PixbufRendererPostProcessFunc func, gpointer user_data, gboolean slow); /* display an on-request array of pixbuf tiles */