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

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: comments; sync up 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
Index: content/renderer/render_widget.cc
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 425d943e846afe23eeee68090ece402399309bd5..d648c9aeaf1767b1a6c236334c165b137d3fd31d 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;
@@ -1820,6 +1822,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_)

Powered by Google App Engine
This is Rietveld 408576698