From 7fdde02f3216536aa8977fa4b396bec8fbaf994b Mon Sep 17 00:00:00 2001 From: Po Lu Date: Mon, 29 May 2023 17:46:19 +0800 Subject: 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. --- java/org/gnu/emacs/EmacsNative.java | 10 ++++++++++ java/org/gnu/emacs/EmacsSurfaceView.java | 33 ++++++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 4 deletions(-) (limited to 'java') 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 . */ 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 -- cgit v1.2.1