summaryrefslogtreecommitdiff
path: root/src/android/app
diff options
context:
space:
mode:
authorGravatar Charles Lombardo2023-04-04 16:01:54 -0400
committerGravatar bunnei2023-06-03 00:05:50 -0700
commit78f02ab9a62658c3cdc29c61368443b619c770ad (patch)
tree59fe12739bfb347fa0a9281589f0370e7c716faa /src/android/app
parentandroid: Use apply instead of commit for shared preferences (diff)
downloadyuzu-78f02ab9a62658c3cdc29c61368443b619c770ad.tar.gz
yuzu-78f02ab9a62658c3cdc29c61368443b619c770ad.tar.xz
yuzu-78f02ab9a62658c3cdc29c61368443b619c770ad.zip
android: Scale input overlay independently of system display scale
Diffstat (limited to 'src/android/app')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt49
-rw-r--r--src/android/app/src/main/res/values/integers.xml22
2 files changed, 41 insertions, 30 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
index 9b27ff1e3..895d33abf 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
@@ -35,6 +35,8 @@ import org.yuzu.yuzu_emu.R
35import org.yuzu.yuzu_emu.YuzuApplication 35import org.yuzu.yuzu_emu.YuzuApplication
36import org.yuzu.yuzu_emu.features.settings.model.Settings 36import org.yuzu.yuzu_emu.features.settings.model.Settings
37import org.yuzu.yuzu_emu.utils.EmulationMenuSettings 37import org.yuzu.yuzu_emu.utils.EmulationMenuSettings
38import kotlin.math.max
39import kotlin.math.min
38 40
39/** 41/**
40 * Draws the interactive input overlay on top of the 42 * Draws the interactive input overlay on top of the
@@ -769,28 +771,37 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
769 /** 771 /**
770 * Resizes a [Bitmap] by a given scale factor 772 * Resizes a [Bitmap] by a given scale factor
771 * 773 *
772 * @param vectorDrawable The {@link Bitmap} to scale. 774 * @param context Context for getting the vector drawable
773 * @param scale The scale factor for the bitmap. 775 * @param drawableId The ID of the drawable to scale.
774 * @return The scaled [Bitmap] 776 * @param scale The scale factor for the bitmap.
777 * @return The scaled [Bitmap]
775 */ 778 */
776 private fun getBitmap(vectorDrawable: VectorDrawable, scale: Float): Bitmap { 779 private fun getBitmap(context: Context, drawableId: Int, scale: Float): Bitmap {
780 val vectorDrawable = ContextCompat.getDrawable(context, drawableId) as VectorDrawable
781
777 val bitmap = Bitmap.createBitmap( 782 val bitmap = Bitmap.createBitmap(
778 (vectorDrawable.intrinsicWidth * scale).toInt(), 783 (vectorDrawable.intrinsicWidth * scale).toInt(),
779 (vectorDrawable.intrinsicHeight * scale).toInt(), 784 (vectorDrawable.intrinsicHeight * scale).toInt(),
780 Bitmap.Config.ARGB_8888 785 Bitmap.Config.ARGB_8888
781 ) 786 )
782 val canvas = Canvas(bitmap) 787
788 val dm = context.resources.displayMetrics
789 val minScreenDimension = min(dm.widthPixels, dm.heightPixels)
790
791 val maxBitmapDimension = max(bitmap.width, bitmap.height)
792 val bitmapScale = scale * minScreenDimension / maxBitmapDimension
793
794 val scaledBitmap = Bitmap.createScaledBitmap(
795 bitmap,
796 (bitmap.width * bitmapScale).toInt(),
797 (bitmap.height * bitmapScale).toInt(),
798 true
799 )
800
801 val canvas = Canvas(scaledBitmap)
783 vectorDrawable.setBounds(0, 0, canvas.width, canvas.height) 802 vectorDrawable.setBounds(0, 0, canvas.width, canvas.height)
784 vectorDrawable.draw(canvas) 803 vectorDrawable.draw(canvas)
785 return bitmap 804 return scaledBitmap
786 }
787
788 private fun getBitmap(context: Context, drawableId: Int, scale: Float): Bitmap {
789 return when (val drawable = ContextCompat.getDrawable(context, drawableId)) {
790 is BitmapDrawable -> BitmapFactory.decodeResource(context.resources, drawableId)
791 is VectorDrawable -> getBitmap(drawable, scale)
792 else -> throw IllegalArgumentException("Unsupported drawable type")
793 }
794 } 805 }
795 806
796 /** 807 /**
@@ -845,12 +856,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
845 ButtonType.BUTTON_HOME, 856 ButtonType.BUTTON_HOME,
846 ButtonType.BUTTON_CAPTURE, 857 ButtonType.BUTTON_CAPTURE,
847 ButtonType.BUTTON_PLUS, 858 ButtonType.BUTTON_PLUS,
848 ButtonType.BUTTON_MINUS -> 0.35f 859 ButtonType.BUTTON_MINUS -> 0.07f
849 ButtonType.TRIGGER_L, 860 ButtonType.TRIGGER_L,
850 ButtonType.TRIGGER_R, 861 ButtonType.TRIGGER_R,
851 ButtonType.TRIGGER_ZL, 862 ButtonType.TRIGGER_ZL,
852 ButtonType.TRIGGER_ZR -> 0.38f 863 ButtonType.TRIGGER_ZR -> 0.26f
853 else -> 0.43f 864 else -> 0.11f
854 } 865 }
855 scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() 866 scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat()
856 scale /= 100f 867 scale /= 100f
@@ -910,7 +921,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
910 val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) 921 val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
911 922
912 // Decide scale based on button ID and user preference 923 // Decide scale based on button ID and user preference
913 var scale = 0.40f 924 var scale = 0.25f
914 scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() 925 scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat()
915 scale /= 100f 926 scale /= 100f
916 927
@@ -980,7 +991,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
980 val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) 991 val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
981 992
982 // Decide scale based on user preference 993 // Decide scale based on user preference
983 var scale = 0.40f 994 var scale = 0.3f
984 scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() 995 scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat()
985 scale /= 100f 996 scale /= 100f
986 997
diff --git a/src/android/app/src/main/res/values/integers.xml b/src/android/app/src/main/res/values/integers.xml
index 79b64192f..bc614b81d 100644
--- a/src/android/app/src/main/res/values/integers.xml
+++ b/src/android/app/src/main/res/values/integers.xml
@@ -4,13 +4,13 @@
4 4
5 <!-- Default SWITCH landscape layout --> 5 <!-- Default SWITCH landscape layout -->
6 <integer name="SWITCH_BUTTON_A_X">760</integer> 6 <integer name="SWITCH_BUTTON_A_X">760</integer>
7 <integer name="SWITCH_BUTTON_A_Y">810</integer> 7 <integer name="SWITCH_BUTTON_A_Y">790</integer>
8 <integer name="SWITCH_BUTTON_B_X">710</integer> 8 <integer name="SWITCH_BUTTON_B_X">710</integer>
9 <integer name="SWITCH_BUTTON_B_Y">920</integer> 9 <integer name="SWITCH_BUTTON_B_Y">900</integer>
10 <integer name="SWITCH_BUTTON_X_X">710</integer> 10 <integer name="SWITCH_BUTTON_X_X">710</integer>
11 <integer name="SWITCH_BUTTON_X_Y">700</integer> 11 <integer name="SWITCH_BUTTON_X_Y">680</integer>
12 <integer name="SWITCH_BUTTON_Y_X">660</integer> 12 <integer name="SWITCH_BUTTON_Y_X">660</integer>
13 <integer name="SWITCH_BUTTON_Y_Y">810</integer> 13 <integer name="SWITCH_BUTTON_Y_Y">790</integer>
14 <integer name="SWITCH_STICK_L_X">100</integer> 14 <integer name="SWITCH_STICK_L_X">100</integer>
15 <integer name="SWITCH_STICK_L_Y">670</integer> 15 <integer name="SWITCH_STICK_L_Y">670</integer>
16 <integer name="SWITCH_STICK_R_X">900</integer> 16 <integer name="SWITCH_STICK_R_X">900</integer>
@@ -24,14 +24,14 @@
24 <integer name="SWITCH_TRIGGER_ZR_X">930</integer> 24 <integer name="SWITCH_TRIGGER_ZR_X">930</integer>
25 <integer name="SWITCH_TRIGGER_ZR_Y">90</integer> 25 <integer name="SWITCH_TRIGGER_ZR_Y">90</integer>
26 <integer name="SWITCH_BUTTON_MINUS_X">460</integer> 26 <integer name="SWITCH_BUTTON_MINUS_X">460</integer>
27 <integer name="SWITCH_BUTTON_MINUS_Y">955</integer> 27 <integer name="SWITCH_BUTTON_MINUS_Y">950</integer>
28 <integer name="SWITCH_BUTTON_PLUS_X">540</integer> 28 <integer name="SWITCH_BUTTON_PLUS_X">540</integer>
29 <integer name="SWITCH_BUTTON_PLUS_Y">955</integer> 29 <integer name="SWITCH_BUTTON_PLUS_Y">950</integer>
30 <integer name="SWITCH_BUTTON_HOME_X">620</integer> 30 <integer name="SWITCH_BUTTON_HOME_X">600</integer>
31 <integer name="SWITCH_BUTTON_HOME_Y">960</integer> 31 <integer name="SWITCH_BUTTON_HOME_Y">950</integer>
32 <integer name="SWITCH_BUTTON_CAPTURE_X">380</integer> 32 <integer name="SWITCH_BUTTON_CAPTURE_X">400</integer>
33 <integer name="SWITCH_BUTTON_CAPTURE_Y">960</integer> 33 <integer name="SWITCH_BUTTON_CAPTURE_Y">950</integer>
34 <integer name="SWITCH_BUTTON_DPAD_X">260</integer> 34 <integer name="SWITCH_BUTTON_DPAD_X">260</integer>
35 <integer name="SWITCH_BUTTON_DPAD_Y">810</integer> 35 <integer name="SWITCH_BUTTON_DPAD_Y">790</integer>
36 36
37</resources> 37</resources>