On 27.06.2017 15:43, Henri Verbeet wrote:
On 27 June 2017 at 10:17, Nikolay Sivov <nsivov(a)codeweavers.com> wrote:
+static HRESULT WINAPI d3drm_animation2_SetOptions(IDirect3DRMAnimation2 *iface, D3DRMANIMATIONOPTIONS options) +{ + struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation2(iface); + static const DWORD supported_options = D3DRMANIMATION_OPEN | D3DRMANIMATION_CLOSED | D3DRMANIMATION_LINEARPOSITION + | D3DRMANIMATION_SPLINEPOSITION | D3DRMANIMATION_SCALEANDROTATION | D3DRMANIMATION_POSITION; + + TRACE("iface %p, options %#x.\n", iface, options); + + if (options && !(options & supported_options)) + return D3DRMERR_BADVALUE; Should that be "if (options & ~supported_options)"? The test is ambiguous about that.
No, they both are wrong. It should be just "if (!(options & supported_options)", because 0 is not allowed.
@@ -6776,6 +6777,42 @@ static void test_animation(void) IDirect3DRMFrame3_Release(frame3); IDirect3DRMFrame_Release(frame);
+ /* Animation options. */ + options = IDirect3DRMAnimation_GetOptions(animation); + ok(options == (D3DRMANIMATION_CLOSED | D3DRMANIMATION_LINEARPOSITION), + "Unexpected default options %#x.\n", options); + + /* Undefined mask value */ + hr = IDirect3DRMAnimation_SetOptions(animation, 0xdeadbeef); + ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr); 0xdeadbeef is a bit of a poor test value here, since it will trigger both the "D3DRMANIMATION_OPEN | D3DRMANIMATION_CLOSED" and "D3DRMANIMATION_LINEARPOSITION | D3DRMANIMATION_SPLINEPOSITION" paths as well.
Right.
Is it valid to set 0 as an option? Is it valid to set e.g. D3DRMANIMATION_OPEN, but not one of D3DRMANIMATION_LINEARPOSITION and D3DRMANIMATION_SPLINEPOSITION? I.e., is it just invalid to set conflicting options, or should always exactly one of OPEN/CLOSED and LINEARPOSITION/SPLINEPOSITION be set?
Setting 0 is invalid. For the rest there's already a test setting only _OPEN. So yes, only conflicting combinations are checked, and I found another one actually - when both _SCALEANDROTATION and _POSITION are set. Bottom line is spline and linear mode bits are bad design, there's no need in two flags when you'll need one of two modes anyway; and you can disable both whatever this means.