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

Unified Diff: content/renderer/render_widget.cc

Issue 12881005: Allow CopyFromBackingStore to fallback to copying from the renderer side if the accelerated surface… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: uma Created 7 years, 9 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 | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_widget.cc
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index fc69a27aad3ad10442336cb06a2c2102a2948208..05c5f325b0ede927ae8b80c1649a0e789ed4e053 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -5,6 +5,7 @@
#include "content/renderer/render_widget.h"
#include "base/bind.h"
+#include "base/bind_helpers.h"
#include "base/command_line.h"
#include "base/debug/trace_event.h"
#include "base/logging.h"
@@ -321,6 +322,7 @@ bool RenderWidget::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(ViewMsg_ImeBatchStateChanged, OnImeBatchStateChanged)
IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded)
#endif
+ IPC_MESSAGE_HANDLER(ViewMsg_Snapshot, OnSnapshot)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
@@ -1821,6 +1823,53 @@ void RenderWidget::OnPaintAtSize(const TransportDIB::Handle& dib_handle,
Send(new ViewHostMsg_PaintAtSize_ACK(routing_id_, tag, bounds.size()));
}
+namespace {
+void OnSnapshotFailed(scoped_refptr<content::RenderWidget> render_widget,
+ int routing_id) {
+ render_widget->Send(new ViewHostMsg_Snapshot(routing_id, false, SkBitmap()));
+}
+} // namespace
+
+void RenderWidget::OnSnapshot(const gfx::Rect& src_subrect) {
+ base::TimeTicks beginning_time = base::TimeTicks::Now();
+
+ base::ScopedClosureRunner scoped_callback_runner(
+ base::Bind(OnSnapshotFailed, make_scoped_refptr(this), routing_id_));
jamesr 2013/03/22 00:05:33 This functional style is highly uncommon in chromi
justinlin 2013/03/22 00:43:39 Done.
+
+ SkBitmap snapshot;
+ if (!webwidget_ || src_subrect.IsEmpty())
+ return;
+
+ gfx::Rect viewport_size = gfx::IntersectRects(
+ src_subrect, gfx::Rect(physical_backing_size_));
+
+ skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(
+ skia::CreatePlatformCanvas(viewport_size.width(),
+ viewport_size.height(),
+ true,
+ NULL,
+ skia::RETURN_NULL_ON_FAILURE));
+ if (!canvas.get())
+ return;
+
+ canvas->save();
+ webwidget_->layout();
+
+ PaintRect(viewport_size, viewport_size.origin(), canvas.get());
+ canvas->restore();
+
+ const SkBitmap& bitmap = skia::GetTopDevice(*canvas)->accessBitmap(false);
+ if (!bitmap.copyTo(&snapshot, SkBitmap::kARGB_8888_Config))
+ return;
+
+ UMA_HISTOGRAM_TIMES("Renderer4.Snapshot",
+ base::TimeTicks::Now() - beginning_time);
+
+ scoped_callback_runner.Release();
+
+ Send(new ViewHostMsg_Snapshot(routing_id_, true, snapshot));
+}
+
void RenderWidget::OnRepaint(const gfx::Size& size_to_paint) {
// During shutdown we can just ignore this message.
if (!webwidget_)
« no previous file with comments | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698