[Xfce4-commits] <ristretto:master> Implement zooming and scrolling

Stephan Arts noreply at xfce.org
Fri Oct 21 17:38:04 CEST 2011


Updating branch refs/heads/master
         to 885ef95fed12ff64f835ca31edd0c8607a8e1448 (commit)
       from 561eb6fcc5bff17432bba70509462cea64836ca3 (commit)

commit 885ef95fed12ff64f835ca31edd0c8607a8e1448
Author: Stephan Arts <stephan at xfce.org>
Date:   Fri Oct 21 08:10:04 2011 +0200

    Implement zooming and scrolling

 src/image_viewer.c |  104 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 102 insertions(+), 2 deletions(-)

diff --git a/src/image_viewer.c b/src/image_viewer.c
index 7a195a0..55e7264 100644
--- a/src/image_viewer.c
+++ b/src/image_viewer.c
@@ -23,6 +23,8 @@
 #include <gio/gio.h>
 #include <libexif/exif-data.h>
 
+#include <math.h>
+
 #include "util.h"
 
 #include "file.h"
@@ -792,6 +794,56 @@ paint_background_icon (
 }
 
 static void
+correct_adjustments ( RsttoImageViewer *viewer )
+{
+    GtkWidget *widget = GTK_WIDGET (viewer);
+    gdouble image_width = (gdouble)viewer->priv->image_width;
+    gdouble image_height = (gdouble)viewer->priv->image_height;
+    gdouble scale = viewer->priv->scale;
+
+
+    g_object_freeze_notify(G_OBJECT(viewer->hadjustment));
+    g_object_freeze_notify(G_OBJECT(viewer->vadjustment));
+
+    gtk_adjustment_set_upper (
+            viewer->hadjustment,
+            ceil(image_width * scale));
+    gtk_adjustment_set_upper (
+            viewer->vadjustment,
+            ceil(image_height * scale));
+
+    gtk_adjustment_set_page_size (
+            viewer->hadjustment,
+            (gdouble)widget->allocation.width);
+    gtk_adjustment_set_page_size (
+            viewer->vadjustment,
+            (gdouble)widget->allocation.height);
+
+    if ( ( gtk_adjustment_get_value (viewer->hadjustment) +
+           gtk_adjustment_get_page_size (viewer->hadjustment) ) >
+           gtk_adjustment_get_upper (viewer->hadjustment) )
+    {
+        gtk_adjustment_set_value (
+                viewer->hadjustment,
+                (image_width * scale) - 
+                    (gdouble)widget->allocation.width);
+    }
+
+    if ( ( gtk_adjustment_get_value (viewer->vadjustment) +
+           gtk_adjustment_get_page_size (viewer->vadjustment) ) >
+           gtk_adjustment_get_upper (viewer->vadjustment) )
+    {
+        gtk_adjustment_set_value (
+                viewer->vadjustment,
+                (image_height * scale) - 
+                    (gdouble)widget->allocation.height);
+    }
+
+    g_object_thaw_notify(G_OBJECT(viewer->hadjustment));
+    g_object_thaw_notify(G_OBJECT(viewer->vadjustment));
+}
+
+static void
 rstto_image_viewer_paint (GtkWidget *widget, cairo_t *ctx)
 {
     RsttoImageViewer *viewer = RSTTO_IMAGE_VIEWER (widget);
@@ -800,7 +852,10 @@ rstto_image_viewer_paint (GtkWidget *widget, cairo_t *ctx)
     
 
     if(GTK_WIDGET_REALIZED(widget))
-    {          
+    {
+
+        correct_adjustments (viewer);
+
         cairo_rectangle (
                 ctx,
                 0.0,
@@ -1074,8 +1129,49 @@ rstto_image_viewer_set_scale (RsttoImageViewer *viewer, gdouble scale)
 {
     GtkWidget *widget = GTK_WIDGET (viewer);
 
+    gdouble x_offset = ((gdouble)widget->allocation.width - (
+            (gdouble)viewer->priv->image_width * 
+                viewer->priv->scale) ) / 2.0;
+    gdouble y_offset = ((gdouble)widget->allocation.height - (
+            (gdouble)viewer->priv->image_height * 
+                viewer->priv->scale) ) / 2.0;
+    gdouble tmp_x;
+    gdouble tmp_y;
+
+    if (x_offset < 0) x_offset = 0;
+    if (y_offset < 0) y_offset = 0;
+
+    tmp_x = (gtk_adjustment_get_value(viewer->hadjustment) + 
+            (gtk_adjustment_get_page_size (viewer->hadjustment) / 2) - 
+                x_offset) / viewer->priv->scale;
+    tmp_y = (gtk_adjustment_get_value(viewer->vadjustment) + 
+            (gtk_adjustment_get_page_size (viewer->vadjustment) / 2) - 
+                y_offset) / viewer->priv->scale;
+    
     set_scale (viewer, scale);
 
+    g_object_freeze_notify(G_OBJECT(viewer->hadjustment));
+    g_object_freeze_notify(G_OBJECT(viewer->vadjustment));
+
+    /* The value here can possibly be set to a wrong value,
+     * the _paint function calls 'correct adjustments' to
+     * solve this issue. Hence, we do not need to call it
+     * here.
+     */
+    gtk_adjustment_set_value (
+            viewer->vadjustment,
+            ( tmp_y * viewer->priv->scale -
+                ( gtk_adjustment_get_page_size (
+                        viewer->vadjustment) / 2 )));
+    gtk_adjustment_set_value (
+            viewer->hadjustment,
+            ( tmp_x * viewer->priv->scale -
+                ( gtk_adjustment_get_page_size (
+                        viewer->hadjustment) / 2 )));
+
+    g_object_thaw_notify(G_OBJECT(viewer->vadjustment));
+    g_object_thaw_notify(G_OBJECT(viewer->hadjustment));
+
     gdk_window_invalidate_rect (
             widget->window,
             NULL,
@@ -1155,7 +1251,11 @@ rstto_image_viewer_set_menu (
 static void
 cb_rstto_image_viewer_value_changed(GtkAdjustment *adjustment, RsttoImageViewer *viewer)
 {
-    rstto_image_viewer_queued_repaint (viewer, TRUE);
+    GtkWidget *widget = GTK_WIDGET (viewer);
+    gdk_window_invalidate_rect (
+            widget->window,
+            NULL,
+            FALSE);
 }
 
 static void


More information about the Xfce4-commits mailing list