From f8977feba2be26431daa91d515f88325f954e07b Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 16 Mar 2020 16:43:38 +0800 Subject: Implement addsource function for snapshotter --- platform/android/src/snapshotter/map_snapshotter.cpp | 12 ++++++++++++ platform/android/src/snapshotter/map_snapshotter.hpp | 2 ++ platform/android/src/style/sources/source.cpp | 15 +++++++++++++++ platform/android/src/style/sources/source.hpp | 2 ++ 4 files changed, 31 insertions(+) diff --git a/platform/android/src/snapshotter/map_snapshotter.cpp b/platform/android/src/snapshotter/map_snapshotter.cpp index abef7eeb21..3ec16e8baa 100644 --- a/platform/android/src/snapshotter/map_snapshotter.cpp +++ b/platform/android/src/snapshotter/map_snapshotter.cpp @@ -241,6 +241,17 @@ void MapSnapshotter::addLayerAbove(JNIEnv& env, jlong nativeLayerPtr, const jni: jni::ThrowNew(env, jni::FindClass(env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"), error.what()); } } + +void MapSnapshotter::addSource(JNIEnv& env, const jni::Object& obj, jlong sourcePtr) { + assert(sourcePtr != 0); + + Source *source = reinterpret_cast(sourcePtr); + try { + source->addToStyle(env, obj, snapshotter->getStyle()); + } catch (const std::runtime_error& error) { + jni::ThrowNew(env, jni::FindClass(env, "com/mapbox/mapboxsdk/style/sources/CannotAddSourceException"), error.what()); + } +} // Static methods // void MapSnapshotter::registerNative(jni::JNIEnv& env) { @@ -258,6 +269,7 @@ void MapSnapshotter::registerNative(jni::JNIEnv& env) { METHOD(&MapSnapshotter::addLayerAt, "nativeAddLayerAt"), METHOD(&MapSnapshotter::addLayerBelow, "nativeAddLayerBelow"), METHOD(&MapSnapshotter::addLayerAbove, "nativeAddLayerAbove"), + METHOD(&MapSnapshotter::addSource, "nativeAddSource"), METHOD(&MapSnapshotter::setStyleJson, "setStyleJson"), METHOD(&MapSnapshotter::setSize, "setSize"), METHOD(&MapSnapshotter::setCameraPosition, "setCameraPosition"), diff --git a/platform/android/src/snapshotter/map_snapshotter.hpp b/platform/android/src/snapshotter/map_snapshotter.hpp index 69895821ca..9239a5ea19 100644 --- a/platform/android/src/snapshotter/map_snapshotter.hpp +++ b/platform/android/src/snapshotter/map_snapshotter.hpp @@ -7,6 +7,7 @@ #include "../geometry/lat_lng_bounds.hpp" #include "../map/camera_position.hpp" #include "../style/layers/layer.hpp" +#include "../style/sources/source.hpp" #include @@ -54,6 +55,7 @@ public: void addLayerAt(JNIEnv&, jlong, jni::jint); void addLayerBelow(JNIEnv&, jlong, const jni::String&); void addLayerAbove(JNIEnv&, jlong, const jni::String&); + void addSource(JNIEnv&, const jni::Object&, jlong nativePtr); // MapSnapshotterObserver overrides void onDidFailLoadingStyle(const std::string&) override; diff --git a/platform/android/src/style/sources/source.cpp b/platform/android/src/style/sources/source.cpp index fda0f0084c..d16dd592fb 100644 --- a/platform/android/src/style/sources/source.cpp +++ b/platform/android/src/style/sources/source.cpp @@ -109,6 +109,21 @@ namespace android { return jni::Local(env, nullptr); } + void Source::addToStyle(JNIEnv &env, const jni::Object &obj, mbgl::style::Style& style) { + if (!ownedSource) { + throw std::runtime_error("Cannot add source twice"); + } + + // Add source to style and release ownership + style.addSource(std::move(ownedSource)); + + // Add peer to core source + source.peer = std::unique_ptr(this); + + // Add strong reference to java source + javaPeer = jni::NewGlobal(env, obj); + } + void Source::addToMap(JNIEnv& env, const jni::Object& obj, mbgl::Map& map, AndroidRendererFrontend& frontend) { // Check to see if we own the source first if (!ownedSource) { diff --git a/platform/android/src/style/sources/source.hpp b/platform/android/src/style/sources/source.hpp index 91e31ea8e2..723d4740b0 100644 --- a/platform/android/src/style/sources/source.hpp +++ b/platform/android/src/style/sources/source.hpp @@ -47,6 +47,8 @@ public: jni::Local getPrefetchZoomDelta(jni::JNIEnv&); + void addToStyle(JNIEnv &env, const jni::Object &obj, mbgl::style::Style& style); + protected: // Set on newly created sources until added to the map. std::unique_ptr ownedSource; -- cgit v1.2.1