From ab2e9e68b13c66e6c5b06f7904c7ed9792515b85 Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Thu, 5 Nov 2020 17:32:26 +0700 Subject: [PATCH] Change to TextureView again --- .../net/kdt/pojavlaunch/AWTCanvasView.java | 49 ++++++++++++++----- app/src/main/jni/awt_bridge.c | 6 +++ 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java b/app/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java index daac84742..2b3ee9bbb 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java +++ b/app/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java @@ -9,8 +9,9 @@ import java.util.*; import net.kdt.pojavlaunch.*; import org.lwjgl.glfw.*; -public class AWTCanvasView extends View { +public class AWTCanvasView extends TextureView implements TextureView.SurfaceTextureListener, Runnable { private int mWidth, mHeight; + private boolean mIsDestroyed = false; private TextPaint fpsPaint; private boolean attached = false; @@ -43,26 +44,52 @@ public class AWTCanvasView extends View { fpsPaint = new TextPaint(); fpsPaint.setColor(Color.WHITE); fpsPaint.setTextSize(20); + + setSurfaceTextureListener(this); } @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { + public void onSurfaceTextureAvailable(SurfaceTexture texture, int w, int h) { mWidth = w; mHeight = h; - // mRadius = (float) (Math.min(mWidth, mHeight) / 2 * 0.8); + + mIsDestroyed = false; + new Thread(this, "AndroidAWTRenderer").start(); + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) { + mIsDestroyed = true; + return true; + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int w, int h) { + mWidth = w; + mHeight = h; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture texture) { } private boolean drawing = false; + private Surface mSurface; @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); + public void run() { + Canvas canvas; + mSurface = new Surface(getSurfaceTexture()); - if (!attached) { - attached = CallbackBridge.nativeAttachThreadToOther(true, MainActivity.isInputStackCall); + while (!mIsDestroyed) { + canvas = mSurface.lockCanvas(null); + if (!attached) { + attached = CallbackBridge.nativeAttachThreadToOther(true, MainActivity.isInputStackCall); + } + if (attached) { + drawing = JREUtils.renderAWTScreenFrame(canvas, mWidth, mHeight); + } + canvas.drawText("FPS: " + fps() + ", drawing=" + drawing, 10, 10, fpsPaint); + mSurface.unlockCanvasAndPost(canvas); } - if (attached) { - drawing = JREUtils.renderAWTScreenFrame(canvas, mWidth, mHeight); - } - canvas.drawText("FPS: " + fps() + ", drawing=" + drawing, 100, 100, fpsPaint); } } diff --git a/app/src/main/jni/awt_bridge.c b/app/src/main/jni/awt_bridge.c index 689ea0e28..6b6444f1c 100644 --- a/app/src/main/jni/awt_bridge.c +++ b/app/src/main/jni/awt_bridge.c @@ -1,10 +1,12 @@ #include +#include "log.h" #include "utils.h" // jclass class_awt; // jmethodID method_awt; // TODO: check for memory leaks +int printed = 0; JNIEXPORT jboolean JNICALL Java_net_kdt_pojavlaunch_JREUtils_renderAWTScreenFrame(JNIEnv* env, jclass clazz, jobject canvas, jint width, jint height) { if (runtimeJNIEnvPtr_ANDROID == NULL) return JNI_FALSE; @@ -25,6 +27,10 @@ JNIEXPORT jboolean JNICALL Java_net_kdt_pojavlaunch_JREUtils_renderAWTScreenFram androidRgbArray = (*dalvikJNIEnvPtr_ANDROID)->NewIntArray(dalvikJNIEnvPtr_ANDROID, arrayLength); (*dalvikJNIEnvPtr_ANDROID)->SetIntArrayRegion(dalvikJNIEnvPtr_ANDROID, androidRgbArray, 0, arrayLength, rgbArray); + if (printed++ < 200) { + LOGD("[AWT] First 3 pixels: | %i | %i | %i |", rgbArray[0], rgbArray[1], rgbArray[2]); + } + // Maybe use Skia lib instead? jclass class_canvas = (*dalvikJNIEnvPtr_ANDROID)->GetObjectClass(dalvikJNIEnvPtr_ANDROID, canvas); jmethodID method_canvas = (*dalvikJNIEnvPtr_ANDROID)->GetMethodID(dalvikJNIEnvPtr_ANDROID, class_canvas, "drawBitmap", "([IIIFFIIZLandroid/graphics/Paint;)V");