cvs diff -- Canvas.cpp Canvas.h Image.cpp Image.h Inject.idl (in directory C:\workspace\Decal2\src\Inject\) Index: Canvas.cpp =================================================================== RCS file: /Decal2/src/Inject/Canvas.cpp,v retrieving revision 1.4 diff -r1.4 Canvas.cpp 271c271,285 < //hRes = m_pSurface->BltFast( current.window.left, current.window.top, pSurf, &rcSrcClipped, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT ); --- > > if (m_UseColorKeyedBlt.top() == VARIANT_TRUE) > { > HDC srcDC, destDC; > pSurf->GetDC(&srcDC); > m_pSurface->GetDC(&destDC); > > TransparentBlt(destDC, rcDest.left, rcDest.top, rcDest.right - rcDest.left, rcDest.bottom - rcDest.top, srcDC, rcSrcClipped.left, rcSrcClipped.top, > rcSrcClipped.right - rcSrcClipped.left, rcSrcClipped.bottom - rcSrcClipped.top, RGB(0, 255, 255)); > > pSurf->ReleaseDC(srcDC); > m_pSurface->ReleaseDC(destDC); > } > else > { 272a287 > } 401,424d415 < // processMask - Support function for DownMixRGB < < void cCanvas::processMask(WORD bitMask, WORD *loBit, WORD *bitCount) { < _ASSERTE(loBit); < _ASSERTE(bitCount); < < WORD mask = 1; < < for (*loBit = 0; *loBit < 16; (*loBit)++) { < if (bitMask & mask) < break; < < mask <<= 1; < } < < for (*bitCount = 1; *bitCount < 32; (*bitCount)++) { < mask <<= 1; < < if (!(bitMask & mask)) < break; < < } < } < 430,432c421 < MessageBox( 0, "WHO IS CALLING ME?", "DownMixRGB: I'm DEPRECATED FOO!", MB_OK ); < < return S_OK; --- > return E_NOTIMPL; 446,447d434 < < 504,506c491,507 < //HRESULT hRes = m_pSurface->Blt( &rcDestClipped, pSurf, &rcSrcClipped, DDBLT_KEYSRC | DDBLT_WAIT, NULL ); < < cManager::_p->m_p3DDevice->StretchRect( pSurf, &rcSrcClipped, m_pSurface, &rcDestClipped, D3DTEXF_NONE ); --- > > if (m_UseColorKeyedBlt.top() == VARIANT_TRUE) > { > HDC srcDC, destDC; > pSurf->GetDC(&srcDC); > m_pSurface->GetDC(&destDC); > > TransparentBlt(destDC, rcDestClipped.left, rcDestClipped.top, rcDestClipped.right - rcDestClipped.left, rcDestClipped.bottom - rcDestClipped.top, srcDC, rcSrcClipped.left, rcSrcClipped.top, > rcSrcClipped.right - rcSrcClipped.left, rcSrcClipped.bottom - rcSrcClipped.top, RGB(0, 255, 255)); > > pSurf->ReleaseDC(srcDC); > m_pSurface->ReleaseDC(destDC); > } > else > { > cManager::_p->m_p3DDevice->StretchRect( pSurf, &rcSrcClipped, m_pSurface, &rcDestClipped, D3DTEXF_NONE ); > } 520a522,538 > } > > STDMETHODIMP cCanvas::PushUseColorKeyedBlt(VARIANT_BOOL newVal) > { > m_UseColorKeyedBlt.push(newVal); > > return S_OK; > } > > STDMETHODIMP cCanvas::PopUseColorKeyedBlt() > { > if (m_UseColorKeyedBlt.size() == 1) > return E_FAIL; > > m_UseColorKeyedBlt.pop(); > > return S_OK; Index: Canvas.h =================================================================== RCS file: /Decal2/src/Inject/Canvas.h,v retrieving revision 1.4 diff -r1.4 Canvas.h 24a25 > m_UseColorKeyedBlt.push(VARIANT_TRUE); 32a34 > typedef std::stack< VARIANT_BOOL > cColourKeyBltStack; 33a36 > cColourKeyBltStack m_UseColorKeyedBlt; 45,46d47 < void processMask(WORD bitMask, WORD *loBit, WORD *bitCount); < 76a78,79 > STDMETHOD(PushUseColorKeyedBlt)(/*[in]*/ VARIANT_BOOL newVal); > STDMETHOD(PopUseColorKeyedBlt)(); Index: Image.cpp =================================================================== RCS file: /Decal2/src/Inject/Image.cpp,v retrieving revision 1.3 diff -r1.3 Image.cpp 7a8,9 > #include > 91a94,95 > > determineColourKeyRequirements(); 331a336,337 > > determineColourKeyRequirements(); 393a400,401 > pDest->PushUseColorKeyedBlt(m_NeedsColourKeying); > 431a440,441 > pDest->PopUseColorKeyedBlt(); > 459a470,471 > pDest->PushUseColorKeyedBlt(m_NeedsColourKeying); > 471a484,485 > pDest->PopUseColorKeyedBlt(); > 483a498 > pDest->PushUseColorKeyedBlt(m_NeedsColourKeying); 484a500 > pDest->PopUseColorKeyedBlt(); 524a541 > pDest->PushUseColorKeyedBlt(m_NeedsColourKeying); 525a543 > pDest->PopUseColorKeyedBlt(); 527c545,586 < } \ No newline at end of file --- > } > > void cImage::determineColourKeyRequirements() > { > // Preset to no - if we find out different, we're fall through > m_NeedsColourKeying = VARIANT_FALSE; > > // Obtain a surface interface and its metrics > CComPtr pSurface; > m_pImage->GetSurface(IID_IDirect3DSurface9, reinterpret_cast(&pSurface)); > > D3DSURFACE_DESC surfaceDesc; > pSurface->GetDesc(&surfaceDesc); > > // Lock the surface > D3DLOCKED_RECT surfaceLock; > pSurface->LockRect(&surfaceLock, NULL, D3DLOCK_READONLY); > long* surfaceData = reinterpret_cast(surfaceLock.pBits); > > // We know all surfaces are D3DFMT_X8R8G8B8, so we can just mask off the G8B8 bits and compare to 0xFFFF on each pixel > > for (int y = 0; y < surfaceDesc.Height; y++) > { > for (int x = 0; x < surfaceDesc.Width; x++) > { > long pixelColour = *(surfaceData + (y * (surfaceLock.Pitch / 4)) + x); > > if (pixelColour & 0x0000FFFF == 0x0000FFFF) > { > // Early terminate, it's got a colour key > m_NeedsColourKeying = VARIANT_TRUE; > break; > } > } > > if (m_NeedsColourKeying == VARIANT_TRUE) > break; > } > > // Unlock > pSurface->UnlockRect(); > } Index: Image.h =================================================================== RCS file: /Decal2/src/Inject/Image.h,v retrieving revision 1.1 diff -r1.1 Image.h 15c15 < cImage() --- > cImage() : m_NeedsColourKeying(VARIANT_FALSE) 31a32 > VARIANT_BOOL m_NeedsColourKeying; 39a41 > void determineColourKeyRequirements(); Index: Inject.idl =================================================================== RCS file: /Decal2/src/Inject/Inject.idl,v retrieving revision 1.6 diff -r1.6 Inject.idl 578a579,580 > [helpstring("method PushUsedColorKeyedBlt")] HRESULT PushUseColorKeyedBlt([in] VARIANT_BOOL newVal); > [helpstring("method PopUsedColorKeyedBlt")] HRESULT PopUseColorKeyedBlt(); ***** CVS exited normally with code 1 *****