Signed-off-by: Nikolay Sivov nsivov@codeweavers.com ---
Zooming should be handled by the mixer.
dlls/evr/presenter.c | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-)
diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c index bf0f89df0eb..b8b18638185 100644 --- a/dlls/evr/presenter.c +++ b/dlls/evr/presenter.c @@ -460,21 +460,6 @@ static HRESULT video_presenter_get_sample_surface(IMFSample *sample, IDirect3DSu return hr; }
-static void scale_rect(RECT *rect, unsigned int width, unsigned int height, const MFVideoNormalizedRect *scale) -{ - if (rect->left == 0.0f && rect->top == 0.0f && rect->right == 1.0f && rect->bottom == 1.0f) - { - SetRect(rect, 0, 0, width, height); - } - else - { - rect->left = width * scale->left; - rect->right = width * scale->right; - rect->top = height * scale->top; - rect->bottom = height * scale->bottom; - } -} - static void video_presenter_sample_present(struct video_presenter *presenter, IMFSample *sample) { IDirect3DSurface9 *surface, *backbuffer; @@ -503,7 +488,7 @@ static void video_presenter_sample_present(struct video_presenter *presenter, IM IDirect3DDevice9_StretchRect(device, surface, NULL, backbuffer, NULL, D3DTEXF_POINT);
IDirect3DSurface9_GetDesc(surface, &desc); - scale_rect(&src, desc.Width, desc.Height, &presenter->src_rect); + SetRect(&src, 0, 0, desc.Width, desc.Height);
IDirect3DSurface9_GetDesc(backbuffer, &desc); SetRect(&dst, 0, 0, desc.Width, desc.Height);
From: Andrew Eikum aeikum@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/evr/presenter.c | 8 +++++++- dlls/evr/tests/evr.c | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c index b8b18638185..5b262e7c663 100644 --- a/dlls/evr/presenter.c +++ b/dlls/evr/presenter.c @@ -1295,8 +1295,14 @@ static HRESULT WINAPI video_presenter_control_SetVideoPosition(IMFVideoDisplayCo video_presenter_set_mixer_rect(presenter); } } - if (dst_rect) + if (dst_rect && !EqualRect(dst_rect, &presenter->dst_rect)) + { presenter->dst_rect = *dst_rect; + hr = video_presenter_invalidate_media_type(presenter); + /* Mixer's input type hasn't been configured yet, this is not an error. */ + if (hr == MF_E_TRANSFORM_TYPE_NOT_SET) hr = S_OK; + /* FIXME: trigger repaint */ + } } LeaveCriticalSection(&presenter->cs);
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index 01edda7bc9b..5bf03fa49f8 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -2190,9 +2190,6 @@ static void test_presenter_media_type(void) hr = IMFTransform_ProcessMessage(mixer, MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)manager); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- hr = IMFTransform_SetInputType(mixer, 0, input_type, 0); - ok(hr == S_OK, "Unexpected hr %#x.\n", hr); - hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFTopologyServiceLookupClient, (void **)&lookup_client); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
@@ -2204,12 +2201,20 @@ static void test_presenter_media_type(void) hr = IMFVideoDisplayControl_SetVideoWindow(display_control, window); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ /* Set destination rectangle before mixer types are configured. */ + SetRect(&dst, 0, 0, 101, 51); + hr = IMFVideoDisplayControl_SetVideoPosition(display_control, NULL, &dst); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFTransform_SetInputType(mixer, 0, input_type, 0); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + hr = IMFVideoPresenter_ProcessMessage(presenter, MFVP_MESSAGE_INVALIDATEMEDIATYPE, 0); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
get_output_aperture(mixer, &frame_size, &aperture); - ok(frame_size.cx == 100 && frame_size.cy == 50, "Unexpected frame size %u x %u.\n", frame_size.cx, frame_size.cy); - ok(aperture.Area.cx == 100 && aperture.Area.cy == 50, "Unexpected size %u x %u.\n", aperture.Area.cx, aperture.Area.cy); + ok(frame_size.cx == 101 && frame_size.cy == 51, "Unexpected frame size %u x %u.\n", frame_size.cx, frame_size.cy); + ok(aperture.Area.cx == 101 && aperture.Area.cy == 51, "Unexpected size %u x %u.\n", aperture.Area.cx, aperture.Area.cy); ok(!aperture.OffsetX.value && !aperture.OffsetX.fract && !aperture.OffsetY.value && !aperture.OffsetY.fract, "Unexpected offset %u x %u.\n", aperture.OffsetX.value, aperture.OffsetY.value);
@@ -2218,10 +2223,8 @@ static void test_presenter_media_type(void) ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
get_output_aperture(mixer, &frame_size, &aperture); -todo_wine { ok(frame_size.cx == 199 && frame_size.cy == 298, "Unexpected frame size %u x %u.\n", frame_size.cx, frame_size.cy); ok(aperture.Area.cx == 199 && aperture.Area.cy == 298, "Unexpected size %u x %u.\n", aperture.Area.cx, aperture.Area.cy); -} ok(!aperture.OffsetX.value && !aperture.OffsetX.fract && !aperture.OffsetY.value && !aperture.OffsetY.fract, "Unexpected offset %u x %u.\n", aperture.OffsetX.value, aperture.OffsetY.value);
@@ -2229,10 +2232,8 @@ todo_wine { ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
get_output_aperture(mixer, &frame_size, &aperture); -todo_wine { ok(frame_size.cx == 199 && frame_size.cy == 298, "Unexpected frame size %u x %u.\n", frame_size.cx, frame_size.cy); ok(aperture.Area.cx == 199 && aperture.Area.cy == 298, "Unexpected size %u x %u.\n", aperture.Area.cx, aperture.Area.cy); -} ok(!aperture.OffsetX.value && !aperture.OffsetX.fract && !aperture.OffsetY.value && !aperture.OffsetY.fract, "Unexpected offset %u x %u.\n", aperture.OffsetX.value, aperture.OffsetY.value);