From 833829cb312a36bf1e7544a43b9e4aec8004d968 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Wed, 6 May 2020 19:28:51 -0500 Subject: [PATCH] quartz: Move the source and destination rectangles to the BaseControlVideo structure. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/quartz/quartz_private.h | 10 +- dlls/quartz/video.c | 216 ++++++++++++----------------------- dlls/quartz/videorenderer.c | 68 +++-------- dlls/quartz/vmr9.c | 93 +++++---------- 4 files changed, 111 insertions(+), 276 deletions(-) diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h index 7f2372ce33b..2bbebd48b3a 100644 --- a/dlls/quartz/quartz_private.h +++ b/dlls/quartz/quartz_private.h @@ -166,29 +166,23 @@ typedef struct tagBaseControlVideo { IBasicVideo IBasicVideo_iface; + RECT src, dst; + struct strmbase_filter *pFilter; struct strmbase_pin *pPin; const struct BaseControlVideoFuncTable *pFuncsTable; } BaseControlVideo; -typedef HRESULT (WINAPI *BaseControlVideo_GetSourceRect)(BaseControlVideo* This, RECT *pSourceRect); typedef HRESULT (WINAPI *BaseControlVideo_GetStaticImage)(BaseControlVideo* This, LONG *pBufferSize, LONG *pDIBImage); -typedef HRESULT (WINAPI *BaseControlVideo_GetTargetRect)(BaseControlVideo* This, RECT *pTargetRect); typedef HRESULT (WINAPI *BaseControlVideo_SetDefaultSourceRect)(BaseControlVideo* This); typedef HRESULT (WINAPI *BaseControlVideo_SetDefaultTargetRect)(BaseControlVideo* This); -typedef HRESULT (WINAPI *BaseControlVideo_SetSourceRect)(BaseControlVideo* This, RECT *pSourceRect); -typedef HRESULT (WINAPI *BaseControlVideo_SetTargetRect)(BaseControlVideo* This, RECT *pTargetRect); typedef struct BaseControlVideoFuncTable { - BaseControlVideo_GetSourceRect pfnGetSourceRect; BaseControlVideo_GetStaticImage pfnGetStaticImage; - BaseControlVideo_GetTargetRect pfnGetTargetRect; BaseControlVideo_SetDefaultSourceRect pfnSetDefaultSourceRect; BaseControlVideo_SetDefaultTargetRect pfnSetDefaultTargetRect; - BaseControlVideo_SetSourceRect pfnSetSourceRect; - BaseControlVideo_SetTargetRect pfnSetTargetRect; } BaseControlVideoFuncTable; void basic_video_init(BaseControlVideo *video, struct strmbase_filter *filter, diff --git a/dlls/quartz/video.c b/dlls/quartz/video.c index 2d002d8de43..ace83664898 100644 --- a/dlls/quartz/video.c +++ b/dlls/quartz/video.c @@ -207,271 +207,197 @@ static HRESULT WINAPI basic_video_get_VideoHeight(IBasicVideo *iface, LONG *pVid return S_OK; } -static HRESULT WINAPI basic_video_put_SourceLeft(IBasicVideo *iface, LONG SourceLeft) +static HRESULT WINAPI basic_video_put_SourceLeft(IBasicVideo *iface, LONG left) { - RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); - HRESULT hr; - TRACE("(%p/%p)->(%d)\n", This, iface, SourceLeft); - hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - if (SUCCEEDED(hr)) - { - SourceRect.right = (SourceRect.right - SourceRect.left) + SourceLeft; - SourceRect.left = SourceLeft; - hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect); - } - if (SUCCEEDED(hr)) - hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); + TRACE("iface %p, left %d.\n", iface, left); - return hr; + if (left < 0 || This->src.right + left - This->src.left > get_bitmap_header(This)->biWidth) + return E_INVALIDARG; + + OffsetRect(&This->src, left - This->src.left, 0); + return S_OK; } static HRESULT WINAPI basic_video_get_SourceLeft(IBasicVideo *iface, LONG *pSourceLeft) { - RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p)\n", This, iface, pSourceLeft); if (!pSourceLeft) return E_POINTER; - This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - *pSourceLeft = SourceRect.left; + *pSourceLeft = This->src.left; return S_OK; } -static HRESULT WINAPI basic_video_put_SourceWidth(IBasicVideo *iface, LONG SourceWidth) +static HRESULT WINAPI basic_video_put_SourceWidth(IBasicVideo *iface, LONG width) { - RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); - HRESULT hr; - TRACE("(%p/%p)->(%d)\n", This, iface, SourceWidth); - hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - if (SUCCEEDED(hr)) - { - SourceRect.right = SourceRect.left + SourceWidth; - hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect); - } - if (SUCCEEDED(hr)) - hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); + TRACE("iface %p, width %d.\n", iface, width); - return hr; + if (width <= 0 || This->src.left + width > get_bitmap_header(This)->biWidth) + return E_INVALIDARG; + + This->src.right = This->src.left + width; + return S_OK; } static HRESULT WINAPI basic_video_get_SourceWidth(IBasicVideo *iface, LONG *pSourceWidth) { - RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p)\n", This, iface, pSourceWidth); if (!pSourceWidth) return E_POINTER; - This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - *pSourceWidth = SourceRect.right - SourceRect.left; + *pSourceWidth = This->src.right - This->src.left; return S_OK; } -static HRESULT WINAPI basic_video_put_SourceTop(IBasicVideo *iface, LONG SourceTop) +static HRESULT WINAPI basic_video_put_SourceTop(IBasicVideo *iface, LONG top) { - RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); - HRESULT hr; - TRACE("(%p/%p)->(%d)\n", This, iface, SourceTop); - hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - if (SUCCEEDED(hr)) - { - SourceRect.bottom = (SourceRect.bottom - SourceRect.top) + SourceTop; - SourceRect.top = SourceTop; - hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect); - } - if (SUCCEEDED(hr)) - hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); + TRACE("iface %p, top %d.\n", iface, top); - return hr; + if (top < 0 || This->src.bottom + top - This->src.top > get_bitmap_header(This)->biHeight) + return E_INVALIDARG; + + OffsetRect(&This->src, 0, top - This->src.top); + return S_OK; } static HRESULT WINAPI basic_video_get_SourceTop(IBasicVideo *iface, LONG *pSourceTop) { - RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p)\n", This, iface, pSourceTop); if (!pSourceTop) return E_POINTER; - This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - *pSourceTop = SourceRect.top; + *pSourceTop = This->src.top; return S_OK; } -static HRESULT WINAPI basic_video_put_SourceHeight(IBasicVideo *iface, LONG SourceHeight) +static HRESULT WINAPI basic_video_put_SourceHeight(IBasicVideo *iface, LONG height) { - RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); - HRESULT hr; - TRACE("(%p/%p)->(%d)\n", This, iface, SourceHeight); - hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - if (SUCCEEDED(hr)) - { - SourceRect.bottom = SourceRect.top + SourceHeight; - hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect); - } - if (SUCCEEDED(hr)) - hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); + TRACE("iface %p, height %d.\n", iface, height); - return hr; + if (height <= 0 || This->src.top + height > get_bitmap_header(This)->biHeight) + return E_INVALIDARG; + + This->src.bottom = This->src.top + height; + return S_OK; } static HRESULT WINAPI basic_video_get_SourceHeight(IBasicVideo *iface, LONG *pSourceHeight) { - RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p)\n", This, iface, pSourceHeight); if (!pSourceHeight) return E_POINTER; - This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - *pSourceHeight = SourceRect.bottom - SourceRect.top; + *pSourceHeight = This->src.bottom - This->src.top; return S_OK; } -static HRESULT WINAPI basic_video_put_DestinationLeft(IBasicVideo *iface, LONG DestinationLeft) +static HRESULT WINAPI basic_video_put_DestinationLeft(IBasicVideo *iface, LONG left) { - RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); - HRESULT hr; - TRACE("(%p/%p)->(%d)\n", This, iface, DestinationLeft); - hr = This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - if (SUCCEEDED(hr)) - { - DestRect.right = (DestRect.right - DestRect.left) + DestinationLeft; - DestRect.left = DestinationLeft; - hr = BaseControlVideoImpl_CheckTargetRect(This, &DestRect); - } - if (SUCCEEDED(hr)) - hr = This->pFuncsTable->pfnSetTargetRect(This, &DestRect); + TRACE("iface %p, left %d.\n", iface, left); - return hr; + OffsetRect(&This->dst, left - This->dst.left, 0); + return S_OK; } static HRESULT WINAPI basic_video_get_DestinationLeft(IBasicVideo *iface, LONG *pDestinationLeft) { - RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationLeft); if (!pDestinationLeft) return E_POINTER; - This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - *pDestinationLeft = DestRect.left; + *pDestinationLeft = This->dst.left; return S_OK; } -static HRESULT WINAPI basic_video_put_DestinationWidth(IBasicVideo *iface, LONG DestinationWidth) +static HRESULT WINAPI basic_video_put_DestinationWidth(IBasicVideo *iface, LONG width) { - RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); - HRESULT hr; - TRACE("(%p/%p)->(%d)\n", This, iface, DestinationWidth); - hr = This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - if (SUCCEEDED(hr)) - { - DestRect.right = DestRect.left + DestinationWidth; - hr = BaseControlVideoImpl_CheckTargetRect(This, &DestRect); - } - if (SUCCEEDED(hr)) - hr = This->pFuncsTable->pfnSetTargetRect(This, &DestRect); + TRACE("iface %p, width %d.\n", iface, width); - return hr; + if (width <= 0) + return E_INVALIDARG; + + This->dst.right = This->dst.left + width; + return S_OK; } static HRESULT WINAPI basic_video_get_DestinationWidth(IBasicVideo *iface, LONG *pDestinationWidth) { - RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationWidth); if (!pDestinationWidth) return E_POINTER; - This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - *pDestinationWidth = DestRect.right - DestRect.left; + *pDestinationWidth = This->dst.right - This->dst.left; return S_OK; } -static HRESULT WINAPI basic_video_put_DestinationTop(IBasicVideo *iface, LONG DestinationTop) +static HRESULT WINAPI basic_video_put_DestinationTop(IBasicVideo *iface, LONG top) { - RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); - HRESULT hr; - TRACE("(%p/%p)->(%d)\n", This, iface, DestinationTop); - hr = This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - if (SUCCEEDED(hr)) - { - DestRect.bottom = (DestRect.bottom - DestRect.top) + DestinationTop; - DestRect.top = DestinationTop; - hr = BaseControlVideoImpl_CheckTargetRect(This, &DestRect); - } - if (SUCCEEDED(hr)) - hr = This->pFuncsTable->pfnSetTargetRect(This, &DestRect); + TRACE("iface %p, top %d.\n", iface, top); - return hr; + OffsetRect(&This->dst, 0, top - This->dst.top); + return S_OK; } static HRESULT WINAPI basic_video_get_DestinationTop(IBasicVideo *iface, LONG *pDestinationTop) { - RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationTop); if (!pDestinationTop) return E_POINTER; - This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - *pDestinationTop = DestRect.top; + *pDestinationTop = This->dst.top; return S_OK; } -static HRESULT WINAPI basic_video_put_DestinationHeight(IBasicVideo *iface, LONG DestinationHeight) +static HRESULT WINAPI basic_video_put_DestinationHeight(IBasicVideo *iface, LONG height) { - RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); - HRESULT hr; - TRACE("(%p/%p)->(%d)\n", This, iface, DestinationHeight); - hr = This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - if (SUCCEEDED(hr)) - { - DestRect.bottom = DestRect.top + DestinationHeight; - hr = BaseControlVideoImpl_CheckTargetRect(This, &DestRect); - } - if (SUCCEEDED(hr)) - hr = This->pFuncsTable->pfnSetTargetRect(This, &DestRect); + TRACE("iface %p, height %d.\n", iface, height); - return hr; + if (height <= 0) + return E_INVALIDARG; + + This->dst.bottom = This->dst.top + height; + return S_OK; } static HRESULT WINAPI basic_video_get_DestinationHeight(IBasicVideo *iface, LONG *pDestinationHeight) { - RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationHeight); if (!pDestinationHeight) return E_POINTER; - This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - *pDestinationHeight = DestRect.bottom - DestRect.top; + *pDestinationHeight = This->dst.bottom - This->dst.top; return S_OK; } @@ -486,23 +412,22 @@ static HRESULT WINAPI basic_video_SetSourcePosition(IBasicVideo *iface, LONG Lef SetRect(&SourceRect, Left, Top, Left + Width, Top + Height); if (FAILED(BaseControlVideoImpl_CheckSourceRect(This, &SourceRect))) return E_INVALIDARG; - return This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); + This->src = SourceRect; + return S_OK; } static HRESULT WINAPI basic_video_GetSourcePosition(IBasicVideo *iface, LONG *pLeft, LONG *pTop, LONG *pWidth, LONG *pHeight) { - RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight); if (!pLeft || !pTop || !pWidth || !pHeight) return E_POINTER; - This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - *pLeft = SourceRect.left; - *pTop = SourceRect.top; - *pWidth = SourceRect.right - SourceRect.left; - *pHeight = SourceRect.bottom - SourceRect.top; + *pLeft = This->src.left; + *pTop = This->src.top; + *pWidth = This->src.right - This->src.left; + *pHeight = This->src.bottom - This->src.top; return S_OK; } @@ -525,23 +450,22 @@ static HRESULT WINAPI basic_video_SetDestinationPosition(IBasicVideo *iface, LON SetRect(&DestRect, Left, Top, Left + Width, Top + Height); if (FAILED(BaseControlVideoImpl_CheckTargetRect(This, &DestRect))) return E_INVALIDARG; - return This->pFuncsTable->pfnSetTargetRect(This, &DestRect); + This->dst = DestRect; + return S_OK; } static HRESULT WINAPI basic_video_GetDestinationPosition(IBasicVideo *iface, LONG *pLeft, LONG *pTop, LONG *pWidth, LONG *pHeight) { - RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight); if (!pLeft || !pTop || !pWidth || !pHeight) return E_POINTER; - This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - *pLeft = DestRect.left; - *pTop = DestRect.top; - *pWidth = DestRect.right - DestRect.left; - *pHeight = DestRect.bottom - DestRect.top; + *pLeft = This->dst.left; + *pTop = This->dst.top; + *pWidth = This->dst.right - This->dst.left; + *pHeight = This->dst.bottom - This->dst.top; return S_OK; } diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c index 39d1586c772..9a79ad4581c 100644 --- a/dlls/quartz/videorenderer.c +++ b/dlls/quartz/videorenderer.c @@ -44,8 +44,6 @@ struct video_renderer IOverlay IOverlay_iface; - RECT SourceRect; - RECT DestRect; LONG VideoWidth; LONG VideoHeight; LONG FullScreenMode; @@ -102,6 +100,7 @@ static HRESULT WINAPI VideoRenderer_ShouldDrawSampleNow(struct strmbase_renderer static HRESULT WINAPI VideoRenderer_DoRenderSample(struct strmbase_renderer *iface, IMediaSample *pSample) { struct video_renderer *filter = impl_from_strmbase_renderer(iface); + RECT src = filter->baseControlVideo.src, dst = filter->baseControlVideo.dst; LPBYTE pbSrcStream = NULL; HRESULT hr; HDC dc; @@ -116,13 +115,9 @@ static HRESULT WINAPI VideoRenderer_DoRenderSample(struct strmbase_renderer *ifa } dc = GetDC(filter->window.hwnd); - StretchDIBits(dc, filter->DestRect.left, filter->DestRect.top, - filter->DestRect.right - filter->DestRect.left, - filter->DestRect.bottom - filter->DestRect.top, - filter->SourceRect.left, filter->SourceRect.top, - filter->SourceRect.right - filter->SourceRect.left, - filter->SourceRect.bottom - filter->SourceRect.top, - pbSrcStream, (BITMAPINFO *)get_bitmap_header(&filter->renderer.sink.pin.mt), DIB_RGB_COLORS, SRCCOPY); + StretchDIBits(dc, dst.left, dst.top, dst.right - dst.left, dst.bottom - dst.top, + src.left, src.top, src.right - src.left, src.bottom - src.top, pbSrcStream, + (BITMAPINFO *)get_bitmap_header(&filter->renderer.sink.pin.mt), DIB_RGB_COLORS, SRCCOPY); ReleaseDC(filter->window.hwnd, dc); if (filter->renderer.filter.state == State_Paused) @@ -236,7 +231,7 @@ static HRESULT video_renderer_connect(struct strmbase_renderer *iface, const AM_ filter->VideoWidth = bitmap_header->biWidth; filter->VideoHeight = abs(bitmap_header->biHeight); SetRect(&rect, 0, 0, filter->VideoWidth, filter->VideoHeight); - filter->SourceRect = filter->DestRect = rect; + filter->baseControlVideo.src = filter->baseControlVideo.dst = rect; AdjustWindowRectEx(&rect, GetWindowLongW(window, GWL_STYLE), FALSE, GetWindowLongW(window, GWL_EXSTYLE)); @@ -258,15 +253,10 @@ static RECT video_renderer_get_default_rect(struct video_window *iface) static BOOL video_renderer_resize(struct video_window *iface, LONG Width, LONG Height) { - struct video_renderer *This = impl_from_video_window(iface); + struct video_renderer *filter = impl_from_video_window(iface); TRACE("WM_SIZE %d %d\n", Width, Height); - GetClientRect(iface->hwnd, &This->DestRect); - TRACE("WM_SIZING: DestRect=(%d,%d),(%d,%d)\n", - This->DestRect.left, - This->DestRect.top, - This->DestRect.right - This->DestRect.left, - This->DestRect.bottom - This->DestRect.top); + GetClientRect(iface->hwnd, &filter->baseControlVideo.dst); return TRUE; } @@ -291,13 +281,6 @@ static const struct video_window_ops window_ops = .resize = video_renderer_resize, }; -static HRESULT WINAPI VideoRenderer_GetSourceRect(BaseControlVideo* iface, RECT *pSourceRect) -{ - struct video_renderer *This = impl_from_BaseControlVideo(iface); - CopyRect(pSourceRect,&This->SourceRect); - return S_OK; -} - static HRESULT WINAPI VideoRenderer_GetStaticImage(BaseControlVideo *iface, LONG *size, LONG *image) { struct video_renderer *filter = impl_from_BaseControlVideo(iface); @@ -345,18 +328,11 @@ static HRESULT WINAPI VideoRenderer_GetStaticImage(BaseControlVideo *iface, LONG return S_OK; } -static HRESULT WINAPI VideoRenderer_GetTargetRect(BaseControlVideo* iface, RECT *pTargetRect) -{ - struct video_renderer *This = impl_from_BaseControlVideo(iface); - CopyRect(pTargetRect,&This->DestRect); - return S_OK; -} - static HRESULT WINAPI VideoRenderer_SetDefaultSourceRect(BaseControlVideo* iface) { struct video_renderer *This = impl_from_BaseControlVideo(iface); - SetRect(&This->SourceRect, 0, 0, This->VideoWidth, This->VideoHeight); + SetRect(&This->baseControlVideo.src, 0, 0, This->VideoWidth, This->VideoHeight); return S_OK; } @@ -369,33 +345,15 @@ static HRESULT WINAPI VideoRenderer_SetDefaultTargetRect(BaseControlVideo* iface if (!GetClientRect(This->window.hwnd, &rect)) return E_FAIL; - SetRect(&This->DestRect, 0, 0, rect.right, rect.bottom); + SetRect(&This->baseControlVideo.dst, 0, 0, rect.right, rect.bottom); return S_OK; } -static HRESULT WINAPI VideoRenderer_SetSourceRect(BaseControlVideo* iface, RECT *pSourceRect) -{ - struct video_renderer *This = impl_from_BaseControlVideo(iface); - CopyRect(&This->SourceRect,pSourceRect); - return S_OK; -} - -static HRESULT WINAPI VideoRenderer_SetTargetRect(BaseControlVideo* iface, RECT *pTargetRect) -{ - struct video_renderer *This = impl_from_BaseControlVideo(iface); - CopyRect(&This->DestRect,pTargetRect); - return S_OK; -} - static const BaseControlVideoFuncTable renderer_BaseControlVideoFuncTable = { - VideoRenderer_GetSourceRect, VideoRenderer_GetStaticImage, - VideoRenderer_GetTargetRect, VideoRenderer_SetDefaultSourceRect, VideoRenderer_SetDefaultTargetRect, - VideoRenderer_SetSourceRect, - VideoRenderer_SetTargetRect }; static HRESULT WINAPI VideoWindow_get_FullScreenMode(IVideoWindow *iface, @@ -428,16 +386,16 @@ static HRESULT WINAPI VideoWindow_put_FullScreenMode(IVideoWindow *iface, LONG f SetWindowLongW(window, GWL_STYLE, WS_POPUP); SetWindowPos(window, HWND_TOP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_SHOWWINDOW); - GetWindowRect(window, &filter->DestRect); + GetWindowRect(window, &filter->baseControlVideo.dst); } else { ShowWindow(window, SW_HIDE); SetParent(window, filter->window.hwndOwner); SetWindowLongW(window, GWL_STYLE, filter->saved_style); - GetClientRect(window, &filter->DestRect); - SetWindowPos(window, 0, filter->DestRect.left, filter->DestRect.top, - filter->DestRect.right, filter->DestRect.bottom, SWP_NOZORDER | SWP_SHOWWINDOW); + GetClientRect(window, &filter->baseControlVideo.dst); + SetWindowPos(window, 0, filter->baseControlVideo.dst.left, filter->baseControlVideo.dst.top, + filter->baseControlVideo.dst.right, filter->baseControlVideo.dst.bottom, SWP_NOZORDER | SWP_SHOWWINDOW); } filter->FullScreenMode = fullscreen; diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index c0d6799eec1..4e535629cce 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -104,8 +104,6 @@ struct quartz_vmr /* for Windowless Mode */ HWND hWndClippingWindow; - RECT source_rect; - RECT target_rect; LONG VideoWidth; LONG VideoHeight; @@ -229,9 +227,6 @@ static DWORD VMR9_SendSampleData(struct quartz_vmr *This, VMR9PresentationInfo * width = bmiHeader->biWidth; height = bmiHeader->biHeight; - TRACE("Src Rect: %s\n", wine_dbgstr_rect(&This->source_rect)); - TRACE("Dst Rect: %s\n", wine_dbgstr_rect(&This->target_rect)); - hr = IDirect3DSurface9_LockRect(info->lpSurf, &lock, NULL, D3DLOCK_DISCARD); if (FAILED(hr)) { @@ -420,8 +415,8 @@ static HRESULT allocate_surfaces(struct quartz_vmr *filter, const AM_MEDIA_TYPE if (filter->mode == VMR9Mode_Windowless && !filter->hWndClippingWindow) return S_OK; - info.dwWidth = filter->source_rect.right; - info.dwHeight = filter->source_rect.bottom; + info.dwWidth = filter->baseControlVideo.src.right; + info.dwHeight = filter->baseControlVideo.src.bottom; info.Pool = D3DPOOL_DEFAULT; info.MinBuffers = 1; info.szAspectRatio.cx = info.dwWidth; @@ -517,7 +512,7 @@ static HRESULT vmr_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE filter->VideoWidth = bitmap_header->biWidth; filter->VideoHeight = bitmap_header->biHeight; SetRect(&rect, 0, 0, filter->VideoWidth, filter->VideoHeight); - filter->source_rect = filter->target_rect = rect; + filter->baseControlVideo.src = filter->baseControlVideo.dst = rect; AdjustWindowRectEx(&rect, GetWindowLongW(window, GWL_STYLE), FALSE, GetWindowLongW(window, GWL_EXSTYLE)); @@ -679,12 +674,7 @@ static BOOL vmr_resize(struct video_window *This, LONG Width, LONG Height) struct quartz_vmr *pVMR9 = impl_from_video_window(This); TRACE("WM_SIZE %d %d\n", Width, Height); - GetClientRect(This->hwnd, &pVMR9->target_rect); - TRACE("WM_SIZING: DestRect=(%d,%d),(%d,%d)\n", - pVMR9->target_rect.left, - pVMR9->target_rect.top, - pVMR9->target_rect.right - pVMR9->target_rect.left, - pVMR9->target_rect.bottom - pVMR9->target_rect.top); + GetClientRect(This->hwnd, &pVMR9->baseControlVideo.dst); return TRUE; } @@ -695,13 +685,6 @@ static const struct video_window_ops window_ops = .resize = vmr_resize, }; -static HRESULT WINAPI VMR9_GetSourceRect(BaseControlVideo* This, RECT *pSourceRect) -{ - struct quartz_vmr* pVMR9 = impl_from_BaseControlVideo(This); - CopyRect(pSourceRect,&pVMR9->source_rect); - return S_OK; -} - static HRESULT WINAPI VMR9_GetStaticImage(BaseControlVideo *iface, LONG *size, LONG *image) { struct quartz_vmr *filter = impl_from_BaseControlVideo(iface); @@ -765,18 +748,11 @@ out: return hr; } -static HRESULT WINAPI VMR9_GetTargetRect(BaseControlVideo* This, RECT *pTargetRect) -{ - struct quartz_vmr* pVMR9 = impl_from_BaseControlVideo(This); - CopyRect(pTargetRect,&pVMR9->target_rect); - return S_OK; -} - static HRESULT WINAPI VMR9_SetDefaultSourceRect(BaseControlVideo* This) { struct quartz_vmr* pVMR9 = impl_from_BaseControlVideo(This); - SetRect(&pVMR9->source_rect, 0, 0, pVMR9->VideoWidth, pVMR9->VideoHeight); + SetRect(&pVMR9->baseControlVideo.src, 0, 0, pVMR9->VideoWidth, pVMR9->VideoHeight); return S_OK; } @@ -789,33 +765,15 @@ static HRESULT WINAPI VMR9_SetDefaultTargetRect(BaseControlVideo* This) if (!GetClientRect(pVMR9->window.hwnd, &rect)) return E_FAIL; - SetRect(&pVMR9->target_rect, 0, 0, rect.right, rect.bottom); + SetRect(&pVMR9->baseControlVideo.dst, 0, 0, rect.right, rect.bottom); return S_OK; } -static HRESULT WINAPI VMR9_SetSourceRect(BaseControlVideo* This, RECT *pSourceRect) -{ - struct quartz_vmr* pVMR9 = impl_from_BaseControlVideo(This); - CopyRect(&pVMR9->source_rect,pSourceRect); - return S_OK; -} - -static HRESULT WINAPI VMR9_SetTargetRect(BaseControlVideo* This, RECT *pTargetRect) -{ - struct quartz_vmr* pVMR9 = impl_from_BaseControlVideo(This); - CopyRect(&pVMR9->target_rect,pTargetRect); - return S_OK; -} - static const BaseControlVideoFuncTable renderer_BaseControlVideoFuncTable = { - VMR9_GetSourceRect, VMR9_GetStaticImage, - VMR9_GetTargetRect, VMR9_SetDefaultSourceRect, VMR9_SetDefaultTargetRect, - VMR9_SetSourceRect, - VMR9_SetTargetRect }; static const IVideoWindowVtbl IVideoWindow_VTable = @@ -1552,10 +1510,10 @@ static HRESULT WINAPI VMR7WindowlessControl_SetVideoPosition(IVMRWindowlessContr EnterCriticalSection(&This->renderer.filter.csFilter); if (source) - This->source_rect = *source; + This->baseControlVideo.src = *source; if (dest) { - This->target_rect = *dest; + This->baseControlVideo.dst = *dest; FIXME("Output rectangle: %s.\n", wine_dbgstr_rect(dest)); SetWindowPos(This->window.hwnd, NULL, dest->left, dest->top, dest->right - dest->left, dest->bottom-dest->top, @@ -1573,10 +1531,10 @@ static HRESULT WINAPI VMR7WindowlessControl_GetVideoPosition(IVMRWindowlessContr struct quartz_vmr *This = impl_from_IVMRWindowlessControl(iface); if (source) - *source = This->source_rect; + *source = This->baseControlVideo.src; if (dest) - *dest = This->target_rect; + *dest = This->baseControlVideo.dst; FIXME("(%p/%p)->(%p/%p) stub\n", iface, This, source, dest); return S_OK; @@ -1753,10 +1711,10 @@ static HRESULT WINAPI VMR9WindowlessControl_SetVideoPosition(IVMRWindowlessContr EnterCriticalSection(&This->renderer.filter.csFilter); if (source) - This->source_rect = *source; + This->baseControlVideo.src = *source; if (dest) { - This->target_rect = *dest; + This->baseControlVideo.dst = *dest; FIXME("Output rectangle: %s.\n", wine_dbgstr_rect(dest)); SetWindowPos(This->window.hwnd, NULL, dest->left, dest->top, dest->right - dest->left, dest->bottom - dest->top, @@ -1773,10 +1731,10 @@ static HRESULT WINAPI VMR9WindowlessControl_GetVideoPosition(IVMRWindowlessContr struct quartz_vmr *This = impl_from_IVMRWindowlessControl9(iface); if (source) - *source = This->source_rect; + *source = This->baseControlVideo.src; if (dest) - *dest = This->target_rect; + *dest = This->baseControlVideo.dst; FIXME("(%p/%p)->(%p/%p) stub\n", iface, This, source, dest); return S_OK; @@ -2561,10 +2519,11 @@ static HRESULT VMR9_ImagePresenter_PresentOffscreenSurface(struct default_presen } /* Move rect to origin and flip it */ - SetRect(&target_rect, 0, This->pVMR9->target_rect.bottom - This->pVMR9->target_rect.top, - This->pVMR9->target_rect.right - This->pVMR9->target_rect.left, 0); + SetRect(&target_rect, 0, This->pVMR9->baseControlVideo.dst.bottom - This->pVMR9->baseControlVideo.dst.top, + This->pVMR9->baseControlVideo.dst.right - This->pVMR9->baseControlVideo.dst.left, 0); - hr = IDirect3DDevice9_StretchRect(This->d3d9_dev, surface, &This->pVMR9->source_rect, target, &target_rect, D3DTEXF_LINEAR); + hr = IDirect3DDevice9_StretchRect(This->d3d9_dev, surface, + &This->pVMR9->baseControlVideo.src, target, &target_rect, D3DTEXF_LINEAR); if (FAILED(hr)) ERR("IDirect3DDevice9_StretchRect -- %08x\n", hr); IDirect3DSurface9_Release(target); @@ -2736,8 +2695,8 @@ static BOOL CreateRenderingWindow(struct default_presenter *This, VMR9Allocation d3dpp.Windowed = TRUE; d3dpp.hDeviceWindow = This->pVMR9->window.hwnd; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; - d3dpp.BackBufferHeight = This->pVMR9->target_rect.bottom - This->pVMR9->target_rect.top; - d3dpp.BackBufferWidth = This->pVMR9->target_rect.right - This->pVMR9->target_rect.left; + d3dpp.BackBufferHeight = This->pVMR9->baseControlVideo.dst.bottom - This->pVMR9->baseControlVideo.dst.top; + d3dpp.BackBufferWidth = This->pVMR9->baseControlVideo.dst.right - This->pVMR9->baseControlVideo.dst.left; hr = IDirect3D9_CreateDevice(This->d3d9_ptr, d3d9_adapter, D3DDEVTYPE_HAL, NULL, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &This->d3d9_dev); if (FAILED(hr)) @@ -2872,24 +2831,24 @@ static HRESULT VMR9_SurfaceAllocator_UpdateDeviceReset(struct default_presenter { if (i % 2) { - t_vert[i].x = (float)This->pVMR9->target_rect.right - (float)This->pVMR9->target_rect.left - 0.5f; - t_vert[i].u = (float)This->pVMR9->source_rect.right / (float)width; + t_vert[i].x = (float)This->pVMR9->baseControlVideo.dst.right - (float)This->pVMR9->baseControlVideo.dst.left - 0.5f; + t_vert[i].u = (float)This->pVMR9->baseControlVideo.src.right / (float)width; } else { t_vert[i].x = -0.5f; - t_vert[i].u = (float)This->pVMR9->source_rect.left / (float)width; + t_vert[i].u = (float)This->pVMR9->baseControlVideo.src.left / (float)width; } if (i % 4 < 2) { t_vert[i].y = -0.5f; - t_vert[i].v = (float)This->pVMR9->source_rect.bottom / (float)height; + t_vert[i].v = (float)This->pVMR9->baseControlVideo.src.bottom / (float)height; } else { - t_vert[i].y = (float)This->pVMR9->target_rect.bottom - (float)This->pVMR9->target_rect.top - 0.5f; - t_vert[i].v = (float)This->pVMR9->source_rect.top / (float)height; + t_vert[i].y = (float)This->pVMR9->baseControlVideo.dst.bottom - (float)This->pVMR9->baseControlVideo.dst.top - 0.5f; + t_vert[i].v = (float)This->pVMR9->baseControlVideo.src.top / (float)height; } t_vert[i].z = 0.0f; t_vert[i].rhw = 1.0f;