summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2023-05-29 17:46:19 +0800
committerPo Lu <luangruo@yahoo.com>2023-05-29 17:46:19 +0800
commit7fdde02f3216536aa8977fa4b396bec8fbaf994b (patch)
tree6f38d0cdc45f5cd50343d48f4028febe8b397251 /java
parent9a3535459333b5a1a32ed5b5ef4c593e585bfe9a (diff)
Work around more problems with Bitmaps
* java/org/gnu/emacs/EmacsNative.java (EmacsNative): New function `blitRect'. * java/org/gnu/emacs/EmacsSurfaceView.java (EmacsSurfaceView): Use it on Android 8.x. * src/android.c (blitRect): Implement new function.
Diffstat (limited to 'java')
-rw-r--r--java/org/gnu/emacs/EmacsNative.java10
-rw-r--r--java/org/gnu/emacs/EmacsSurfaceView.java33
2 files changed, 39 insertions, 4 deletions
diff --git a/java/org/gnu/emacs/EmacsNative.java b/java/org/gnu/emacs/EmacsNative.java
index e699dda9ad4..56c03ee38dc 100644
--- a/java/org/gnu/emacs/EmacsNative.java
+++ b/java/org/gnu/emacs/EmacsNative.java
@@ -20,6 +20,9 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
package org.gnu.emacs;
import android.content.res.AssetManager;
+
+import android.graphics.Bitmap;
+
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
@@ -216,6 +219,13 @@ public final class EmacsNative
failure. */
public static native int[] getSelection (short window);
+
+ /* Graphics functions used as a replacement for potentially buggy
+ Android APIs. */
+
+ public static native void blitRect (Bitmap src, Bitmap dest, int x1,
+ int y1, int x2, int y2);
+
static
{
/* Older versions of Android cannot link correctly with shared
diff --git a/java/org/gnu/emacs/EmacsSurfaceView.java b/java/org/gnu/emacs/EmacsSurfaceView.java
index e0411f7f8b3..0deb930c2c2 100644
--- a/java/org/gnu/emacs/EmacsSurfaceView.java
+++ b/java/org/gnu/emacs/EmacsSurfaceView.java
@@ -57,11 +57,36 @@ public final class EmacsSurfaceView extends View
private void
copyToFrontBuffer (Bitmap bitmap, Rect damageRect)
{
- if (damageRect != null)
- bitmapCanvas.drawBitmap (bitmap, damageRect, damageRect,
- bitmapPaint);
+ EmacsService.checkEmacsThread ();
+
+ if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O
+ && Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1)
+ {
+ /* If `drawBitmap' can safely be used while a bitmap is locked
+ by another thread, continue here... */
+
+ if (damageRect != null)
+ bitmapCanvas.drawBitmap (bitmap, damageRect, damageRect,
+ bitmapPaint);
+ else
+ bitmapCanvas.drawBitmap (bitmap, 0f, 0f, bitmapPaint);
+ }
else
- bitmapCanvas.drawBitmap (bitmap, 0f, 0f, bitmapPaint);
+ {
+ /* But if it can not, as on Android 8.0 and 8.1, then use a
+ replacement function. */
+
+ if (damageRect != null)
+ EmacsNative.blitRect (bitmap, frontBuffer,
+ damageRect.left,
+ damageRect.top,
+ damageRect.right,
+ damageRect.bottom);
+ else
+ EmacsNative.blitRect (bitmap, frontBuffer, 0, 0,
+ bitmap.getWidth (),
+ bitmap.getHeight ());
+ }
}
private void