From 8212a864cad67b5b3c1fb2212a637801539ba7eb Mon Sep 17 00:00:00 2001
From: german77 <juangerman-13@hotmail.com>
Date: Thu, 7 Oct 2021 20:35:30 -0500
Subject: [PATCH] input_common/sdl: Fix joystick range

---
 src/input_common/sdl/sdl_impl.cpp | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp
index ab6211b29c..ecb00d4286 100644
--- a/src/input_common/sdl/sdl_impl.cpp
+++ b/src/input_common/sdl/sdl_impl.cpp
@@ -170,7 +170,8 @@ public:
     float GetAxis(int axis, float range, float offset) const {
         std::lock_guard lock{mutex};
         const float value = static_cast<float>(state.axes.at(axis)) / 32767.0f;
-        return (value + offset) / range;
+        const float offset_scale = (value + offset) > 0.0f ? 1.0f + offset : 1.0f - offset;
+        return (value + offset) / range / offset_scale;
     }
 
     bool RumblePlay(u16 amp_low, u16 amp_high) {
@@ -789,8 +790,8 @@ public:
         const std::string invert_y_value = params.Get("invert_y", "+");
         const bool invert_x = invert_x_value == "-";
         const bool invert_y = invert_y_value == "-";
-        const float offset_x = params.Get("offset_x", 0.0f);
-        const float offset_y = params.Get("offset_y", 0.0f);
+        const float offset_x = std::clamp(params.Get("offset_x", 0.0f), -0.99f, 0.99f);
+        const float offset_y = std::clamp(params.Get("offset_y", 0.0f), -0.99f, 0.99f);
         auto joystick = state.GetSDLJoystickByGUID(guid, port);
 
         // This is necessary so accessing GetAxis with axis_x and axis_y won't crash