Index: chrome/renderer/render_widget.cc |
=================================================================== |
--- chrome/renderer/render_widget.cc (revision 45523) |
+++ chrome/renderer/render_widget.cc (working copy) |
@@ -149,6 +149,7 @@ |
IPC_MESSAGE_HANDLER(ViewMsg_SetFocus, OnSetFocus) |
IPC_MESSAGE_HANDLER(ViewMsg_ImeSetInputMode, OnImeSetInputMode) |
IPC_MESSAGE_HANDLER(ViewMsg_ImeSetComposition, OnImeSetComposition) |
+ IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnMsgPaintAtSize) |
IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnMsgRepaint) |
IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) |
IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) |
@@ -250,8 +251,8 @@ |
return; |
needs_repainting_on_restore_ = false; |
- // Tag the next paint as a restore ack, which is picked up by DoDeferredUpdate |
- // when it sends out the next PaintRect message. |
+ // Tag the next paint as a restore ack, which is picked up by |
+ // DoDeferredUpdate when it sends out the next PaintRect message. |
set_next_paint_is_restore_ack(); |
// Generate a full repaint. |
@@ -268,7 +269,7 @@ |
update_reply_pending_ = false; |
// If we sent an UpdateRect message with a zero-sized bitmap, then we should |
- // have no current update buf. |
+ // have no current paint buffer. |
if (current_paint_buf_) { |
RenderProcess::current()->ReleaseTransportDIB(current_paint_buf_); |
current_paint_buf_ = NULL; |
@@ -720,6 +721,72 @@ |
ime_control_busy_ = false; |
} |
+// Forces a repaint even if we're hidden, so we can update backing |
+// store even before a tab has been shown for the first time, and it |
+// does it synchronously. |
+void RenderWidget::OnMsgPaintAtSize(const TransportDIB::Handle& dib_handle, |
+ const gfx::Size& desired_size) { |
+ if (!webwidget_ || dib_handle == TransportDIB::DefaultHandleValue()) |
+ return; |
+ |
+ if (webwidget_->size().isEmpty() || |
+ desired_size.IsEmpty()) { |
+ // If one of these is empty, then we just return the dib we were |
+ // given, to avoid leaking it. |
+ Send(new ViewHostMsg_PaintAtSize_ACK(routing_id_, |
+ dib_handle, |
+ desired_size)); |
+ return; |
+ } |
+ |
+ // Map the given DIB ID into this process, and unmap it at the end |
+ // of this function. |
+ scoped_ptr<TransportDIB> paint_at_scale_buffer(TransportDIB::Map(dib_handle)); |
+ |
+ DCHECK(paint_at_scale_buffer.get()); |
+ if (!paint_at_scale_buffer.get()) |
+ return; |
+ |
+ // Have to make sure we're laid out before rendering. |
+ webwidget_->layout(); |
+ |
+ gfx::Size canvas_size = webwidget_->size(); |
+ float x_scale = static_cast<float>(desired_size.width()) / |
+ static_cast<float>(canvas_size.width()); |
+ float y_scale = static_cast<float>(desired_size.height()) / |
+ static_cast<float>(canvas_size.height()); |
+ |
+ gfx::Rect orig_bounds(gfx::Point(0,0), canvas_size); |
+ canvas_size.set_width(static_cast<int>(canvas_size.width() * x_scale)); |
+ canvas_size.set_height(static_cast<int>(canvas_size.height() * y_scale)); |
+ gfx::Rect bounds(gfx::Point(0,0), canvas_size); |
+ |
+ scoped_ptr<skia::PlatformCanvas> canvas( |
+ paint_at_scale_buffer->GetPlatformCanvas(canvas_size.width(), |
+ canvas_size.height())); |
+ if (!canvas.get()) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ // Reset bounds to what we actually received, but they should be the |
+ // same. |
+ DCHECK_EQ(bounds.width(), canvas->getDevice()->width()); |
+ DCHECK_EQ(bounds.height(), canvas->getDevice()->height()); |
+ bounds.set_width(canvas->getDevice()->width()); |
+ bounds.set_height(canvas->getDevice()->height()); |
+ |
+ canvas->save(); |
+ // Add the scale factor to the canvas, so that we'll get what we expect. |
+ canvas->scale(SkFloatToScalar(x_scale), SkFloatToScalar(y_scale)); |
+ |
+ // Paint the entire thing (using original bounds, not scaled bounds). |
+ PaintRect(orig_bounds, orig_bounds.origin(), canvas.get()); |
+ canvas->restore(); |
+ |
+ Send(new ViewHostMsg_PaintAtSize_ACK(routing_id_, dib_handle, bounds.size())); |
+} |
+ |
void RenderWidget::OnMsgRepaint(const gfx::Size& size_to_paint) { |
// During shutdown we can just ignore this message. |
if (!webwidget_) |
@@ -878,4 +945,3 @@ |
} |
} |
} |
- |