/****************************************************************************** * 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) { LONG state, size; BYTE *data; BITMAPINFO *info; HRESULT hr; RECT src, dest; LONG visible = OATRUE; res = MCIERR_INTERNAL; IMediaControl_GetState(wma->pmctrl, -1, &state); if (state == State_Running) return MCIERR_UNSUPPORTED_FUNCTION; /* 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_get_Visible(wma->vidwin, &visible); if (wma->parent) IVideoWindow_put_Visible(wma->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(wma->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(wma->vidbasic, &size, (LONG*)data); data += info->bmiHeader.biSize; IBasicVideo_GetSourcePosition(wma->vidbasic, &src.left, &src.top, &src.right, &src.bottom); IBasicVideo_GetDestinationPosition(wma->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 (wma->parent) IVideoWindow_put_Visible(wma->vidwin, visible); } else if (dwFlags) FIXME("Unhandled flags %x\n", dwFlags); return res; }
static HRESULT WINAPI IVideoWindow_fnget_Visible(IVideoWindow* iface,long* plVisible) { CFilterGraph_THIS(iface,vidwin); QUERYVIDEOWINDOW TRACE("(%p)->()\n",This); hr = IVideoWindow_get_Visible(pVidWin,plVisible); IVideoWindow_Release(pVidWin); return hr; }
/*************************************************************************** * MCIQTZ_mciWindow [internal] */ static DWORD MCIQTZ_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSW lpParms) { WINE_MCIQTZ *wma = MCIQTZ_mciGetOpenDev(wDevID); TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); if(!lpParms) return MCIERR_NULL_PARAMETER_BLOCK; if (!wma) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_TEST) return 0; if (dwFlags & MCI_DGV_WINDOW_HWND && (IsWindow(lpParms->hWnd) || !lpParms->hWnd)) { LONG visible = OATRUE; LONG style = 0; TRACE("Setting hWnd to %p\n", lpParms->hWnd); IVideoWindow_get_Visible(wma->vidwin, &visible); IVideoWindow_put_Visible(wma->vidwin, OAFALSE); IVideoWindow_get_WindowStyle(wma->vidwin, &style); style &= ~WS_CHILD; if (lpParms->hWnd) IVideoWindow_put_WindowStyle(wma->vidwin, style|WS_CHILD); else IVideoWindow_put_WindowStyle(wma->vidwin, style); IVideoWindow_put_Owner(wma->vidwin, (OAHWND)lpParms->hWnd); IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)lpParms->hWnd); IVideoWindow_put_Visible(wma->vidwin, visible); wma->parent = lpParms->hWnd; } if (dwFlags & MCI_DGV_WINDOW_STATE) { TRACE("Setting nCmdShow to %d\n", lpParms->nCmdShow); IVideoWindow_put_WindowState(wma->vidwin, lpParms->nCmdShow); } if (dwFlags & MCI_DGV_WINDOW_TEXT) { TRACE("Setting caption to %s\n", debugstr_w(lpParms->lpstrText)); IVideoWindow_put_Caption(wma->vidwin, lpParms->lpstrText); } return 0; }