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