summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/state.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/state.c b/src/state.c
index 5387828..895d096 100644
--- a/src/state.c
+++ b/src/state.c
@@ -36,10 +36,23 @@ static int fincmp(const void *a, const void *b)
36 return ((struct FingerState *)a)->id - ((struct FingerState *)b)->id; 36 return ((struct FingerState *)a)->id - ((struct FingerState *)b)->id;
37} 37}
38 38
39inline float dist2(const struct FingerData *a, const struct FingerData *b) 39/* seander@cs.stanford.edu */
40inline unsigned abs32(int x)
40{ 41{
41 float dx = a->position_x - b->position_x; 42 int const m = x >> 31;
42 float dy = a->position_y - b->position_y; 43 return (x + m) ^ m;
44}
45
46inline int abs15(int x)
47{
48 return 32767 & abs32(x);
49}
50
51/* abslute scale is assumed to fit in 15 bits */
52inline int dist2(const struct FingerData *a, const struct FingerData *b)
53{
54 int dx = abs15(a->position_x - b->position_x);
55 int dy = abs15(a->position_y - b->position_y);
43 56
44 return dx * dx + dy * dy; 57 return dx * dx + dy * dy;
45} 58}
@@ -71,7 +84,7 @@ void modify_state(struct State *s,
71 const struct HWData *hw, 84 const struct HWData *hw,
72 const struct Capabilities *caps) 85 const struct Capabilities *caps)
73{ 86{
74 float A[DIM2_FINGER], *row; 87 int A[DIM2_FINGER], *row;
75 int sid[DIM_FINGER], hw2s[DIM_FINGER]; 88 int sid[DIM_FINGER], hw2s[DIM_FINGER];
76 int id, sk, hwk; 89 int id, sk, hwk;
77 90