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

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: unused include 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
« content/common/view_messages.h ('K') | « 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 425d943e846afe23eeee68090ece402399309bd5..60fbd389fbee93d39b5ba7daae41ef0e689e998b 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -321,6 +321,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;
@@ -1820,6 +1821,50 @@ void RenderWidget::OnPaintAtSize(const TransportDIB::Handle& dib_handle,
Send(new ViewHostMsg_PaintAtSize_ACK(routing_id_, tag, bounds.size()));
}
+void RenderWidget::OnSnapshot(const gfx::Rect& src_subrect) {
+ SkBitmap snapshot;
+
+ if (OnSnapshotHelper(src_subrect, &snapshot)) {
+ Send(new ViewHostMsg_Snapshot(routing_id(), true, snapshot));
+ } else {
+ Send(new ViewHostMsg_Snapshot(routing_id(), false, SkBitmap()));
+ }
+}
+
+bool RenderWidget::OnSnapshotHelper(const gfx::Rect& src_subrect,
+ SkBitmap* snapshot) {
+ base::TimeTicks beginning_time = base::TimeTicks::Now();
+
+ if (!webwidget_ || src_subrect.IsEmpty())
+ return false;
+
+ 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 false;
+
+ 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 false;
+
+ UMA_HISTOGRAM_TIMES("Renderer4.Snapshot",
+ base::TimeTicks::Now() - beginning_time);
+ return true;
+}
+
void RenderWidget::OnRepaint(const gfx::Size& size_to_paint) {
// During shutdown we can just ignore this message.
if (!webwidget_)
« content/common/view_messages.h ('K') | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698