//////////////////////////////////////////////////////////////// // // CScreenGrabber::GetBackBufferPixels // // // //////////////////////////////////////////////////////////////// bool CScreenGrabber::GetBackBufferPixels ( uint uiSizeX, uint uiSizeY, CBuffer& buffer, SString& strOutError ) { HRESULT hr; // Try to get the back buffer IDirect3DSurface9* pD3DBackBufferSurface = NULL; hr = m_pDevice->GetBackBuffer ( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pD3DBackBufferSurface ); if ( FAILED( hr ) ) { strOutError = SString( "GetBackBuffer failed (0x%08x)", hr ); return false; } // Adjust/create screenshot target size if ( !m_pScreenShotTemp || m_pScreenShotTemp->m_uiSizeX != uiSizeX || m_pScreenShotTemp->m_uiSizeY != uiSizeY ) { // Delete old one if it exists SAFE_RELEASE( m_pScreenShotTemp ); // Try to create new one if needed if ( uiSizeX > 0 ) m_pScreenShotTemp = CGraphics::GetSingleton ().GetRenderItemManager ()->CreateRenderTarget ( uiSizeX, uiSizeY, false, true ); } if ( !m_pScreenShotTemp ) { strOutError = "No ScreenShotTemp"; return false; } // Copy back buffer into our private render target D3DTEXTUREFILTERTYPE FilterType = D3DTEXF_LINEAR; hr = m_pDevice->StretchRect( pD3DBackBufferSurface, NULL, m_pScreenShotTemp->m_pD3DRenderTargetSurface, NULL, FilterType ); if ( FAILED( hr ) ) { strOutError = SString( "StretchRect failed (0x%08x)", hr ); return false; } // Clean up SAFE_RELEASE( pD3DBackBufferSurface ); if ( !m_pScreenShotTemp->ReadPixels ( buffer, strOutError ) ) { dassert( !strOutError.empty() ); return false; } return true; }