From 495191815885acaf6503c237c0ec88819050b3e3 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 25 Mar 2021 21:56:58 +0100 Subject: [PATCH 1/5] - Start of the scaler implementation --- .../net/kdt/pojavlaunch/AWTCanvasView.java | 9 +++ .../pojavlaunch/JavaGUILauncherActivity.java | 65 ++++++++++++------- .../net/kdt/pojavlaunch/utils/MathUtils.java | 10 +++ 3 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/MathUtils.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java index 5191efc93..ddbe8072d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java @@ -10,6 +10,8 @@ import net.kdt.pojavlaunch.utils.*; import org.lwjgl.glfw.*; public class AWTCanvasView extends TextureView implements TextureView.SurfaceTextureListener, Runnable { + private float mScaleFactor = 3.f; + private int mWidth, mHeight; private boolean mIsDestroyed = false; @@ -91,7 +93,12 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex int[] rgbArray = JREUtils.renderAWTScreenFrame(/* canvas, mWidth, mHeight */); mDrawing = rgbArray != null; if (rgbArray != null) { + canvas.scale(mScaleFactor, mScaleFactor); + canvas.translate(-CallbackBridge.physicalWidth/3,-CallbackBridge.physicalHeight/3); + canvas.drawBitmap(rgbArray, 0, CallbackBridge.physicalWidth, 0, 0, CallbackBridge.physicalWidth, CallbackBridge.physicalHeight, true, null); + + } rgbArray = null; // System.gc(); @@ -105,3 +112,5 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex } } } + + diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java index 82052cda9..b1a76bdb8 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java @@ -15,6 +15,8 @@ import net.kdt.pojavlaunch.prefs.*; import net.kdt.pojavlaunch.utils.*; import org.lwjgl.glfw.*; +import static net.kdt.pojavlaunch.utils.MathUtils.map; + public class JavaGUILauncherActivity extends LoggableActivity implements View.OnTouchListener { private static final int MSG_LEFT_MOUSE_BUTTON_CHECK = 1028; @@ -37,8 +39,8 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On private boolean isLogAllow, mSkipDetectMod; private boolean rightOverride = false; - private float scaleFactor = 1; - private int fingerStillThreshold = 8; + private float[] scaleFactor = initScaleFactors(); + private final int fingerStillThreshold = 8; private int initialX; private int initialY; private static boolean triggeredLeftMouseButton = false; @@ -70,8 +72,8 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On gestureDetector = new GestureDetector(this, new SingleTapConfirm()); this.displayMetrics = Tools.getDisplayMetrics(this); - CallbackBridge.windowWidth = (int) ((float)displayMetrics.widthPixels * scaleFactor); - CallbackBridge.windowHeight = (int) ((float)displayMetrics.heightPixels * scaleFactor); + CallbackBridge.windowWidth = displayMetrics.widthPixels; + CallbackBridge.windowHeight = displayMetrics.heightPixels ; System.out.println("WidthHeight: " + CallbackBridge.windowWidth + ":" + CallbackBridge.windowHeight); findViewById(R.id.installmod_mouse_pri).setOnTouchListener(this); @@ -81,24 +83,13 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On touchPad.setFocusable(false); this.mousePointer = findViewById(R.id.main_mouse_pointer); - this.mousePointer.post(new Runnable(){ - - @Override - public void run() { - ViewGroup.LayoutParams params = mousePointer.getLayoutParams(); - params.width = (int) (36 / 100f * LauncherPreferences.PREF_MOUSESCALE); - params.height = (int) (54 / 100f * LauncherPreferences.PREF_MOUSESCALE); - } - }); -/* - touchPad.setOnHoverListener(new OnHoverListener() { - @Override - public boolean onHover(View v, MotionEvent event) { - AWTInputBridge.sendMousePos((int) event.getX(), (int) event.getY()); - return false; - } + this.mousePointer.post(() -> { + ViewGroup.LayoutParams params = mousePointer.getLayoutParams(); + params.width = (int) (36 / 100f * LauncherPreferences.PREF_MOUSESCALE); + params.height = (int) (54 / 100f * LauncherPreferences.PREF_MOUSESCALE); }); -*/ + + touchPad.setOnTouchListener(new OnTouchListener(){ private float prevX, prevY; @Override @@ -124,7 +115,8 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On if (gestureDetector.onTouchEvent(event)) { - AWTInputBridge.sendMousePos((int) (mouseX * scaleFactor), (int) (mouseY *scaleFactor)); + sendScaledMousePlaced(mouseX,mouseY); + AWTInputBridge.sendMousePress(rightOverride ? AWTInputEvent.BUTTON3_DOWN_MASK : AWTInputEvent.BUTTON1_DOWN_MASK); if (!rightOverride) { CallbackBridge.mouseLeft = true; @@ -144,7 +136,7 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On mouseY = Math.max(0, Math.min(displayMetrics.heightPixels, mouseY + y - prevY)); placeMouseAt(mouseX, mouseY); - AWTInputBridge.sendMousePos((int) (mouseX * scaleFactor), (int) (mouseY *scaleFactor)); + sendScaledMousePlaced(mouseX,mouseY); /* if (!CallbackBridge.isGrabbing()) { CallbackBridge.sendMouseKeycode(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, 0, isLeftMouseDown); @@ -269,6 +261,11 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On this.mousePointer.setTranslationY(y); } + void sendScaledMousePlaced(float x, float y){ + AWTInputBridge.sendMousePos((int) map((x * scaleFactor),0,CallbackBridge.physicalWidth,scale,2*(CallbackBridge.physicalWidth/3)), + (int) map((y * scaleFactor),0,CallbackBridge.physicalHeight,CallbackBridge.physicalHeight/3,2*(CallbackBridge.physicalHeight/3))); + } + public void forceClose(View v) { BaseMainActivity.dialogForceClose(this); } @@ -342,4 +339,26 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On } }); } + + float[] initScaleFactors(){ + //Could be optimized + int minDimension = Math.min(CallbackBridge.physicalHeight,CallbackBridge.physicalHeight); + float scaleFactor = (3*minDimension)/1080f; + float[] scales = new float[4]; //Left, Top, Right, Bottom + + scales[0] = (CallbackBridge.physicalWidth/2f); + scales[0] -= scales[0]/scaleFactor; + + scales[1] = (CallbackBridge.physicalHeight/2f); + scales[1] -= scales[1]/scaleFactor; + + scales[2] = (CallbackBridge.physicalWidth/2f); + scales[2] += scales[2]/scaleFactor; + + scales[3] = (CallbackBridge.physicalHeight/2f); + scales[3] += scales[3]/scaleFactor; + + return scales; + } + } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/MathUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/MathUtils.java new file mode 100644 index 000000000..c508b698c --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/MathUtils.java @@ -0,0 +1,10 @@ +package net.kdt.pojavlaunch.utils; + +public class MathUtils { + + //Ported from https://www.arduino.cc/reference/en/language/functions/math/map/ + public static float map(float x, float in_min, float in_max, float out_min, float out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } + +} From cf7a5ec357bce8f8f0f12aa49c07757098490acd Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 26 Mar 2021 09:54:36 +0100 Subject: [PATCH 2/5] The installer scaler is now properly implemented. --- .../net/kdt/pojavlaunch/AWTCanvasView.java | 26 ++++++++- .../pojavlaunch/JavaGUILauncherActivity.java | 53 ++++++++----------- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java index ddbe8072d..baa2fe98e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java @@ -10,7 +10,8 @@ import net.kdt.pojavlaunch.utils.*; import org.lwjgl.glfw.*; public class AWTCanvasView extends TextureView implements TextureView.SurfaceTextureListener, Runnable { - private float mScaleFactor = 3.f; + private int mScaleFactor; + private int[] mScales; private int mWidth, mHeight; private boolean mIsDestroyed = false; @@ -34,6 +35,22 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex } return difference > 0 ? times.size() / difference : 0.0; } + + /** Computes the scale to better fit the screen */ + int[] initScaleFactors(){ + //Could be optimized + int minDimension = Math.min(CallbackBridge.physicalHeight,CallbackBridge.physicalWidth); + mScaleFactor = (3*minDimension)/1080; + int[] scales = new int[2]; //Left, Top + + scales[0] = (CallbackBridge.physicalWidth/2); + scales[0] -= scales[0]/mScaleFactor; + + scales[1] = (CallbackBridge.physicalHeight/2); + scales[1] -= scales[1]/mScaleFactor; + + return scales; + } public AWTCanvasView(Context ctx) { this(ctx, null); @@ -48,6 +65,7 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex fpsPaint.setTextSize(20); setSurfaceTextureListener(this); + mScales = initScaleFactors(); } @Override @@ -94,7 +112,7 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex mDrawing = rgbArray != null; if (rgbArray != null) { canvas.scale(mScaleFactor, mScaleFactor); - canvas.translate(-CallbackBridge.physicalWidth/3,-CallbackBridge.physicalHeight/3); + canvas.translate(-mScales[0],-mScales[1]); canvas.drawBitmap(rgbArray, 0, CallbackBridge.physicalWidth, 0, 0, CallbackBridge.physicalWidth, CallbackBridge.physicalHeight, true, null); @@ -111,6 +129,10 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex Tools.showError(getContext(), th); } } + + + + } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java index b1a76bdb8..aa5123c84 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java @@ -1,14 +1,12 @@ package net.kdt.pojavlaunch; -import android.*; -import android.content.*; import android.graphics.*; import android.os.*; import android.util.*; import android.view.*; import android.view.View.*; import android.widget.*; -import androidx.appcompat.app.*; + import java.io.*; import java.util.*; import net.kdt.pojavlaunch.prefs.*; @@ -35,11 +33,10 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On private final Object mDialogLock = new Object(); - private DisplayMetrics displayMetrics; private boolean isLogAllow, mSkipDetectMod; private boolean rightOverride = false; - private float[] scaleFactor = initScaleFactors(); + private int[] scaleFactor = initScaleFactors(); private final int fingerStillThreshold = 8; private int initialX; private int initialY; @@ -70,11 +67,6 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On try { gestureDetector = new GestureDetector(this, new SingleTapConfirm()); - - this.displayMetrics = Tools.getDisplayMetrics(this); - CallbackBridge.windowWidth = displayMetrics.widthPixels; - CallbackBridge.windowHeight = displayMetrics.heightPixels ; - System.out.println("WidthHeight: " + CallbackBridge.windowWidth + ":" + CallbackBridge.windowHeight); findViewById(R.id.installmod_mouse_pri).setOnTouchListener(this); findViewById(R.id.installmod_mouse_sec).setOnTouchListener(this); @@ -115,7 +107,7 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On if (gestureDetector.onTouchEvent(event)) { - sendScaledMousePlaced(mouseX,mouseY); + sendScaledMousePosition(mouseX,mouseY); AWTInputBridge.sendMousePress(rightOverride ? AWTInputEvent.BUTTON3_DOWN_MASK : AWTInputEvent.BUTTON1_DOWN_MASK); if (!rightOverride) { @@ -132,11 +124,11 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On } break; case MotionEvent.ACTION_MOVE: // 2 - mouseX = Math.max(0, Math.min(displayMetrics.widthPixels, mouseX + x - prevX)); - mouseY = Math.max(0, Math.min(displayMetrics.heightPixels, mouseY + y - prevY)); + mouseX = Math.max(0, Math.min(CallbackBridge.physicalWidth, mouseX + x - prevX)); + mouseY = Math.max(0, Math.min(CallbackBridge.physicalHeight, mouseY + y - prevY)); placeMouseAt(mouseX, mouseY); - sendScaledMousePlaced(mouseX,mouseY); + sendScaledMousePosition(mouseX,mouseY); /* if (!CallbackBridge.isGrabbing()) { CallbackBridge.sendMouseKeycode(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, 0, isLeftMouseDown); @@ -261,9 +253,9 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On this.mousePointer.setTranslationY(y); } - void sendScaledMousePlaced(float x, float y){ - AWTInputBridge.sendMousePos((int) map((x * scaleFactor),0,CallbackBridge.physicalWidth,scale,2*(CallbackBridge.physicalWidth/3)), - (int) map((y * scaleFactor),0,CallbackBridge.physicalHeight,CallbackBridge.physicalHeight/3,2*(CallbackBridge.physicalHeight/3))); + void sendScaledMousePosition(float x, float y){ + AWTInputBridge.sendMousePos((int) map(x,0,CallbackBridge.physicalWidth,scaleFactor[0],scaleFactor[2]), + (int) map(y,0,CallbackBridge.physicalHeight,scaleFactor[1],scaleFactor[3])); } public void forceClose(View v) { @@ -331,31 +323,28 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On public void appendToLog(final String text, boolean checkAllow) { logStream.print(text); if (checkAllow && !isLogAllow) return; - textLog.post(new Runnable(){ - @Override - public void run() { - textLog.append(text); - contentScroll.fullScroll(ScrollView.FOCUS_DOWN); - } - }); + textLog.post(() -> { + textLog.append(text); + contentScroll.fullScroll(ScrollView.FOCUS_DOWN); + }); } - float[] initScaleFactors(){ + int[] initScaleFactors(){ //Could be optimized - int minDimension = Math.min(CallbackBridge.physicalHeight,CallbackBridge.physicalHeight); - float scaleFactor = (3*minDimension)/1080f; - float[] scales = new float[4]; //Left, Top, Right, Bottom + int minDimension = Math.min(CallbackBridge.physicalHeight,CallbackBridge.physicalWidth); + int scaleFactor = (3*minDimension)/1080; + int[] scales = new int[4]; //Left, Top, Right, Bottom - scales[0] = (CallbackBridge.physicalWidth/2f); + scales[0] = (CallbackBridge.physicalWidth/2); scales[0] -= scales[0]/scaleFactor; - scales[1] = (CallbackBridge.physicalHeight/2f); + scales[1] = (CallbackBridge.physicalHeight/2); scales[1] -= scales[1]/scaleFactor; - scales[2] = (CallbackBridge.physicalWidth/2f); + scales[2] = (CallbackBridge.physicalWidth/2); scales[2] += scales[2]/scaleFactor; - scales[3] = (CallbackBridge.physicalHeight/2f); + scales[3] = (CallbackBridge.physicalHeight/2); scales[3] += scales[3]/scaleFactor; return scales; From 35b5941387cae19e731a7f84aa7551c77df9ce93 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 26 Mar 2021 11:29:11 +0100 Subject: [PATCH 3/5] - Fixed heads not being DPI aware --- .../kdt/pojavlaunch/PojavLoginActivity.java | 8 +++++--- .../res/layout/simple_account_list_item.xml | 20 +++++++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java index 4798d70ae..81ed390fe 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java @@ -32,6 +32,7 @@ import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; @@ -651,15 +652,16 @@ public class PojavLoginActivity extends BaseActivity View child = inflater.inflate(R.layout.simple_account_list_item, null); TextView accountName = child.findViewById(R.id.accountitem_text_name); ImageButton removeButton = child.findViewById(R.id.accountitem_button_remove); + ImageView imageView = child.findViewById(R.id.account_head); String accNameStr = s.substring(0, s.length() - 5); String skinFaceBase64 = MinecraftAccount.load(accNameStr).skinFaceBase64; if (skinFaceBase64 != null) { byte[] faceIconBytes = Base64.decode(skinFaceBase64, Base64.DEFAULT); Bitmap bitmap = BitmapFactory.decodeByteArray(faceIconBytes, 0, faceIconBytes.length); - - accountName.setCompoundDrawablesWithIntrinsicBounds(new BitmapDrawable(getResources(), - bitmap), null, null, null); + + imageView.setImageDrawable(new BitmapDrawable(getResources(), + bitmap)); } accountName.setText(accNameStr); diff --git a/app_pojavlauncher/src/main/res/layout/simple_account_list_item.xml b/app_pojavlauncher/src/main/res/layout/simple_account_list_item.xml index 3d9b06b51..9b04619e9 100644 --- a/app_pojavlauncher/src/main/res/layout/simple_account_list_item.xml +++ b/app_pojavlauncher/src/main/res/layout/simple_account_list_item.xml @@ -1,6 +1,5 @@ - + + From 5518d58cbefc648fe7ad022387ff9845bf4b38c9 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 26 Mar 2021 12:28:55 +0100 Subject: [PATCH 4/5] - Fixed FPS counter being invisible --- .../src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java index baa2fe98e..a0cab4947 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java @@ -111,11 +111,14 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex int[] rgbArray = JREUtils.renderAWTScreenFrame(/* canvas, mWidth, mHeight */); mDrawing = rgbArray != null; if (rgbArray != null) { + + canvas.save(); canvas.scale(mScaleFactor, mScaleFactor); canvas.translate(-mScales[0],-mScales[1]); - canvas.drawBitmap(rgbArray, 0, CallbackBridge.physicalWidth, 0, 0, CallbackBridge.physicalWidth, CallbackBridge.physicalHeight, true, null); + canvas.drawBitmap(rgbArray, 0, CallbackBridge.physicalWidth, 0, 0, CallbackBridge.physicalWidth, CallbackBridge.physicalHeight, true, null); + canvas.restore(); } rgbArray = null; From 879a3f0e5628441d679cc87992ca64d38f824794 Mon Sep 17 00:00:00 2001 From: Boulay Mathias Date: Mon, 5 Apr 2021 19:53:17 +0200 Subject: [PATCH 5/5] Death to empty spaces ! --- .../src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java index a0cab4947..2739d4a29 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java @@ -132,10 +132,4 @@ public class AWTCanvasView extends TextureView implements TextureView.SurfaceTex Tools.showError(getContext(), th); } } - - - - } - -