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

Side by Side Diff: Source/core/layout/LayoutObject.cpp

Issue 1302993003: Cleanup bitfield accessors for slimming paint v2 (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: clear ChildShouldCheckForPaintInvalidation Created 5 years, 4 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2000 Dirk Mueller (mueller@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2009 Google Inc. All rights reserved. 7 * Copyright (C) 2009 Google Inc. All rights reserved.
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 if (LayoutFlowThread* flowThread = layoutState->flowThread()) 668 if (LayoutFlowThread* flowThread = layoutState->flowThread())
669 return flowThread; 669 return flowThread;
670 } 670 }
671 671
672 // Not in the middle of layout so have to find the thread the slow way. 672 // Not in the middle of layout so have to find the thread the slow way.
673 return LayoutFlowThread::locateFlowThreadContainingBlockOf(*this); 673 return LayoutFlowThread::locateFlowThreadContainingBlockOf(*this);
674 } 674 }
675 675
676 bool LayoutObject::skipInvalidationWhenLaidOutChildren() const 676 bool LayoutObject::skipInvalidationWhenLaidOutChildren() const
677 { 677 {
678 if (!neededLayoutBecauseOfChildren()) 678 if (!m_bitfields.neededLayoutBecauseOfChildren())
679 return false; 679 return false;
680 680
681 // SVG layoutObjects need to be invalidated when their children are laid out . 681 // SVG layoutObjects need to be invalidated when their children are laid out .
682 // LayoutBlocks with line boxes are responsible to invalidate them so we can 't ignore them. 682 // LayoutBlocks with line boxes are responsible to invalidate them so we can 't ignore them.
683 if (isSVG() || (isLayoutBlockFlow() && toLayoutBlockFlow(this)->firstLineBox ())) 683 if (isSVG() || (isLayoutBlockFlow() && toLayoutBlockFlow(this)->firstLineBox ()))
684 return false; 684 return false;
685 685
686 // In case scrollbars got repositioned (which will typically happen if the l ayout object got 686 // In case scrollbars got repositioned (which will typically happen if the l ayout object got
687 // resized), we cannot skip invalidation. 687 // resized), we cannot skip invalidation.
688 if (hasNonCompositedScrollbars()) 688 if (hasNonCompositedScrollbars())
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 return; 749 return;
750 if (!last->isTextOrSVGChild() && last->style()->hasOutOfFlowPosition()) { 750 if (!last->isTextOrSVGChild() && last->style()->hasOutOfFlowPosition()) {
751 bool willSkipRelativelyPositionedInlines = !object->isLayoutBlock() || object->isAnonymousBlock(); 751 bool willSkipRelativelyPositionedInlines = !object->isLayoutBlock() || object->isAnonymousBlock();
752 // Skip relatively positioned inlines and anonymous blocks to get to the enclosing LayoutBlock. 752 // Skip relatively positioned inlines and anonymous blocks to get to the enclosing LayoutBlock.
753 while (object && (!object->isLayoutBlock() || object->isAnonymousBlo ck())) 753 while (object && (!object->isLayoutBlock() || object->isAnonymousBlo ck()))
754 object = object->container(); 754 object = object->container();
755 if (!object || object->posChildNeedsLayout()) 755 if (!object || object->posChildNeedsLayout())
756 return; 756 return;
757 if (willSkipRelativelyPositionedInlines) 757 if (willSkipRelativelyPositionedInlines)
758 container = object->container(); 758 container = object->container();
759 object->setPosChildNeedsLayout(true); 759 object->m_bitfields.setPosChildNeedsLayout(true);
760 simplifiedNormalFlowLayout = true; 760 simplifiedNormalFlowLayout = true;
761 ASSERT(!object->isSetNeedsLayoutForbidden()); 761 ASSERT(!object->isSetNeedsLayoutForbidden());
762 } else if (simplifiedNormalFlowLayout) { 762 } else if (simplifiedNormalFlowLayout) {
763 if (object->needsSimplifiedNormalFlowLayout()) 763 if (object->needsSimplifiedNormalFlowLayout())
764 return; 764 return;
765 object->setNeedsSimplifiedNormalFlowLayout(true); 765 object->m_bitfields.setNeedsSimplifiedNormalFlowLayout(true);
766 ASSERT(!object->isSetNeedsLayoutForbidden()); 766 ASSERT(!object->isSetNeedsLayoutForbidden());
767 } else { 767 } else {
768 if (object->normalChildNeedsLayout()) 768 if (object->normalChildNeedsLayout())
769 return; 769 return;
770 object->setNormalChildNeedsLayout(true); 770 object->m_bitfields.setNormalChildNeedsLayout(true);
771 ASSERT(!object->isSetNeedsLayoutForbidden()); 771 ASSERT(!object->isSetNeedsLayoutForbidden());
772 } 772 }
773 773
774 if (layouter) { 774 if (layouter) {
775 layouter->recordObjectMarkedForLayout(object); 775 layouter->recordObjectMarkedForLayout(object);
776 if (object == layouter->root()) 776 if (object == layouter->root())
777 return; 777 return;
778 } 778 }
779 779
780 last = object; 780 last = object;
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 return; 1341 return;
1342 selectionPaintInvalidationMap = new SelectionPaintInvalidationMap(); 1342 selectionPaintInvalidationMap = new SelectionPaintInvalidationMap();
1343 } 1343 }
1344 1344
1345 if (selectionRect.isEmpty()) 1345 if (selectionRect.isEmpty())
1346 selectionPaintInvalidationMap->remove(this); 1346 selectionPaintInvalidationMap->remove(this);
1347 else 1347 else
1348 selectionPaintInvalidationMap->set(this, selectionRect); 1348 selectionPaintInvalidationMap->set(this, selectionRect);
1349 } 1349 }
1350 1350
1351 // TODO: Remove this for slimming paint v2 because we don't care about paint inv alidation rects.
1351 inline void LayoutObject::invalidateSelectionIfNeeded(const LayoutBoxModelObject & paintInvalidationContainer, PaintInvalidationReason invalidationReason) 1352 inline void LayoutObject::invalidateSelectionIfNeeded(const LayoutBoxModelObject & paintInvalidationContainer, PaintInvalidationReason invalidationReason)
1352 { 1353 {
1353 // Update selection rect when we are doing full invalidation (in case that t he object is moved, composite status changed, etc.) 1354 // Update selection rect when we are doing full invalidation (in case that t he object is moved, composite status changed, etc.)
1354 // or shouldInvalidationSelection is set (in case that the selection itself changed). 1355 // or shouldInvalidationSelection is set (in case that the selection itself changed).
1355 bool fullInvalidation = view()->doingFullPaintInvalidation() || isFullPaintI nvalidationReason(invalidationReason); 1356 bool fullInvalidation = view()->doingFullPaintInvalidation() || isFullPaintI nvalidationReason(invalidationReason);
1356 if (!fullInvalidation && !shouldInvalidateSelection()) 1357 if (!fullInvalidation && !shouldInvalidateSelection())
1357 return; 1358 return;
1358 1359
1359 LayoutRect oldSelectionRect = previousSelectionRectForPaintInvalidation(); 1360 LayoutRect oldSelectionRect = previousSelectionRectForPaintInvalidation();
1360 LayoutRect newSelectionRect = selectionRectForPaintInvalidation(&paintInvali dationContainer); 1361 LayoutRect newSelectionRect = selectionRectForPaintInvalidation(&paintInvali dationContainer);
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
1821 // TODO(rune@opera.com): We should use the diff to determine whether a r epaint vs. layout 1822 // TODO(rune@opera.com): We should use the diff to determine whether a r epaint vs. layout
1822 // is needed, but for now just assume a layout will be required. The dif f code 1823 // is needed, but for now just assume a layout will be required. The dif f code
1823 // in LayoutObject::setStyle would need to be factored out so that it co uld be reused. 1824 // in LayoutObject::setStyle would need to be factored out so that it co uld be reused.
1824 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalida tionReason::StyleChange); 1825 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalida tionReason::StyleChange);
1825 } 1826 }
1826 } 1827 }
1827 1828
1828 void LayoutObject::markContainingBlocksForOverflowRecalc() 1829 void LayoutObject::markContainingBlocksForOverflowRecalc()
1829 { 1830 {
1830 for (LayoutBlock* container = containingBlock(); container && !container->ch ildNeedsOverflowRecalcAfterStyleChange(); container = container->containingBlock ()) 1831 for (LayoutBlock* container = containingBlock(); container && !container->ch ildNeedsOverflowRecalcAfterStyleChange(); container = container->containingBlock ())
1831 container->setChildNeedsOverflowRecalcAfterStyleChange(true); 1832 container->m_bitfields.setChildNeedsOverflowRecalcAfterStyleChange(true) ;
1832 } 1833 }
1833 1834
1834 void LayoutObject::setNeedsOverflowRecalcAfterStyleChange() 1835 void LayoutObject::setNeedsOverflowRecalcAfterStyleChange()
1835 { 1836 {
1836 bool neededRecalc = needsOverflowRecalcAfterStyleChange(); 1837 bool neededRecalc = needsOverflowRecalcAfterStyleChange();
1837 setSelfNeedsOverflowRecalcAfterStyleChange(true); 1838 m_bitfields.setSelfNeedsOverflowRecalcAfterStyleChange(true);
1838 if (!neededRecalc) 1839 if (!neededRecalc)
1839 markContainingBlocksForOverflowRecalc(); 1840 markContainingBlocksForOverflowRecalc();
1840 } 1841 }
1841 1842
1842 void LayoutObject::setStyle(PassRefPtr<ComputedStyle> style) 1843 void LayoutObject::setStyle(PassRefPtr<ComputedStyle> style)
1843 { 1844 {
1844 ASSERT(style); 1845 ASSERT(style);
1845 1846
1846 if (m_style == style) { 1847 if (m_style == style) {
1847 // We need to run through adjustStyleDifference() for iframes, plugins, and canvas so 1848 // We need to run through adjustStyleDifference() for iframes, plugins, and canvas so
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after
2661 } 2662 }
2662 2663
2663 PositionWithAffinity LayoutObject::positionForPoint(const LayoutPoint&) 2664 PositionWithAffinity LayoutObject::positionForPoint(const LayoutPoint&)
2664 { 2665 {
2665 return createPositionWithAffinity(caretMinOffset()); 2666 return createPositionWithAffinity(caretMinOffset());
2666 } 2667 }
2667 2668
2668 void LayoutObject::updateDragState(bool dragOn) 2669 void LayoutObject::updateDragState(bool dragOn)
2669 { 2670 {
2670 bool valueChanged = (dragOn != isDragging()); 2671 bool valueChanged = (dragOn != isDragging());
2671 setIsDragging(dragOn); 2672 m_bitfields.setIsDragging(dragOn);
2672 if (valueChanged && node()) { 2673 if (valueChanged && node()) {
2673 if (node()->isElementNode() && toElement(node())->childrenOrSiblingsAffe ctedByDrag()) 2674 if (node()->isElementNode() && toElement(node())->childrenOrSiblingsAffe ctedByDrag())
2674 node()->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonFor Tracing::create(StyleChangeReason::Drag)); 2675 node()->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonFor Tracing::create(StyleChangeReason::Drag));
2675 else if (style()->affectedByDrag()) 2676 else if (style()->affectedByDrag())
2676 node()->setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTr acing::create(StyleChangeReason::Drag)); 2677 node()->setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTr acing::create(StyleChangeReason::Drag));
2677 } 2678 }
2678 for (LayoutObject* curr = slowFirstChild(); curr; curr = curr->nextSibling() ) 2679 for (LayoutObject* curr = slowFirstChild(); curr; curr = curr->nextSibling() )
2679 curr->updateDragState(dragOn); 2680 curr->updateDragState(dragOn);
2680 } 2681 }
2681 2682
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2746 if (LayoutView* layoutView = view()) { 2747 if (LayoutView* layoutView = view()) {
2747 if (FrameView* frameView = layoutView->frameView()) 2748 if (FrameView* frameView = layoutView->frameView())
2748 frameView->scheduleRelayoutOfSubtree(this); 2749 frameView->scheduleRelayoutOfSubtree(this);
2749 } 2750 }
2750 } 2751 }
2751 } 2752 }
2752 } 2753 }
2753 2754
2754 void LayoutObject::forceLayout() 2755 void LayoutObject::forceLayout()
2755 { 2756 {
2756 setSelfNeedsLayout(true); 2757 m_bitfields.setSelfNeedsLayout(true);
2757 setShouldDoFullPaintInvalidation(); 2758 setShouldDoFullPaintInvalidation();
2758 layout(); 2759 layout();
2759 } 2760 }
2760 2761
2761 // FIXME: Does this do anything different than forceLayout given that we don't w alk 2762 // FIXME: Does this do anything different than forceLayout given that we don't w alk
2762 // the containing block chain. If not, we should change all callers to use force Layout. 2763 // the containing block chain. If not, we should change all callers to use force Layout.
2763 void LayoutObject::forceChildLayout() 2764 void LayoutObject::forceChildLayout()
2764 { 2765 {
2765 setNormalChildNeedsLayout(true); 2766 m_bitfields.setNormalChildNeedsLayout(true);
2766 layout(); 2767 layout();
2767 } 2768 }
2768 2769
2769 enum StyleCacheState { 2770 enum StyleCacheState {
2770 Cached, 2771 Cached,
2771 Uncached 2772 Uncached
2772 }; 2773 };
2773 2774
2774 static PassRefPtr<ComputedStyle> firstLineStyleForCachedUncachedType(StyleCacheS tate type, const LayoutObject* layoutObject, ComputedStyle* style) 2775 static PassRefPtr<ComputedStyle> firstLineStyleForCachedUncachedType(StyleCacheS tate type, const LayoutObject* layoutObject, ComputedStyle* style)
2775 { 2776 {
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
3193 case DocumentLifecycle::InCompositingUpdate: 3194 case DocumentLifecycle::InCompositingUpdate:
3194 return PaintInvalidationCompositingUpdate; 3195 return PaintInvalidationCompositingUpdate;
3195 default: 3196 default:
3196 return PaintInvalidationFull; 3197 return PaintInvalidationFull;
3197 } 3198 }
3198 } 3199 }
3199 3200
3200 inline void LayoutObject::markContainerChainForPaintInvalidation() 3201 inline void LayoutObject::markContainerChainForPaintInvalidation()
3201 { 3202 {
3202 for (LayoutObject* container = this->containerCrossingFrameBoundaries(); con tainer && !container->shouldCheckForPaintInvalidationRegardlessOfPaintInvalidati onState(); container = container->containerCrossingFrameBoundaries()) 3203 for (LayoutObject* container = this->containerCrossingFrameBoundaries(); con tainer && !container->shouldCheckForPaintInvalidationRegardlessOfPaintInvalidati onState(); container = container->containerCrossingFrameBoundaries())
3203 container->setSelfMayNeedPaintInvalidation(); 3204 container->m_bitfields.setChildShouldCheckForPaintInvalidation(true);
3204 }
3205
3206 void LayoutObject::setLayoutDidGetCalledSinceLastFrame()
3207 {
3208 m_bitfields.setLayoutDidGetCalledSinceLastFrame(true);
3209
3210 // Make sure our parent is marked as needing invalidation.
3211 // This would be unneeded if we allowed sub-tree invalidation (akin to sub-t ree layouts).
3212 markContainerChainForPaintInvalidation();
3213 } 3205 }
3214 3206
3215 void LayoutObject::setShouldInvalidateSelection() 3207 void LayoutObject::setShouldInvalidateSelection()
3216 { 3208 {
3217 if (!canUpdateSelectionOnRootLineBoxes()) 3209 if (!canUpdateSelectionOnRootLineBoxes())
3218 return; 3210 return;
3219 3211
3220 m_bitfields.setShouldInvalidateSelection(true); 3212 m_bitfields.setShouldInvalidateSelection(true);
3221 markContainerChainForPaintInvalidation(); 3213 markContainerChainForPaintInvalidation();
3222 } 3214 }
(...skipping 16 matching lines...) Expand all
3239 frame()->page()->animator().scheduleVisualUpdate(); // In case that this is called outside of FrameView::updateLayoutAndStyleForPainting(). 3231 frame()->page()->animator().scheduleVisualUpdate(); // In case that this is called outside of FrameView::updateLayoutAndStyleForPainting().
3240 markContainerChainForPaintInvalidation(); 3232 markContainerChainForPaintInvalidation();
3241 } 3233 }
3242 } 3234 }
3243 3235
3244 void LayoutObject::setMayNeedPaintInvalidation() 3236 void LayoutObject::setMayNeedPaintInvalidation()
3245 { 3237 {
3246 if (mayNeedPaintInvalidation()) 3238 if (mayNeedPaintInvalidation())
3247 return; 3239 return;
3248 m_bitfields.setMayNeedPaintInvalidation(true); 3240 m_bitfields.setMayNeedPaintInvalidation(true);
3249 // Make sure our parent is marked as needing invalidation.
3250 markContainerChainForPaintInvalidation(); 3241 markContainerChainForPaintInvalidation();
3251 frame()->page()->animator().scheduleVisualUpdate(); // In case that this is called outside of FrameView::updateLayoutAndStyleForPainting(). 3242 frame()->page()->animator().scheduleVisualUpdate(); // In case that this is called outside of FrameView::updateLayoutAndStyleForPainting().
3252 } 3243 }
3253 3244
3254 void LayoutObject::clearMayNeedPaintInvalidation()
3255 {
3256 m_bitfields.setMayNeedPaintInvalidation(false);
3257 }
3258
3259 void LayoutObject::setSelfMayNeedPaintInvalidation()
3260 {
3261 m_bitfields.setMayNeedPaintInvalidation(true);
3262 }
3263
3264 void LayoutObject::clearPaintInvalidationState(const PaintInvalidationState& pai ntInvalidationState) 3245 void LayoutObject::clearPaintInvalidationState(const PaintInvalidationState& pai ntInvalidationState)
3265 { 3246 {
3266 // paintInvalidationStateIsDirty should be kept in sync with the 3247 // paintInvalidationStateIsDirty should be kept in sync with the
3267 // booleans that are cleared below. 3248 // booleans that are cleared below.
3268 ASSERT(paintInvalidationState.ancestorHadPaintInvalidationForLocationChange( ) || paintInvalidationStateIsDirty()); 3249 ASSERT(paintInvalidationState.ancestorHadPaintInvalidationForLocationChange( ) || paintInvalidationStateIsDirty());
3269 clearShouldDoFullPaintInvalidation(); 3250 clearShouldDoFullPaintInvalidation();
3270 setNeededLayoutBecauseOfChildren(false); 3251 m_bitfields.setChildShouldCheckForPaintInvalidation(false);
3271 setShouldInvalidateOverflowForPaint(false); 3252 m_bitfields.setNeededLayoutBecauseOfChildren(false);
3272 clearLayoutDidGetCalledSinceLastFrame(); 3253 m_bitfields.setShouldInvalidateOverflowForPaint(false);
3273 clearMayNeedPaintInvalidation(); 3254 m_bitfields.setMayNeedPaintInvalidation(false);
3274 clearShouldInvalidateSelection(); 3255 m_bitfields.setShouldInvalidateSelection(false);
3275 } 3256 }
3276 3257
3277 bool LayoutObject::isAllowedToModifyLayoutTreeStructure(Document& document) 3258 bool LayoutObject::isAllowedToModifyLayoutTreeStructure(Document& document)
3278 { 3259 {
3279 return DeprecatedDisableModifyLayoutTreeStructureAsserts::canModifyLayoutTre eStateInAnyState() 3260 return DeprecatedDisableModifyLayoutTreeStructureAsserts::canModifyLayoutTre eStateInAnyState()
3280 || document.lifecycle().stateAllowsLayoutTreeMutations(); 3261 || document.lifecycle().stateAllowsLayoutTreeMutations();
3281 } 3262 }
3282 3263
3283 DeprecatedDisableModifyLayoutTreeStructureAsserts::DeprecatedDisableModifyLayout TreeStructureAsserts() 3264 DeprecatedDisableModifyLayoutTreeStructureAsserts::DeprecatedDisableModifyLayout TreeStructureAsserts()
3284 : m_disabler(gModifyLayoutTreeStructureAnyState, true) 3265 : m_disabler(gModifyLayoutTreeStructureAnyState, true)
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
3470 const blink::LayoutObject* root = object1; 3451 const blink::LayoutObject* root = object1;
3471 while (root->parent()) 3452 while (root->parent())
3472 root = root->parent(); 3453 root = root->parent();
3473 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); 3454 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0);
3474 } else { 3455 } else {
3475 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); 3456 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n");
3476 } 3457 }
3477 } 3458 }
3478 3459
3479 #endif 3460 #endif
OLDNEW
« Source/core/layout/LayoutObject.h ('K') | « Source/core/layout/LayoutObject.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698