[Xfce4-commits] <ristretto:master> Implement rotation

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


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

commit ce0d6809b7dcecc0fb32f9aee2558f94a150339a
Author: Stephan Arts <stephan at xfce.org>
Date:   Fri Oct 21 09:50:05 2011 +0200

    Implement rotation

 src/image_viewer.c |  259 ++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 211 insertions(+), 48 deletions(-)

diff --git a/src/image_viewer.c b/src/image_viewer.c
index 55e7264..4c6ac90 100644
--- a/src/image_viewer.c
+++ b/src/image_viewer.c
@@ -583,8 +583,23 @@ set_scale (
         gdouble scale )
 {
     gboolean auto_scale = FALSE;
-    gdouble v_scale = (gdouble)(GTK_WIDGET (viewer)->allocation.height) / (gdouble)viewer->priv->image_height;
-    gdouble h_scale = (gdouble)(GTK_WIDGET (viewer)->allocation.width) / (gdouble)viewer->priv->image_width;
+    gdouble v_scale;
+    gdouble h_scale;
+
+    switch (viewer->priv->orientation)
+    {
+        case RSTTO_IMAGE_ORIENT_90:
+        case RSTTO_IMAGE_ORIENT_270:
+            v_scale = (gdouble)(GTK_WIDGET (viewer)->allocation.width) / (gdouble)viewer->priv->image_height;
+            h_scale = (gdouble)(GTK_WIDGET (viewer)->allocation.height) / (gdouble)viewer->priv->image_width;
+            break;
+        case RSTTO_IMAGE_ORIENT_NONE:
+        case RSTTO_IMAGE_ORIENT_180:
+        default:
+            v_scale = (gdouble)(GTK_WIDGET (viewer)->allocation.width) / (gdouble)viewer->priv->image_width;
+            h_scale = (gdouble)(GTK_WIDGET (viewer)->allocation.height) / (gdouble)viewer->priv->image_height;
+            break;
+    }
 
     if (scale == -1.0)
     {
@@ -641,9 +656,6 @@ set_scale (
              *
              * Whichever comes last.
              */
-            v_scale = (gdouble)(GTK_WIDGET (viewer)->allocation.height) / (gdouble)viewer->priv->image_height;
-            h_scale = (gdouble)(GTK_WIDGET (viewer)->allocation.width) / (gdouble)viewer->priv->image_width;
-
             if ((h_scale > RSTTO_MAX_SCALE) || (v_scale > RSTTO_MAX_SCALE))
             {
                 if(h_scale < v_scale)
@@ -805,38 +817,80 @@ correct_adjustments ( RsttoImageViewer *viewer )
     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) )
+    switch (viewer->priv->orientation)
     {
-        gtk_adjustment_set_value (
-                viewer->hadjustment,
-                (image_width * scale) - 
+        case RSTTO_IMAGE_ORIENT_NONE:
+        case RSTTO_IMAGE_ORIENT_180:
+            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->vadjustment) +
-           gtk_adjustment_get_page_size (viewer->vadjustment) ) >
-           gtk_adjustment_get_upper (viewer->vadjustment) )
-    {
-        gtk_adjustment_set_value (
-                viewer->vadjustment,
-                (image_height * scale) - 
+            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);
+            }
+            break;
+        case RSTTO_IMAGE_ORIENT_90:
+        case RSTTO_IMAGE_ORIENT_270:
+            gtk_adjustment_set_upper (
+                    viewer->hadjustment,
+                    ceil(image_height * scale));
+            gtk_adjustment_set_upper (
+                    viewer->vadjustment,
+                    ceil(image_width * 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_height * 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_width * scale) - 
+                            (gdouble)widget->allocation.height);
+            }
+            break;
     }
 
     g_object_thaw_notify(G_OBJECT(viewer->hadjustment));
@@ -890,7 +944,93 @@ rstto_image_viewer_paint (GtkWidget *widget, cairo_t *ctx)
                 /* TODO: make this work for all rotations */
                 switch (viewer->priv->orientation)
                 {
+                    case RSTTO_IMAGE_ORIENT_90:
+                        cairo_rotate (
+                                ctx,
+                                M_PI*0.5);
+                        cairo_translate (
+                                ctx,
+                                0.0 - gtk_adjustment_get_value (viewer->vadjustment),
+                                gtk_adjustment_get_value (viewer->hadjustment));
+                        cairo_translate (
+                                ctx,
+                                0.0,
+                                -1.0 * viewer->priv->image_height * viewer->priv->scale);
+
+                        y_offset = -1.0 * (((gdouble)widget->allocation.width - (
+                                    (gdouble)viewer->priv->image_height * 
+                                        viewer->priv->scale) ) / 2.0);
+                        x_offset =  ((gdouble)widget->allocation.height - (
+                                    (gdouble)viewer->priv->image_width * 
+                                        viewer->priv->scale) ) / 2.0;
+                        if (x_offset < 0.0)
+                        {
+                            x_offset = 0.0;
+                        }
+                        if (y_offset > 0.0)
+                        {
+                            y_offset = 0.0;
+                        }
+                        break;
+                    case RSTTO_IMAGE_ORIENT_270:
+                        cairo_rotate (
+                                ctx,
+                                M_PI*1.5);
+                        cairo_translate (
+                                ctx,
+                                gtk_adjustment_get_value (viewer->vadjustment),
+                                0.0 - gtk_adjustment_get_value (viewer->hadjustment));
+                        cairo_translate (
+                                ctx,
+                                -1.0 * viewer->priv->image_width * viewer->priv->scale,
+                                0.0);
+
+                        y_offset = (((gdouble)widget->allocation.width - (
+                                    (gdouble)viewer->priv->image_height * 
+                                        viewer->priv->scale) ) / 2.0);
+                        x_offset = -1.0 * ((gdouble)widget->allocation.height - (
+                                    (gdouble)viewer->priv->image_width * 
+                                        viewer->priv->scale) ) / 2.0;
+                        if (x_offset > 0.0)
+                        {
+                            x_offset = 0.0;
+                        }
+                        if (y_offset < 0.0)
+                        {
+                            y_offset = 0.0;
+                        }
+                        break;
+                    case RSTTO_IMAGE_ORIENT_180:
+                        cairo_rotate (
+                                ctx,
+                                M_PI);
+                        cairo_translate (
+                                ctx,
+                                gtk_adjustment_get_value (viewer->hadjustment),
+                                gtk_adjustment_get_value (viewer->vadjustment));
+                        cairo_translate (
+                                ctx,
+                                -1.0 * viewer->priv->image_width * viewer->priv->scale,
+                                -1.0 * viewer->priv->image_height * viewer->priv->scale);
+
+                        x_offset = -1.0 * ((gdouble)widget->allocation.width - (
+                                    (gdouble)viewer->priv->image_width * 
+                                        viewer->priv->scale) ) / 2.0;
+                        y_offset = -1.0 * ((gdouble)widget->allocation.height - (
+                                    (gdouble)viewer->priv->image_height * 
+                                        viewer->priv->scale) ) / 2.0;
+
+                        if (x_offset > 0.0)
+                        {
+                            x_offset = 0.0;
+                        }
+                        if (y_offset > 0.0)
+                        {
+                            y_offset = 0.0;
+                        }
+                        break;
                     case RSTTO_IMAGE_ORIENT_NONE:
+                    default:
                         cairo_translate (
                                 ctx,
                                 0.0 - gtk_adjustment_get_value (viewer->hadjustment),
@@ -901,25 +1041,24 @@ rstto_image_viewer_paint (GtkWidget *widget, cairo_t *ctx)
                         y_offset = ((gdouble)widget->allocation.height - (
                                     (gdouble)viewer->priv->image_height * 
                                         viewer->priv->scale) ) / 2.0;
+                        if (x_offset < 0.0)
+                        {
+                            x_offset = 0.0;
+                        }
+                        if (y_offset < 0.0)
+                        {
+                            y_offset = 0.0;
+                        }
                         break;
 
                 }
 
-                if (x_offset < 0.)
-                {
-                    x_offset = 0.0;
-                }
-                if (y_offset < 0.)
-                {
-                    y_offset = 0.0;
-                }
 
                 cairo_translate (
                         ctx,
                         x_offset,
                         y_offset);
 
-                /* TODO: center image on widget when zoomed out */
                 cairo_scale (
                         ctx,
                         (viewer->priv->scale/viewer->priv->image_scale),
@@ -1129,15 +1268,33 @@ 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 x_offset;
+    gdouble y_offset;
     gdouble tmp_x;
     gdouble tmp_y;
 
+    switch (viewer->priv->orientation)
+    {
+        case RSTTO_IMAGE_ORIENT_90:
+        case RSTTO_IMAGE_ORIENT_270:
+            x_offset = ((gdouble)widget->allocation.width - (
+                (gdouble)viewer->priv->image_height * 
+                    viewer->priv->scale) ) / 2.0;
+            y_offset = ((gdouble)widget->allocation.height - (
+                (gdouble)viewer->priv->image_width * 
+                    viewer->priv->scale) ) / 2.0;
+            break;
+        case RSTTO_IMAGE_ORIENT_NONE:
+        default:
+            x_offset = ((gdouble)widget->allocation.width - (
+                (gdouble)viewer->priv->image_width * 
+                    viewer->priv->scale) ) / 2.0;
+            y_offset = ((gdouble)widget->allocation.height - (
+                (gdouble)viewer->priv->image_height * 
+                    viewer->priv->scale) ) / 2.0;
+            break;
+    }
+
     if (x_offset < 0) x_offset = 0;
     if (y_offset < 0) y_offset = 0;
 
@@ -1205,6 +1362,12 @@ rstto_image_viewer_set_orientation (
     GtkWidget *widget = GTK_WIDGET (viewer); 
 
     viewer->priv->orientation = orientation;
+
+    if (viewer->priv->auto_scale)
+    {
+        set_scale (viewer, 0.0);
+    }
+
     rstto_file_set_orientation (viewer->priv->file, orientation);
 
     gdk_window_invalidate_rect (


More information about the Xfce4-commits mailing list