dix: improve readbility of DoGetDirection.
Use enums for the direction bits, not hardcoded bitfield values that are added up. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Daniel Stone <daniel@fooishbar.org> Reviewed-by: Jamey Sharp <jamey@minilop.net> Reviewed-by: Simon Thum <simon.thum@gmx.de>
This commit is contained in:
parent
709b291972
commit
e804ae85fe
|
@ -429,14 +429,27 @@ InitTrackers(DeviceVelocityPtr vel, int ntracker)
|
||||||
vel->num_tracker = ntracker;
|
vel->num_tracker = ntracker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum directions {
|
||||||
|
N = (1 << 0),
|
||||||
|
NE = (1 << 1),
|
||||||
|
E = (1 << 2),
|
||||||
|
SE = (1 << 3),
|
||||||
|
S = (1 << 4),
|
||||||
|
SW = (1 << 5),
|
||||||
|
W = (1 << 6),
|
||||||
|
NW = (1 << 7),
|
||||||
|
UNDEFINED = 0xFF
|
||||||
|
};
|
||||||
/**
|
/**
|
||||||
* return a bit field of possible directions.
|
* return a bit field of possible directions.
|
||||||
* 0 = N, 2 = E, 4 = S, 6 = W, in-between is as you guess.
|
|
||||||
* There's no reason against widening to more precise directions (<45 degrees),
|
* There's no reason against widening to more precise directions (<45 degrees),
|
||||||
* should it not perform well. All this is needed for is sort out non-linear
|
* should it not perform well. All this is needed for is sort out non-linear
|
||||||
* motion, so precision isn't paramount. However, one should not flag direction
|
* motion, so precision isn't paramount. However, one should not flag direction
|
||||||
* too narrow, since it would then cut the linear segment to zero size way too
|
* too narrow, since it would then cut the linear segment to zero size way too
|
||||||
* often.
|
* often.
|
||||||
|
*
|
||||||
|
* @return A bitmask for N, NE, S, SE, etc. indicating the directions for
|
||||||
|
* this movement.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
DoGetDirection(int dx, int dy){
|
DoGetDirection(int dx, int dy){
|
||||||
|
@ -446,23 +459,23 @@ DoGetDirection(int dx, int dy){
|
||||||
if(abs(dx) < 2 && abs(dy) < 2){
|
if(abs(dx) < 2 && abs(dy) < 2){
|
||||||
/* first check diagonal cases */
|
/* first check diagonal cases */
|
||||||
if(dx > 0 && dy > 0)
|
if(dx > 0 && dy > 0)
|
||||||
return 4+8+16;
|
return E | SE | S;
|
||||||
if(dx > 0 && dy < 0)
|
if(dx > 0 && dy < 0)
|
||||||
return 1+2+4;
|
return N | NE | E;
|
||||||
if(dx < 0 && dy < 0)
|
if(dx < 0 && dy < 0)
|
||||||
return 1+128+64;
|
return W | NW | N;
|
||||||
if(dx < 0 && dy > 0)
|
if(dx < 0 && dy > 0)
|
||||||
return 16+32+64;
|
return W | SW | S;
|
||||||
/* check axis-aligned directions */
|
/* check axis-aligned directions */
|
||||||
if(dx > 0)
|
if(dx > 0)
|
||||||
return 2+4+8; /*E*/
|
return NE | E | SE;
|
||||||
if(dx < 0)
|
if(dx < 0)
|
||||||
return 128+64+32; /*W*/
|
return NW | W | SW;
|
||||||
if(dy > 0)
|
if(dy > 0)
|
||||||
return 32+16+8; /*S*/
|
return SE | S | SW;
|
||||||
if(dy < 0)
|
if(dy < 0)
|
||||||
return 128+1+2; /*N*/
|
return NE | N | NW;
|
||||||
return 255; /* shouldn't happen */
|
return UNDEFINED; /* shouldn't happen */
|
||||||
}
|
}
|
||||||
/* else, compute angle and set appropriate flags */
|
/* else, compute angle and set appropriate flags */
|
||||||
#ifdef _ISOC99_SOURCE
|
#ifdef _ISOC99_SOURCE
|
||||||
|
@ -478,7 +491,7 @@ DoGetDirection(int dx, int dy){
|
||||||
i1 = (int)(r+0.1) % 8;
|
i1 = (int)(r+0.1) % 8;
|
||||||
i2 = (int)(r+0.9) % 8;
|
i2 = (int)(r+0.9) % 8;
|
||||||
if(i1 < 0 || i1 > 7 || i2 < 0 || i2 > 7)
|
if(i1 < 0 || i1 > 7 || i2 < 0 || i2 > 7)
|
||||||
return 255; /* shouldn't happen */
|
return UNDEFINED; /* shouldn't happen */
|
||||||
return 1 << i1 | 1 << i2;
|
return 1 << i1 | 1 << i2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -558,7 +571,7 @@ CalcTracker(DeviceVelocityPtr vel, int offset, int cur_t){
|
||||||
*/
|
*/
|
||||||
static float
|
static float
|
||||||
QueryTrackers(DeviceVelocityPtr vel, int cur_t){
|
QueryTrackers(DeviceVelocityPtr vel, int cur_t){
|
||||||
int n, offset, dir = 255, i = -1, age_ms;
|
int n, offset, dir = UNDEFINED, i = -1, age_ms;
|
||||||
/* initial velocity: a low-offset, valid velocity */
|
/* initial velocity: a low-offset, valid velocity */
|
||||||
float iveloc = 0, res = 0, tmp, vdiff;
|
float iveloc = 0, res = 0, tmp, vdiff;
|
||||||
float vfac = vel->corr_mul * vel->const_acceleration; /* premultiply */
|
float vfac = vel->corr_mul * vel->const_acceleration; /* premultiply */
|
||||||
|
|
Loading…
Reference in New Issue