summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortobrun <tobrun.van.nuland@gmail.com>2018-06-26 18:07:18 +0200
committertobrun <tobrun.van.nuland@gmail.com>2018-06-26 18:10:51 +0200
commitc6f1d619ca12bfdcf6aaaeafc4e0399cd38283c7 (patch)
tree7379d11afa167824afe4345f58557c023626b6e9
parent36defd39910fb4c186b3704eec930ade0800c873 (diff)
downloadqtlocation-mapboxgl-upstream/tvn-add-latlngforpixel-snapshot.tar.gz
[core] - add LatLng for screencoordinate to mapsnapshotterupstream/tvn-add-latlngforpixel-snapshot
-rw-r--r--platform/android/src/graphics/pointf.cpp7
-rw-r--r--platform/android/src/graphics/pointf.hpp2
-rw-r--r--platform/android/src/snapshotter/map_snapshot.cpp14
-rw-r--r--platform/android/src/snapshotter/map_snapshot.hpp7
-rw-r--r--platform/android/src/snapshotter/map_snapshotter.cpp4
-rw-r--r--platform/default/mbgl/map/map_snapshotter.cpp12
-rw-r--r--platform/default/mbgl/map/map_snapshotter.hpp3
7 files changed, 37 insertions, 12 deletions
diff --git a/platform/android/src/graphics/pointf.cpp b/platform/android/src/graphics/pointf.cpp
index 6e91b81416..3f854da2ea 100644
--- a/platform/android/src/graphics/pointf.cpp
+++ b/platform/android/src/graphics/pointf.cpp
@@ -1,3 +1,4 @@
+#include <mbgl/util/geo.hpp>
#include "pointf.hpp"
namespace mbgl {
@@ -8,6 +9,12 @@ jni::Object<PointF> PointF::New(jni::JNIEnv& env, float x, float y) {
return PointF::javaClass.New(env, constructor, x, y);
}
+mbgl::ScreenCoordinate PointF::getScreenCoordinate(jni::JNIEnv& env, jni::Object<PointF> point) {
+ static auto xField = PointF::javaClass.GetField<jni::jfloat>(env, "x");
+ static auto yField = PointF::javaClass.GetField<jni::jfloat>(env, "y");
+ return mbgl::ScreenCoordinate{point.Get(env, xField), point.Get(env, yField)};
+}
+
void PointF::registerNative(jni::JNIEnv& env) {
// Lookup the class
PointF::javaClass = *jni::Class<PointF>::Find(env).NewGlobalRef(env).release();
diff --git a/platform/android/src/graphics/pointf.hpp b/platform/android/src/graphics/pointf.hpp
index ea25ad2b40..e3ef24dd65 100644
--- a/platform/android/src/graphics/pointf.hpp
+++ b/platform/android/src/graphics/pointf.hpp
@@ -14,6 +14,8 @@ public:
static jni::Object<PointF> New(jni::JNIEnv&, float, float);
+ static mbgl::ScreenCoordinate getScreenCoordinate(jni::JNIEnv&, jni::Object<PointF>);
+
static jni::Class<PointF> javaClass;
static void registerNative(jni::JNIEnv&);
diff --git a/platform/android/src/snapshotter/map_snapshot.cpp b/platform/android/src/snapshotter/map_snapshot.cpp
index bbbf7cc207..42c1c16ca1 100644
--- a/platform/android/src/snapshotter/map_snapshot.cpp
+++ b/platform/android/src/snapshotter/map_snapshot.cpp
@@ -8,9 +8,10 @@
namespace mbgl {
namespace android {
-MapSnapshot::MapSnapshot(float pixelRatio_, MapSnapshot::PointForFn pointForFn_)
+MapSnapshot::MapSnapshot(float pixelRatio_, MapSnapshot::PointForFn pointForFn_, MapSnapshot::LatLngForFn latLngForFn_)
: pixelRatio(pixelRatio_)
- , pointForFn(std::move(pointForFn_)) {
+ , pointForFn(std::move(pointForFn_))
+ , latLngForFn(std::move(latLngForFn_)) {
}
MapSnapshot::~MapSnapshot() = default;
@@ -20,8 +21,8 @@ jni::Object<PointF> MapSnapshot::pixelForLatLng(jni::JNIEnv& env, jni::Object<La
return PointF::New(env, point.x * pixelRatio, point.y * pixelRatio);
}
-jni::Object<LatLng> MapSnapshot::latLngForPixel(jni::JNIEnv& env, jni::Object<PointF>) {
- return LatLng::New(env, {0, 0});
+jni::Object<LatLng> MapSnapshot::latLngForPixel(jni::JNIEnv& env, jni::Object<PointF>jPoint) {
+ return LatLng::New(env, latLngForFn(PointF::getScreenCoordinate(env, jPoint)));
}
// Static methods //
@@ -31,13 +32,14 @@ jni::Object<MapSnapshot> MapSnapshot::New(JNIEnv& env,
float pixelRatio,
std::vector<std::string> attributions,
bool showLogo,
- mbgl::MapSnapshotter::PointForFn pointForFn) {
+ mbgl::MapSnapshotter::PointForFn pointForFn,
+ mbgl::MapSnapshotter::LatLngForFn latLngForFn) {
// Create the bitmap
auto bitmap = Bitmap::CreateBitmap(env, std::move(image));
// Create the Mapsnapshot peers
static auto constructor = javaClass.GetConstructor<jni::jlong, jni::Object<Bitmap>, jni::Array<jni::String>, jni::jboolean>(env);
- auto nativePeer = std::make_unique<MapSnapshot>(pixelRatio, pointForFn);
+ auto nativePeer = std::make_unique<MapSnapshot>(pixelRatio, pointForFn, latLngForFn);
return javaClass.New(env, constructor, reinterpret_cast<jlong>(nativePeer.release()), bitmap, jni::Make<jni::Array<jni::String>>(env, attributions), (jni::jboolean) showLogo);
}
diff --git a/platform/android/src/snapshotter/map_snapshot.hpp b/platform/android/src/snapshotter/map_snapshot.hpp
index 48dd1b6049..f168be85b4 100644
--- a/platform/android/src/snapshotter/map_snapshot.hpp
+++ b/platform/android/src/snapshotter/map_snapshot.hpp
@@ -17,6 +17,7 @@ class MapSnapshot {
public:
using PointForFn = mbgl::MapSnapshotter::PointForFn;
+ using LatLngForFn = mbgl::MapSnapshotter::LatLngForFn;
static constexpr auto Name() { return "com/mapbox/mapboxsdk/snapshotter/MapSnapshot"; };
@@ -27,10 +28,11 @@ public:
float pixelRatio,
std::vector<std::string> attributions,
bool showLogo,
- PointForFn pointForFn);
+ PointForFn pointForFn,
+ LatLngForFn latLngForFn);
MapSnapshot(jni::JNIEnv&) {};
- MapSnapshot(float pixelRatio, PointForFn);
+ MapSnapshot(float pixelRatio, PointForFn, LatLngForFn);
~MapSnapshot();
jni::Object<PointF> pixelForLatLng(jni::JNIEnv&, jni::Object<LatLng>);
@@ -41,6 +43,7 @@ private:
float pixelRatio;
mbgl::MapSnapshotter::PointForFn pointForFn;
+ mbgl::MapSnapshotter::LatLngForFn latLngForFn;
};
} // namespace android
diff --git a/platform/android/src/snapshotter/map_snapshotter.cpp b/platform/android/src/snapshotter/map_snapshotter.cpp
index 155fdf81fb..fae941874e 100644
--- a/platform/android/src/snapshotter/map_snapshotter.cpp
+++ b/platform/android/src/snapshotter/map_snapshotter.cpp
@@ -77,7 +77,7 @@ void MapSnapshotter::start(JNIEnv& env) {
snapshotCallback = std::make_unique<Actor<mbgl::MapSnapshotter::Callback>>(
*Scheduler::GetCurrent(),
- [this](std::exception_ptr err, PremultipliedImage image, std::vector<std::string> attributions, mbgl::MapSnapshotter::PointForFn pointForFn) {
+ [this](std::exception_ptr err, PremultipliedImage image, std::vector<std::string> attributions, mbgl::MapSnapshotter::PointForFn pointForFn, mbgl::MapSnapshotter::LatLngForFn latLngForFn) {
MBGL_VERIFY_THREAD(tid);
android::UniqueEnv _env = android::AttachEnv();
@@ -89,7 +89,7 @@ void MapSnapshotter::start(JNIEnv& env) {
jni::DeleteLocalRef(*_env, message);
} else {
// Create the wrapper
- auto mapSnapshot = android::MapSnapshot::New(*_env, std::move(image), pixelRatio, attributions, showLogo, pointForFn);
+ auto mapSnapshot = android::MapSnapshot::New(*_env, std::move(image), pixelRatio, attributions, showLogo, pointForFn, latLngForFn);
// invoke callback
static auto onSnapshotReady = javaClass.GetMethod<void (jni::Object<MapSnapshot>)>(*_env, "onSnapshotReady");
diff --git a/platform/default/mbgl/map/map_snapshotter.cpp b/platform/default/mbgl/map/map_snapshotter.cpp
index a909e3fe9b..0f65e2d924 100644
--- a/platform/default/mbgl/map/map_snapshotter.cpp
+++ b/platform/default/mbgl/map/map_snapshotter.cpp
@@ -85,6 +85,15 @@ void MapSnapshotter::Impl::snapshot(ActorRef<MapSnapshotter::Callback> callback)
return transform.latLngToScreenCoordinate(unwrappedLatLng);
}};
+ // Create lambda that captures the current transform state
+ // and can be used to translate for geographic to screen
+ // coordinates
+ assert (frontend.getTransformState());
+ LatLngForFn latLngForFn { [=, transformState = *frontend.getTransformState()] (const ScreenCoordinate& screenCoordinate) {
+ Transform transform { transformState };
+ return transform.screenCoordinateToLatLng(screenCoordinate);
+ }};
+
// Collect all source attributions
std::vector<std::string> attributions;
for (auto source : map.getStyle().getSources()) {
@@ -100,7 +109,8 @@ void MapSnapshotter::Impl::snapshot(ActorRef<MapSnapshotter::Callback> callback)
error,
error ? PremultipliedImage() : frontend.readStillImage(),
std::move(attributions),
- std::move(pointForFn)
+ std::move(pointForFn),
+ std::move(latLngForFn)
);
});
}
diff --git a/platform/default/mbgl/map/map_snapshotter.hpp b/platform/default/mbgl/map/map_snapshotter.hpp
index b9e6307664..f2e571c686 100644
--- a/platform/default/mbgl/map/map_snapshotter.hpp
+++ b/platform/default/mbgl/map/map_snapshotter.hpp
@@ -52,8 +52,9 @@ public:
LatLngBounds getRegion() const;
using PointForFn = std::function<ScreenCoordinate (const LatLng&)>;
+ using LatLngForFn = std::function<LatLng (const ScreenCoordinate&)>;
using Attributions = std::vector<std::string>;
- using Callback = std::function<void (std::exception_ptr, PremultipliedImage, Attributions, PointForFn)>;
+ using Callback = std::function<void (std::exception_ptr, PremultipliedImage, Attributions, PointForFn, LatLngForFn)>;
void snapshot(ActorRef<Callback>);
private: