=== modified file 'libview/ev-view.c'
--- libview/ev-view.c	2010-09-15 15:05:47 +0000
+++ libview/ev-view.c	2010-11-17 22:07:11 +0000
@@ -5297,27 +5297,39 @@
 }
 
 void
+ev_view_zoom_in_smooth (EvView *view, float factor)
+{
+	gdouble scale;
+
+	g_return_if_fail (view->sizing_mode == EV_SIZING_FREE);
+
+	view->pending_scroll = SCROLL_TO_CENTER;
+	scale = ev_document_model_get_scale (view->model) * factor;
+	ev_document_model_set_scale (view->model, scale);
+}
+
+void
 ev_view_zoom_in (EvView *view)
 {
+	ev_view_zoom_in_smooth (view, ZOOM_IN_FACTOR);
+}
+
+void
+ev_view_zoom_out_smooth (EvView *view, float factor)
+{
 	gdouble scale;
 
 	g_return_if_fail (view->sizing_mode == EV_SIZING_FREE);
 
 	view->pending_scroll = SCROLL_TO_CENTER;
-	scale = ev_document_model_get_scale (view->model) * ZOOM_IN_FACTOR;
+	scale = ev_document_model_get_scale (view->model) * factor;
 	ev_document_model_set_scale (view->model, scale);
 }
 
 void
 ev_view_zoom_out (EvView *view)
 {
-	gdouble scale;
-
-	g_return_if_fail (view->sizing_mode == EV_SIZING_FREE);
-
-	view->pending_scroll = SCROLL_TO_CENTER;
-	scale = ev_document_model_get_scale (view->model) * ZOOM_OUT_FACTOR;
-	ev_document_model_set_scale (view->model, scale);
+	ev_view_zoom_out_smooth (view, ZOOM_OUT_FACTOR);
 }
 
 static double

=== modified file 'libview/ev-view.h'
--- libview/ev-view.h	2010-07-20 15:07:40 +0000
+++ libview/ev-view.h	2010-11-17 22:07:11 +0000
@@ -65,8 +65,10 @@
 /* Page size */
 gboolean	ev_view_can_zoom_in       (EvView         *view);
 void		ev_view_zoom_in		  (EvView         *view);
+void            ev_view_zoom_in_smooth    (EvView         *view, float factor);
 gboolean        ev_view_can_zoom_out      (EvView         *view);
 void		ev_view_zoom_out	  (EvView         *view);
+void            ev_view_zoom_out_smooth   (EvView         *view, float factor);
 
 /* Find */
 void            ev_view_find_next                 (EvView         *view);

=== modified file 'shell/ev-window.c'
--- shell/ev-window.c	2010-10-12 18:00:39 +0000
+++ shell/ev-window.c	2010-11-17 22:07:11 +0000
@@ -5448,22 +5448,26 @@
 ev_pinch_gesture_update (GtkWindow       *window,
 			 IdoGestureEvent *event)
 {
+	IdoEventGesturePinch *pinch = (IdoEventGesturePinch *)event;
+	EvWindowPrivate *priv = EV_WINDOW (window)->priv;
+	gdouble increment = pinch->radius_delta * 0.01;
+
+	if (increment < 0.0) increment = -increment;
+	increment += 1.0;
+
+	if (pinch->radius_delta < 0.0) {
+		ev_document_model_set_sizing_mode (priv->model, EV_SIZING_FREE);
+		ev_view_zoom_out_smooth (priv->view, (1.0 / increment));
+	} else if (pinch->radius_delta > 0.0) {
+		ev_document_model_set_sizing_mode (priv->model, EV_SIZING_FREE);
+		ev_view_zoom_in_smooth (priv->view, increment);
+	}
 }
 
 static void
 ev_pinch_gesture_end (GtkWindow       *window,
 		      IdoGestureEvent *event)
 {
-	IdoEventGesturePinch *pinch = (IdoEventGesturePinch *)event;
-	EvWindowPrivate *priv = EV_WINDOW (window)->priv;
-
-	gdouble diff = pinch->radius - priv->pinch_start_radius;
-
-	if (diff <= -100) {
-		ev_window_cmd_view_zoom_out (NULL, EV_WINDOW (window));
-	} else if (diff >= 100) {
-		ev_window_cmd_view_zoom_in (NULL, EV_WINDOW (window));
-	}
 }
 
 static void

