[libchamplain] When zooming-in, recalculate viewport position from latitude/longitude to avoid rounding errors



commit a31db71dd4270bc68d80046d3538f7bf15319b1b
Author: Jiří Techet <techet gmail com>
Date:   Wed May 8 01:45:00 2013 +0200

    When zooming-in, recalculate viewport position from latitude/longitude to avoid rounding errors

 champlain/champlain-view.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)
---
diff --git a/champlain/champlain-view.c b/champlain/champlain-view.c
index 644e396..3bf7979 100644
--- a/champlain/champlain-view.c
+++ b/champlain/champlain-view.c
@@ -2490,6 +2490,8 @@ view_set_zoom_level_at (ChamplainView *view,
   gdouble new_x, new_y;
   gdouble offset_x = x;
   gdouble offset_y = y;
+  gdouble viewport_x, viewport_y;
+  gdouble deltazoom;
 
   if (zoom_level == priv->zoom_level || ZOOM_LEVEL_OUT_OF_RANGE (priv, zoom_level))
     return FALSE;
@@ -2506,9 +2508,14 @@ view_set_zoom_level_at (ChamplainView *view,
   if (CLUTTER_ACTOR_IS_REALIZED (view))
     show_zoom_actor (view, zoom_level, offset_x, offset_y);
 
-  gdouble deltazoom = pow (2, -(gdouble)priv->zoom_level + (gdouble)zoom_level);
-  new_x = (priv->viewport_x + offset_x) * deltazoom - offset_x;
-  new_y = (priv->viewport_y + offset_y) * deltazoom - offset_y;
+  deltazoom = pow (2, -(gdouble)priv->zoom_level + (gdouble)zoom_level);
+
+  /* priv->viewport_x, priv->viewport_y are in int which isn't sufficient precision
+   * when multiplied by deltazoom - recalculate them */
+  viewport_x = champlain_map_source_get_x (priv->map_source, priv->zoom_level, priv->longitude);
+  viewport_y = champlain_map_source_get_y (priv->map_source, priv->zoom_level, priv->latitude);
+  new_x = (viewport_x + offset_x) * deltazoom - offset_x;
+  new_y = (viewport_y + offset_y) * deltazoom - offset_y;
 
   priv->zoom_level = zoom_level;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]