summaryrefslogtreecommitdiff
path: root/platform/android/src/map_renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/map_renderer.cpp')
-rw-r--r--platform/android/src/map_renderer.cpp27
1 files changed, 19 insertions, 8 deletions
diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp
index f5336e3dd8..3ebbdb7e5e 100644
--- a/platform/android/src/map_renderer.cpp
+++ b/platform/android/src/map_renderer.cpp
@@ -17,10 +17,21 @@ MapRenderer::MapRenderer(jni::JNIEnv& _env,
const jni::Object<MapRenderer>& obj,
jni::jfloat pixelRatio_,
const jni::String& localIdeographFontFamily_)
- : javaPeer(_env, obj)
- , pixelRatio(pixelRatio_)
- , localIdeographFontFamily(localIdeographFontFamily_ ? jni::Make<std::string>(_env, localIdeographFontFamily_) : optional<std::string>{})
- , mailbox(std::make_shared<Mailbox>(*this)) {
+ : javaPeer(_env, obj),
+ pixelRatio(pixelRatio_),
+ localIdeographFontFamily(localIdeographFontFamily_ ? jni::Make<std::string>(_env, localIdeographFontFamily_)
+ : optional<std::string>{}),
+ mailboxData(this) {}
+
+MapRenderer::MailboxData::MailboxData(Scheduler* scheduler_) : scheduler(scheduler_) {
+ assert(scheduler);
+}
+
+std::shared_ptr<Mailbox> MapRenderer::MailboxData::getMailbox() const noexcept {
+ if (!mailbox) {
+ mailbox = std::make_shared<Mailbox>(*scheduler);
+ }
+ return mailbox;
}
MapRenderer::~MapRenderer() = default;
@@ -30,7 +41,7 @@ void MapRenderer::reset() {
if (renderer) {
// Make sure to destroy the renderer on the GL Thread
- auto self = ActorRef<MapRenderer>(*this, mailbox);
+ auto self = ActorRef<MapRenderer>(*this, mailboxData.getMailbox());
self.ask(&MapRenderer::resetRenderer).wait();
}
@@ -93,7 +104,7 @@ void MapRenderer::setObserver(std::shared_ptr<RendererObserver> _rendererObserve
}
void MapRenderer::requestSnapshot(SnapshotCallback callback) {
- auto self = ActorRef<MapRenderer>(*this, mailbox);
+ auto self = ActorRef<MapRenderer>(*this, mailboxData.getMailbox());
self.invoke(
&MapRenderer::scheduleSnapshot,
std::make_unique<SnapshotCallback>([&, callback=std::move(callback), runloop=util::RunLoop::Get()](PremultipliedImage image) {
@@ -172,7 +183,7 @@ void MapRenderer::onSurfaceCreated(JNIEnv&) {
// Create the new backend and renderer
backend = std::make_unique<AndroidRendererBackend>();
renderer = std::make_unique<Renderer>(*backend, pixelRatio, localIdeographFontFamily);
- rendererRef = std::make_unique<ActorRef<Renderer>>(*renderer, mailbox);
+ rendererRef = std::make_unique<ActorRef<Renderer>>(*renderer, mailboxData.getMailbox());
// Set the observer on the new Renderer implementation
if (rendererObserver) {
@@ -193,7 +204,7 @@ void MapRenderer::onSurfaceChanged(JNIEnv& env, jint width, jint height) {
void MapRenderer::onRendererReset(JNIEnv&) {
// Make sure to destroy the renderer on the GL Thread
- auto self = ActorRef<MapRenderer>(*this, mailbox);
+ auto self = ActorRef<MapRenderer>(*this, mailboxData.getMailbox());
self.ask(&MapRenderer::resetRenderer).wait();
}