Rémi Bernon : dinput: Store the user_format field inline in struct dinput_device.
Alexandre Julliard
julliard at winehq.org
Mon May 16 15:37:58 CDT 2022
Module: wine
Branch: master
Commit: 39f903481c64444c13bf4a9598f91d025f0a4c13
URL: https://source.winehq.org/git/wine.git/?a=commit;h=39f903481c64444c13bf4a9598f91d025f0a4c13
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Mon May 16 11:50:39 2022 +0200
dinput: Store the user_format field inline in struct dinput_device.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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;
More information about the wine-cvs
mailing list