Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(228)

Unified Diff: core/win/d3d9/renderer_d3d9.cc

Issue 164130: This CL adds client.toDataURL which gets the contents... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
Patch Set: '' Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « core/win/d3d9/renderer_d3d9.h ('k') | plugin/idl/client.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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, &current_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() {
« no previous file with comments | « core/win/d3d9/renderer_d3d9.h ('k') | plugin/idl/client.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698