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

Side by Side Diff: third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp

Issue 2761673005: Optimize scroll adjustment for paint invalidation
Patch Set: - Created 3 years, 9 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/layout/PaintInvalidationState.h" 5 #include "core/layout/PaintInvalidationState.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/frame/Settings.h" 9 #include "core/frame/Settings.h"
10 #include "core/layout/LayoutInline.h" 10 #include "core/layout/LayoutInline.h"
(...skipping 25 matching lines...) Expand all
36 PaintInvalidationState::PaintInvalidationState( 36 PaintInvalidationState::PaintInvalidationState(
37 const LayoutView& layoutView, 37 const LayoutView& layoutView,
38 Vector<const LayoutObject*>& pendingDelayedPaintInvalidations) 38 Vector<const LayoutObject*>& pendingDelayedPaintInvalidations)
39 : m_currentObject(layoutView), 39 : m_currentObject(layoutView),
40 m_forcedSubtreeInvalidationFlags(0), 40 m_forcedSubtreeInvalidationFlags(0),
41 m_clipped(false), 41 m_clipped(false),
42 m_clippedForAbsolutePosition(false), 42 m_clippedForAbsolutePosition(false),
43 m_cachedOffsetsEnabled(true), 43 m_cachedOffsetsEnabled(true),
44 m_cachedOffsetsForAbsolutePositionEnabled(true), 44 m_cachedOffsetsForAbsolutePositionEnabled(true),
45 m_paintInvalidationContainer(&layoutView.containerForPaintInvalidation()), 45 m_paintInvalidationContainer(&layoutView.containerForPaintInvalidation()),
46 m_scrollAdjustment(
47 m_paintInvalidationContainer->scrollAdjustmentForPaintInvalidation()),
46 m_paintInvalidationContainerForStackedContents( 48 m_paintInvalidationContainerForStackedContents(
47 m_paintInvalidationContainer), 49 m_paintInvalidationContainer),
48 m_containerForAbsolutePosition(layoutView), 50 m_containerForAbsolutePosition(layoutView),
49 m_pendingDelayedPaintInvalidations(pendingDelayedPaintInvalidations), 51 m_pendingDelayedPaintInvalidations(pendingDelayedPaintInvalidations),
50 m_paintingLayer(*layoutView.layer()) 52 m_paintingLayer(*layoutView.layer())
51 #ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY 53 #ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
52 , 54 ,
53 m_canCheckFastPathSlowPathEquality(layoutView == 55 m_canCheckFastPathSlowPathEquality(layoutView ==
54 m_paintInvalidationContainer) 56 m_paintInvalidationContainer)
55 #endif 57 #endif
(...skipping 22 matching lines...) Expand all
78 m_clippedForAbsolutePosition(parentState.m_clippedForAbsolutePosition), 80 m_clippedForAbsolutePosition(parentState.m_clippedForAbsolutePosition),
79 m_clipRect(parentState.m_clipRect), 81 m_clipRect(parentState.m_clipRect),
80 m_clipRectForAbsolutePosition(parentState.m_clipRectForAbsolutePosition), 82 m_clipRectForAbsolutePosition(parentState.m_clipRectForAbsolutePosition),
81 m_paintOffset(parentState.m_paintOffset), 83 m_paintOffset(parentState.m_paintOffset),
82 m_paintOffsetForAbsolutePosition( 84 m_paintOffsetForAbsolutePosition(
83 parentState.m_paintOffsetForAbsolutePosition), 85 parentState.m_paintOffsetForAbsolutePosition),
84 m_cachedOffsetsEnabled(parentState.m_cachedOffsetsEnabled), 86 m_cachedOffsetsEnabled(parentState.m_cachedOffsetsEnabled),
85 m_cachedOffsetsForAbsolutePositionEnabled( 87 m_cachedOffsetsForAbsolutePositionEnabled(
86 parentState.m_cachedOffsetsForAbsolutePositionEnabled), 88 parentState.m_cachedOffsetsForAbsolutePositionEnabled),
87 m_paintInvalidationContainer(parentState.m_paintInvalidationContainer), 89 m_paintInvalidationContainer(parentState.m_paintInvalidationContainer),
90 m_scrollAdjustment(parentState.m_scrollAdjustment),
88 m_paintInvalidationContainerForStackedContents( 91 m_paintInvalidationContainerForStackedContents(
89 parentState.m_paintInvalidationContainerForStackedContents), 92 parentState.m_paintInvalidationContainerForStackedContents),
90 m_containerForAbsolutePosition( 93 m_containerForAbsolutePosition(
91 currentObject.canContainAbsolutePositionObjects() 94 currentObject.canContainAbsolutePositionObjects()
92 ? currentObject 95 ? currentObject
93 : parentState.m_containerForAbsolutePosition), 96 : parentState.m_containerForAbsolutePosition),
94 m_svgTransform(parentState.m_svgTransform), 97 m_svgTransform(parentState.m_svgTransform),
95 m_pendingDelayedPaintInvalidations( 98 m_pendingDelayedPaintInvalidations(
96 parentState.m_pendingDelayedPaintInvalidations), 99 parentState.m_pendingDelayedPaintInvalidations),
97 m_paintingLayer(parentState.childPaintingLayer(currentObject)) 100 m_paintingLayer(parentState.childPaintingLayer(currentObject))
(...skipping 15 matching lines...) Expand all
113 #if DCHECK_IS_ON() 116 #if DCHECK_IS_ON()
114 m_didUpdateForChildren = parentState.m_didUpdateForChildren; 117 m_didUpdateForChildren = parentState.m_didUpdateForChildren;
115 #endif 118 #endif
116 return; 119 return;
117 } 120 }
118 121
119 #if DCHECK_IS_ON() 122 #if DCHECK_IS_ON()
120 DCHECK(parentState.m_didUpdateForChildren); 123 DCHECK(parentState.m_didUpdateForChildren);
121 #endif 124 #endif
122 125
126 const auto* oldPaintInvalidationContainer = m_paintInvalidationContainer;
123 if (currentObject.isPaintInvalidationContainer()) { 127 if (currentObject.isPaintInvalidationContainer()) {
124 m_paintInvalidationContainer = toLayoutBoxModelObject(&currentObject); 128 m_paintInvalidationContainer = toLayoutBoxModelObject(&currentObject);
125 if (currentObject.styleRef().isStackingContext()) 129 if (currentObject.styleRef().isStackingContext())
126 m_paintInvalidationContainerForStackedContents = 130 m_paintInvalidationContainerForStackedContents =
127 toLayoutBoxModelObject(&currentObject); 131 toLayoutBoxModelObject(&currentObject);
128 } else if (currentObject.isLayoutView()) { 132 } else if (currentObject.isLayoutView()) {
129 // m_paintInvalidationContainerForStackedContents is only for stacked 133 // m_paintInvalidationContainerForStackedContents is only for stacked
130 // descendants in its own frame, because it doesn't establish stacking 134 // descendants in its own frame, because it doesn't establish stacking
131 // context for stacked contents in sub-frames. Contents stacked in the root 135 // context for stacked contents in sub-frames. Contents stacked in the root
132 // stacking context in this frame should use this frame's 136 // stacking context in this frame should use this frame's
(...skipping 27 matching lines...) Expand all
160 // path and enable fast path for descendants if possible; or 164 // path and enable fast path for descendants if possible; or
161 // - Track offset between the two paintInvalidationContainers. 165 // - Track offset between the two paintInvalidationContainers.
162 m_cachedOffsetsEnabled = false; 166 m_cachedOffsetsEnabled = false;
163 if (m_forcedSubtreeInvalidationFlags & 167 if (m_forcedSubtreeInvalidationFlags &
164 PaintInvalidatorContext:: 168 PaintInvalidatorContext::
165 ForcedSubtreeFullInvalidationForStackedContents) 169 ForcedSubtreeFullInvalidationForStackedContents)
166 m_forcedSubtreeInvalidationFlags |= 170 m_forcedSubtreeInvalidationFlags |=
167 PaintInvalidatorContext::ForcedSubtreeFullInvalidation; 171 PaintInvalidatorContext::ForcedSubtreeFullInvalidation;
168 } 172 }
169 173
174 if (m_paintInvalidationContainer != oldPaintInvalidationContainer) {
175 m_scrollAdjustment =
176 m_paintInvalidationContainer->scrollAdjustmentForPaintInvalidation();
177 } else {
178 DCHECK(
179 m_scrollAdjustment ==
180 m_paintInvalidationContainer->scrollAdjustmentForPaintInvalidation());
181 }
182
170 if (!currentObject.isBoxModelObject() && !currentObject.isSVG()) 183 if (!currentObject.isBoxModelObject() && !currentObject.isSVG())
171 return; 184 return;
172 185
173 if (m_cachedOffsetsEnabled || currentObject == m_paintInvalidationContainer) 186 if (m_cachedOffsetsEnabled || currentObject == m_paintInvalidationContainer)
174 m_cachedOffsetsEnabled = supportsCachedOffsets(currentObject); 187 m_cachedOffsetsEnabled = supportsCachedOffsets(currentObject);
175 188
176 if (currentObject.isSVG()) { 189 if (currentObject.isSVG()) {
177 if (currentObject.isSVGRoot()) { 190 if (currentObject.isSVGRoot()) {
178 m_svgTransform = 191 m_svgTransform =
179 toLayoutSVGRoot(currentObject).localToBorderBoxTransform(); 192 toLayoutSVGRoot(currentObject).localToBorderBoxTransform();
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 point += FloatPoint(m_paintOffset); 448 point += FloatPoint(m_paintOffset);
436 #ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY 449 #ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
437 DCHECK(point == 450 DCHECK(point ==
438 slowLocalOriginToAncestorPoint( 451 slowLocalOriginToAncestorPoint(
439 m_currentObject, m_paintInvalidationContainer, FloatPoint())); 452 m_currentObject, m_paintInvalidationContainer, FloatPoint()));
440 #endif 453 #endif
441 } else { 454 } else {
442 point = slowLocalToAncestorPoint( 455 point = slowLocalToAncestorPoint(
443 m_currentObject, *m_paintInvalidationContainer, FloatPoint()); 456 m_currentObject, *m_paintInvalidationContainer, FloatPoint());
444 } 457 }
458
459 point.move(m_scrollAdjustment);
445 } 460 }
446 461
447 PaintLayer::mapPointInPaintInvalidationContainerToBacking( 462 PaintLayer::mapPointInPaintInvalidationContainerToBacking(
448 *m_paintInvalidationContainer, point); 463 *m_paintInvalidationContainer, point);
449 464
450 point.move(m_currentObject.scrollAdjustmentForPaintInvalidation(
451 *m_paintInvalidationContainer));
452
453 return LayoutPoint(point); 465 return LayoutPoint(point);
454 } 466 }
455 467
456 LayoutRect PaintInvalidationState::computeVisualRectInBacking() const { 468 LayoutRect PaintInvalidationState::computeVisualRectInBacking() const {
457 #if DCHECK_IS_ON() 469 #if DCHECK_IS_ON()
458 DCHECK(!m_didUpdateForChildren); 470 DCHECK(!m_didUpdateForChildren);
459 #endif 471 #endif
460 472
461 if (m_currentObject.isSVGChild()) 473 if (m_currentObject.isSVGChild())
462 return computeVisualRectInBackingForSVG(); 474 return computeVisualRectInBackingForSVG();
(...skipping 23 matching lines...) Expand all
486 // and slow path (for things above the SVGRoot). 498 // and slow path (for things above the SVGRoot).
487 rect = SVGLayoutSupport::visualRectInAncestorSpace( 499 rect = SVGLayoutSupport::visualRectInAncestorSpace(
488 m_currentObject, *m_paintInvalidationContainer); 500 m_currentObject, *m_paintInvalidationContainer);
489 } 501 }
490 502
491 PaintLayer::mapRectInPaintInvalidationContainerToBacking( 503 PaintLayer::mapRectInPaintInvalidationContainerToBacking(
492 *m_paintInvalidationContainer, rect); 504 *m_paintInvalidationContainer, rect);
493 505
494 m_currentObject.adjustVisualRectForRasterEffects(rect); 506 m_currentObject.adjustVisualRectForRasterEffects(rect);
495 507
496 rect.move(m_currentObject.scrollAdjustmentForPaintInvalidation( 508 if (m_currentObject != m_paintInvalidationContainer)
497 *m_paintInvalidationContainer)); 509 rect.move(m_scrollAdjustment);
498 510
499 return rect; 511 return rect;
500 } 512 }
501 513
502 static void slowMapToVisualRectInAncestorSpace( 514 static void slowMapToVisualRectInAncestorSpace(
503 const LayoutObject& object, 515 const LayoutObject& object,
504 const LayoutBoxModelObject& ancestor, 516 const LayoutBoxModelObject& ancestor,
505 LayoutRect& rect) { 517 LayoutRect& rect) {
506 // TODO(wkorman): The flip below is required because visual rects are 518 // TODO(wkorman): The flip below is required because visual rects are
507 // currently in "physical coordinates with flipped block-flow direction" 519 // currently in "physical coordinates with flipped block-flow direction"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 556
545 void PaintInvalidationState::mapLocalRectToVisualRectInBacking( 557 void PaintInvalidationState::mapLocalRectToVisualRectInBacking(
546 LayoutRect& rect) const { 558 LayoutRect& rect) const {
547 mapLocalRectToPaintInvalidationContainer(rect); 559 mapLocalRectToPaintInvalidationContainer(rect);
548 560
549 PaintLayer::mapRectInPaintInvalidationContainerToBacking( 561 PaintLayer::mapRectInPaintInvalidationContainerToBacking(
550 *m_paintInvalidationContainer, rect); 562 *m_paintInvalidationContainer, rect);
551 563
552 m_currentObject.adjustVisualRectForRasterEffects(rect); 564 m_currentObject.adjustVisualRectForRasterEffects(rect);
553 565
554 rect.move(m_currentObject.scrollAdjustmentForPaintInvalidation( 566 if (m_currentObject != m_paintInvalidationContainer)
555 *m_paintInvalidationContainer)); 567 rect.move(m_scrollAdjustment);
556 } 568 }
557 569
558 void PaintInvalidationState::addClipRectRelativeToPaintOffset( 570 void PaintInvalidationState::addClipRectRelativeToPaintOffset(
559 const LayoutRect& localClipRect) { 571 const LayoutRect& localClipRect) {
560 LayoutRect clipRect = localClipRect; 572 LayoutRect clipRect = localClipRect;
561 clipRect.move(m_paintOffset); 573 clipRect.move(m_paintOffset);
562 if (m_clipped) { 574 if (m_clipped) {
563 m_clipRect.intersect(clipRect); 575 m_clipRect.intersect(clipRect);
564 } else { 576 } else {
565 m_clipRect = clipRect; 577 m_clipRect = clipRect;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 } 658 }
647 659
648 void PaintInvalidatorContextAdapter::mapLocalRectToVisualRectInBacking( 660 void PaintInvalidatorContextAdapter::mapLocalRectToVisualRectInBacking(
649 const LayoutObject& object, 661 const LayoutObject& object,
650 LayoutRect& rect) const { 662 LayoutRect& rect) const {
651 DCHECK(&object == &m_paintInvalidationState.currentObject()); 663 DCHECK(&object == &m_paintInvalidationState.currentObject());
652 m_paintInvalidationState.mapLocalRectToVisualRectInBacking(rect); 664 m_paintInvalidationState.mapLocalRectToVisualRectInBacking(rect);
653 } 665 }
654 666
655 } // namespace blink 667 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698