| 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 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 InvalidatePaintIncludingNonCompositingDescendants() { | 207 InvalidatePaintIncludingNonCompositingDescendants() { |
| 208 // Since we're only painting non-composited layers, we know that they all | 208 // Since we're only painting non-composited layers, we know that they all |
| 209 // share the same paintInvalidationContainer. | 209 // share the same paintInvalidationContainer. |
| 210 const LayoutBoxModelObject& paint_invalidation_container = | 210 const LayoutBoxModelObject& paint_invalidation_container = |
| 211 object_.ContainerForPaintInvalidation(); | 211 object_.ContainerForPaintInvalidation(); |
| 212 SlowSetPaintingLayerNeedsRepaint(); | 212 SlowSetPaintingLayerNeedsRepaint(); |
| 213 TraverseNonCompositingDescendantsInPaintOrder( | 213 TraverseNonCompositingDescendantsInPaintOrder( |
| 214 object_, [&paint_invalidation_container](const LayoutObject& object) { | 214 object_, [&paint_invalidation_container](const LayoutObject& object) { |
| 215 SetPaintingLayerNeedsRepaintDuringTraverse(object); | 215 SetPaintingLayerNeedsRepaintDuringTraverse(object); |
| 216 ObjectPaintInvalidator(object).InvalidatePaintOfPreviousVisualRect( | 216 ObjectPaintInvalidator(object).InvalidatePaintOfPreviousVisualRect( |
| 217 paint_invalidation_container, kPaintInvalidationSubtree); | 217 paint_invalidation_container, PaintInvalidationReason::kSubtree); |
| 218 }); | 218 }); |
| 219 } | 219 } |
| 220 | 220 |
| 221 void ObjectPaintInvalidator:: | 221 void ObjectPaintInvalidator:: |
| 222 InvalidatePaintIncludingNonSelfPaintingLayerDescendantsInternal( | 222 InvalidatePaintIncludingNonSelfPaintingLayerDescendantsInternal( |
| 223 const LayoutBoxModelObject& paint_invalidation_container) { | 223 const LayoutBoxModelObject& paint_invalidation_container) { |
| 224 InvalidatePaintOfPreviousVisualRect(paint_invalidation_container, | 224 InvalidatePaintOfPreviousVisualRect(paint_invalidation_container, |
| 225 kPaintInvalidationSubtree); | 225 PaintInvalidationReason::kSubtree); |
| 226 for (LayoutObject* child = object_.SlowFirstChild(); child; | 226 for (LayoutObject* child = object_.SlowFirstChild(); child; |
| 227 child = child->NextSibling()) { | 227 child = child->NextSibling()) { |
| 228 if (!child->HasLayer() || | 228 if (!child->HasLayer() || |
| 229 !ToLayoutBoxModelObject(child)->Layer()->IsSelfPaintingLayer()) | 229 !ToLayoutBoxModelObject(child)->Layer()->IsSelfPaintingLayer()) |
| 230 ObjectPaintInvalidator(*child) | 230 ObjectPaintInvalidator(*child) |
| 231 .InvalidatePaintIncludingNonSelfPaintingLayerDescendantsInternal( | 231 .InvalidatePaintIncludingNonSelfPaintingLayerDescendantsInternal( |
| 232 paint_invalidation_container); | 232 paint_invalidation_container); |
| 233 } | 233 } |
| 234 } | 234 } |
| 235 | 235 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 // here. It is already taken into account. | 317 // here. It is already taken into account. |
| 318 squashing_layer->SetNeedsDisplayInRect(EnclosingIntRect(rect), reason, | 318 squashing_layer->SetNeedsDisplayInRect(EnclosingIntRect(rect), reason, |
| 319 object_); | 319 object_); |
| 320 } | 320 } |
| 321 } else if (object_.CompositedScrollsWithRespectTo( | 321 } else if (object_.CompositedScrollsWithRespectTo( |
| 322 paint_invalidation_container)) { | 322 paint_invalidation_container)) { |
| 323 layer.GetCompositedLayerMapping()->SetScrollingContentsNeedDisplayInRect( | 323 layer.GetCompositedLayerMapping()->SetScrollingContentsNeedDisplayInRect( |
| 324 rect, reason, object_); | 324 rect, reason, object_); |
| 325 } else if (paint_invalidation_container.UsesCompositedScrolling()) { | 325 } else if (paint_invalidation_container.UsesCompositedScrolling()) { |
| 326 DCHECK(object_ == paint_invalidation_container); | 326 DCHECK(object_ == paint_invalidation_container); |
| 327 if (reason == kPaintInvalidationBackgroundOnScrollingContentsLayer || | 327 if (reason == |
| 328 reason == kPaintInvalidationCaret) { | 328 PaintInvalidationReason::kBackgroundOnScrollingContentsLayer || |
| 329 reason == PaintInvalidationReason::kCaret) { |
| 329 layer.GetCompositedLayerMapping()->SetScrollingContentsNeedDisplayInRect( | 330 layer.GetCompositedLayerMapping()->SetScrollingContentsNeedDisplayInRect( |
| 330 rect, reason, object_); | 331 rect, reason, object_); |
| 331 } else { | 332 } else { |
| 332 layer.GetCompositedLayerMapping() | 333 layer.GetCompositedLayerMapping() |
| 333 ->SetNonScrollingContentsNeedDisplayInRect(rect, reason, object_); | 334 ->SetNonScrollingContentsNeedDisplayInRect(rect, reason, object_); |
| 334 } | 335 } |
| 335 } else { | 336 } else { |
| 336 // Otherwise invalidate everything. | 337 // Otherwise invalidate everything. |
| 337 layer.GetCompositedLayerMapping()->SetContentsNeedDisplayInRect( | 338 layer.GetCompositedLayerMapping()->SetContentsNeedDisplayInRect( |
| 338 rect, reason, object_); | 339 rect, reason, object_); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 | 406 |
| 406 const LayoutBoxModelObject& paint_invalidation_container = | 407 const LayoutBoxModelObject& paint_invalidation_container = |
| 407 object_.ContainerForPaintInvalidation(); | 408 object_.ContainerForPaintInvalidation(); |
| 408 LayoutRect dirty_rect_on_backing = dirty_rect; | 409 LayoutRect dirty_rect_on_backing = dirty_rect; |
| 409 PaintLayer::MapRectToPaintInvalidationBacking( | 410 PaintLayer::MapRectToPaintInvalidationBacking( |
| 410 object_, paint_invalidation_container, dirty_rect_on_backing); | 411 object_, paint_invalidation_container, dirty_rect_on_backing); |
| 411 dirty_rect_on_backing.Move(object_.ScrollAdjustmentForPaintInvalidation( | 412 dirty_rect_on_backing.Move(object_.ScrollAdjustmentForPaintInvalidation( |
| 412 paint_invalidation_container)); | 413 paint_invalidation_container)); |
| 413 InvalidatePaintUsingContainer(paint_invalidation_container, | 414 InvalidatePaintUsingContainer(paint_invalidation_container, |
| 414 dirty_rect_on_backing, | 415 dirty_rect_on_backing, |
| 415 kPaintInvalidationRectangle); | 416 PaintInvalidationReason::kRectangle); |
| 416 | 417 |
| 417 SlowSetPaintingLayerNeedsRepaint(); | 418 SlowSetPaintingLayerNeedsRepaint(); |
| 418 if (display_item_client) | 419 if (display_item_client) { |
| 419 InvalidateDisplayItemClient(*display_item_client, | 420 InvalidateDisplayItemClient(*display_item_client, |
| 420 kPaintInvalidationRectangle); | 421 PaintInvalidationReason::kRectangle); |
| 421 else | 422 } else { |
| 422 object_.InvalidateDisplayItemClients(kPaintInvalidationRectangle); | 423 object_.InvalidateDisplayItemClients(PaintInvalidationReason::kRectangle); |
| 424 } |
| 423 | 425 |
| 424 return dirty_rect_on_backing; | 426 return dirty_rect_on_backing; |
| 425 } | 427 } |
| 426 | 428 |
| 427 void ObjectPaintInvalidator::SlowSetPaintingLayerNeedsRepaint() { | 429 void ObjectPaintInvalidator::SlowSetPaintingLayerNeedsRepaint() { |
| 428 if (PaintLayer* painting_layer = object_.PaintingLayer()) | 430 if (PaintLayer* painting_layer = object_.PaintingLayer()) |
| 429 painting_layer->SetNeedsRepaint(); | 431 painting_layer->SetNeedsRepaint(); |
| 430 } | 432 } |
| 431 | 433 |
| 432 LayoutPoint ObjectPaintInvalidator::LocationInBacking() const { | 434 LayoutPoint ObjectPaintInvalidator::LocationInBacking() const { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 520 bool background_obscuration_changed = false; | 522 bool background_obscuration_changed = false; |
| 521 bool background_obscured = object_.BackgroundIsKnownToBeObscured(); | 523 bool background_obscured = object_.BackgroundIsKnownToBeObscured(); |
| 522 if (background_obscured != object_.PreviousBackgroundObscured()) { | 524 if (background_obscured != object_.PreviousBackgroundObscured()) { |
| 523 object_.GetMutableForPainting().SetPreviousBackgroundObscured( | 525 object_.GetMutableForPainting().SetPreviousBackgroundObscured( |
| 524 background_obscured); | 526 background_obscured); |
| 525 background_obscuration_changed = true; | 527 background_obscuration_changed = true; |
| 526 } | 528 } |
| 527 | 529 |
| 528 if (context_.forced_subtree_invalidation_flags & | 530 if (context_.forced_subtree_invalidation_flags & |
| 529 PaintInvalidatorContext::kForcedSubtreeFullInvalidation) | 531 PaintInvalidatorContext::kForcedSubtreeFullInvalidation) |
| 530 return kPaintInvalidationSubtree; | 532 return PaintInvalidationReason::kSubtree; |
| 531 | 533 |
| 532 if (object_.ShouldDoFullPaintInvalidation()) | 534 if (object_.ShouldDoFullPaintInvalidation()) |
| 533 return object_.FullPaintInvalidationReason(); | 535 return object_.FullPaintInvalidationReason(); |
| 534 | 536 |
| 535 if (context_.old_visual_rect.IsEmpty() && object_.VisualRect().IsEmpty()) | 537 if (context_.old_visual_rect.IsEmpty() && object_.VisualRect().IsEmpty()) |
| 536 return kPaintInvalidationNone; | 538 return PaintInvalidationReason::kNone; |
| 537 | 539 |
| 538 if (background_obscuration_changed) | 540 if (background_obscuration_changed) |
| 539 return kPaintInvalidationBackgroundObscurationChange; | 541 return PaintInvalidationReason::kBackground; |
| 540 | 542 |
| 541 if (object_.PaintedOutputOfObjectHasNoEffectRegardlessOfSize()) | 543 if (object_.PaintedOutputOfObjectHasNoEffectRegardlessOfSize()) |
| 542 return kPaintInvalidationNone; | 544 return PaintInvalidationReason::kNone; |
| 543 | 545 |
| 544 // Force full paint invalidation if the outline may be affected by descendants | 546 // Force full paint invalidation if the outline may be affected by descendants |
| 545 // and this object is marked for checking paint invalidation for any reason. | 547 // and this object is marked for checking paint invalidation for any reason. |
| 546 if (object_.OutlineMayBeAffectedByDescendants() || | 548 if (object_.OutlineMayBeAffectedByDescendants() || |
| 547 object_.PreviousOutlineMayBeAffectedByDescendants()) { | 549 object_.PreviousOutlineMayBeAffectedByDescendants()) { |
| 548 object_.GetMutableForPainting() | 550 object_.GetMutableForPainting() |
| 549 .UpdatePreviousOutlineMayBeAffectedByDescendants(); | 551 .UpdatePreviousOutlineMayBeAffectedByDescendants(); |
| 550 return kPaintInvalidationOutline; | 552 return PaintInvalidationReason::kOutline; |
| 551 } | 553 } |
| 552 | 554 |
| 553 // If the size is zero on one of our bounds then we know we're going to have | 555 // If the size is zero on one of our bounds then we know we're going to have |
| 554 // to do a full invalidation of either old bounds or new bounds. | 556 // to do a full invalidation of either old bounds or new bounds. |
| 555 if (context_.old_visual_rect.IsEmpty()) | 557 if (context_.old_visual_rect.IsEmpty()) |
| 556 return kPaintInvalidationBecameVisible; | 558 return PaintInvalidationReason::kAppeared; |
| 557 if (object_.VisualRect().IsEmpty()) | 559 if (object_.VisualRect().IsEmpty()) |
| 558 return kPaintInvalidationBecameInvisible; | 560 return PaintInvalidationReason::kDisappeared; |
| 559 | 561 |
| 560 // If we shifted, we don't know the exact reason so we are conservative and | 562 // If we shifted, we don't know the exact reason so we are conservative and |
| 561 // trigger a full invalidation. Shifting could be caused by some layout | 563 // trigger a full invalidation. Shifting could be caused by some layout |
| 562 // property (left / top) or some in-flow layoutObject inserted / removed | 564 // property (left / top) or some in-flow layoutObject inserted / removed |
| 563 // before us in the tree. | 565 // before us in the tree. |
| 564 if (object_.VisualRect().Location() != context_.old_visual_rect.Location()) | 566 if (object_.VisualRect().Location() != context_.old_visual_rect.Location()) |
| 565 return kPaintInvalidationBoundsChange; | 567 return PaintInvalidationReason::kGeometry; |
| 566 | 568 |
| 567 if (context_.new_location != context_.old_location) | 569 if (context_.new_location != context_.old_location) |
| 568 return kPaintInvalidationLocationChange; | 570 return PaintInvalidationReason::kGeometry; |
| 569 | 571 |
| 570 // Incremental invalidation is only applicable to LayoutBoxes. Return | 572 // Incremental invalidation is only applicable to LayoutBoxes. Return |
| 571 // PaintInvalidationIncremental no matter if oldVisualRect and newVisualRect | 573 // PaintInvalidationIncremental no matter if oldVisualRect and newVisualRect |
| 572 // are equal because a LayoutBox may need paint invalidation if its border box | 574 // are equal because a LayoutBox may need paint invalidation if its border box |
| 573 // changes. BoxPaintInvalidator may also override this reason with a full | 575 // changes. BoxPaintInvalidator may also override this reason with a full |
| 574 // paint invalidation reason if needed. | 576 // paint invalidation reason if needed. |
| 575 if (object_.IsBox()) | 577 if (object_.IsBox()) |
| 576 return kPaintInvalidationIncremental; | 578 return PaintInvalidationReason::kIncremental; |
| 577 | 579 |
| 578 if (context_.old_visual_rect != object_.VisualRect()) | 580 if (context_.old_visual_rect != object_.VisualRect()) |
| 579 return kPaintInvalidationBoundsChange; | 581 return PaintInvalidationReason::kGeometry; |
| 580 | 582 |
| 581 return kPaintInvalidationNone; | 583 return PaintInvalidationReason::kNone; |
| 582 } | 584 } |
| 583 | 585 |
| 584 DISABLE_CFI_PERF | 586 DISABLE_CFI_PERF |
| 585 void ObjectPaintInvalidatorWithContext::InvalidateSelectionIfNeeded( | 587 void ObjectPaintInvalidatorWithContext::InvalidateSelectionIfNeeded( |
| 586 PaintInvalidationReason reason) { | 588 PaintInvalidationReason reason) { |
| 587 // Update selection rect when we are doing full invalidation with geometry | 589 // Update selection rect when we are doing full invalidation with geometry |
| 588 // change (in case that the object is moved, composite status changed, etc.) | 590 // change (in case that the object is moved, composite status changed, etc.) |
| 589 // or shouldInvalidationSelection is set (in case that the selection itself | 591 // or shouldInvalidationSelection is set (in case that the selection itself |
| 590 // changed). | 592 // changed). |
| 591 bool full_invalidation = IsImmediateFullPaintInvalidationReason(reason); | 593 bool full_invalidation = IsImmediateFullPaintInvalidationReason(reason); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 606 if (context_.NeedsVisualRectUpdate(object_)) { | 608 if (context_.NeedsVisualRectUpdate(object_)) { |
| 607 new_selection_rect = object_.LocalSelectionRect(); | 609 new_selection_rect = object_.LocalSelectionRect(); |
| 608 context_.MapLocalRectToVisualRectInBacking(object_, new_selection_rect); | 610 context_.MapLocalRectToVisualRectInBacking(object_, new_selection_rect); |
| 609 } else { | 611 } else { |
| 610 new_selection_rect = old_selection_rect; | 612 new_selection_rect = old_selection_rect; |
| 611 } | 613 } |
| 612 | 614 |
| 613 SetSelectionVisualRect(object_, new_selection_rect); | 615 SetSelectionVisualRect(object_, new_selection_rect); |
| 614 | 616 |
| 615 if (!full_invalidation) { | 617 if (!full_invalidation) { |
| 616 FullyInvalidatePaint(kPaintInvalidationSelection, old_selection_rect, | 618 FullyInvalidatePaint(PaintInvalidationReason::kSelection, |
| 617 new_selection_rect); | 619 old_selection_rect, new_selection_rect); |
| 618 context_.painting_layer->SetNeedsRepaint(); | 620 context_.painting_layer->SetNeedsRepaint(); |
| 619 object_.InvalidateDisplayItemClients(kPaintInvalidationSelection); | 621 object_.InvalidateDisplayItemClients(PaintInvalidationReason::kSelection); |
| 620 } | 622 } |
| 621 } | 623 } |
| 622 | 624 |
| 623 DISABLE_CFI_PERF | 625 DISABLE_CFI_PERF |
| 624 PaintInvalidationReason | 626 PaintInvalidationReason |
| 625 ObjectPaintInvalidatorWithContext::InvalidatePaintWithComputedReason( | 627 ObjectPaintInvalidatorWithContext::InvalidatePaintWithComputedReason( |
| 626 PaintInvalidationReason reason) { | 628 PaintInvalidationReason reason) { |
| 627 // We need to invalidate the selection before checking for whether we are | 629 // We need to invalidate the selection before checking for whether we are |
| 628 // doing a full invalidation. This is because we need to update the previous | 630 // doing a full invalidation. This is because we need to update the previous |
| 629 // selection rect regardless. | 631 // selection rect regardless. |
| 630 InvalidateSelectionIfNeeded(reason); | 632 InvalidateSelectionIfNeeded(reason); |
| 631 | 633 |
| 632 switch (reason) { | 634 switch (reason) { |
| 633 case kPaintInvalidationNone: | 635 case PaintInvalidationReason::kNone: |
| 634 // There are corner cases that the display items need to be invalidated | 636 // There are corner cases that the display items need to be invalidated |
| 635 // for paint offset mutation, but incurs no pixel difference (i.e. bounds | 637 // for paint offset mutation, but incurs no pixel difference (i.e. bounds |
| 636 // stay the same) so no rect-based invalidation is issued. See | 638 // stay the same) so no rect-based invalidation is issued. See |
| 637 // crbug.com/508383 and crbug.com/515977. | 639 // crbug.com/508383 and crbug.com/515977. |
| 638 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled() && | 640 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled() && |
| 639 (context_.forced_subtree_invalidation_flags & | 641 (context_.forced_subtree_invalidation_flags & |
| 640 PaintInvalidatorContext::kForcedSubtreeInvalidationChecking) && | 642 PaintInvalidatorContext::kForcedSubtreeInvalidationChecking) && |
| 641 !object_.IsSVGChild()) { | 643 !object_.IsSVGChild()) { |
| 642 // For SPv1, we conservatively assume the object changed paint offset | 644 // For SPv1, we conservatively assume the object changed paint offset |
| 643 // except for non-root SVG whose paint offset is always zero. | 645 // except for non-root SVG whose paint offset is always zero. |
| 644 reason = kPaintInvalidationLocationChange; | 646 reason = PaintInvalidationReason::kGeometry; |
| 645 break; | 647 break; |
| 646 } | 648 } |
| 647 | 649 |
| 648 if (object_.IsSVG() && | 650 if (object_.IsSVG() && |
| 649 (context_.forced_subtree_invalidation_flags & | 651 (context_.forced_subtree_invalidation_flags & |
| 650 PaintInvalidatorContext::kForcedSubtreeSVGResourceChange)) { | 652 PaintInvalidatorContext::kForcedSubtreeSVGResourceChange)) { |
| 651 reason = kPaintInvalidationSVGResourceChange; | 653 reason = PaintInvalidationReason::kSVGResource; |
| 652 break; | 654 break; |
| 653 } | 655 } |
| 654 return kPaintInvalidationNone; | 656 return PaintInvalidationReason::kNone; |
| 655 case kPaintInvalidationDelayedFull: | 657 case PaintInvalidationReason::kDelayedFull: |
| 656 return kPaintInvalidationDelayedFull; | 658 return PaintInvalidationReason::kDelayedFull; |
| 657 default: | 659 default: |
| 658 DCHECK(IsImmediateFullPaintInvalidationReason(reason)); | 660 DCHECK(IsImmediateFullPaintInvalidationReason(reason)); |
| 659 // This allows descendants to know the computed reason if it's different | 661 // This allows descendants to know the computed reason if it's different |
| 660 // from the original reason before paint invalidation. | 662 // from the original reason before paint invalidation. |
| 661 object_.GetMutableForPainting() | 663 object_.GetMutableForPainting() |
| 662 .SetShouldDoFullPaintInvalidationWithoutGeometryChange(reason); | 664 .SetShouldDoFullPaintInvalidationWithoutGeometryChange(reason); |
| 663 FullyInvalidatePaint(reason, context_.old_visual_rect, | 665 FullyInvalidatePaint(reason, context_.old_visual_rect, |
| 664 object_.VisualRect()); | 666 object_.VisualRect()); |
| 665 } | 667 } |
| 666 | 668 |
| 667 context_.painting_layer->SetNeedsRepaint(); | 669 context_.painting_layer->SetNeedsRepaint(); |
| 668 object_.InvalidateDisplayItemClients(reason); | 670 object_.InvalidateDisplayItemClients(reason); |
| 669 return reason; | 671 return reason; |
| 670 } | 672 } |
| 671 | 673 |
| 672 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts() | 674 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts() |
| 673 : disabler_(&g_disable_paint_invalidation_state_asserts, true) {} | 675 : disabler_(&g_disable_paint_invalidation_state_asserts, true) {} |
| 674 | 676 |
| 675 } // namespace blink | 677 } // namespace blink |
| OLD | NEW |