Browse Source

Haptic: Explicitly avoid floating point arithmetic if it's not needed.

Thanks, Elias!

Partially fixes Bugzilla #2686.
Ryan C. Gordon 10 years ago
parent
commit
a2622ce6e0
1 changed files with 9 additions and 4 deletions
  1. 9 4
      src/haptic/linux/SDL_syshaptic.c

+ 9 - 4
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: