diff options
Diffstat (limited to 'platform/android/src/native_map_view.cpp')
-rwxr-xr-x | platform/android/src/native_map_view.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index 0b849976eb..578e5d0033 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -194,6 +194,35 @@ void NativeMapView::render() { map->render(); + if(snapshot){ + snapshot = false; + + // take snapshot + const unsigned int w = fbWidth; + const unsigned int h = fbHeight; + mbgl::PremultipliedImage image { w, h }; + MBGL_CHECK_ERROR(glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, image.data.get())); + const size_t stride = image.stride(); + auto tmp = std::make_unique<uint8_t[]>(stride); + uint8_t *rgba = image.data.get(); + for (int i = 0, j = h - 1; i < j; i++, j--) { + std::memcpy(tmp.get(), rgba + i * stride, stride); + std::memcpy(rgba + i * stride, rgba + j * stride, stride); + std::memcpy(rgba + j * stride, tmp.get(), stride); + } + + // encode and convert to jbytes + std::string string = encodePNG(image); + jbyteArray arr = env->NewByteArray(string.length()); + env->SetByteArrayRegion(arr,0,string.length(),(jbyte*)string.c_str()); + + // invoke Mapview#OnSnapshotReady + env->CallVoidMethod(obj, onSnapshotReadyId, arr); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + } + } + if ((display != EGL_NO_DISPLAY) && (surface != EGL_NO_SURFACE)) { if (!eglSwapBuffers(display, surface)) { mbgl::Log::Error(mbgl::Event::OpenGL, "eglSwapBuffers() returned error %d", @@ -436,6 +465,10 @@ void NativeMapView::destroySurface() { } } +void NativeMapView::scheduleTakeSnapshot() { + snapshot = true; +} + // Speed /* typedef enum { |