summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorbajones <bajones@chromium.org>2015-11-05 18:47:45 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-06 02:48:47 +0000
commit71cdd9187961525087022b0e9b00b6b103f76fd1 (patch)
treee21c015d152232e494204711f27f66fa8d5fb429 /content
parent0c1375df4d18383c937632d9b126e6a118096c63 (diff)
downloadchromium_src-71cdd9187961525087022b0e9b00b6b103f76fd1.zip
chromium_src-71cdd9187961525087022b0e9b00b6b103f76fd1.tar.gz
chromium_src-71cdd9187961525087022b0e9b00b6b103f76fd1.tar.bz2
Changing gamepad sanitization to happen after mapping
BUG=529668 Review URL: https://codereview.chromium.org/1415603010 Cr-Commit-Position: refs/heads/master@{#358239}
Diffstat (limited to 'content')
-rw-r--r--content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc51
-rw-r--r--content/browser/gamepad/gamepad_platform_data_fetcher_linux.h1
-rw-r--r--content/browser/gamepad/gamepad_platform_data_fetcher_mac.h4
-rw-r--r--content/browser/gamepad/gamepad_platform_data_fetcher_mac.mm41
-rw-r--r--content/browser/gamepad/gamepad_platform_data_fetcher_win.cc100
-rw-r--r--content/browser/gamepad/gamepad_platform_data_fetcher_win.h1
6 files changed, 123 insertions, 75 deletions
diff --git a/content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc b/content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc
index a7b4f93..5196674 100644
--- a/content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc
+++ b/content/browser/gamepad/gamepad_platform_data_fetcher_linux.cc
@@ -94,6 +94,33 @@ GamepadPlatformDataFetcherLinux::~GamepadPlatformDataFetcherLinux() {
CloseFileDescriptorIfValid(pad_state_[i].device_fd);
}
+void GamepadPlatformDataFetcherLinux::SanitizeGamepadData(size_t index,
+ WebGamepad* pad) {
+ bool* axes_reset = pad_state_[index].is_axes_ever_reset;
+ bool* buttons_reset = pad_state_[index].is_buttons_ever_reset;
+
+ for (size_t axis = 0; axis < pad->axesLength; ++axis) {
+ if (!axes_reset[axis]) {
+ if (fabs(pad->axes[axis]) < kMinAxisResetValue) {
+ axes_reset[axis] = true;
+ } else {
+ pad->axes[axis] = 0.0f;
+ }
+ }
+ }
+
+ for (size_t button = 0; button < pad->buttonsLength; ++button) {
+ if (!buttons_reset[button]) {
+ if (!pad->buttons[button].pressed) {
+ buttons_reset[button] = true;
+ } else {
+ pad->buttons[button].pressed = false;
+ pad->buttons[button].value = 0.0f;
+ }
+ }
+ }
+}
+
void GamepadPlatformDataFetcherLinux::GetGamepadData(WebGamepads* pads, bool) {
TRACE_EVENT0("GAMEPAD", "GetGamepadData");
@@ -112,6 +139,7 @@ void GamepadPlatformDataFetcherLinux::GetGamepadData(WebGamepads* pads, bool) {
pad_state_[i].mapper(pad_state_[i].data, &pads->items[i]);
else
pads->items[i] = pad_state_[i].data;
+ SanitizeGamepadData(i, &pads->items[i]);
}
}
@@ -255,8 +283,6 @@ void GamepadPlatformDataFetcherLinux::ReadDeviceData(size_t index) {
const int& fd = pad_state_[index].device_fd;
WebGamepad& pad = pad_state_[index].data;
- bool* axes_reset = pad_state_[index].is_axes_ever_reset;
- bool* buttons_reset = pad_state_[index].is_buttons_ever_reset;
DCHECK_GE(fd, 0);
js_event event;
@@ -266,14 +292,7 @@ void GamepadPlatformDataFetcherLinux::ReadDeviceData(size_t index) {
if (item >= WebGamepad::axesLengthCap)
continue;
- float val = event.value / kMaxLinuxAxisValue;
- if (fabs(val) < kMinAxisResetValue)
- axes_reset[item] = true;
-
- if (axes_reset[item])
- pad.axes[item] = val;
- else
- pad.axes[item] = 0.0;
+ pad.axes[item] = event.value / kMaxLinuxAxisValue;
if (item >= pad.axesLength)
pad.axesLength = item + 1;
@@ -281,16 +300,8 @@ void GamepadPlatformDataFetcherLinux::ReadDeviceData(size_t index) {
if (item >= WebGamepad::buttonsLengthCap)
continue;
- if (!event.value)
- buttons_reset[item] = true;
-
- if (buttons_reset[item]) {
- pad.buttons[item].pressed = event.value;
- pad.buttons[item].value = event.value ? 1.0 : 0.0;
- } else {
- pad.buttons[item].pressed = false;
- pad.buttons[item].value = 0.0;
- }
+ pad.buttons[item].pressed = event.value;
+ pad.buttons[item].value = event.value ? 1.0 : 0.0;
if (item >= pad.buttonsLength)
pad.buttonsLength = item + 1;
diff --git a/content/browser/gamepad/gamepad_platform_data_fetcher_linux.h b/content/browser/gamepad/gamepad_platform_data_fetcher_linux.h
index 3742d60c..251b3a1 100644
--- a/content/browser/gamepad/gamepad_platform_data_fetcher_linux.h
+++ b/content/browser/gamepad/gamepad_platform_data_fetcher_linux.h
@@ -35,6 +35,7 @@ class GamepadPlatformDataFetcherLinux : public GamepadDataFetcher {
void RefreshDevice(udev_device* dev);
void EnumerateDevices();
void ReadDeviceData(size_t index);
+ void SanitizeGamepadData(size_t index, blink::WebGamepad* pad);
struct PadState {
// File descriptor for the /dev/input/js* devices. -1 if not in use.
diff --git a/content/browser/gamepad/gamepad_platform_data_fetcher_mac.h b/content/browser/gamepad/gamepad_platform_data_fetcher_mac.h
index 15de8d1..302a6c1 100644
--- a/content/browser/gamepad/gamepad_platform_data_fetcher_mac.h
+++ b/content/browser/gamepad/gamepad_platform_data_fetcher_mac.h
@@ -72,6 +72,8 @@ class GamepadPlatformDataFetcherMac : public GamepadDataFetcher,
void RegisterForNotifications();
void UnregisterFromNotifications();
+ void SanitizeGamepadData(size_t index, blink::WebGamepad* pad);
+
scoped_ptr<XboxDataFetcher> xbox_fetcher_;
blink::WebGamepads data_;
@@ -96,6 +98,8 @@ class GamepadPlatformDataFetcherMac : public GamepadDataFetcher,
UInt32 location_id;
} xbox;
};
+ bool is_axes_ever_reset[blink::WebGamepad::axesLengthCap];
+ bool is_buttons_ever_reset[blink::WebGamepad::buttonsLengthCap];
};
AssociatedData associated_[blink::WebGamepads::itemsLengthCap];
diff --git a/content/browser/gamepad/gamepad_platform_data_fetcher_mac.mm b/content/browser/gamepad/gamepad_platform_data_fetcher_mac.mm
index f25d15a..5c27631 100644
--- a/content/browser/gamepad/gamepad_platform_data_fetcher_mac.mm
+++ b/content/browser/gamepad/gamepad_platform_data_fetcher_mac.mm
@@ -50,6 +50,8 @@ const uint32_t kGameUsageNumber = 0x05;
const uint32_t kMultiAxisUsageNumber = 0x08;
const uint32_t kAxisMinimumUsageNumber = 0x30;
+const float kMinAxisResetValue = 0.1;
+
} // namespace
GamepadPlatformDataFetcherMac::GamepadPlatformDataFetcherMac()
@@ -328,6 +330,11 @@ void GamepadPlatformDataFetcherMac::DeviceAdd(IOHIDDeviceRef device) {
data_.items[slot].connected = true;
if (slot >= data_.length)
data_.length = slot + 1;
+
+ for (size_t j = 0; j < blink::WebGamepad::axesLengthCap; ++j)
+ associated_[slot].is_axes_ever_reset[j] = false;
+ for (size_t j = 0; j < blink::WebGamepad::buttonsLengthCap; ++j)
+ associated_[slot].is_buttons_ever_reset[j] = false;
}
void GamepadPlatformDataFetcherMac::DeviceRemove(IOHIDDeviceRef device) {
@@ -437,6 +444,11 @@ void GamepadPlatformDataFetcherMac::XboxDeviceAdd(XboxController* device) {
data_.items[slot].timestamp = 0;
if (slot >= data_.length)
data_.length = slot + 1;
+
+ for (size_t j = 0; j < blink::WebGamepad::axesLengthCap; ++j)
+ associated_[slot].is_axes_ever_reset[j] = false;
+ for (size_t j = 0; j < blink::WebGamepad::buttonsLengthCap; ++j)
+ associated_[slot].is_buttons_ever_reset[j] = false;
}
void GamepadPlatformDataFetcherMac::XboxDeviceRemove(XboxController* device) {
@@ -491,6 +503,33 @@ void GamepadPlatformDataFetcherMac::XboxValueChanged(
pad.timestamp = base::TimeTicks::Now().ToInternalValue();
}
+void GamepadPlatformDataFetcherMac::SanitizeGamepadData(size_t index,
+ WebGamepad* pad) {
+ bool* axes_reset = associated_[index].is_axes_ever_reset;
+ bool* buttons_reset = associated_[index].is_buttons_ever_reset;
+
+ for (size_t axis = 0; axis < pad->axesLength; ++axis) {
+ if (!axes_reset[axis]) {
+ if (fabs(pad->axes[axis]) < kMinAxisResetValue) {
+ axes_reset[axis] = true;
+ } else {
+ pad->axes[axis] = 0.0f;
+ }
+ }
+ }
+
+ for (size_t button = 0; button < pad->buttonsLength; ++button) {
+ if (!buttons_reset[button]) {
+ if (!pad->buttons[button].pressed) {
+ buttons_reset[button] = true;
+ } else {
+ pad->buttons[button].pressed = false;
+ pad->buttons[button].value = 0.0f;
+ }
+ }
+ }
+}
+
void GamepadPlatformDataFetcherMac::GetGamepadData(WebGamepads* pads, bool) {
if (!enabled_ && !xbox_fetcher_) {
pads->length = 0;
@@ -505,6 +544,8 @@ void GamepadPlatformDataFetcherMac::GetGamepadData(WebGamepads* pads, bool) {
associated_[i].hid.mapper(data_.items[i], &pads->items[i]);
else
pads->items[i] = data_.items[i];
+
+ SanitizeGamepadData(i, &pads->items[i]);
}
}
diff --git a/content/browser/gamepad/gamepad_platform_data_fetcher_win.cc b/content/browser/gamepad/gamepad_platform_data_fetcher_win.cc
index 88aa7ec..7372126 100644
--- a/content/browser/gamepad/gamepad_platform_data_fetcher_win.cc
+++ b/content/browser/gamepad/gamepad_platform_data_fetcher_win.cc
@@ -172,6 +172,32 @@ void GamepadPlatformDataFetcherWin::EnumerateDevices(
}
}
+void GamepadPlatformDataFetcherWin::SanitizeGamepadData(size_t index,
+ WebGamepad* pad) {
+ bool* axes_reset = pad_state_[index].is_axes_ever_reset;
+ bool* buttons_reset = pad_state_[index].is_buttons_ever_reset;
+
+ for (size_t axis = 0; axis < pad->axesLength; ++axis) {
+ if (!axes_reset[axis]) {
+ if (fabs(pad->axes[axis]) < kMinAxisResetValue) {
+ axes_reset[axis] = true;
+ } else {
+ pad->axes[axis] = 0.0f;
+ }
+ }
+ }
+
+ for (size_t button = 0; button < pad->buttonsLength; ++button) {
+ if (!buttons_reset[button]) {
+ if (!pad->buttons[button].pressed) {
+ buttons_reset[button] = true;
+ } else {
+ pad->buttons[button].pressed = false;
+ pad->buttons[button].value = 0.0f;
+ }
+ }
+ }
+}
void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads,
bool devices_changed_hint) {
@@ -207,6 +233,8 @@ void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads,
else if (pad_state_[i].status == RAWINPUT_CONNECTED)
GetRawInputPadData(i, &pads->items[i]);
+ SanitizeGamepadData(i, &pads->items[i]);
+
if (pads->items[i].connected)
pads->length++;
}
@@ -254,43 +282,25 @@ void GamepadPlatformDataFetcherWin::GetXInputPadData(
pad->buttonsLength = 0;
WORD val = state.Gamepad.wButtons;
#define ADD(b) if (!val) \
- pad_state_[i].is_buttons_ever_reset[pad->buttonsLength] = true; \
- if (pad_state_[i].is_buttons_ever_reset[pad->buttonsLength]) { \
- pad->buttons[pad->buttonsLength].pressed = (val & (b)) != 0; \
- pad->buttons[pad->buttonsLength++].value = ((val & (b)) ? 1.f : 0.f); \
- } else { \
- pad->buttons[pad->buttonsLength].pressed = false; \
- pad->buttons[pad->buttonsLength++].value = 0.0; \
- }
+ pad->buttons[pad->buttonsLength].pressed = (val & (b)) != 0; \
+ pad->buttons[pad->buttonsLength++].value = ((val & (b)) ? 1.f : 0.f);
ADD(XINPUT_GAMEPAD_A);
ADD(XINPUT_GAMEPAD_B);
ADD(XINPUT_GAMEPAD_X);
ADD(XINPUT_GAMEPAD_Y);
ADD(XINPUT_GAMEPAD_LEFT_SHOULDER);
ADD(XINPUT_GAMEPAD_RIGHT_SHOULDER);
- if (state.Gamepad.bLeftTrigger < XINPUT_GAMEPAD_TRIGGER_THRESHOLD)
- pad_state_[i].is_buttons_ever_reset[pad->buttonsLength] = true;
- if (pad_state_[i].is_buttons_ever_reset[pad->buttonsLength]) {
- pad->buttons[pad->buttonsLength].pressed =
- state.Gamepad.bLeftTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
- pad->buttons[pad->buttonsLength++].value =
- state.Gamepad.bLeftTrigger / 255.f;
- } else {
- pad->buttons[pad->buttonsLength].pressed = false;
- pad->buttons[pad->buttonsLength++].value = 0.0;
- }
- if (state.Gamepad.bRightTrigger < XINPUT_GAMEPAD_TRIGGER_THRESHOLD)
- pad_state_[i].is_buttons_ever_reset[pad->buttonsLength] = true;
- if (pad_state_[i].is_buttons_ever_reset[pad->buttonsLength]) {
- pad->buttons[pad->buttonsLength].pressed =
- state.Gamepad.bRightTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
- pad->buttons[pad->buttonsLength++].value =
- state.Gamepad.bRightTrigger / 255.f;
- } else {
- pad->buttons[pad->buttonsLength].pressed = false;
- pad->buttons[pad->buttonsLength++].value = 0.0;
- }
+ pad->buttons[pad->buttonsLength].pressed =
+ state.Gamepad.bLeftTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
+ pad->buttons[pad->buttonsLength++].value =
+ state.Gamepad.bLeftTrigger / 255.f;
+
+ pad->buttons[pad->buttonsLength].pressed =
+ state.Gamepad.bRightTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD;
+ pad->buttons[pad->buttonsLength++].value =
+ state.Gamepad.bRightTrigger / 255.f;
+
ADD(XINPUT_GAMEPAD_BACK);
ADD(XINPUT_GAMEPAD_START);
ADD(XINPUT_GAMEPAD_LEFT_THUMB);
@@ -304,12 +314,7 @@ void GamepadPlatformDataFetcherWin::GetXInputPadData(
float value = 0.0;
#define ADD(a, factor) value = factor * NormalizeXInputAxis(a); \
- if (fabs(value) < kMinAxisResetValue) \
- pad_state_[i].is_axes_ever_reset[pad->axesLength] = true; \
- if (pad_state_[i].is_axes_ever_reset[pad->axesLength]) \
- pad->axes[pad->axesLength++] = value; \
- else \
- pad->axes[pad->axesLength++] = 0.0;
+ pad->axes[pad->axesLength++] = value;
// XInput are +up/+right, -down/-left, we want -up/-left.
ADD(state.Gamepad.sThumbLX, 1);
@@ -339,27 +344,12 @@ void GamepadPlatformDataFetcherWin::GetRawInputPadData(
raw_pad.axesLength = gamepad->axes_length;
for (unsigned int i = 0; i < raw_pad.buttonsLength; i++) {
- if (!gamepad->buttons[i])
- pad_state_[index].is_buttons_ever_reset[i] = true;
-
- if (pad_state_[index].is_buttons_ever_reset[i]) {
- raw_pad.buttons[i].pressed = gamepad->buttons[i];
- raw_pad.buttons[i].value = gamepad->buttons[i] ? 1.0 : 0.0;
- } else {
- raw_pad.buttons[i].pressed = false;
- raw_pad.buttons[i].value = 0.0;
- }
+ raw_pad.buttons[i].pressed = gamepad->buttons[i];
+ raw_pad.buttons[i].value = gamepad->buttons[i] ? 1.0 : 0.0;
}
- for (unsigned int i = 0; i < raw_pad.axesLength; i++) {
- if (fabs(gamepad->axes[i].value) < kMinAxisResetValue)
- pad_state_[index].is_axes_ever_reset[i] = true;
-
- if (pad_state_[index].is_axes_ever_reset[i])
- raw_pad.axes[i] = gamepad->axes[i].value;
- else
- raw_pad.axes[i] = 0.0;
- }
+ for (unsigned int i = 0; i < raw_pad.axesLength; i++)
+ raw_pad.axes[i] = gamepad->axes[i].value;
// Copy to the current state to the output buffer, using the mapping
// function, if there is one available.
diff --git a/content/browser/gamepad/gamepad_platform_data_fetcher_win.h b/content/browser/gamepad/gamepad_platform_data_fetcher_win.h
index 86ea629..a668366 100644
--- a/content/browser/gamepad/gamepad_platform_data_fetcher_win.h
+++ b/content/browser/gamepad/gamepad_platform_data_fetcher_win.h
@@ -65,6 +65,7 @@ class GamepadPlatformDataFetcherWin : public GamepadDataFetcher {
int FirstAvailableGamepadId() const;
bool HasXInputGamepad(int index) const;
bool HasRawInputGamepad(const HANDLE handle) const;
+ void SanitizeGamepadData(size_t index, blink::WebGamepad* pad);
base::ScopedNativeLibrary xinput_dll_;
bool xinput_available_;