mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	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.Handler
 | 
			
		||||
import android.os.Looper
 | 
			
		||||
import android.util.Rational
 | 
			
		||||
import android.util.TypedValue
 | 
			
		||||
import android.view.*
 | 
			
		||||
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.databinding.DialogOverlayAdjustBinding
 | 
			
		||||
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.ui.SettingsActivity
 | 
			
		||||
import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile
 | 
			
		||||
@@ -158,6 +160,18 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
        if (!DirectoryInitialization.areDirectoriesReady) {
 | 
			
		||||
            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)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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">
 | 
			
		||||
 | 
			
		||||
        <!-- This is what everything is rendered to during emulation -->
 | 
			
		||||
        <SurfaceView
 | 
			
		||||
        <org.yuzu.yuzu_emu.views.FixedRatioSurfaceView
 | 
			
		||||
            android:id="@+id/surface_emulation"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent"
 | 
			
		||||
            android:layout_gravity="center"
 | 
			
		||||
            android:focusable="false"
 | 
			
		||||
            android:focusableInTouchMode="false" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user