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