blob: 8f913767aa5145cd3ebcc5b43f2a771f1837f529 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gestures/include/box_filter_interpreter.h"
#include "gestures/include/macros.h"
#include "gestures/include/tracer.h"
#include "gestures/include/util.h"
namespace gestures {
BoxFilterInterpreter::BoxFilterInterpreter(PropRegistry* prop_reg,
Interpreter* next,
Tracer* tracer)
: FilterInterpreter(NULL, next, tracer, false),
box_width_(prop_reg, "Box Width", 0.0),
box_height_(prop_reg, "Box Height", 0.0) {
InitName();
}
void BoxFilterInterpreter::SyncInterpretImpl(HardwareState* hwstate,
stime_t* timeout) {
if (box_width_.val_ == 0.0 && box_height_.val_ == 0.0) {
next_->SyncInterpret(hwstate, timeout);
return;
}
RemoveMissingIdsFromMap(&previous_output_, *hwstate);
const float kHalfWidth = box_width_.val_ * 0.5;
const float kHalfHeight = box_height_.val_ * 0.5;
for (size_t i = 0; i < hwstate->finger_cnt; i++) {
FingerState& fs = hwstate->fingers[i];
// If it's new, pass it through
if (!MapContainsKey(previous_output_, fs.tracking_id))
continue;
const FingerState& prev_out = previous_output_[fs.tracking_id];
float FingerState::*fields[] = { &FingerState::position_x,
&FingerState::position_y };
const float kBounds[] = { kHalfWidth, kHalfHeight };
unsigned warp[] = { GESTURES_FINGER_WARP_X_MOVE,
GESTURES_FINGER_WARP_Y_MOVE };
for (size_t f_idx = 0; f_idx < arraysize(fields); f_idx++) {
if (fs.flags & warp[f_idx]) // If warping, just move to the new point
continue;
float FingerState::*field = fields[f_idx];
float prev_out_val = prev_out.*field;
float val = fs.*field;
float bound = kBounds[f_idx];
if (prev_out_val - bound < val && val < prev_out_val + bound) {
// keep box in place
fs.*field = prev_out_val;
} else if (val > prev_out_val) {
fs.*field -= bound;
} else {
fs.*field += bound;
}
}
}
for (size_t i = 0; i < hwstate->finger_cnt; i++)
previous_output_[hwstate->fingers[i].tracking_id] = hwstate->fingers[i];
next_->SyncInterpret(hwstate, timeout);
}
} // namespace gestures