diff --git a/.idea/.idea.osu.Android/.idea/deploymentTargetSelector.xml b/.idea/.idea.osu.Android/.idea/deploymentTargetSelector.xml
new file mode 100644
index 000000000000..4432459b869d
--- /dev/null
+++ b/.idea/.idea.osu.Android/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/osu.Android/OsuGameAndroid.cs b/osu.Android/OsuGameAndroid.cs
index 0f2451f0a01f..e725f9245f61 100644
--- a/osu.Android/OsuGameAndroid.cs
+++ b/osu.Android/OsuGameAndroid.cs
@@ -12,6 +12,7 @@
using osu.Game.Screens;
using osu.Game.Updater;
using osu.Game.Utils;
+using osuTK;
namespace osu.Android
{
@@ -20,6 +21,8 @@ public partial class OsuGameAndroid : OsuGame
[Cached]
private readonly OsuGameActivity gameActivity;
+ protected override Vector2 ScalingContainerTargetDrawSize => new Vector2(1024, 1024 * DrawHeight / DrawWidth);
+
public OsuGameAndroid(OsuGameActivity activity)
: base(null)
{
diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs
index 1244dd8cfc8d..76d06f36658e 100644
--- a/osu.Game/Configuration/OsuConfigManager.cs
+++ b/osu.Game/Configuration/OsuConfigManager.cs
@@ -238,7 +238,7 @@ protected override bool CheckLookupContainsPrivateInformation(OsuSetting lookup)
public void Migrate()
{
- // arrives as 2020.123.0
+ // arrives as 2020.123.0-lazer
string rawVersion = Get(OsuSetting.Version);
if (rawVersion.Length < 6)
@@ -251,11 +251,14 @@ public void Migrate()
if (!int.TryParse(pieces[0], out int year)) return;
if (!int.TryParse(pieces[1], out int monthDay)) return;
- // ReSharper disable once UnusedVariable
- int combined = (year * 10000) + monthDay;
+ int combined = year * 10000 + monthDay;
- // migrations can be added here using a condition like:
- // if (combined < 20220103) { performMigration() }
+ if (combined < 20250214)
+ {
+ // UI scaling on mobile platforms has been internally adjusted such that 1x UI scale looks correctly zoomed in than before.
+ if (RuntimeInfo.IsMobile)
+ GetBindable(OsuSetting.UIScale).SetDefault();
+ }
}
public override TrackedSettings CreateTrackedSettings()
diff --git a/osu.Game/Graphics/Containers/ScalingContainer.cs b/osu.Game/Graphics/Containers/ScalingContainer.cs
index c47aba2f0cc1..9d2a1c16af99 100644
--- a/osu.Game/Graphics/Containers/ScalingContainer.cs
+++ b/osu.Game/Graphics/Containers/ScalingContainer.cs
@@ -1,8 +1,6 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-#nullable disable
-
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
@@ -26,17 +24,17 @@ public partial class ScalingContainer : Container
{
internal const float TRANSITION_DURATION = 500;
- private Bindable sizeX;
- private Bindable sizeY;
- private Bindable posX;
- private Bindable posY;
- private Bindable applySafeAreaPadding;
+ private Bindable sizeX = null!;
+ private Bindable sizeY = null!;
+ private Bindable posX = null!;
+ private Bindable posY = null!;
+ private Bindable applySafeAreaPadding = null!;
- private Bindable safeAreaPadding;
+ private Bindable safeAreaPadding = null!;
private readonly ScalingMode? targetMode;
- private Bindable scalingMode;
+ private Bindable scalingMode = null!;
private readonly Container content;
protected override Container Content => content;
@@ -45,9 +43,9 @@ public partial class ScalingContainer : Container
private readonly Container sizableContainer;
- private BackgroundScreenStack backgroundStack;
+ private BackgroundScreenStack? backgroundStack;
- private Bindable scalingMenuBackgroundDim;
+ private Bindable scalingMenuBackgroundDim = null!;
private RectangleF? customRect;
private bool customRectIsRelativePosition;
@@ -88,7 +86,8 @@ public ScalingContainer(ScalingMode? targetMode = null)
public partial class ScalingDrawSizePreservingFillContainer : DrawSizePreservingFillContainer
{
private readonly bool applyUIScale;
- private Bindable uiScale;
+
+ private Bindable? uiScale;
protected float CurrentScale { get; private set; } = 1;
@@ -99,6 +98,9 @@ public ScalingDrawSizePreservingFillContainer(bool applyUIScale)
this.applyUIScale = applyUIScale;
}
+ [Resolved(canBeNull: true)]
+ private OsuGame? game { get; set; }
+
[BackgroundDependencyLoader]
private void load(OsuConfigManager osuConfig)
{
@@ -111,6 +113,8 @@ private void load(OsuConfigManager osuConfig)
protected override void Update()
{
+ if (game != null)
+ TargetDrawSize = game.ScalingContainerTargetDrawSize;
Scale = new Vector2(CurrentScale);
Size = new Vector2(1 / CurrentScale);
@@ -233,13 +237,13 @@ public override void OnEntering(ScreenTransitionEvent e)
private partial class SizeableAlwaysInputContainer : Container
{
[Resolved]
- private GameHost host { get; set; }
+ private GameHost host { get; set; } = null!;
[Resolved]
- private ISafeArea safeArea { get; set; }
+ private ISafeArea safeArea { get; set; } = null!;
[Resolved]
- private OsuConfigManager config { get; set; }
+ private OsuConfigManager config { get; set; } = null!;
private readonly bool confineHostCursor;
private readonly LayoutValue cursorRectCache = new LayoutValue(Invalidation.RequiredParentSizeToFit);
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 6c725cab4f07..d379392a7de7 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -72,6 +72,7 @@
using osu.Game.Updater;
using osu.Game.Users;
using osu.Game.Utils;
+using osuTK;
using osuTK.Graphics;
using Sentry;
@@ -813,6 +814,12 @@ public override Task Import(ImportTask[] imports, ImportParameters parameters =
protected virtual UpdateManager CreateUpdateManager() => new UpdateManager();
+ ///
+ /// Adjust the globally applied in every .
+ /// Useful for changing how the game handles different aspect ratios.
+ ///
+ protected internal virtual Vector2 ScalingContainerTargetDrawSize { get; } = new Vector2(1024, 768);
+
protected override Container CreateScalingContainer() => new ScalingContainer(ScalingMode.Everything);
#region Beatmap progression
diff --git a/osu.iOS/OsuGameIOS.cs b/osu.iOS/OsuGameIOS.cs
index a0132de966b9..883e89e38ab4 100644
--- a/osu.iOS/OsuGameIOS.cs
+++ b/osu.iOS/OsuGameIOS.cs
@@ -11,6 +11,7 @@
using osu.Game.Screens;
using osu.Game.Updater;
using osu.Game.Utils;
+using osuTK;
using UIKit;
namespace osu.iOS
@@ -22,6 +23,8 @@ public partial class OsuGameIOS : OsuGame
public override bool HideUnlicensedContent => true;
+ protected override Vector2 ScalingContainerTargetDrawSize => new Vector2(1024, 1024 * DrawHeight / DrawWidth);
+
public OsuGameIOS(AppDelegate appDelegate)
{
this.appDelegate = appDelegate;