summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiří Techet <techet@gmail.com>2013-05-08 01:45:00 +0200
committerJiří Techet <techet@gmail.com>2013-05-08 01:45:00 +0200
commita31db71dd4270bc68d80046d3538f7bf15319b1b (patch)
tree7715d87dab3514e030fefed231b48767a3905ede
parent6a90f2766d21cbc17d69c1f9ee22f998db3f49e5 (diff)
downloadlibchamplain-a31db71dd4270bc68d80046d3538f7bf15319b1b.tar.gz
When zooming-in, recalculate viewport position from latitude/longitude to avoid rounding errors
-rw-r--r--champlain/champlain-view.c13
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;