| 3215 | // IMFVideoMixerBitmap |
| 3216 | |
| 3217 | STDMETHODIMP CDX9VideoProcessor::SetAlphaBitmap(const MFVideoAlphaBitmap *pBmpParms) |
| 3218 | { |
| 3219 | CheckPointer(pBmpParms, E_POINTER); |
| 3220 | CAutoLock cRendererLock(&m_pFilter->m_RendererLock); |
| 3221 | |
| 3222 | CheckPointer(m_pD3DDevEx, E_ABORT); |
| 3223 | HRESULT hr = S_FALSE; |
| 3224 | |
| 3225 | if (pBmpParms->GetBitmapFromDC && pBmpParms->bitmap.hdc) { |
| 3226 | HBITMAP hBitmap = (HBITMAP)GetCurrentObject(pBmpParms->bitmap.hdc, OBJ_BITMAP); |
| 3227 | if (!hBitmap) { |
| 3228 | return E_INVALIDARG; |
| 3229 | } |
| 3230 | DIBSECTION info = {0}; |
| 3231 | if (!::GetObjectW(hBitmap, sizeof(DIBSECTION), &info)) { |
| 3232 | return E_INVALIDARG; |
| 3233 | } |
| 3234 | BITMAP& bm = info.dsBm; |
| 3235 | if (!bm.bmWidth || !bm.bmHeight || bm.bmBitsPixel != 32 || !bm.bmBits) { |
| 3236 | return E_INVALIDARG; |
| 3237 | } |
| 3238 | |
| 3239 | hr = m_TexAlphaBitmap.CheckCreate(m_pD3DDevEx, D3DFMT_A8R8G8B8, bm.bmWidth, bm.bmHeight, D3DUSAGE_DYNAMIC); |
| 3240 | if (S_OK == hr) { |
| 3241 | D3DLOCKED_RECT lr; |
| 3242 | hr = m_TexAlphaBitmap.pSurface->LockRect(&lr, nullptr, D3DLOCK_DISCARD); |
| 3243 | if (S_OK == hr) { |
| 3244 | if (bm.bmWidthBytes == lr.Pitch) { |
| 3245 | memcpy(lr.pBits, bm.bmBits, bm.bmWidthBytes * bm.bmHeight); |
| 3246 | } else { |
| 3247 | LONG linesize = std::min<LONG>(bm.bmWidthBytes, lr.Pitch); |
| 3248 | BYTE* src = (BYTE*)bm.bmBits; |
| 3249 | BYTE* dst = (BYTE*)lr.pBits; |
| 3250 | for (LONG y = 0; y < bm.bmHeight; ++y) { |
| 3251 | memcpy(dst, src, linesize); |
| 3252 | src += bm.bmWidthBytes; |
| 3253 | dst += lr.Pitch; |
| 3254 | } |
| 3255 | } |
| 3256 | hr = m_TexAlphaBitmap.pSurface->UnlockRect(); |
| 3257 | } |
| 3258 | } |
| 3259 | } else { |
| 3260 | return E_INVALIDARG; |
| 3261 | } |
| 3262 | |
| 3263 | m_bAlphaBitmapEnable = SUCCEEDED(hr) && m_TexAlphaBitmap.pTexture; |
| 3264 | |
| 3265 | if (m_bAlphaBitmapEnable) { |
| 3266 | m_AlphaBitmapRectSrc = { 0, 0, (LONG)m_TexAlphaBitmap.Width, (LONG)m_TexAlphaBitmap.Height }; |
| 3267 | m_AlphaBitmapNRectDest = { 0, 0, 1, 1 }; |
| 3268 | |
| 3269 | hr = UpdateAlphaBitmapParameters(&pBmpParms->params); |
| 3270 | } |
| 3271 | |
| 3272 | return hr; |
| 3273 | } |
| 3274 |
nothing calls this directly
no test coverage detected