From 39f903481c64444c13bf4a9598f91d025f0a4c13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Mon, 16 May 2022 11:50:39 +0200 Subject: [PATCH] dinput: Store the user_format field inline in struct dinput_device. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: RĂ©mi Bernon Signed-off-by: Alexandre Julliard --- dlls/dinput/device.c | 40 +++++++++++++++--------------------- dlls/dinput/device_private.h | 2 +- dlls/dinput/joystick_hid.c | 4 ++-- dlls/dinput/mouse.c | 6 +++--- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index a23398ac794..bd2064b1484 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -210,9 +210,8 @@ BOOL device_instance_is_disabled( DIDEVICEINSTANCEW *instance, BOOL *override ) static void dinput_device_release_user_format( struct dinput_device *impl ) { - if (impl->user_format) free( impl->user_format->rgodf ); - free( impl->user_format ); - impl->user_format = NULL; + free( impl->user_format.rgodf ); + impl->user_format.rgodf = NULL; } static inline LPDIOBJECTDATAFORMAT dataformat_to_odf(LPCDIDATAFORMAT df, int idx) @@ -276,20 +275,15 @@ static BOOL match_device_object( const DIDATAFORMAT *device_format, DIDATAFORMAT static HRESULT dinput_device_init_user_format( struct dinput_device *impl, const DIDATAFORMAT *format ) { - DIDATAFORMAT *user_format, *device_format = &impl->device_format; + DIDATAFORMAT *user_format = &impl->user_format, *device_format = &impl->device_format; DIOBJECTDATAFORMAT *user_obj, *match_obj; DWORD i; - if (!(user_format = malloc( sizeof(DIDATAFORMAT) ))) return DIERR_OUTOFMEMORY; *user_format = *device_format; user_format->dwFlags = format->dwFlags; user_format->dwDataSize = format->dwDataSize; user_format->dwNumObjs += format->dwNumObjs; - if (!(user_format->rgodf = calloc( user_format->dwNumObjs, sizeof(DIOBJECTDATAFORMAT) ))) - { - free( user_format ); - return DIERR_OUTOFMEMORY; - } + if (!(user_format->rgodf = calloc( user_format->dwNumObjs, sizeof(DIOBJECTDATAFORMAT) ))) return DIERR_OUTOFMEMORY; user_obj = user_format->rgodf + user_format->dwNumObjs; while (user_obj-- > user_format->rgodf) user_obj->dwType |= DIDFT_OPTIONAL; @@ -310,21 +304,20 @@ static HRESULT dinput_device_init_user_format( struct dinput_device *impl, const user_obj = user_format->rgodf + user_format->dwNumObjs; while (user_obj-- > user_format->rgodf) user_obj->dwType &= ~DIDFT_OPTIONAL; - impl->user_format = user_format; return DI_OK; failed: free( user_format->rgodf ); - free( user_format ); + user_format->rgodf = NULL; return DIERR_INVALIDPARAM; } static int id_to_offset( struct dinput_device *impl, int id ) { - DIDATAFORMAT *user_format = impl->user_format; + DIDATAFORMAT *user_format = &impl->user_format; DIOBJECTDATAFORMAT *user_obj; - if (!user_format) return -1; + if (!user_format->rgodf) return -1; user_obj = user_format->rgodf + impl->device_format.dwNumObjs; while (user_obj-- > user_format->rgodf) @@ -582,7 +575,7 @@ static HRESULT WINAPI dinput_device_Acquire( IDirectInputDevice8W *iface ) EnterCriticalSection( &impl->crit ); if (impl->status == STATUS_ACQUIRED) hr = DI_NOEFFECT; - else if (!impl->user_format) + else if (!impl->user_format.rgodf) hr = DIERR_INVALIDPARAM; else if ((impl->dwCoopLevel & DISCL_FOREGROUND) && impl->win != GetForegroundWindow()) hr = DIERR_OTHERAPPHASPRIO; @@ -887,14 +880,14 @@ static HRESULT WINAPI dinput_device_EnumObjects( IDirectInputDevice8W *iface, static HRESULT enum_object_filter_init( struct dinput_device *impl, DIPROPHEADER *filter ) { - DIDATAFORMAT *device_format = &impl->device_format, *user_format = impl->user_format; + DIDATAFORMAT *device_format = &impl->device_format, *user_format = &impl->user_format; DIOBJECTDATAFORMAT *device_obj, *user_obj; if (filter->dwHow > DIPH_BYUSAGE) return DIERR_INVALIDPARAM; if (filter->dwHow == DIPH_BYUSAGE && !(impl->instance.dwDevType & DIDEVTYPE_HID)) return DIERR_UNSUPPORTED; if (filter->dwHow != DIPH_BYOFFSET) return DI_OK; - if (!impl->user_format) return DIERR_NOTFOUND; + if (!user_format->rgodf) return DIERR_NOTFOUND; user_obj = user_format->rgodf + device_format->dwNumObjs; device_obj = device_format->rgodf + device_format->dwNumObjs; @@ -1411,11 +1404,10 @@ static HRESULT WINAPI dinput_device_set_property( IDirectInputDevice8W *iface, c const DIPROPDWORD *value = (const DIPROPDWORD *)header; TRACE( "Axis mode: %s\n", value->dwData == DIPROPAXISMODE_ABS ? "absolute" : "relative" ); - if (impl->user_format) - { - impl->user_format->dwFlags &= ~DIDFT_AXIS; - impl->user_format->dwFlags |= value->dwData == DIPROPAXISMODE_ABS ? DIDF_ABSAXIS : DIDF_RELAXIS; - } + + impl->user_format.dwFlags &= ~DIDFT_AXIS; + impl->user_format.dwFlags |= value->dwData == DIPROPAXISMODE_ABS ? DIDF_ABSAXIS : DIDF_RELAXIS; + return DI_OK; } case (DWORD_PTR)DIPROP_BUFFERSIZE: @@ -1533,7 +1525,7 @@ static HRESULT WINAPI dinput_device_GetObjectInfo( IDirectInputDevice8W *iface, static HRESULT WINAPI dinput_device_GetDeviceState( IDirectInputDevice8W *iface, DWORD size, void *data ) { struct dinput_device *impl = impl_from_IDirectInputDevice8W( iface ); - DIDATAFORMAT *device_format = &impl->device_format, *user_format; + DIDATAFORMAT *device_format = &impl->device_format, *user_format = &impl->user_format; DIOBJECTDATAFORMAT *device_obj, *user_obj; BYTE *user_state = data; DIPROPHEADER filter = @@ -1556,7 +1548,7 @@ static HRESULT WINAPI dinput_device_GetDeviceState( IDirectInputDevice8W *iface, hr = DIERR_INPUTLOST; else if (impl->status != STATUS_ACQUIRED) hr = DIERR_NOTACQUIRED; - else if (!(user_format = impl->user_format)) + else if (!user_format->rgodf) hr = DIERR_INVALIDPARAM; else if (size != user_format->dwDataSize) hr = DIERR_INVALIDPARAM; diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h index 2936e8ccb37..f23542a660c 100644 --- a/dlls/dinput/device_private.h +++ b/dlls/dinput/device_private.h @@ -104,7 +104,7 @@ struct dinput_device DWORD buffersize; /* size of the queue - set in 'SetProperty' */ DIDATAFORMAT device_format; - DIDATAFORMAT *user_format; + DIDATAFORMAT user_format; /* Action mapping */ int num_actions; /* number of actions mapped */ diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c index f0b243091b9..3aa6d6b5ad3 100644 --- a/dlls/dinput/joystick_hid.c +++ b/dlls/dinput/joystick_hid.c @@ -2300,10 +2300,10 @@ static BOOL get_parameters_object_id( struct hid_joystick *impl, struct hid_valu static BOOL get_parameters_object_ofs( struct hid_joystick *impl, struct hid_value_caps *caps, DIDEVICEOBJECTINSTANCEW *instance, void *data ) { - DIDATAFORMAT *device_format = &impl->base.device_format, *user_format = impl->base.user_format; + DIDATAFORMAT *device_format = &impl->base.device_format, *user_format = &impl->base.user_format; DIOBJECTDATAFORMAT *device_obj, *user_obj; - if (!user_format) return DIENUM_CONTINUE; + if (!user_format->rgodf) return DIENUM_CONTINUE; user_obj = user_format->rgodf + device_format->dwNumObjs; device_obj = device_format->rgodf + device_format->dwNumObjs; diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c index 46c065d78fa..2a004d80143 100644 --- a/dlls/dinput/mouse.c +++ b/dlls/dinput/mouse.c @@ -179,7 +179,7 @@ void dinput_mouse_rawinput_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPA state->lX += rel.x; state->lY += rel.y; - if (impl->base.user_format->dwFlags & DIDF_ABSAXIS) + if (impl->base.user_format.dwFlags & DIDF_ABSAXIS) { pt.x = state->lX; pt.y = state->lY; @@ -259,7 +259,7 @@ int dinput_mouse_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPARAM lparam state->lX += pt.x = hook->pt.x - pt.x; state->lY += pt.y = hook->pt.y - pt.y; - if (impl->base.user_format->dwFlags & DIDF_ABSAXIS) + if (impl->base.user_format.dwFlags & DIDF_ABSAXIS) { pt1.x = state->lX; pt1.y = state->lY; @@ -399,7 +399,7 @@ static HRESULT mouse_acquire( IDirectInputDevice8W *iface ) /* Init the mouse state */ GetCursorPos( &point ); - if (impl->base.user_format->dwFlags & DIDF_ABSAXIS) + if (impl->base.user_format.dwFlags & DIDF_ABSAXIS) { state->lX = point.x; state->lY = point.y;