| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "core/paint/ObjectPaintInvalidator.h" | 5 #include "core/paint/ObjectPaintInvalidator.h" |
| 6 | 6 |
| 7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
| 8 #include "core/frame/LocalFrame.h" | 8 #include "core/frame/LocalFrame.h" |
| 9 #include "core/layout/LayoutView.h" | 9 #include "core/layout/LayoutView.h" |
| 10 #include "core/layout/api/LayoutPartItem.h" | 10 #include "core/layout/api/LayoutPartItem.h" |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 // container vs scrolling contents). | 492 // container vs scrolling contents). |
| 493 return !context_.paint_invalidation_container->UsesCompositedScrolling(); | 493 return !context_.paint_invalidation_container->UsesCompositedScrolling(); |
| 494 } | 494 } |
| 495 | 495 |
| 496 void ObjectPaintInvalidatorWithContext::InvalidatePaintRectangleWithContext( | 496 void ObjectPaintInvalidatorWithContext::InvalidatePaintRectangleWithContext( |
| 497 const LayoutRect& rect, | 497 const LayoutRect& rect, |
| 498 PaintInvalidationReason reason) { | 498 PaintInvalidationReason reason) { |
| 499 if (rect.IsEmpty()) | 499 if (rect.IsEmpty()) |
| 500 return; | 500 return; |
| 501 | 501 |
| 502 if (context_.forced_subtree_invalidation_flags & | |
| 503 PaintInvalidatorContext::kForcedSubtreeNoRasterInvalidation) | |
| 504 return; | |
| 505 | |
| 506 // If the parent has fully invalidated and its visual rect covers this object | 502 // If the parent has fully invalidated and its visual rect covers this object |
| 507 // on the same backing, skip the invalidation. | 503 // on the same backing, skip the invalidation. |
| 508 if (ParentFullyInvalidatedOnSameBacking() && | 504 if (ParentFullyInvalidatedOnSameBacking() && |
| 509 (context_.parent_context->old_visual_rect.Contains(rect) || | 505 (context_.parent_context->old_visual_rect.Contains(rect) || |
| 510 object_.Parent()->VisualRect().Contains(rect))) | 506 object_.Parent()->VisualRect().Contains(rect))) |
| 511 return; | 507 return; |
| 512 | 508 |
| 513 InvalidatePaintUsingContainer(*context_.paint_invalidation_container, rect, | 509 InvalidatePaintUsingContainer(*context_.paint_invalidation_container, rect, |
| 514 reason); | 510 reason); |
| 515 } | 511 } |
| 516 | 512 |
| 517 DISABLE_CFI_PERF | 513 DISABLE_CFI_PERF |
| 518 PaintInvalidationReason | 514 PaintInvalidationReason |
| 519 ObjectPaintInvalidatorWithContext::ComputePaintInvalidationReason() { | 515 ObjectPaintInvalidatorWithContext::ComputePaintInvalidationReason() { |
| 520 // This is before any early return to ensure the background obscuration status | 516 // This is before any early return to ensure the background obscuration status |
| 521 // is saved. | 517 // is saved. |
| 522 bool background_obscuration_changed = false; | 518 bool background_obscuration_changed = false; |
| 523 bool background_obscured = object_.BackgroundIsKnownToBeObscured(); | 519 bool background_obscured = object_.BackgroundIsKnownToBeObscured(); |
| 524 if (background_obscured != object_.PreviousBackgroundObscured()) { | 520 if (background_obscured != object_.PreviousBackgroundObscured()) { |
| 525 object_.GetMutableForPainting().SetPreviousBackgroundObscured( | 521 object_.GetMutableForPainting().SetPreviousBackgroundObscured( |
| 526 background_obscured); | 522 background_obscured); |
| 527 background_obscuration_changed = true; | 523 background_obscuration_changed = true; |
| 528 } | 524 } |
| 529 | 525 |
| 530 if (context_.forced_subtree_invalidation_flags & | 526 if (context_.subtree_flags & |
| 531 PaintInvalidatorContext::kForcedSubtreeFullInvalidation) | 527 PaintInvalidatorContext::kSubtreeFullInvalidation) |
| 532 return PaintInvalidationReason::kSubtree; | 528 return PaintInvalidationReason::kSubtree; |
| 533 | 529 |
| 534 if (object_.ShouldDoFullPaintInvalidation()) | 530 if (object_.ShouldDoFullPaintInvalidation()) |
| 535 return object_.FullPaintInvalidationReason(); | 531 return object_.FullPaintInvalidationReason(); |
| 536 | 532 |
| 537 if (context_.old_visual_rect.IsEmpty() && object_.VisualRect().IsEmpty()) | 533 if (context_.old_visual_rect.IsEmpty() && object_.VisualRect().IsEmpty()) |
| 538 return PaintInvalidationReason::kNone; | 534 return PaintInvalidationReason::kNone; |
| 539 | 535 |
| 540 if (background_obscuration_changed) | 536 if (background_obscuration_changed) |
| 541 return PaintInvalidationReason::kBackground; | 537 return PaintInvalidationReason::kBackground; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 old_selection_rect, new_selection_rect); | 615 old_selection_rect, new_selection_rect); |
| 620 context_.painting_layer->SetNeedsRepaint(); | 616 context_.painting_layer->SetNeedsRepaint(); |
| 621 object_.InvalidateDisplayItemClients(PaintInvalidationReason::kSelection); | 617 object_.InvalidateDisplayItemClients(PaintInvalidationReason::kSelection); |
| 622 } | 618 } |
| 623 } | 619 } |
| 624 | 620 |
| 625 DISABLE_CFI_PERF | 621 DISABLE_CFI_PERF |
| 626 PaintInvalidationReason | 622 PaintInvalidationReason |
| 627 ObjectPaintInvalidatorWithContext::InvalidatePaintWithComputedReason( | 623 ObjectPaintInvalidatorWithContext::InvalidatePaintWithComputedReason( |
| 628 PaintInvalidationReason reason) { | 624 PaintInvalidationReason reason) { |
| 625 DCHECK(!(context_.subtree_flags & |
| 626 PaintInvalidatorContext::kSubtreeNoInvalidation)); |
| 627 |
| 629 // We need to invalidate the selection before checking for whether we are | 628 // We need to invalidate the selection before checking for whether we are |
| 630 // doing a full invalidation. This is because we need to update the previous | 629 // doing a full invalidation. This is because we need to update the previous |
| 631 // selection rect regardless. | 630 // selection rect regardless. |
| 632 InvalidateSelectionIfNeeded(reason); | 631 InvalidateSelectionIfNeeded(reason); |
| 633 | 632 |
| 634 switch (reason) { | 633 switch (reason) { |
| 635 case PaintInvalidationReason::kNone: | 634 case PaintInvalidationReason::kNone: |
| 636 // There are corner cases that the display items need to be invalidated | 635 // There are corner cases that the display items need to be invalidated |
| 637 // for paint offset mutation, but incurs no pixel difference (i.e. bounds | 636 // for paint offset mutation, but incurs no pixel difference (i.e. bounds |
| 638 // stay the same) so no rect-based invalidation is issued. See | 637 // stay the same) so no rect-based invalidation is issued. See |
| 639 // crbug.com/508383 and crbug.com/515977. | 638 // crbug.com/508383 and crbug.com/515977. |
| 640 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled() && | 639 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled() && |
| 641 (context_.forced_subtree_invalidation_flags & | 640 (context_.subtree_flags & |
| 642 PaintInvalidatorContext::kForcedSubtreeInvalidationChecking) && | 641 PaintInvalidatorContext::kSubtreeInvalidationChecking) && |
| 643 !object_.IsSVGChild()) { | 642 !object_.IsSVGChild()) { |
| 644 // For SPv1, we conservatively assume the object changed paint offset | 643 // For SPv1, we conservatively assume the object changed paint offset |
| 645 // except for non-root SVG whose paint offset is always zero. | 644 // except for non-root SVG whose paint offset is always zero. |
| 646 reason = PaintInvalidationReason::kGeometry; | 645 reason = PaintInvalidationReason::kGeometry; |
| 647 break; | 646 break; |
| 648 } | 647 } |
| 649 | 648 |
| 650 if (object_.IsSVG() && | 649 if (object_.IsSVG() && |
| 651 (context_.forced_subtree_invalidation_flags & | 650 (context_.subtree_flags & |
| 652 PaintInvalidatorContext::kForcedSubtreeSVGResourceChange)) { | 651 PaintInvalidatorContext::kSubtreeSVGResourceChange)) { |
| 653 reason = PaintInvalidationReason::kSVGResource; | 652 reason = PaintInvalidationReason::kSVGResource; |
| 654 break; | 653 break; |
| 655 } | 654 } |
| 656 return PaintInvalidationReason::kNone; | 655 return PaintInvalidationReason::kNone; |
| 657 case PaintInvalidationReason::kDelayedFull: | 656 case PaintInvalidationReason::kDelayedFull: |
| 658 return PaintInvalidationReason::kDelayedFull; | 657 return PaintInvalidationReason::kDelayedFull; |
| 659 default: | 658 default: |
| 660 DCHECK(IsImmediateFullPaintInvalidationReason(reason)); | 659 DCHECK(IsImmediateFullPaintInvalidationReason(reason)); |
| 661 // This allows descendants to know the computed reason if it's different | 660 // This allows descendants to know the computed reason if it's different |
| 662 // from the original reason before paint invalidation. | 661 // from the original reason before paint invalidation. |
| 663 object_.GetMutableForPainting() | 662 object_.GetMutableForPainting() |
| 664 .SetShouldDoFullPaintInvalidationWithoutGeometryChange(reason); | 663 .SetShouldDoFullPaintInvalidationWithoutGeometryChange(reason); |
| 665 FullyInvalidatePaint(reason, context_.old_visual_rect, | 664 FullyInvalidatePaint(reason, context_.old_visual_rect, |
| 666 object_.VisualRect()); | 665 object_.VisualRect()); |
| 667 } | 666 } |
| 668 | 667 |
| 669 context_.painting_layer->SetNeedsRepaint(); | 668 context_.painting_layer->SetNeedsRepaint(); |
| 670 object_.InvalidateDisplayItemClients(reason); | 669 object_.InvalidateDisplayItemClients(reason); |
| 671 return reason; | 670 return reason; |
| 672 } | 671 } |
| 673 | 672 |
| 674 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts() | 673 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts() |
| 675 : disabler_(&g_disable_paint_invalidation_state_asserts, true) {} | 674 : disabler_(&g_disable_paint_invalidation_state_asserts, true) {} |
| 676 | 675 |
| 677 } // namespace blink | 676 } // namespace blink |
| OLD | NEW |