Maarten Lankhorst : mciqtz32: Add support for mciUpdate.
Alexandre Julliard
julliard at winehq.org
Wed May 19 10:34:16 CDT 2010
Module: wine
Branch: master
Commit: 6956ce61534862e1922dbc2e83b44c69cba5dab9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6956ce61534862e1922dbc2e83b44c69cba5dab9
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Tue May 18 20:16:57 2010 +0200
mciqtz32: Add support for mciUpdate.
---
dlls/mciqtz32/Makefile.in | 2 +-
dlls/mciqtz32/mciqtz.c | 71 ++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/dlls/mciqtz32/Makefile.in b/dlls/mciqtz32/Makefile.in
index fde3f90..6dbdb87 100644
--- a/dlls/mciqtz32/Makefile.in
+++ b/dlls/mciqtz32/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = mciqtz32.dll
-IMPORTS = strmiids oleaut32 ole32 winmm user32 kernel32
+IMPORTS = strmiids oleaut32 ole32 winmm user32 gdi32 kernel32
C_SRCS = \
mciqtz.c
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c
index 005b1a3..4c9baf5 100644
--- a/dlls/mciqtz32/mciqtz.c
+++ b/dlls/mciqtz32/mciqtz.c
@@ -734,6 +734,74 @@ out:
return ret;
}
+/******************************************************************************
+ * MCIAVI_mciUpdate [internal]
+ */
+static DWORD MCIQTZ_mciUpdate(UINT wDevID, DWORD dwFlags, LPMCI_DGV_UPDATE_PARMS lpParms)
+{
+ WINE_MCIQTZ *wma;
+ DWORD res = 0;
+
+ TRACE("%04x, %08x, %p\n", wDevID, dwFlags, lpParms);
+
+ if (!lpParms)
+ return MCIERR_NULL_PARAMETER_BLOCK;
+
+ wma = MCIQTZ_mciGetOpenDev(wDevID);
+ if (!wma)
+ return MCIERR_INVALID_DEVICE_ID;
+
+ if (dwFlags & MCI_DGV_UPDATE_HDC) {
+ IBasicVideo *vidbasic;
+ IVideoWindow *vidwin;
+ res = MCIERR_INTERNAL;
+ IFilterGraph2_QueryInterface(wma->pgraph, &IID_IVideoWindow, (void**)&vidwin);
+ IFilterGraph2_QueryInterface(wma->pgraph, &IID_IBasicVideo, (void**)&vidbasic);
+ if (vidbasic && vidwin) {
+ LONG state, size;
+ BYTE *data;
+ BITMAPINFO *info;
+ HRESULT hr;
+ RECT src, dest;
+
+ /* If in stopped state, nothing has been drawn to screen
+ * moving to pause, which is needed for the old dib renderer, will result
+ * in a single frame drawn, so hide the window here */
+ IVideoWindow_put_Visible(vidwin, OAFALSE);
+ /* FIXME: Should we check the original state and restore it? */
+ IMediaControl_Pause(wma->pmctrl);
+ IMediaControl_GetState(wma->pmctrl, -1, &state);
+ if (FAILED(hr = IBasicVideo_GetCurrentImage(vidbasic, &size, NULL))) {
+ WARN("Could not get image size (hr = %x)\n", hr);
+ goto out;
+ }
+ data = HeapAlloc(GetProcessHeap(), 0, size);
+ info = (BITMAPINFO*)data;
+ IBasicVideo_GetCurrentImage(vidbasic, &size, (LONG*)data);
+ data += info->bmiHeader.biSize;
+
+ IBasicVideo_GetSourcePosition(vidbasic, &src.left, &src.top, &src.right, &src.bottom);
+ IBasicVideo_GetDestinationPosition(vidbasic, &dest.left, &dest.top, &dest.right, &dest.bottom);
+ StretchDIBits(lpParms->hDC,
+ dest.left, dest.top, dest.right + dest.left, dest.bottom + dest.top,
+ src.left, src.top, src.right + src.left, src.bottom + src.top,
+ data, info, DIB_RGB_COLORS, SRCCOPY);
+ HeapFree(GetProcessHeap(), 0, data);
+ }
+ res = 0;
+out:
+ if (vidbasic)
+ IBasicVideo_Release(vidbasic);
+ if (vidwin) {
+ IVideoWindow_put_Visible(vidwin, OATRUE);
+ IVideoWindow_Release(vidwin);
+ }
+ }
+ else if (dwFlags)
+ FIXME("Unhandled flags %x\n", dwFlags);
+ return res;
+}
+
/***************************************************************************
* MCIQTZ_mciSetAudio [internal]
*/
@@ -797,6 +865,8 @@ LRESULT CALLBACK MCIQTZ_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
case MCI_WHERE: return MCIQTZ_mciWhere (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2);
/* Digital Video specific */
case MCI_SETAUDIO: return MCIQTZ_mciSetAudio (dwDevID, dwParam1, (LPMCI_DGV_SETAUDIO_PARMSW) dwParam2);
+ case MCI_UPDATE:
+ return MCIQTZ_mciUpdate(dwDevID, dwParam1, (LPMCI_DGV_UPDATE_PARMS)dwParam2);
case MCI_RECORD:
case MCI_PAUSE:
case MCI_RESUME:
@@ -808,7 +878,6 @@ LRESULT CALLBACK MCIQTZ_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
case MCI_FREEZE:
case MCI_REALIZE:
case MCI_UNFREEZE:
- case MCI_UPDATE:
case MCI_STEP:
case MCI_COPY:
case MCI_CUT:
More information about the wine-cvs
mailing list