From 63344e01ef7276c8b72ec17a7b354b75265e026e Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Wed, 28 Jun 2017 14:23:39 +0300 Subject: [PATCH 1/2] [core] Clamp to scale boundaries in TransformState::setLatLngZoom --- src/mbgl/map/transform_state.cpp | 2 +- test/map/transform.test.cpp | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp index bbf7e22b310..f052e30a6b2 100644 --- a/src/mbgl/map/transform_state.cpp +++ b/src/mbgl/map/transform_state.cpp @@ -358,7 +358,7 @@ void TransformState::setLatLngZoom(const LatLng& latLng, double zoom) { constrained = bounds->constrain(latLng); } - double newScale = zoomScale(zoom); + double newScale = util::clamp(zoomScale(zoom), min_scale, max_scale); const double newWorldSize = newScale * util::tileSize; Bc = newWorldSize / util::DEGREES_MAX; Cc = newWorldSize / util::M2PI; diff --git a/test/map/transform.test.cpp b/test/map/transform.test.cpp index aa49d250b6e..6d41a868dc5 100644 --- a/test/map/transform.test.cpp +++ b/test/map/transform.test.cpp @@ -28,6 +28,22 @@ TEST(Transform, InvalidZoom) { ASSERT_DOUBLE_EQ(0, transform.getLatLng().latitude()); ASSERT_DOUBLE_EQ(0, transform.getLatLng().longitude()); ASSERT_DOUBLE_EQ(1, transform.getZoom()); + + transform.setZoom(transform.getState().getMaxZoom() + 0.1); + ASSERT_DOUBLE_EQ(transform.getZoom(), transform.getState().getMaxZoom()); + + CameraOptions cameraOptions; + cameraOptions.center = LatLng { util::LATITUDE_MAX, util::LONGITUDE_MAX }; + cameraOptions.zoom = transform.getState().getMaxZoom(); + + // Executing flyTo with maximum zoom level to the same zoom level causes + // frameZoom to be bigger than maximum zoom. + transform.resize(Size { 100, 100 }); + transform.flyTo(cameraOptions); + transform.updateTransitions(transform.getTransitionStart() + transform.getTransitionDuration()); + + ASSERT_TRUE(transform.getState().valid()); + ASSERT_DOUBLE_EQ(transform.getState().getMaxZoom(), transform.getZoom()); } From 47c336dc30c612664c00df67889cc8280fc21032 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Wed, 28 Jun 2017 14:36:28 +0300 Subject: [PATCH 2/2] [core] Check if frameZoom is NaN in Transform::flyTo callback --- src/mbgl/map/transform.cpp | 5 +++++ test/map/transform.test.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index 8d05bc0e913..50f979437d7 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -293,6 +293,11 @@ void Transform::flyTo(const CameraOptions &camera, const AnimationOptions &anima Point framePoint = util::interpolate(startPoint, endPoint, us); double frameZoom = startZoom + state.scaleZoom(1 / w(s)); + // Zoom can be NaN if size is empty. + if (std::isnan(frameZoom)) { + frameZoom = zoom; + } + // Convert to geographic coordinates and set the new viewpoint. LatLng frameLatLng = Projection::unproject(framePoint, startScale); state.setLatLngZoom(frameLatLng, frameZoom); diff --git a/test/map/transform.test.cpp b/test/map/transform.test.cpp index 6d41a868dc5..11c2c1cc6b1 100644 --- a/test/map/transform.test.cpp +++ b/test/map/transform.test.cpp @@ -36,6 +36,11 @@ TEST(Transform, InvalidZoom) { cameraOptions.center = LatLng { util::LATITUDE_MAX, util::LONGITUDE_MAX }; cameraOptions.zoom = transform.getState().getMaxZoom(); + // Executing flyTo with an empty size causes frameZoom to be NaN. + transform.flyTo(cameraOptions); + transform.updateTransitions(transform.getTransitionStart() + transform.getTransitionDuration()); + ASSERT_DOUBLE_EQ(transform.getZoom(), transform.getState().getMaxZoom()); + // Executing flyTo with maximum zoom level to the same zoom level causes // frameZoom to be bigger than maximum zoom. transform.resize(Size { 100, 100 });