Merge pull request #10633 from t895/variable-surface-ratio
android: Use a custom view for changing emulation aspect ratio
This commit is contained in:
		| @@ -14,6 +14,7 @@ import android.graphics.Color | |||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.os.Handler | import android.os.Handler | ||||||
| import android.os.Looper | import android.os.Looper | ||||||
|  | import android.util.Rational | ||||||
| import android.util.TypedValue | import android.util.TypedValue | ||||||
| import android.view.* | import android.view.* | ||||||
| import android.widget.TextView | import android.widget.TextView | ||||||
| @@ -36,6 +37,7 @@ import org.yuzu.yuzu_emu.YuzuApplication | |||||||
| import org.yuzu.yuzu_emu.activities.EmulationActivity | import org.yuzu.yuzu_emu.activities.EmulationActivity | ||||||
| import org.yuzu.yuzu_emu.databinding.DialogOverlayAdjustBinding | import org.yuzu.yuzu_emu.databinding.DialogOverlayAdjustBinding | ||||||
| import org.yuzu.yuzu_emu.databinding.FragmentEmulationBinding | import org.yuzu.yuzu_emu.databinding.FragmentEmulationBinding | ||||||
|  | import org.yuzu.yuzu_emu.features.settings.model.IntSetting | ||||||
| import org.yuzu.yuzu_emu.features.settings.model.Settings | import org.yuzu.yuzu_emu.features.settings.model.Settings | ||||||
| import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity | import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity | ||||||
| import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile | import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile | ||||||
| @@ -158,6 +160,18 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||||||
|         if (!DirectoryInitialization.areDirectoriesReady) { |         if (!DirectoryInitialization.areDirectoriesReady) { | ||||||
|             DirectoryInitialization.start(requireContext()) |             DirectoryInitialization.start(requireContext()) | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         binding.surfaceEmulation.setAspectRatio( | ||||||
|  |             when (IntSetting.RENDERER_ASPECT_RATIO.int) { | ||||||
|  |                 0 -> Rational(16, 9) | ||||||
|  |                 1 -> Rational(4, 3) | ||||||
|  |                 2 -> Rational(21, 9) | ||||||
|  |                 3 -> Rational(16, 10) | ||||||
|  |                 4 -> null // Stretch | ||||||
|  |                 else -> Rational(16, 9) | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  |  | ||||||
|         emulationState.run(emulationActivity!!.isActivityRecreated) |         emulationState.run(emulationActivity!!.isActivityRecreated) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -0,0 +1,46 @@ | |||||||
|  | // SPDX-FileCopyrightText: 2023 yuzu Emulator Project | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later | ||||||
|  |  | ||||||
|  | package org.yuzu.yuzu_emu.views | ||||||
|  |  | ||||||
|  | import android.content.Context | ||||||
|  | import android.util.AttributeSet | ||||||
|  | import android.util.Rational | ||||||
|  | import android.view.SurfaceView | ||||||
|  | import kotlin.math.roundToInt | ||||||
|  |  | ||||||
|  | class FixedRatioSurfaceView @JvmOverloads constructor( | ||||||
|  |     context: Context, | ||||||
|  |     attrs: AttributeSet? = null, | ||||||
|  |     defStyleAttr: Int = 0 | ||||||
|  | ) : SurfaceView(context, attrs, defStyleAttr) { | ||||||
|  |     private var aspectRatio: Float = 0f // (width / height), 0f is a special value for stretch | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Sets the desired aspect ratio for this view | ||||||
|  |      * @param ratio the ratio to force the view to, or null to stretch to fit | ||||||
|  |      */ | ||||||
|  |     fun setAspectRatio(ratio: Rational?) { | ||||||
|  |         aspectRatio = ratio?.toFloat() ?: 0f | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { | ||||||
|  |         super.onMeasure(widthMeasureSpec, heightMeasureSpec) | ||||||
|  |         val width = MeasureSpec.getSize(widthMeasureSpec) | ||||||
|  |         val height = MeasureSpec.getSize(heightMeasureSpec) | ||||||
|  |         if (aspectRatio != 0f) { | ||||||
|  |             val newWidth: Int | ||||||
|  |             val newHeight: Int | ||||||
|  |             if (height * aspectRatio < width) { | ||||||
|  |                 newWidth = (height * aspectRatio).roundToInt() | ||||||
|  |                 newHeight = height | ||||||
|  |             } else { | ||||||
|  |                 newWidth = width | ||||||
|  |                 newHeight = (width / aspectRatio).roundToInt() | ||||||
|  |             } | ||||||
|  |             setMeasuredDimension(newWidth, newHeight) | ||||||
|  |         } else { | ||||||
|  |             setMeasuredDimension(width, height) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -13,10 +13,11 @@ | |||||||
|         android:layout_height="match_parent"> |         android:layout_height="match_parent"> | ||||||
|  |  | ||||||
|         <!-- This is what everything is rendered to during emulation --> |         <!-- This is what everything is rendered to during emulation --> | ||||||
|         <SurfaceView |         <org.yuzu.yuzu_emu.views.FixedRatioSurfaceView | ||||||
|             android:id="@+id/surface_emulation" |             android:id="@+id/surface_emulation" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="match_parent" |             android:layout_height="match_parent" | ||||||
|  |             android:layout_gravity="center" | ||||||
|             android:focusable="false" |             android:focusable="false" | ||||||
|             android:focusableInTouchMode="false" /> |             android:focusableInTouchMode="false" /> | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user