| Index: core/win/d3d9/renderer_d3d9.cc
|
| ===================================================================
|
| --- core/win/d3d9/renderer_d3d9.cc (revision 22687)
|
| +++ core/win/d3d9/renderer_d3d9.cc (working copy)
|
| @@ -1708,20 +1708,18 @@
|
| depth_constructor));
|
| }
|
|
|
| -// Saves a png screenshot 'filename.png'.
|
| -// Returns true on success and false on failure.
|
| -bool RendererD3D9::SaveScreen(const String& file_name) {
|
| -#ifdef TESTING
|
| +Bitmap::Ref RendererD3D9::TakeScreenshot() {
|
| + Bitmap::Ref empty;
|
| LPDIRECT3DDEVICE9 device = d3d_device();
|
| CComPtr<IDirect3DSurface9> system_surface;
|
| CComPtr<IDirect3DSurface9> current_surface;
|
|
|
| if (!HR(device->GetRenderTarget(0, ¤t_surface)))
|
| - return false;
|
| + return empty;
|
|
|
| D3DSURFACE_DESC surface_description;
|
| if (!HR(current_surface->GetDesc(&surface_description)))
|
| - return false;
|
| + return empty;
|
|
|
| // Construct an intermediate surface with multi-sampling disabled.
|
| // This surface is required because GetRenderTargetData(...) will fail
|
| @@ -1737,7 +1735,7 @@
|
| FALSE,
|
| &intermediate_target,
|
| NULL))) {
|
| - return false;
|
| + return empty;
|
| }
|
|
|
| if (!HR(device->StretchRect(current_surface,
|
| @@ -1745,7 +1743,7 @@
|
| intermediate_target,
|
| NULL,
|
| D3DTEXF_NONE))) {
|
| - return false;
|
| + return empty;
|
| }
|
|
|
| if (!HR(device->CreateOffscreenPlainSurface(surface_description.Width,
|
| @@ -1754,27 +1752,39 @@
|
| D3DPOOL_SYSTEMMEM,
|
| &system_surface,
|
| NULL))) {
|
| - return false;
|
| + return empty;
|
| }
|
|
|
| if (!HR(device->GetRenderTargetData(intermediate_target, system_surface)))
|
| - return false;
|
| + return empty;
|
|
|
| - // append .png to the end of file_name
|
| - String png_file_name = file_name;
|
| - png_file_name.append(String(".png"));
|
| - // convert file name to utf16
|
| - std::wstring file_name_utf16 = UTF8ToWide(png_file_name);
|
| + D3DLOCKED_RECT out_rect = {0};
|
| + if (!HR(system_surface->LockRect(&out_rect, NULL, D3DLOCK_READONLY))) {
|
| + O3D_ERROR(service_locator()) << "Failed to Lock Surface (D3D9)";
|
| + return empty;
|
| + }
|
|
|
| - return HR(o3d::D3DXSaveSurfaceToFile(file_name_utf16.c_str(),
|
| - D3DXIFF_PNG,
|
| - system_surface,
|
| - NULL,
|
| - NULL));
|
| -#else
|
| - // Not a test build, always return false.
|
| - return false;
|
| -#endif
|
| + Bitmap::Ref bitmap = Bitmap::Ref(new Bitmap(service_locator()));
|
| + bitmap->Allocate(Texture::ARGB8,
|
| + surface_description.Width,
|
| + surface_description.Height,
|
| + 1,
|
| + false);
|
| + bitmap->SetRect(0, 0, 0,
|
| + surface_description.Width,
|
| + surface_description.Height,
|
| + out_rect.pBits,
|
| + out_rect.Pitch);
|
| + // TODO(gman): Remove this when we get the D3D backbuffer to be RGBA
|
| + // Set the Alpha to 0xFF
|
| + uint8* data = bitmap->image_data();
|
| + uint8* end = data + bitmap->width() * bitmap->height() * 4;
|
| + while (data != end) {
|
| + data[3] = 0xFF;
|
| + data += 4;
|
| + }
|
| + bitmap->FlipVertically();
|
| + return bitmap;
|
| }
|
|
|
| const int* RendererD3D9::GetRGBAUByteNSwizzleTable() {
|
|
|