From b5b57059557e31e9edf3d67e83a0aad5aa999d87 Mon Sep 17 00:00:00 2001 From: Alex Andrewschenko Date: Wed, 26 Feb 2025 16:52:17 +0100 Subject: [PATCH 1/2] Allow reading frame bitmap in window mode --- .../osmand/core/android/MapRendererView.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/wrappers/android/src/net/osmand/core/android/MapRendererView.java b/wrappers/android/src/net/osmand/core/android/MapRendererView.java index 417395616..491b35cd9 100644 --- a/wrappers/android/src/net/osmand/core/android/MapRendererView.java +++ b/wrappers/android/src/net/osmand/core/android/MapRendererView.java @@ -94,6 +94,7 @@ public abstract class MapRendererView extends FrameLayout { /** * Rendering global parameters */ + private volatile boolean _frameReadingMode; private volatile boolean _batterySavingMode; private volatile int _maxFrameRate; private volatile long _maxFrameTime; @@ -1488,6 +1489,29 @@ public final void dumpResourcesInfo() { _mapRenderer.dumpResourcesInfo(); } + public final boolean enableFrameReader() { + if (_frameReadingMode || _byteBuffer != null) { + return true; + } else if (_windowWidth > 0 && _windowHeight > 0) { + synchronized (eglThread) { + _byteBuffer = ByteBuffer.allocateDirect(_windowWidth * _windowHeight * 4); + _renderingResultIsReady = false; + } + _frameReadingMode = true; + return true; + } + return false; + } + + public final void disableFrameReader() { + if (_frameReadingMode) { + synchronized (eglThread) { + _byteBuffer = null; + } + _frameReadingMode = false; + } + } + public final boolean isBatterySavingModeEnabled() { return _batterySavingMode; } @@ -2008,6 +2032,8 @@ public void onSurfaceChanged(GL10 gl, int width, int height) { synchronized (eglThread) { eglThread.ok = false; eglThread.mapRenderer = _mapRenderer; + eglThread.surfaceWidth = width; + eglThread.surfaceHeight = height; eglThread.startAndCompleteOperation(EGLThreadOperation.INITIALIZE_RENDERING); ok = eglThread.ok; } @@ -2070,7 +2096,7 @@ public void onDrawFrame(GL10 gl) { frameId++; - if (_byteBuffer != null) { + if (!_frameReadingMode && _byteBuffer != null) { for (MapRendererViewListener listener : listeners) { listener.onFrameReady(MapRendererView.this); } @@ -2425,6 +2451,9 @@ public void run() { gl.glFlush(); if (byteBuffer != null) { gl.glFinish(); + if (_frameReadingMode) { + egl.eglSwapBuffers(display, surface); + } synchronized (byteBuffer) { byteBuffer.rewind(); gl.glReadPixels(0, 0, surfaceWidth, surfaceHeight, From 3055a26b1340e643351d4f762f14c3a962916427 Mon Sep 17 00:00:00 2001 From: Alex Andrewschenko Date: Wed, 26 Feb 2025 17:17:38 +0100 Subject: [PATCH 2/2] Provide methods for taking screenshots --- .../android/src/net/osmand/core/android/MapRendererView.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/wrappers/android/src/net/osmand/core/android/MapRendererView.java b/wrappers/android/src/net/osmand/core/android/MapRendererView.java index 491b35cd9..ab62c2a6f 100644 --- a/wrappers/android/src/net/osmand/core/android/MapRendererView.java +++ b/wrappers/android/src/net/osmand/core/android/MapRendererView.java @@ -385,6 +385,11 @@ public Bitmap getBitmap() { _resultBitmap.copyPixelsFromBuffer(_byteBuffer); _renderingResultIsReady = false; } + if (_frameReadingMode) { + Matrix matrix = new Matrix(); + matrix.preScale(1.0f, -1.0f); + _resultBitmap = Bitmap.createBitmap(_resultBitmap, 0, 0, _windowWidth, _windowHeight, matrix, true); + } } return _resultBitmap; }