diff --git a/src/android/app/src/main/java/org/citron/citron_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/citron/citron_emu/activities/EmulationActivity.kt index 5d314985c..85abf9d72 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/activities/EmulationActivity.kt @@ -314,6 +314,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { 2 -> Rational(21, 9) 3 -> Rational(16, 10) 4 -> Rational(32, 9) + 5 -> null // Stretch to window else -> null // Best fit } return this.apply { aspectRatio?.let { setAspectRatio(it) } } diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt index f9479354d..5ea9d6d34 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt @@ -668,6 +668,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { 2 -> Rational(21, 9) 3 -> Rational(16, 10) 4 -> Rational(32, 9) + 5 -> null // Stretch to window else -> null // Best fit } when (verticalAlignment) { diff --git a/src/android/app/src/main/java/org/citron/citron_emu/views/FixedRatioSurfaceView.kt b/src/android/app/src/main/java/org/citron/citron_emu/views/FixedRatioSurfaceView.kt index bb009b32e..b4f1745a2 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/views/FixedRatioSurfaceView.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/views/FixedRatioSurfaceView.kt @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.citron.citron_emu.views @@ -27,7 +28,15 @@ class FixedRatioSurfaceView @JvmOverloads constructor( override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val displayWidth: Float = MeasureSpec.getSize(widthMeasureSpec).toFloat() val displayHeight: Float = MeasureSpec.getSize(heightMeasureSpec).toFloat() - if (aspectRatio != 0f) { + + // Safety check: ensure we have valid dimensions + if (displayWidth <= 0f || displayHeight <= 0f || aspectRatio == 0f) { + // Fall back to default behavior for stretch or invalid dimensions + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + return + } + + if (aspectRatio > 0f) { val displayAspect = displayWidth / displayHeight if (displayAspect < aspectRatio) { // Max out width diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 97fa1ebb6..b41369260 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -142,6 +142,7 @@ @string/ratio_force_four_three @string/ratio_force_twenty_one_nine @string/ratio_force_sixteen_ten + @string/ratio_force_thirty_two_nine @string/ratio_stretch @@ -151,6 +152,7 @@ 2 3 4 + 5 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 9842db990..13a49eb1b 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -656,6 +656,7 @@ Force 4:3 Force 21:9 Force 16:10 + Force 32:9 Stretch to window