Chromium Code Reviews| 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_) |