d3drm: Store animation options.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2017-06-27 17:36:33 +03:00 committed by Alexandre Julliard
parent 9c84b06524
commit 1f38c0b165
3 changed files with 87 additions and 15 deletions

View File

@ -214,6 +214,7 @@ struct d3drm_animation
LONG ref; LONG ref;
IDirect3DRM *d3drm; IDirect3DRM *d3drm;
IDirect3DRMFrame3 *frame; IDirect3DRMFrame3 *frame;
D3DRMANIMATIONOPTIONS options;
}; };
struct d3drm_wrap struct d3drm_wrap

View File

@ -3238,11 +3238,38 @@ static HRESULT WINAPI d3drm_animation1_GetClassName(IDirect3DRMAnimation *iface,
return d3drm_animation2_GetClassName(&animation->IDirect3DRMAnimation2_iface, size, name); return d3drm_animation2_GetClassName(&animation->IDirect3DRMAnimation2_iface, size, name);
} }
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 & supported_options))
return D3DRMERR_BADVALUE;
if ((options & (D3DRMANIMATION_OPEN | D3DRMANIMATION_CLOSED)) == (D3DRMANIMATION_OPEN | D3DRMANIMATION_CLOSED) ||
(options & (D3DRMANIMATION_LINEARPOSITION | D3DRMANIMATION_SPLINEPOSITION)) ==
(D3DRMANIMATION_LINEARPOSITION | D3DRMANIMATION_SPLINEPOSITION) ||
(options & (D3DRMANIMATION_SCALEANDROTATION | D3DRMANIMATION_POSITION)) ==
(D3DRMANIMATION_SCALEANDROTATION | D3DRMANIMATION_POSITION))
{
return D3DRMERR_BADVALUE;
}
animation->options = options;
return D3DRM_OK;
}
static HRESULT WINAPI d3drm_animation1_SetOptions(IDirect3DRMAnimation *iface, D3DRMANIMATIONOPTIONS options) static HRESULT WINAPI d3drm_animation1_SetOptions(IDirect3DRMAnimation *iface, D3DRMANIMATIONOPTIONS options)
{ {
FIXME("iface %p, %#x.\n", iface, options); struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation(iface);
return E_NOTIMPL; TRACE("iface %p, %#x.\n", iface, options);
return d3drm_animation2_SetOptions(&animation->IDirect3DRMAnimation2_iface, options);
} }
static HRESULT WINAPI d3drm_animation1_AddRotateKey(IDirect3DRMAnimation *iface, D3DVALUE time, D3DRMQUATERNION *q) static HRESULT WINAPI d3drm_animation1_AddRotateKey(IDirect3DRMAnimation *iface, D3DVALUE time, D3DRMQUATERNION *q)
@ -3301,18 +3328,22 @@ static HRESULT WINAPI d3drm_animation1_SetTime(IDirect3DRMAnimation *iface, D3DV
return E_NOTIMPL; return E_NOTIMPL;
} }
static D3DRMANIMATIONOPTIONS WINAPI d3drm_animation1_GetOptions(IDirect3DRMAnimation *iface) static D3DRMANIMATIONOPTIONS WINAPI d3drm_animation2_GetOptions(IDirect3DRMAnimation2 *iface)
{ {
FIXME("iface %p.\n", iface); struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation2(iface);
return 0; TRACE("iface %p.\n", iface);
return animation->options;
} }
static HRESULT WINAPI d3drm_animation2_SetOptions(IDirect3DRMAnimation2 *iface, D3DRMANIMATIONOPTIONS options) static D3DRMANIMATIONOPTIONS WINAPI d3drm_animation1_GetOptions(IDirect3DRMAnimation *iface)
{ {
FIXME("iface %p, options %#x.\n", iface, options); struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation(iface);
return E_NOTIMPL; TRACE("iface %p.\n", iface);
return d3drm_animation2_GetOptions(&animation->IDirect3DRMAnimation2_iface);
} }
static HRESULT WINAPI d3drm_animation2_AddRotateKey(IDirect3DRMAnimation2 *iface, D3DVALUE time, D3DRMQUATERNION *q) static HRESULT WINAPI d3drm_animation2_AddRotateKey(IDirect3DRMAnimation2 *iface, D3DVALUE time, D3DRMQUATERNION *q)
@ -3363,13 +3394,6 @@ static HRESULT WINAPI d3drm_animation2_SetTime(IDirect3DRMAnimation2 *iface, D3D
return E_NOTIMPL; return E_NOTIMPL;
} }
static D3DRMANIMATIONOPTIONS WINAPI d3drm_animation2_GetOptions(IDirect3DRMAnimation2 *iface)
{
FIXME("iface %p.\n", iface);
return 0;
}
static HRESULT WINAPI d3drm_animation2_GetFrame(IDirect3DRMAnimation2 *iface, IDirect3DRMFrame3 **frame) static HRESULT WINAPI d3drm_animation2_GetFrame(IDirect3DRMAnimation2 *iface, IDirect3DRMFrame3 **frame)
{ {
struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation2(iface); struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation2(iface);
@ -3481,6 +3505,7 @@ HRESULT d3drm_animation_create(struct d3drm_animation **animation, IDirect3DRM *
object->IDirect3DRMAnimation2_iface.lpVtbl = &d3drm_animation2_vtbl; object->IDirect3DRMAnimation2_iface.lpVtbl = &d3drm_animation2_vtbl;
object->d3drm = d3drm; object->d3drm = d3drm;
object->ref = 1; object->ref = 1;
object->options = D3DRMANIMATION_CLOSED | D3DRMANIMATION_LINEARPOSITION;
d3drm_object_init(&object->obj, classname); d3drm_object_init(&object->obj, classname);

View File

@ -6706,6 +6706,7 @@ static void test_animation(void)
{ {
IDirect3DRMAnimation2 *animation2; IDirect3DRMAnimation2 *animation2;
IDirect3DRMAnimation *animation; IDirect3DRMAnimation *animation;
D3DRMANIMATIONOPTIONS options;
IDirect3DRMObject *obj, *obj2; IDirect3DRMObject *obj, *obj2;
IDirect3DRMFrame3 *frame3; IDirect3DRMFrame3 *frame3;
IDirect3DRMFrame *frame; IDirect3DRMFrame *frame;
@ -6776,6 +6777,51 @@ static void test_animation(void)
IDirect3DRMFrame3_Release(frame3); IDirect3DRMFrame3_Release(frame3);
IDirect3DRMFrame_Release(frame); 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, 0xf0000000);
ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr);
options = IDirect3DRMAnimation_GetOptions(animation);
ok(options == (D3DRMANIMATION_CLOSED | D3DRMANIMATION_LINEARPOSITION),
"Unexpected default options %#x.\n", options);
/* Ambiguous mask */
hr = IDirect3DRMAnimation_SetOptions(animation, D3DRMANIMATION_OPEN | D3DRMANIMATION_CLOSED);
ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr);
hr = IDirect3DRMAnimation_SetOptions(animation, D3DRMANIMATION_LINEARPOSITION | D3DRMANIMATION_SPLINEPOSITION);
ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr);
hr = IDirect3DRMAnimation_SetOptions(animation, D3DRMANIMATION_SCALEANDROTATION | D3DRMANIMATION_POSITION);
ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr);
options = IDirect3DRMAnimation_GetOptions(animation);
ok(options == (D3DRMANIMATION_CLOSED | D3DRMANIMATION_LINEARPOSITION),
"Unexpected default options %#x.\n", options);
hr = IDirect3DRMAnimation_SetOptions(animation, D3DRMANIMATION_SCALEANDROTATION);
ok(SUCCEEDED(hr), "Failed to set animation options, hr %#x.\n", hr);
options = IDirect3DRMAnimation_GetOptions(animation);
ok(options == D3DRMANIMATION_SCALEANDROTATION, "Unexpected options %#x.\n", options);
hr = IDirect3DRMAnimation_SetOptions(animation, D3DRMANIMATION_OPEN);
ok(SUCCEEDED(hr), "Failed to set animation options, hr %#x.\n", hr);
options = IDirect3DRMAnimation_GetOptions(animation);
ok(options == D3DRMANIMATION_OPEN, "Unexpected options %#x.\n", options);
hr = IDirect3DRMAnimation_SetOptions(animation, 0);
ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr);
options = IDirect3DRMAnimation_GetOptions(animation);
ok(options == D3DRMANIMATION_OPEN, "Unexpected options %#x.\n", options);
IDirect3DRMAnimation2_Release(animation2); IDirect3DRMAnimation2_Release(animation2);
IDirect3DRMAnimation_Release(animation); IDirect3DRMAnimation_Release(animation);