diff options
author | bajones <bajones@chromium.org> | 2015-11-05 18:47:45 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-06 02:48:47 +0000 |
commit | 71cdd9187961525087022b0e9b00b6b103f76fd1 (patch) | |
tree | e21c015d152232e494204711f27f66fa8d5fb429 /content | |
parent | 0c1375df4d18383c937632d9b126e6a118096c63 (diff) | |
download | chromium_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')
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_; |