OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/plugins/ppapi/ppb_graphics_2d_impl.h" | 5 #include "webkit/plugins/ppapi/ppb_graphics_2d_impl.h" |
6 | 6 |
7 #include <iterator> | 7 #include <iterator> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 case QueuedOperation::SCROLL: | 337 case QueuedOperation::SCROLL: |
338 ExecuteScroll(operation.scroll_clip_rect, | 338 ExecuteScroll(operation.scroll_clip_rect, |
339 operation.scroll_dx, operation.scroll_dy, | 339 operation.scroll_dx, operation.scroll_dy, |
340 &op_rect); | 340 &op_rect); |
341 break; | 341 break; |
342 case QueuedOperation::REPLACE: | 342 case QueuedOperation::REPLACE: |
343 ExecuteReplaceContents(operation.replace_image, &op_rect); | 343 ExecuteReplaceContents(operation.replace_image, &op_rect); |
344 break; | 344 break; |
345 } | 345 } |
346 | 346 |
347 // We need the rect to be in terms of the current clip rect of the plugin | 347 // For correctness with accelerated compositing, we must issue an invalidate |
348 // since that's what will actually be painted. If we issue an invalidate | 348 // on the full op_rect even if it is partially or completely off-screen. |
349 // for a clipped-out region, WebKit will do nothing and we won't get any | 349 // However, if we issue an invalidate for a clipped-out region, WebKit will |
350 // ViewWillInitiatePaint/ViewFlushedPaint calls, leaving our callback | 350 // do nothing and we won't get any ViewWillInitiatePaint/ViewFlushedPaint |
351 // stranded. | 351 // calls, leaving our callback stranded. So we still need to check whether |
352 gfx::Rect visible_changed_rect; | 352 // the repainted area is visible to determine how to deal with the callback. |
353 if (bound_instance_ && !op_rect.IsEmpty()) | 353 if (bound_instance_ && !op_rect.IsEmpty()) { |
354 visible_changed_rect =PP_ToGfxRect(bound_instance_->view_data().clip_rect)
. | 354 |
| 355 // Set |nothing_visible| to false if the change overlaps the visible area. |
| 356 gfx::Rect visible_changed_rect = |
| 357 PP_ToGfxRect(bound_instance_->view_data().clip_rect). |
355 Intersect(op_rect); | 358 Intersect(op_rect); |
| 359 if (!visible_changed_rect.IsEmpty()) |
| 360 nothing_visible = false; |
356 | 361 |
357 if (bound_instance_ && !visible_changed_rect.IsEmpty()) { | 362 // Notify the plugin of the entire change (op_rect), even if it is |
| 363 // partially or completely off-screen. |
358 if (operation.type == QueuedOperation::SCROLL) { | 364 if (operation.type == QueuedOperation::SCROLL) { |
359 bound_instance_->ScrollRect(operation.scroll_dx, operation.scroll_dy, | 365 bound_instance_->ScrollRect(operation.scroll_dx, operation.scroll_dy, |
360 visible_changed_rect); | 366 op_rect); |
361 } else { | 367 } else { |
362 bound_instance_->InvalidateRect(visible_changed_rect); | 368 bound_instance_->InvalidateRect(op_rect); |
363 } | 369 } |
364 nothing_visible = false; | |
365 } | 370 } |
366 } | 371 } |
367 queued_operations_.clear(); | 372 queued_operations_.clear(); |
368 | 373 |
369 if (nothing_visible) { | 374 if (nothing_visible) { |
370 // There's nothing visible to invalidate so just schedule the callback to | 375 // There's nothing visible to invalidate so just schedule the callback to |
371 // execute in the next round of the message loop. | 376 // execute in the next round of the message loop. |
372 ScheduleOffscreenCallback(FlushCallbackData( | 377 ScheduleOffscreenCallback(FlushCallbackData( |
373 scoped_refptr<TrackedCallback>(new TrackedCallback(this, callback)))); | 378 scoped_refptr<TrackedCallback>(new TrackedCallback(this, callback)))); |
374 } else { | 379 } else { |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 } | 685 } |
681 | 686 |
682 bool PPB_Graphics2D_Impl::HasPendingFlush() const { | 687 bool PPB_Graphics2D_Impl::HasPendingFlush() const { |
683 return !unpainted_flush_callback_.is_null() || | 688 return !unpainted_flush_callback_.is_null() || |
684 !painted_flush_callback_.is_null() || | 689 !painted_flush_callback_.is_null() || |
685 offscreen_flush_pending_; | 690 offscreen_flush_pending_; |
686 } | 691 } |
687 | 692 |
688 } // namespace ppapi | 693 } // namespace ppapi |
689 } // namespace webkit | 694 } // namespace webkit |
OLD | NEW |