From 52cce7925d32181a20a79978479c5552fa6ae810 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Fri, 23 Nov 2018 22:47:40 +0200 Subject: [core] Camera center and anchor points are mutually exclusive --- include/mbgl/map/camera.hpp | 5 ++++- src/mbgl/map/transform.cpp | 4 +++- test/map/transform.test.cpp | 13 +++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/include/mbgl/map/camera.hpp b/include/mbgl/map/camera.hpp index 33722a0018..d5563b5ccf 100644 --- a/include/mbgl/map/camera.hpp +++ b/include/mbgl/map/camera.hpp @@ -10,7 +10,10 @@ namespace mbgl { /** Various options for describing the viewpoint of a map. All fields are - optional. */ + optional. + Anchor and center points are mutually exclusive, with preference for the + center point when both are set. + */ struct CameraOptions { /** Coordinate at the center of the map. */ optional center; diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index 0d633499cf..03a1e117f7 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -561,7 +561,9 @@ void Transform::startTransition(const CameraOptions& camera, observer.onCameraWillChange(isAnimated ? MapObserver::CameraChangeMode::Animated : MapObserver::CameraChangeMode::Immediate); // Associate the anchor, if given, with a coordinate. - optional anchor = camera.anchor; + // Anchor and center points are mutually exclusive, with preference for the + // center point when both are set. + optional anchor = camera.center ? nullopt : camera.anchor; LatLng anchorLatLng; if (anchor) { anchor->y = state.size.height - anchor->y; diff --git a/test/map/transform.test.cpp b/test/map/transform.test.cpp index 44b5f49366..06df34c4c4 100644 --- a/test/map/transform.test.cpp +++ b/test/map/transform.test.cpp @@ -476,6 +476,19 @@ TEST(Transform, Camera) { transform.updateTransitions(transform.getTransitionStart() + Milliseconds(750)); transform.updateTransitions(transform.getTransitionStart() + transform.getTransitionDuration()); ASSERT_FALSE(transform.inTransition()); + + // Anchor and center points are mutually exclusive. + CameraOptions camera; + camera.center = LatLng { 0, 0 }; + camera.anchor = ScreenCoordinate { 0, 0 }; // top-left + camera.zoom = transform.getState().getMaxZoom(); + transform.easeTo(camera, AnimationOptions(Seconds(1))); + transform.updateTransitions(transform.getTransitionStart() + Milliseconds(250)); + transform.updateTransitions(transform.getTransitionStart() + Milliseconds(500)); + transform.updateTransitions(transform.getTransitionStart() + Milliseconds(750)); + transform.updateTransitions(transform.getTransitionStart() + transform.getTransitionDuration()); + ASSERT_DOUBLE_EQ(transform.getLatLng().latitude(), 0); + ASSERT_DOUBLE_EQ(transform.getLatLng().longitude(), 0); } TEST(Transform, DefaultTransform) { -- cgit v1.2.1