Commit a2622ce6e07eae6e5d60779468cb8721f70b21e3

Ryan C. Gordon 2014-08-16T16:42:55

Haptic: Explicitly avoid floating point arithmetic if it's not needed. Thanks, Elias! Partially fixes Bugzilla #2686.

diff --git a/src/haptic/linux/SDL_syshaptic.c b/src/haptic/linux/SDL_syshaptic.c
index c70a470..5320fb5 100644
--- a/src/haptic/linux/SDL_syshaptic.c
+++ b/src/haptic/linux/SDL_syshaptic.c
@@ -658,7 +658,6 @@ static int
 SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
 {
     Uint32 tmp;
-    float f;                    /* Ideally we'd use fixed point math instead of floats... */
 
     switch (src->type) {
     case SDL_HAPTIC_POLAR:
@@ -690,7 +689,12 @@ SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
         break;
 
     case SDL_HAPTIC_CARTESIAN:
-        f = atan2(src->dir[1], src->dir[0]);
+        if (!src->dir[1])
+            *dest = (src->dir[0] >= 0 ? 0x4000 : 0xC000);
+        else if (!src->dir[0])
+            *dest = (src->dir[1] >= 0 ? 0x8000 : 0);
+        else {
+            float f = atan2(src->dir[1], src->dir[0]);    /* Ideally we'd use fixed point math instead of floats... */
                     /*
                       atan2 takes the parameters: Y-axis-value and X-axis-value (in that order)
                        - Y-axis-value is the second coordinate (from center to SOUTH)
@@ -702,8 +706,9 @@ SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
                       --> finally convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR.
                     */
                 tmp = (((Sint32) (f * 18000. / M_PI)) + 45000) % 36000;
-        tmp = (tmp * 0x8000) / 18000; /* convert to range [0,0xFFFF] */
-        *dest = (Uint16) tmp;
+            tmp = (tmp * 0x8000) / 18000; /* convert to range [0,0xFFFF] */
+            *dest = (Uint16) tmp;
+        }
         break;
 
     default: