[PATCH 09/11] dinput: Partially implement HID joystick IDirectInputEffect_SetParameters.

Rémi Bernon rbernon at codeweavers.com
Thu Oct 7 03:40:06 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/joystick_hid.c | 176 ++++++++++++++++++++++++++++++++++++-
 dlls/dinput8/tests/hid.c   |  85 ++----------------
 2 files changed, 177 insertions(+), 84 deletions(-)

diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 3014e76603b..87fe27afadd 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -155,6 +155,8 @@ struct hid_joystick_effect
     DIENVELOPE envelope;
     DIPERIODIC periodic;
     DIEFFECT params;
+    BOOL modified;
+    DWORD flags;
 
     char *effect_control_buf;
     char *effect_update_buf;
@@ -2193,7 +2195,6 @@ static HRESULT WINAPI hid_joystick_effect_GetParameters( IDirectInputEffect *ifa
     if (flags & DIEP_DIRECTION)
     {
         if (!direction_flags) return DIERR_INVALIDPARAM;
-        params->dwFlags &= ~(DIEFF_CARTESIAN | DIEFF_POLAR | DIEFF_SPHERICAL);
 
         count = params->cAxes = impl->params.cAxes;
         if (capacity < params->cAxes) return DIERR_MOREDATA;
@@ -2218,7 +2219,8 @@ static HRESULT WINAPI hid_joystick_effect_GetParameters( IDirectInputEffect *ifa
             }
         }
 
-        if (!params->rglDirection) return DIERR_INVALIDPARAM;
+        if (!count) params->rglDirection = NULL;
+        else if (!params->rglDirection) return DIERR_INVALIDPARAM;
         else memcpy( params->rglDirection, directions, count * sizeof(LONG) );
     }
 
@@ -2277,11 +2279,177 @@ static HRESULT WINAPI hid_joystick_effect_GetParameters( IDirectInputEffect *ifa
     return DI_OK;
 }
 
+static BOOL set_parameters_object( struct hid_joystick *impl, struct hid_value_caps *caps,
+                                   DIDEVICEOBJECTINSTANCEW *instance, void *data )
+{
+    DWORD usages = MAKELONG( instance->wUsage, instance->wUsagePage );
+    *(DWORD *)data = usages;
+    return DIENUM_STOP;
+}
+
 static HRESULT WINAPI hid_joystick_effect_SetParameters( IDirectInputEffect *iface,
                                                          const DIEFFECT *params, DWORD flags )
 {
-    FIXME( "iface %p, params %p, flags %#x stub!\n", iface, params, flags );
-    return DIERR_UNSUPPORTED;
+    DIPROPHEADER filter =
+    {
+        .dwSize = sizeof(DIPROPHEADER),
+        .dwHeaderSize = sizeof(DIPROPHEADER),
+        .dwHow = DIPH_BYUSAGE,
+    };
+    struct hid_joystick_effect *impl = impl_from_IDirectInputEffect( iface );
+    ULONG i, count, old_value, object_flags, direction_flags;
+    LONG directions[6] = {0};
+    HRESULT hr;
+    BOOL ret;
+
+    TRACE( "iface %p, params %p, flags %#x.\n", iface, params, flags );
+
+    if (!params) return E_POINTER;
+    if (params->dwSize != sizeof(DIEFFECT)) return DIERR_INVALIDPARAM;
+    object_flags = params->dwFlags & (DIEFF_OBJECTIDS | DIEFF_OBJECTOFFSETS);
+    direction_flags = params->dwFlags & (DIEFF_CARTESIAN | DIEFF_POLAR | DIEFF_SPHERICAL);
+
+    if (object_flags & DIEFF_OBJECTIDS) filter.dwHow = DIPH_BYID;
+    else filter.dwHow = DIPH_BYOFFSET;
+
+    if (flags & DIEP_AXES)
+    {
+        if (!object_flags) return DIERR_INVALIDPARAM;
+        if (!params->rgdwAxes) return DIERR_INVALIDPARAM;
+        if (impl->params.cAxes) return DIERR_ALREADYINITIALIZED;
+        count = impl->joystick->pid_effect_update.axis_count;
+        if (params->cAxes > count) return DIERR_INVALIDPARAM;
+
+        impl->params.cAxes = params->cAxes;
+        for (i = 0; i < params->cAxes; ++i)
+        {
+            filter.dwObj = params->rgdwAxes[i];
+            ret = enum_objects( impl->joystick, &filter, DIDFT_AXIS, set_parameters_object,
+                                &impl->params.rgdwAxes[i] );
+            if (ret != DIENUM_STOP) impl->params.rgdwAxes[i] = 0;
+        }
+
+        impl->modified = TRUE;
+    }
+
+    if (flags & DIEP_DIRECTION)
+    {
+        if (!direction_flags) return DIERR_INVALIDPARAM;
+        if (!params->rglDirection) return DIERR_INVALIDPARAM;
+
+        count = impl->params.cAxes;
+        if (params->cAxes < count) return DIERR_INVALIDPARAM;
+        if ((direction_flags & DIEFF_POLAR) && count != 2) return DIERR_INVALIDPARAM;
+        if ((direction_flags & DIEFF_CARTESIAN) && count < 2) return DIERR_INVALIDPARAM;
+
+        if (!count) memset( directions, 0, sizeof(directions) );
+        else if (direction_flags & DIEFF_POLAR)
+        {
+            directions[0] = (params->rglDirection[0] % 36000) - 9000;
+            if (directions[0] < 0) directions[0] += 36000;
+            for (i = 1; i < count; ++i) directions[i] = 0;
+        }
+        else if (direction_flags & DIEFF_CARTESIAN)
+        {
+            for (i = 1; i < count; ++i)
+                directions[i - 1] = atan2( params->rglDirection[i], params->rglDirection[0] );
+            directions[count - 1] = 0;
+        }
+        else
+        {
+            for (i = 0; i < count; ++i)
+            {
+                directions[i] = params->rglDirection[i] % 36000;
+                if (directions[i] < 0) directions[i] += 36000;
+            }
+        }
+
+        if (memcmp( impl->params.rglDirection, directions, count * sizeof(LONG) ))
+            impl->modified = TRUE;
+        memcpy( impl->params.rglDirection, directions, count * sizeof(LONG) );
+    }
+
+    if (flags & DIEP_TYPESPECIFICPARAMS)
+    {
+        switch (impl->type)
+        {
+        case PID_USAGE_ET_SQUARE:
+        case PID_USAGE_ET_SINE:
+        case PID_USAGE_ET_TRIANGLE:
+        case PID_USAGE_ET_SAWTOOTH_UP:
+        case PID_USAGE_ET_SAWTOOTH_DOWN:
+            if (!params->lpvTypeSpecificParams) return E_POINTER;
+            if (params->cbTypeSpecificParams != sizeof(DIPERIODIC)) return DIERR_INVALIDPARAM;
+            if (memcmp( &impl->periodic, params->lpvTypeSpecificParams, sizeof(DIPERIODIC) ))
+                impl->modified = TRUE;
+            memcpy( &impl->periodic, params->lpvTypeSpecificParams, sizeof(DIPERIODIC) );
+            break;
+        case PID_USAGE_ET_SPRING:
+        case PID_USAGE_ET_DAMPER:
+        case PID_USAGE_ET_INERTIA:
+        case PID_USAGE_ET_FRICTION:
+        case PID_USAGE_ET_CONSTANT_FORCE:
+        case PID_USAGE_ET_RAMP:
+        case PID_USAGE_ET_CUSTOM_FORCE_DATA:
+            FIXME( "DIEP_TYPESPECIFICPARAMS not implemented!\n" );
+            return DIERR_UNSUPPORTED;
+        }
+    }
+
+    if ((flags & DIEP_ENVELOPE) && params->lpEnvelope)
+    {
+        if (params->lpEnvelope->dwSize != sizeof(DIENVELOPE)) return DIERR_INVALIDPARAM;
+        if (memcmp( &impl->envelope, params->lpEnvelope, sizeof(DIENVELOPE) ))
+            impl->modified = TRUE;
+        memcpy( &impl->envelope, params->lpEnvelope, sizeof(DIENVELOPE) );
+    }
+
+    if (flags & DIEP_DURATION)
+    {
+        if (impl->params.dwDuration != params->dwDuration) impl->modified = TRUE;
+        impl->params.dwDuration = params->dwDuration;
+    }
+    if (flags & DIEP_GAIN)
+    {
+        if (impl->params.dwGain != params->dwGain) impl->modified = TRUE;
+        impl->params.dwGain = params->dwGain;
+    }
+    if (flags & DIEP_SAMPLEPERIOD)
+    {
+        if (impl->params.dwSamplePeriod != params->dwSamplePeriod) impl->modified = TRUE;
+        impl->params.dwSamplePeriod = params->dwSamplePeriod;
+    }
+    if (flags & DIEP_STARTDELAY)
+    {
+        if (impl->params.dwStartDelay != params->dwStartDelay) impl->modified = TRUE;
+        impl->params.dwStartDelay = params->dwStartDelay;
+    }
+    if (flags & DIEP_TRIGGERREPEATINTERVAL)
+    {
+        if (impl->params.dwTriggerRepeatInterval != params->dwTriggerRepeatInterval)
+            impl->modified = TRUE;
+        impl->params.dwTriggerRepeatInterval = params->dwTriggerRepeatInterval;
+    }
+
+    if (flags & DIEP_TRIGGERBUTTON)
+    {
+        if (!object_flags) return DIERR_INVALIDPARAM;
+
+        filter.dwObj = params->dwTriggerButton;
+        old_value = impl->params.dwTriggerButton;
+        ret = enum_objects( impl->joystick, &filter, DIDFT_BUTTON, set_parameters_object,
+                            &impl->params.dwTriggerButton );
+        if (ret != DIENUM_STOP) impl->params.dwTriggerButton = -1;
+        if (impl->params.dwTriggerButton != old_value) impl->modified = TRUE;
+    }
+
+    impl->flags |= flags;
+
+    if (flags & DIEP_NODOWNLOAD) return DI_DOWNLOADSKIPPED;
+    if (flags & DIEP_START) return IDirectInputEffect_Start( iface, 1, 0 );
+    if (FAILED(hr = IDirectInputEffect_Download( iface ))) return hr;
+    if (hr == DI_NOEFFECT) return DI_DOWNLOADSKIPPED;
+    return DI_OK;
 }
 
 static HRESULT WINAPI hid_joystick_effect_Start( IDirectInputEffect *iface, DWORD iterations, DWORD flags )
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index fc6a235617c..70c55136602 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -5370,7 +5370,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     check_member( desc, expect_desc_init, "%u", cAxes );
     desc.dwFlags |= DIEFF_CARTESIAN;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
     ok( desc.dwFlags == DIEFF_OBJECTIDS, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_OBJECTIDS );
     desc.dwFlags |= DIEFF_POLAR;
@@ -5379,7 +5378,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     ok( desc.dwFlags == DIEFF_OBJECTIDS, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_OBJECTIDS );
     desc.dwFlags |= DIEFF_SPHERICAL;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
     check_member( desc, expect_desc_init, "%u", cAxes );
     ok( desc.dwFlags == DIEFF_OBJECTIDS, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_OBJECTIDS );
@@ -5393,7 +5391,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     check_member( desc, expect_desc_init, "%u", cAxes );
     check_member( desc, expect_desc_init, "%u", rgdwAxes[0] );
     check_member( desc, expect_desc_init, "%u", rgdwAxes[1] );
-    todo_wine
     check_member( desc, expect_desc_init, "%p", rglDirection );
     ok( desc.dwFlags == DIEFF_OBJECTIDS, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_OBJECTIDS );
 
@@ -5411,7 +5408,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     check_member( desc, expect_desc_init, "%u", cAxes );
     check_member( desc, expect_desc_init, "%u", rgdwAxes[0] );
     check_member( desc, expect_desc_init, "%u", rgdwAxes[1] );
-    todo_wine
     check_member( desc, expect_desc_init, "%p", rglDirection );
     todo_wine
     check_member( desc, expect_desc_init, "%p", lpEnvelope );
@@ -5439,15 +5435,12 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     ok( hr == DI_NOEFFECT, "Unload returned %#x\n", hr );
 
     hr = IDirectInputEffect_SetParameters( effect, NULL, DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == E_POINTER, "SetParameters returned %#x\n", hr );
     memset( &desc, 0, sizeof(desc) );
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
     desc.dwSize = sizeof(DIEFFECT);
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
 
     set_hid_expect( file, &expect_dc_reset, sizeof(expect_dc_reset) );
@@ -5455,7 +5448,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     ok( hr == DI_OK, "Unacquire returned: %#x\n", hr );
     set_hid_expect( file, NULL, 0 );
     hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_DURATION | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
     set_hid_expect( file, &expect_dc_reset, sizeof(expect_dc_reset) );
     hr = IDirectInputDevice8_Acquire( device );
@@ -5463,13 +5455,11 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     set_hid_expect( file, NULL, 0 );
 
     hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_DURATION | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
 
     desc.dwTriggerButton = -1;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DURATION );
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     check_member( desc, expect_desc, "%u", dwDuration );
     check_member( desc, expect_desc_init, "%u", dwSamplePeriod );
     check_member( desc, expect_desc_init, "%u", dwGain );
@@ -5491,26 +5481,20 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     hr = IDirectInputEffect_SetParameters( effect, &expect_desc,
                                            DIEP_GAIN | DIEP_SAMPLEPERIOD | DIEP_STARTDELAY |
                                                DIEP_TRIGGERREPEATINTERVAL | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
     desc.dwDuration = 0;
     flags = DIEP_DURATION | DIEP_GAIN | DIEP_SAMPLEPERIOD | DIEP_STARTDELAY | DIEP_TRIGGERREPEATINTERVAL;
     hr = IDirectInputEffect_GetParameters( effect, &desc, flags );
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     check_member( desc, expect_desc, "%u", dwDuration );
-    todo_wine
     check_member( desc, expect_desc, "%u", dwSamplePeriod );
-    todo_wine
     check_member( desc, expect_desc, "%u", dwGain );
     check_member( desc, expect_desc_init, "%#x", dwTriggerButton );
-    todo_wine
     check_member( desc, expect_desc, "%u", dwTriggerRepeatInterval );
     check_member( desc, expect_desc_init, "%u", cAxes );
     check_member( desc, expect_desc_init, "%p", rglDirection );
     check_member( desc, expect_desc_init, "%p", lpEnvelope );
     check_member( desc, expect_desc_init, "%u", cbTypeSpecificParams );
-    todo_wine
     check_member( desc, expect_desc, "%u", dwStartDelay );
 
     hr = IDirectInputEffect_Download( effect );
@@ -5522,29 +5506,22 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
 
     desc.lpEnvelope = NULL;
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_ENVELOPE | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
     desc.lpEnvelope = &envelope;
     envelope.dwSize = 0;
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_ENVELOPE | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
 
     hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_ENVELOPE | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
 
     desc.lpEnvelope = &envelope;
     envelope.dwSize = sizeof(DIENVELOPE);
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_ENVELOPE );
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     check_member( envelope, expect_envelope, "%u", dwAttackLevel );
-    todo_wine
     check_member( envelope, expect_envelope, "%u", dwAttackTime );
-    todo_wine
     check_member( envelope, expect_envelope, "%u", dwFadeLevel );
-    todo_wine
     check_member( envelope, expect_envelope, "%u", dwFadeTime );
 
     hr = IDirectInputEffect_Download( effect );
@@ -5562,13 +5539,10 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     desc.cbTypeSpecificParams = 0;
     desc.lpvTypeSpecificParams = NULL;
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_ALLPARAMS | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_TRIGGERBUTTON | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_AXES | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
 
     desc.dwFlags = DIEFF_OBJECTOFFSETS;
@@ -5577,45 +5551,32 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     desc.rgdwAxes[0] = DIJOFS_X;
     desc.dwTriggerButton = DIJOFS_BUTTON( 1 );
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
     hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_AXES | DIEP_TRIGGERBUTTON | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_ALREADYINITIALIZED, "SetParameters returned %#x\n", hr );
 
     desc.cAxes = 0;
     desc.dwFlags = DIEFF_OBJECTIDS;
     desc.rgdwAxes = axes;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON );
-    todo_wine
     ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
-    todo_wine
     check_member( desc, expect_desc, "%u", cAxes );
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON );
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     check_member( desc, expect_desc, "%#x", dwTriggerButton );
-    todo_wine
     check_member( desc, expect_desc, "%u", cAxes );
-    todo_wine
     check_member( desc, expect_desc, "%u", rgdwAxes[0] );
-    todo_wine
     check_member( desc, expect_desc, "%u", rgdwAxes[1] );
-    todo_wine
     check_member( desc, expect_desc, "%u", rgdwAxes[2] );
 
     desc.dwFlags = DIEFF_OBJECTOFFSETS;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON );
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     ok( desc.dwTriggerButton == 0x30, "got %#x expected %#x\n", desc.dwTriggerButton, 0x30 );
-    todo_wine
     ok( desc.rgdwAxes[0] == 8, "got %#x expected %#x\n", desc.rgdwAxes[0], 8 );
     ok( desc.rgdwAxes[1] == 0, "got %#x expected %#x\n", desc.rgdwAxes[1], 0 );
-    todo_wine
     ok( desc.rgdwAxes[2] == 4, "got %#x expected %#x\n", desc.rgdwAxes[2], 4 );
 
     hr = IDirectInputEffect_Download( effect );
@@ -5629,56 +5590,41 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     desc.cAxes = 0;
     desc.rglDirection = directions;
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
     desc.cAxes = 3;
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
     desc.dwFlags = DIEFF_POLAR;
     desc.cAxes = 3;
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
 
     hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
 
     desc.dwFlags = DIEFF_SPHERICAL;
     desc.cAxes = 1;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
-    todo_wine
+    ok( desc.dwFlags == DIEFF_SPHERICAL, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_SPHERICAL );
     check_member( desc, expect_desc, "%u", cAxes );
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     check_member( desc, expect_desc, "%u", cAxes );
-    todo_wine
     ok( desc.rglDirection[0] == 3000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 3000 );
-    todo_wine
     ok( desc.rglDirection[1] == 30000, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 30000 );
     ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
     desc.dwFlags = DIEFF_CARTESIAN;
     desc.cAxes = 2;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
-    todo_wine
+    ok( desc.dwFlags == DIEFF_CARTESIAN, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_CARTESIAN );
     check_member( desc, expect_desc, "%u", cAxes );
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     check_member( desc, expect_desc, "%u", cAxes );
-    todo_wine
     ok( desc.rglDirection[0] == 4330, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 4330 );
-    todo_wine
     ok( desc.rglDirection[1] == 2500, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 2500 );
-    todo_wine
     ok( desc.rglDirection[2] == -8660, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], -8660 );
     desc.dwFlags = DIEFF_POLAR;
     desc.cAxes = 3;
@@ -5695,25 +5641,18 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     desc.cbTypeSpecificParams = 0;
     desc.lpvTypeSpecificParams = &periodic;
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_TYPESPECIFICPARAMS | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
     desc.cbTypeSpecificParams = sizeof(DIPERIODIC);
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_TYPESPECIFICPARAMS | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
     hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_TYPESPECIFICPARAMS | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
 
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_TYPESPECIFICPARAMS );
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     check_member( periodic, expect_periodic, "%u", dwMagnitude );
-    todo_wine
     check_member( periodic, expect_periodic, "%d", lOffset );
-    todo_wine
     check_member( periodic, expect_periodic, "%u", dwPhase );
-    todo_wine
     check_member( periodic, expect_periodic, "%u", dwPeriod );
 
     hr = IDirectInputEffect_Start( effect, 1, DIES_NODOWNLOAD );
@@ -5821,23 +5760,18 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     desc.rglDirection[1] = 0;
     desc.rglDirection[2] = 0;
     hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_AXES | DIEP_DIRECTION | DIEP_NODOWNLOAD );
-    todo_wine
     ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
     desc.rglDirection[0] = 0;
 
     desc.dwFlags = DIEFF_SPHERICAL;
     desc.cAxes = 1;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
-    todo_wine
+    ok( desc.dwFlags == DIEFF_SPHERICAL, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_SPHERICAL );
     ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
-    todo_wine
     ok( desc.rglDirection[0] == 30000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 30000 );
     ok( desc.rglDirection[1] == 0, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 0 );
     ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
@@ -5845,34 +5779,25 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
     desc.dwFlags = DIEFF_CARTESIAN;
     desc.cAxes = 1;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
-    todo_wine
+    ok( desc.dwFlags == DIEFF_CARTESIAN, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_CARTESIAN );
     ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
-    todo_wine
     ok( desc.rglDirection[0] == 5000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 5000 );
-    todo_wine
     ok( desc.rglDirection[1] == -8660, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], -8660 );
     ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
 
     desc.dwFlags = DIEFF_POLAR;
     desc.cAxes = 1;
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
-    todo_wine
+    ok( desc.dwFlags == DIEFF_POLAR, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_POLAR );
     ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
     hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
-    todo_wine
     ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
-    todo_wine
     ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
-    todo_wine
     ok( desc.rglDirection[0] == 3000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 3000 );
     ok( desc.rglDirection[1] == 0, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 0 );
     ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
-- 
2.33.0




More information about the wine-devel mailing list