bool CImageMixer_EVR::GetMapSize(int *pWidth,int *pHeight) { bool fOK=false; IMFGetService *pGetService; if (SUCCEEDED(m_pRenderer->QueryInterface(IID_IMFGetService, reinterpret_cast<LPVOID*>(&pGetService)))) { IMFVideoDisplayControl *pDisplayControl; if (SUCCEEDED(pGetService->GetService(MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl, reinterpret_cast<LPVOID*>(&pDisplayControl)))) { SIZE Size; if (SUCCEEDED(pDisplayControl->GetNativeVideoSize(&Size,NULL))) { if (pWidth) *pWidth=Size.cx; if (pHeight) *pHeight=Size.cy; fOK=true; } pDisplayControl->Release(); } pGetService->Release(); } return fOK; }
bool CImageMixer_EVR::SetBitmap(HBITMAP hbm,int Opacity,COLORREF TransColor,RECT *pDestRect) { IMFGetService *pGetService; IMFVideoDisplayControl *pDisplayControl; IMFVideoMixerBitmap *pMixerBitmap; SIZE NativeSize; BITMAP bm; MFVideoAlphaBitmap ab; HRESULT hr; if (!CreateMemDC()) return false; if (FAILED(m_pRenderer->QueryInterface(IID_IMFGetService, reinterpret_cast<LPVOID*>(&pGetService)))) return false; if (FAILED(pGetService->GetService(MR_VIDEO_MIXER_SERVICE, IID_IMFVideoMixerBitmap, reinterpret_cast<LPVOID*>(&pMixerBitmap)))) { pGetService->Release(); return false; } if (FAILED(pGetService->GetService(MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl, reinterpret_cast<LPVOID*>(&pDisplayControl)))) { pMixerBitmap->Release(); pGetService->Release(); return false; } hr=pDisplayControl->GetNativeVideoSize(&NativeSize,NULL); pDisplayControl->Release(); if (FAILED(hr)) { pMixerBitmap->Release(); pGetService->Release(); return false; } ::SelectObject(m_hdc,hbm); ab.GetBitmapFromDC=TRUE; ab.bitmap.hdc=m_hdc; ab.params.dwFlags=MFVideoAlphaBitmap_SrcRect | MFVideoAlphaBitmap_DestRect | MFVideoAlphaBitmap_Alpha; if (TransColor!=CLR_INVALID) { ab.params.dwFlags|=MFVideoAlphaBitmap_SrcColorKey; ab.params.clrSrcKey=TransColor; } ::GetObject(hbm,sizeof(BITMAP),&bm); ::SetRect(&ab.params.rcSrc,0,0,bm.bmWidth,bm.bmHeight); ab.params.nrcDest.left=(float)pDestRect->left/(float)NativeSize.cx; ab.params.nrcDest.top=(float)pDestRect->top/(float)NativeSize.cy; ab.params.nrcDest.right=(float)pDestRect->right/(float)NativeSize.cx; ab.params.nrcDest.bottom=(float)pDestRect->bottom/(float)NativeSize.cy; ab.params.fAlpha=(float)Opacity/100.0f; hr=pMixerBitmap->SetAlphaBitmap(&ab); pMixerBitmap->Release(); pGetService->Release(); if (FAILED(hr)) { ::SelectObject(m_hdc,m_hbmOld); return false; } return true; }