summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/render_widget.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/render_widget.cc')
-rw-r--r--chrome/renderer/render_widget.cc33
1 files changed, 28 insertions, 5 deletions
diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc
index 3252097..f5a7ebe 100644
--- a/chrome/renderer/render_widget.cc
+++ b/chrome/renderer/render_widget.cc
@@ -505,11 +505,24 @@ void RenderWidget::DoDeferredUpdate() {
gfx::Rect scroll_damage = update.GetScrollDamage();
gfx::Rect bounds = update.GetPaintBounds().Union(scroll_damage);
+ // A plugin may be able to do an optimized paint. First check this, in which
+ // case we can skip all of the bitmap generation and regular paint code.
+ TransportDIB::Id dib_id = TransportDIB::Id();
+ TransportDIB* dib = NULL;
std::vector<gfx::Rect> copy_rects;
- if (!is_gpu_rendering_active_) {
+ gfx::Rect optimized_copy_rect, optimized_copy_location;
+ if (update.scroll_rect.IsEmpty() &&
+ !is_gpu_rendering_active_ &&
+ GetBitmapForOptimizedPluginPaint(bounds, &dib, &optimized_copy_location,
+ &optimized_copy_rect)) {
+ bounds = optimized_copy_location;
+ copy_rects.push_back(optimized_copy_rect);
+ dib_id = dib->id();
+ } else if (!is_gpu_rendering_active_) {
// Compute a buffer for painting and cache it.
- scoped_ptr<skia::PlatformCanvas> canvas
- (RenderProcess::current()->GetDrawingCanvas(&current_paint_buf_, bounds));
+ scoped_ptr<skia::PlatformCanvas> canvas(
+ RenderProcess::current()->GetDrawingCanvas(&current_paint_buf_,
+ bounds));
if (!canvas.get()) {
NOTREACHED();
return;
@@ -538,6 +551,8 @@ void RenderWidget::DoDeferredUpdate() {
for (size_t i = 0; i < copy_rects.size(); ++i)
PaintRect(copy_rects[i], bounds.origin(), canvas.get());
+
+ dib_id = current_paint_buf_->id();
} else { // Accelerated compositing path
// Begin painting.
bool finish = next_paint_is_resize_ack();
@@ -546,8 +561,7 @@ void RenderWidget::DoDeferredUpdate() {
// sending an ack to browser process that the paint is complete...
ViewHostMsg_UpdateRect_Params params;
- params.bitmap =
- current_paint_buf_ ? current_paint_buf_->id() : TransportDIB::Id();
+ params.bitmap = dib_id;
params.bitmap_rect = bounds;
params.dx = update.scroll_delta.x();
params.dy = update.scroll_delta.y();
@@ -889,6 +903,15 @@ void RenderWidget::OnSetTextDirection(WebTextDirection direction) {
webwidget_->setTextDirection(direction);
}
+bool RenderWidget::GetBitmapForOptimizedPluginPaint(
+ const gfx::Rect& paint_bounds,
+ TransportDIB** dib,
+ gfx::Rect* location,
+ gfx::Rect* clip) {
+ // Normal RenderWidgets don't support optimized plugin painting.
+ return false;
+}
+
void RenderWidget::SetHidden(bool hidden) {
if (is_hidden_ == hidden)
return;