Vitaliy Margolen : dinput: Fix dead zone handling.

Alexandre Julliard julliard at winehq.org
Mon Nov 26 08:16:16 CST 2007


Module: wine
Branch: master
Commit: 1ed3a815edc0edca2c077a1a2795414fca187cf7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1ed3a815edc0edca2c077a1a2795414fca187cf7

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Sun Nov 25 11:17:28 2007 -0700

dinput: Fix dead zone handling.

---

 dlls/dinput/joystick_linuxinput.c |   25 ++++++++++++++++---------
 1 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index 18417fb..13e413b 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -88,23 +88,30 @@ DWORD joystick_map_pov(POINTL *p)
 /*
  * This maps the read value (from the input event) to a value in the
  * 'wanted' range.
+ * Notes:
+ *   Dead zone is in % multiplied by a 100 (range 0..10000)
  */
 LONG joystick_map_axis(ObjProps *props, int val)
 {
     LONG ret;
-    LONG center = (props->lMax - props->lMin) / 2;
+    LONG dead_zone = MulDiv( props->lDeadZone, props->lDevMax - props->lDevMin, 10000 );
+    LONG dev_range = props->lDevMax - props->lDevMin - dead_zone;
 
-    /* map the value from the hmin-hmax range into the wmin-wmax range */
-    ret = MulDiv( val - props->lDevMin, props->lMax - props->lMin,
-                  props->lDevMax - props->lDevMin );
+    /* Center input */
+    val -= (props->lDevMin + props->lDevMax) / 2;
 
-    if (abs( ret - center ) <= props->lDeadZone / 2 )
-        ret = center;
+    /* Remove dead zone */
+    if (abs( val ) <= dead_zone / 2)
+        val = 0;
+    else
+        val = val < 0 ? val + dead_zone / 2 : val - dead_zone / 2;
 
-    ret += props->lMin;
+    /* Scale and map the value from the device range into the required range */
+    ret = MulDiv( val, props->lMax - props->lMin, dev_range ) +
+          (props->lMin + props->lMax) / 2;
 
-    TRACE( "(%d %d) -> (%d <%d> %d): val=%d ret=%d\n",
-           props->lDevMin, props->lDevMax,
+    TRACE( "(%d <%d> %d) -> (%d <%d> %d): val=%d ret=%d\n",
+           props->lDevMin, dead_zone, props->lDevMax,
            props->lMin, props->lDeadZone, props->lMax,
            val, ret );
 




More information about the wine-cvs mailing list