From c17be060fd910dbcaf7334356743421ac6936e7e Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Mon, 18 Sep 2017 11:31:45 +0300 Subject: [android] map snapshots --- .../com/mapbox/mapboxsdk/maps/NativeMapView.java | 13 ++++------- platform/android/src/android_renderer_frontend.cpp | 9 -------- platform/android/src/android_renderer_frontend.hpp | 8 ------- platform/android/src/map_renderer.cpp | 25 ++++++++++++++++++++++ platform/android/src/map_renderer.hpp | 12 +++++++++++ platform/android/src/native_map_view.cpp | 12 +++++------ platform/android/src/native_map_view.hpp | 2 ++ 7 files changed, 49 insertions(+), 32 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index 62fe2be0c3..5be74258fd 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -807,13 +807,6 @@ final class NativeMapView { return features != null ? Arrays.asList(features) : new ArrayList(); } - public void scheduleTakeSnapshot() { - if (isDestroyedOn("scheduleTakeSnapshot")) { - return; - } - nativeTakeSnapshot(); - } - public void setApiBaseUrl(String baseUrl) { if (isDestroyedOn("setApiBaseUrl")) { return; @@ -1076,9 +1069,11 @@ final class NativeMapView { // void addSnapshotCallback(@NonNull MapboxMap.SnapshotReadyCallback callback) { + if (isDestroyedOn("addSnapshotCallback")) { + return; + } snapshotReadyCallback = callback; - scheduleTakeSnapshot(); - scheduler.requestRender(); + nativeTakeSnapshot(); } } diff --git a/platform/android/src/android_renderer_frontend.cpp b/platform/android/src/android_renderer_frontend.cpp index ac29639bd4..b80e23e21f 100644 --- a/platform/android/src/android_renderer_frontend.cpp +++ b/platform/android/src/android_renderer_frontend.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include "android_renderer_backend.hpp" @@ -113,14 +112,6 @@ AnnotationIDs AndroidRendererFrontend::queryPointAnnotations(const ScreenBox& bo return mapRenderer.actor().ask(&Renderer::queryPointAnnotations, box).get(); } -void AndroidRendererFrontend::requestSnapshot(SnapshotCallback callback_) { - snapshotCallback = std::make_unique([callback=std::move(callback_), runloop=util::RunLoop::Get()](PremultipliedImage image){ - runloop->invoke([&]() { - callback(std::move(image)); - }); - }); -} - } // namespace android } // namespace mbgl diff --git a/platform/android/src/android_renderer_frontend.hpp b/platform/android/src/android_renderer_frontend.hpp index bb8323b390..94508fd816 100644 --- a/platform/android/src/android_renderer_frontend.hpp +++ b/platform/android/src/android_renderer_frontend.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -41,16 +40,9 @@ public: // Memory void onLowMemory(); - // Snapshot - Callback will be called on calling thread through RunLoop - using SnapshotCallback = std::function; - void requestSnapshot(SnapshotCallback); - private: MapRenderer& mapRenderer; util::RunLoop* mapRunLoop; - - // TODO - std::unique_ptr snapshotCallback; }; } // namespace android diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp index 0db41ffe8a..3cf39ad3ff 100644 --- a/platform/android/src/map_renderer.cpp +++ b/platform/android/src/map_renderer.cpp @@ -2,6 +2,7 @@ #include #include +#include #include @@ -75,8 +76,26 @@ void MapRenderer::setObserver(std::shared_ptr _rendererObserve } } +void MapRenderer::requestSnapshot(SnapshotCallback callback) { + auto self = ActorRef(*this, mailbox); + self.invoke( + &MapRenderer::scheduleSnapshot, + std::make_unique([&, callback=std::move(callback), runloop=util::RunLoop::Get()](PremultipliedImage image) { + runloop->invoke([callback=std::move(callback), image=std::move(image)]() mutable { + callback(std::move(image)); + }); + snapshotCallback.reset(); + }) + ); +} + // Called on OpenGL thread // +void MapRenderer::scheduleSnapshot(std::unique_ptr callback) { + snapshotCallback = std::move(callback); + requestRender(); +} + void MapRenderer::render(JNIEnv&) { assert (renderer); @@ -103,6 +122,12 @@ void MapRenderer::render(JNIEnv&) { } renderer->render(*params); + + // Deliver the snapshot if requested + if (snapshotCallback) { + snapshotCallback->operator()(backend->readFramebuffer()); + snapshotCallback.reset(); + } } void MapRenderer::onSurfaceCreated(JNIEnv&) { diff --git a/platform/android/src/map_renderer.hpp b/platform/android/src/map_renderer.hpp index ca216fc240..2039444457 100644 --- a/platform/android/src/map_renderer.hpp +++ b/platform/android/src/map_renderer.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -74,6 +75,15 @@ public: void requestRender(); + // Snapshot - requires a RunLoop on the calling thread + using SnapshotCallback = std::function; + void requestSnapshot(SnapshotCallback); + +protected: + // Called from the GL Thread // + + void scheduleSnapshot(std::unique_ptr); + private: // Called from the GL Thread // @@ -105,6 +115,8 @@ private: std::mutex updateMutex; bool framebufferSizeChanged = false; + + std::unique_ptr snapshotCallback; }; } // namespace android diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index e44bd023c5..02d048ff2e 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -60,9 +60,10 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, jni::Object jFileSource, jni::Object jMapRenderer, jni::jfloat _pixelRatio) - : javaPeer(_obj.NewWeakGlobalRef(_env)), - pixelRatio(_pixelRatio), - threadPool(sharedThreadPool()) { + : javaPeer(_obj.NewWeakGlobalRef(_env)) + , mapRenderer(MapRenderer::getNativePeer(_env, jMapRenderer)) + , pixelRatio(_pixelRatio) + , threadPool(sharedThreadPool()) { // Get a reference to the JavaVM for callbacks if (_env.GetJavaVM(&vm) < 0) { @@ -70,9 +71,8 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, return; } - // Get native peers + // Get native peer for file source mbgl::FileSource& fileSource = mbgl::android::FileSource::getDefaultFileSource(_env, jFileSource); - MapRenderer& mapRenderer = MapRenderer::getNativePeer(_env, jMapRenderer); // Create a renderer frontend rendererFrontend = std::make_unique(mapRenderer); @@ -395,7 +395,7 @@ void NativeMapView::setContentPadding(JNIEnv&, double top, double left, double b } void NativeMapView::scheduleSnapshot(jni::JNIEnv&) { - rendererFrontend->requestSnapshot([&](PremultipliedImage image) { + mapRenderer.requestSnapshot([&](PremultipliedImage image) { auto _env = android::AttachEnv(); // Convert image to bitmap auto bitmap = Bitmap::CreateBitmap(*_env, std::move(image)); diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index d88647914e..9102f8463b 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -252,6 +252,8 @@ private: JavaVM *vm = nullptr; jni::UniqueWeakObject javaPeer; + MapRenderer& mapRenderer; + std::string styleUrl; std::string apiKey; -- cgit v1.2.1