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

Unified Diff: webkit/glue/plugins/pepper_graphics_2d.cc

Issue 4365001: Use optimized scrolling for pepper plugins. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 10 years, 1 month 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: webkit/glue/plugins/pepper_graphics_2d.cc
===================================================================
--- webkit/glue/plugins/pepper_graphics_2d.cc (revision 64839)
+++ webkit/glue/plugins/pepper_graphics_2d.cc (working copy)
@@ -334,7 +334,7 @@
if (!callback.func)
return PP_ERROR_BADARGUMENT;
- gfx::Rect changed_rect;
+ bool nothing_visible = true;
for (size_t i = 0; i < queued_operations_.size(); i++) {
QueuedOperation& operation = queued_operations_[i];
gfx::Rect op_rect;
@@ -354,26 +354,34 @@
ExecuteReplaceContents(operation.replace_image, &op_rect);
break;
}
- changed_rect = changed_rect.Union(op_rect);
+
+ // We need the rect to be in terms of the current clip rect of the plugin
+ // since that's what will actually be painted. If we issue an invalidate
+ // for a clipped-out region, WebKit will do nothing and we won't get any
+ // ViewInitiatedPaint/ViewFlushedPaint calls, leaving our callback stranded.
+ gfx::Rect visible_changed_rect;
+ if (bound_instance_ && !op_rect.IsEmpty())
+ visible_changed_rect = bound_instance_->clip().Intersect(op_rect);
+
+ if (bound_instance_ && !visible_changed_rect.IsEmpty()) {
+ if (operation.type == QueuedOperation::SCROLL) {
+ bound_instance_->ScrollRect(operation.scroll_dx, operation.scroll_dy,
+ visible_changed_rect);
+ } else {
+ bound_instance_->InvalidateRect(visible_changed_rect);
+ }
+ nothing_visible = false;
+ }
}
queued_operations_.clear();
flushed_any_data_ = true;
- // We need the rect to be in terms of the current clip rect of the plugin
- // since that's what will actually be painted. If we issue an invalidate
- // for a clipped-out region, WebKit will do nothing and we won't get any
- // ViewInitiatedPaint/ViewFlushedPaint calls, leaving our callback stranded.
- gfx::Rect visible_changed_rect;
- if (bound_instance_ && !changed_rect.IsEmpty())
- visible_changed_rect = bound_instance_->clip().Intersect(changed_rect);
-
- if (bound_instance_ && !visible_changed_rect.IsEmpty()) {
- unpainted_flush_callback_.Set(callback);
- bound_instance_->InvalidateRect(visible_changed_rect);
- } else {
+ if (nothing_visible) {
// There's nothing visible to invalidate so just schedule the callback to
// execute in the next round of the message loop.
ScheduleOffscreenCallback(FlushCallbackData(callback));
+ } else {
+ unpainted_flush_callback_.Set(callback);
}
return PP_ERROR_WOULDBLOCK;
}

Powered by Google App Engine
This is Rietveld 408576698