Chromium Code Reviews| Index: core/win/d3d9/renderer_d3d9.cc |
| =================================================================== |
| --- core/win/d3d9/renderer_d3d9.cc (revision 22687) |
| +++ core/win/d3d9/renderer_d3d9.cc (working copy) |
| @@ -59,6 +59,7 @@ |
| #include "core/win/d3d9/stream_bank_d3d9.h" |
| #include "core/win/d3d9/texture_d3d9.h" |
| #include "core/win/d3d9/utils_d3d9.h" |
| +#include "utils/cross/dataurl.h" |
| namespace o3d { |
| @@ -1708,20 +1709,17 @@ |
| 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 |
| +String RendererD3D9::ToDataURL() { |
| LPDIRECT3DDEVICE9 device = d3d_device(); |
| CComPtr<IDirect3DSurface9> system_surface; |
| CComPtr<IDirect3DSurface9> current_surface; |
| if (!HR(device->GetRenderTarget(0, ¤t_surface))) |
| - return false; |
| + return dataurl::kEmptyDataURL; |
| D3DSURFACE_DESC surface_description; |
| if (!HR(current_surface->GetDesc(&surface_description))) |
| - return false; |
| + return dataurl::kEmptyDataURL; |
| // 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 dataurl::kEmptyDataURL; |
| } |
| if (!HR(device->StretchRect(current_surface, |
| @@ -1745,7 +1743,7 @@ |
| intermediate_target, |
| NULL, |
| D3DTEXF_NONE))) { |
| - return false; |
| + return dataurl::kEmptyDataURL; |
| } |
| if (!HR(device->CreateOffscreenPlainSurface(surface_description.Width, |
| @@ -1754,27 +1752,39 @@ |
| D3DPOOL_SYSTEMMEM, |
| &system_surface, |
| NULL))) { |
| - return false; |
| + return dataurl::kEmptyDataURL; |
| } |
| if (!HR(device->GetRenderTargetData(intermediate_target, system_surface))) |
| - return false; |
| + return dataurl::kEmptyDataURL; |
| - // 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 dataurl::kEmptyDataURL; |
| + } |
| - 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) { |
|
apatrick
2009/08/07 18:25:45
This looks like it wants to be a for loop.
gman
2009/08/07 21:34:31
Done.
|
| + data[3] = 0xFF; |
| + data += 4; |
| + } |
| + bitmap->FlipVertically(); |
| + return bitmap->ToDataURL(); |
| } |
| const int* RendererD3D9::GetRGBAUByteNSwizzleTable() { |