[Xfce4-commits] <ristretto:master> Improved behaviour when zooming inside a previewed image

Stephan Arts stephan at xfce.org
Wed Aug 12 12:19:31 CEST 2009


Updating branch refs/heads/master
         to 7566a5a251dd6a37bc30889dab19aa8615361b5a (commit)
       from 3c9fbba878bb2518b4e9915f43be88dcb0b501a8 (commit)

commit 7566a5a251dd6a37bc30889dab19aa8615361b5a
Author: Stephan Arts <stephan at xfce.org>
Date:   Wed Mar 11 16:36:13 2009 +0100

    Improved behaviour when zooming inside a previewed image

 src/picture_viewer.c |  126 +++++++++++++++++++++----------------------------
 1 files changed, 54 insertions(+), 72 deletions(-)

diff --git a/src/picture_viewer.c b/src/picture_viewer.c
index 427274a..910c6cb 100644
--- a/src/picture_viewer.c
+++ b/src/picture_viewer.c
@@ -934,6 +934,8 @@ cb_rstto_picture_viewer_queued_repaint (RsttoPictureViewer *viewer)
     gdouble *p_scale = NULL;
     gboolean *p_fit_to_screen= NULL;
     gdouble scale;
+    gdouble thumb_scale = 1;
+    gdouble thumb_width = 0;
     gboolean fit_to_screen = FALSE;
     gdouble width, height;
     GtkWidget *widget = GTK_WIDGET (viewer);
@@ -945,96 +947,76 @@ cb_rstto_picture_viewer_queued_repaint (RsttoPictureViewer *viewer)
         {
             width = (gdouble)gdk_pixbuf_get_width (p_src_pixbuf);
             height = (gdouble)gdk_pixbuf_get_height (p_src_pixbuf);
+            if (viewer->priv->state != RSTTO_PICTURE_VIEWER_STATE_NORMAL)
+            {
+                switch (viewer->priv->state)
+                {
+                    case RSTTO_PICTURE_VIEWER_STATE_PREVIEW:
+                        p_src_pixbuf = rstto_image_get_thumbnail (viewer->priv->image);
+                        thumb_width = (gdouble)gdk_pixbuf_get_width (p_src_pixbuf);
+                        thumb_scale = (thumb_width / width);
+                        break;
+                    default:
+                        break;
+                }
+            }
         }
 
         p_scale = g_object_get_data (G_OBJECT (viewer->priv->image), "viewer-scale");
         p_fit_to_screen = g_object_get_data (G_OBJECT (viewer->priv->image), "viewer-fit-to-screen");
         scale = *p_scale;
         fit_to_screen = *p_fit_to_screen;
-    }
 
-    if ((scale <= 0) || (fit_to_screen == TRUE))
-    {
-        scale = rstto_picture_viewer_calculate_scale (viewer);
-        *p_fit_to_screen = TRUE;
-        *p_scale = scale;
+        if ((scale <= 0) || (fit_to_screen == TRUE))
+        {
+            scale = rstto_picture_viewer_calculate_scale (viewer);
+            *p_fit_to_screen = TRUE;
+            *p_scale = scale;
+        }
     }
 
+
     rstto_picture_viewer_calculate_adjustments (viewer, scale);
 
 
-    switch (viewer->priv->state)
+    if (viewer->priv->repaint.refresh)
     {
-        case RSTTO_PICTURE_VIEWER_STATE_NORMAL:
-            if (viewer->priv->repaint.refresh)
+        if (p_src_pixbuf)
+        {
+            /**
+             *  tmp_scale is the factor between the original image and the thumbnail,
+             *  when looking at the actual image, tmp_scale == 1.0
+             */
+            gint x = (gint)viewer->hadjustment->value * scale;
+            gint y = (gint)viewer->vadjustment->value * scale;
+
+            p_tmp_pixbuf = gdk_pixbuf_new_subpixbuf (p_src_pixbuf,
+                                               (gint)(x * thumb_scale), 
+                                                      (y * thumb_scale),
+                                                    ((widget->allocation.width / scale) < width?
+                                                      (widget->allocation.width / scale)*thumb_scale:width*thumb_scale),
+                                                    ((widget->allocation.height / scale) < height?
+                                                      (widget->allocation.height / scale)*thumb_scale:height*thumb_scale));
+
+            if(viewer->priv->dst_pixbuf)
             {
-                if (p_src_pixbuf)
-                {
-                    p_tmp_pixbuf = gdk_pixbuf_new_subpixbuf (p_src_pixbuf,
-                                                       (gint)(viewer->hadjustment->value / scale), 
-                                                              viewer->vadjustment->value / scale,
-                                                            ((widget->allocation.width/scale)) < width?
-                                                              widget->allocation.width/scale:width,
-                                                            ((widget->allocation.height/scale))< height?
-                                                              widget->allocation.height/scale:height);
-
-                    if(viewer->priv->dst_pixbuf)
-                    {
-                        g_object_unref(viewer->priv->dst_pixbuf);
-                        viewer->priv->dst_pixbuf = NULL;
-                    }
-                    if(p_tmp_pixbuf)
-                    {
-                        gint dst_width = gdk_pixbuf_get_width (p_tmp_pixbuf)*scale;
-                        gint dst_height = gdk_pixbuf_get_height (p_tmp_pixbuf)*scale;
-                        viewer->priv->dst_pixbuf = gdk_pixbuf_scale_simple (p_tmp_pixbuf,
-                                                dst_width>0?dst_width:1,
-                                                dst_height>0?dst_height:1,
-                                                GDK_INTERP_BILINEAR);
-                        g_object_unref (p_tmp_pixbuf);
-                        p_tmp_pixbuf = NULL;
-                    }
-                }
+                g_object_unref(viewer->priv->dst_pixbuf);
+                viewer->priv->dst_pixbuf = NULL;
             }
-            rstto_picture_viewer_paint (GTK_WIDGET (viewer));
-            break;
-        case RSTTO_PICTURE_VIEWER_STATE_PREVIEW:
-            if (viewer->priv->image)
+            if(p_tmp_pixbuf)
             {
-                p_tmp_pixbuf = rstto_image_get_thumbnail (viewer->priv->image);
-                if (G_LIKELY (p_scale == NULL))
-                {
-                    p_scale = g_new0 (gdouble, 1);
-                    g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-scale", p_scale);
-                }
-                *p_scale = scale;
-
-                if (p_tmp_pixbuf)
-                {
-                    g_object_ref (p_tmp_pixbuf);
-
-                    if(viewer->priv->dst_pixbuf)
-                    {
-                        g_object_unref(viewer->priv->dst_pixbuf);
-                        viewer->priv->dst_pixbuf = NULL;
-                    }
-                    if(p_tmp_pixbuf)
-                    {
-                        gint dst_width = gdk_pixbuf_get_width (p_src_pixbuf)*scale;
-                        gint dst_height = gdk_pixbuf_get_height (p_src_pixbuf)*scale;
-                        viewer->priv->dst_pixbuf = gdk_pixbuf_scale_simple (p_tmp_pixbuf,
-                                                dst_width>0?dst_width:1,
-                                                dst_height>0?dst_height:1,
-                                                GDK_INTERP_BILINEAR);
-                        g_object_unref (p_tmp_pixbuf);
-                        p_tmp_pixbuf = NULL;
-                    }
-                }
-    
+                gint dst_width = gdk_pixbuf_get_width (p_tmp_pixbuf)*(scale/thumb_scale);
+                gint dst_height = gdk_pixbuf_get_height (p_tmp_pixbuf)*(scale/thumb_scale);
+                viewer->priv->dst_pixbuf = gdk_pixbuf_scale_simple (p_tmp_pixbuf,
+                                        dst_width>0?dst_width:1,
+                                        dst_height>0?dst_height:1,
+                                        GDK_INTERP_BILINEAR);
+                g_object_unref (p_tmp_pixbuf);
+                p_tmp_pixbuf = NULL;
             }
-            rstto_picture_viewer_paint (GTK_WIDGET(viewer));
-            break;
+        }
     }
+    rstto_picture_viewer_paint (GTK_WIDGET (viewer));
 
     g_source_remove (viewer->priv->repaint.idle_id);
     viewer->priv->repaint.idle_id = -1;



More information about the Xfce4-commits mailing list