Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 1303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1314 | 1314 |
| 1315 // If we didn't need paint invalidation then our children don't need as well . | 1315 // If we didn't need paint invalidation then our children don't need as well . |
| 1316 // Skip walking down the tree as everything should be fine below us. | 1316 // Skip walking down the tree as everything should be fine below us. |
| 1317 if (!shouldCheckForPaintInvalidation(paintInvalidationState)) | 1317 if (!shouldCheckForPaintInvalidation(paintInvalidationState)) |
| 1318 return; | 1318 return; |
| 1319 | 1319 |
| 1320 PaintInvalidationState newPaintInvalidationState(paintInvalidationState, *th is); | 1320 PaintInvalidationState newPaintInvalidationState(paintInvalidationState, *th is); |
| 1321 PaintInvalidationReason reason = invalidatePaintIfNeeded(newPaintInvalidatio nState); | 1321 PaintInvalidationReason reason = invalidatePaintIfNeeded(newPaintInvalidatio nState); |
| 1322 clearPaintInvalidationFlags(newPaintInvalidationState); | 1322 clearPaintInvalidationFlags(newPaintInvalidationState); |
| 1323 | 1323 |
| 1324 if (reason == PaintInvalidationDelayedFull) | 1324 newPaintInvalidationState.updateForChildren(reason); |
| 1325 newPaintInvalidationState.pushDelayedPaintInvalidationTarget(*this); | |
| 1326 | |
| 1327 newPaintInvalidationState.updateForChildren(); | |
| 1328 invalidatePaintOfSubtreesIfNeeded(newPaintInvalidationState); | 1325 invalidatePaintOfSubtreesIfNeeded(newPaintInvalidationState); |
| 1329 } | 1326 } |
| 1330 | 1327 |
| 1331 void LayoutObject::invalidatePaintOfSubtreesIfNeeded(const PaintInvalidationStat e& childPaintInvalidationState) | 1328 void LayoutObject::invalidatePaintOfSubtreesIfNeeded(const PaintInvalidationStat e& childPaintInvalidationState) |
| 1332 { | 1329 { |
| 1333 for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibli ng()) | 1330 for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibli ng()) |
| 1334 child->invalidateTreeIfNeeded(childPaintInvalidationState); | 1331 child->invalidateTreeIfNeeded(childPaintInvalidationState); |
| 1335 } | 1332 } |
| 1336 | 1333 |
| 1337 static PassOwnPtr<TracedValue> jsonObjectForOldAndNewRects(const LayoutRect& old Rect, const LayoutPoint& oldLocation, const LayoutRect& newRect, const LayoutPoi nt& newLocation) | 1334 static PassOwnPtr<TracedValue> jsonObjectForOldAndNewRects(const LayoutRect& old Rect, const LayoutPoint& oldLocation, const LayoutRect& newRect, const LayoutPoi nt& newLocation) |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1432 if (paintInvalidationContainer.usesCompositedScrolling() && &paintInvalidati onContainer != this) { | 1429 if (paintInvalidationContainer.usesCompositedScrolling() && &paintInvalidati onContainer != this) { |
| 1433 LayoutSize inverseOffset(toLayoutBox(&paintInvalidationContainer)->scrol ledContentOffset()); | 1430 LayoutSize inverseOffset(toLayoutBox(&paintInvalidationContainer)->scrol ledContentOffset()); |
| 1434 newLocation.move(inverseOffset); | 1431 newLocation.move(inverseOffset); |
| 1435 newBounds.move(inverseOffset); | 1432 newBounds.move(inverseOffset); |
| 1436 } | 1433 } |
| 1437 | 1434 |
| 1438 setPreviousPaintInvalidationRect(newBounds); | 1435 setPreviousPaintInvalidationRect(newBounds); |
| 1439 if (!RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled()) | 1436 if (!RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled()) |
| 1440 setPreviousPositionFromPaintInvalidationBacking(newLocation); | 1437 setPreviousPositionFromPaintInvalidationBacking(newLocation); |
| 1441 | 1438 |
| 1442 if (!shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState() && !paintInvalidationState.forcedSubtreeInvalidationWithinContainer()) { | 1439 if (!shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState() && paintInvalidationState.forcedSubtreeInvalidationRectUpdateWithinContainerOnly()) |
|
chrishtr
2016/05/09 22:20:41
I'm trying to understand what the old and new vers
Xianzhu
2016/05/10 17:17:12
The previous condition was an implicit check for f
| |
| 1443 ASSERT(paintInvalidationState.forcedSubtreeInvalidationRectUpdateWithinC ontainer()); | |
| 1444 return PaintInvalidationNone; | 1440 return PaintInvalidationNone; |
| 1445 } | |
| 1446 | 1441 |
| 1447 PaintInvalidationReason invalidationReason = getPaintInvalidationReason(pain tInvalidationContainer, oldBounds, oldLocation, newBounds, newLocation); | 1442 PaintInvalidationReason invalidationReason = getPaintInvalidationReason(pain tInvalidationState, oldBounds, oldLocation, newBounds, newLocation); |
| 1448 | 1443 |
| 1449 // We need to invalidate the selection before checking for whether we are do ing a full invalidation. | 1444 // We need to invalidate the selection before checking for whether we are do ing a full invalidation. |
| 1450 // This is because we need to update the old rect regardless. | 1445 // This is because we need to update the old rect regardless. |
| 1451 invalidateSelectionIfNeeded(paintInvalidationContainer, paintInvalidationSta te, invalidationReason); | 1446 invalidateSelectionIfNeeded(paintInvalidationContainer, paintInvalidationSta te, invalidationReason); |
| 1452 | 1447 |
| 1453 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"), "LayoutObject: :invalidatePaintIfNeeded()", | 1448 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"), "LayoutObject: :invalidatePaintIfNeeded()", |
| 1454 "object", this->debugName().ascii(), | 1449 "object", this->debugName().ascii(), |
| 1455 "info", jsonObjectForOldAndNewRects(oldBounds, oldLocation, newBounds, n ewLocation)); | 1450 "info", jsonObjectForOldAndNewRects(oldBounds, oldLocation, newBounds, n ewLocation)); |
| 1456 | 1451 |
| 1457 bool boxDecorationBackgroundObscured = boxDecorationBackgroundIsKnownToBeObs cured(); | 1452 bool boxDecorationBackgroundObscured = boxDecorationBackgroundIsKnownToBeObs cured(); |
| 1458 if (!isFullPaintInvalidationReason(invalidationReason) && boxDecorationBackg roundObscured != m_bitfields.lastBoxDecorationBackgroundObscured()) | 1453 if (!isFullPaintInvalidationReason(invalidationReason) && boxDecorationBackg roundObscured != m_bitfields.lastBoxDecorationBackgroundObscured()) |
| 1459 invalidationReason = PaintInvalidationBackgroundObscurationChange; | 1454 invalidationReason = PaintInvalidationBackgroundObscurationChange; |
| 1460 m_bitfields.setLastBoxDecorationBackgroundObscured(boxDecorationBackgroundOb scured); | 1455 m_bitfields.setLastBoxDecorationBackgroundObscured(boxDecorationBackgroundOb scured); |
| 1461 | 1456 |
| 1462 if (invalidationReason == PaintInvalidationNone) { | 1457 if (invalidationReason == PaintInvalidationNone) { |
| 1463 // TODO(trchen): Currently we don't keep track of paint offset of layout objects. | 1458 // TODO(trchen): Currently we don't keep track of paint offset of layout objects. |
| 1464 // There are corner cases that the display items need to be invalidated for paint offset | 1459 // There are corner cases that the display items need to be invalidated for paint offset |
| 1465 // mutation, but incurs no pixel difference (i.e. bounds stay the same) so no rect-based | 1460 // mutation, but incurs no pixel difference (i.e. bounds stay the same) so no rect-based |
| 1466 // invalidation is issued. See crbug.com/508383 and crbug.com/515977. | 1461 // invalidation is issued. See crbug.com/508383 and crbug.com/515977. |
| 1467 // This is a workaround to force display items to update paint offset. | 1462 // This is a workaround to force display items to update paint offset. |
| 1468 if (!RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() && paint InvalidationState.forcedSubtreeInvalidationWithinContainer()) | 1463 if (!RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() && paint InvalidationState.forcedSubtreeInvalidationCheckingWithinContainer()) |
| 1469 invalidateDisplayItemClientsWithPaintInvalidationState(paintInvalida tionContainer, paintInvalidationState, invalidationReason); | 1464 invalidateDisplayItemClientsWithPaintInvalidationState(paintInvalida tionContainer, paintInvalidationState, invalidationReason); |
| 1470 | 1465 |
| 1471 return invalidationReason; | 1466 return invalidationReason; |
| 1472 } | 1467 } |
| 1473 | 1468 |
| 1474 if (invalidationReason == PaintInvalidationIncremental) | 1469 if (invalidationReason == PaintInvalidationIncremental) |
| 1475 incrementallyInvalidatePaint(paintInvalidationContainer, oldBounds, newB ounds, newLocation); | 1470 incrementallyInvalidatePaint(paintInvalidationContainer, oldBounds, newB ounds, newLocation); |
| 1476 else | 1471 else |
| 1477 fullyInvalidatePaint(paintInvalidationContainer, invalidationReason, old Bounds, newBounds); | 1472 fullyInvalidatePaint(paintInvalidationContainer, invalidationReason, old Bounds, newBounds); |
| 1478 | 1473 |
| 1479 invalidateDisplayItemClientsWithPaintInvalidationState(paintInvalidationCont ainer, paintInvalidationState, invalidationReason); | 1474 invalidateDisplayItemClientsWithPaintInvalidationState(paintInvalidationCont ainer, paintInvalidationState, invalidationReason); |
| 1480 return invalidationReason; | 1475 return invalidationReason; |
| 1481 } | 1476 } |
| 1482 | 1477 |
| 1483 PaintInvalidationReason LayoutObject::getPaintInvalidationReason(const LayoutBox ModelObject& paintInvalidationContainer, | 1478 PaintInvalidationReason LayoutObject::getPaintInvalidationReason(const PaintInva lidationState& paintInvalidationState, |
| 1484 const LayoutRect& oldBounds, const LayoutPoint& oldPositionFromPaintInvalida tionBacking, | 1479 const LayoutRect& oldBounds, const LayoutPoint& oldPositionFromPaintInvalida tionBacking, |
| 1485 const LayoutRect& newBounds, const LayoutPoint& newPositionFromPaintInvalida tionBacking) const | 1480 const LayoutRect& newBounds, const LayoutPoint& newPositionFromPaintInvalida tionBacking) const |
| 1486 { | 1481 { |
| 1482 if (paintInvalidationState.forcedSubtreeFullInvalidationWithinContainer()) | |
| 1483 return PaintInvalidationSubtree; | |
| 1484 | |
| 1487 if (shouldDoFullPaintInvalidation()) | 1485 if (shouldDoFullPaintInvalidation()) |
| 1488 return m_bitfields.fullPaintInvalidationReason(); | 1486 return m_bitfields.fullPaintInvalidationReason(); |
| 1489 | 1487 |
| 1490 // The outline may change shape because of position change of descendants. F or simplicity, | 1488 // The outline may change shape because of position change of descendants. F or simplicity, |
| 1491 // just force full paint invalidation if this object is marked for checking paint invalidation | 1489 // just force full paint invalidation if this object is marked for checking paint invalidation |
| 1492 // for any reason. | 1490 // for any reason. |
| 1493 if (styleRef().hasOutline()) | 1491 if (styleRef().hasOutline()) |
| 1494 return PaintInvalidationOutline; | 1492 return PaintInvalidationOutline; |
| 1495 | 1493 |
| 1496 bool locationChanged = newPositionFromPaintInvalidationBacking != oldPositio nFromPaintInvalidationBacking; | 1494 bool locationChanged = newPositionFromPaintInvalidationBacking != oldPositio nFromPaintInvalidationBacking; |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1783 // Skip a full layout for transforms at the html/svg boundary which do n ot affect sizes inside SVG. | 1781 // Skip a full layout for transforms at the html/svg boundary which do n ot affect sizes inside SVG. |
| 1784 if (!isSVGRoot()) | 1782 if (!isSVGRoot()) |
| 1785 diff.setNeedsFullLayout(); | 1783 diff.setNeedsFullLayout(); |
| 1786 } | 1784 } |
| 1787 | 1785 |
| 1788 // If transform changed, and the layer does not paint into its own separate backing, then we need to invalidate paints. | 1786 // If transform changed, and the layer does not paint into its own separate backing, then we need to invalidate paints. |
| 1789 if (diff.transformChanged()) { | 1787 if (diff.transformChanged()) { |
| 1790 // Text nodes share style with their parents but transforms don't apply to them, | 1788 // Text nodes share style with their parents but transforms don't apply to them, |
| 1791 // hence the !isText() check. | 1789 // hence the !isText() check. |
| 1792 if (!isText() && (!hasLayer() || !toLayoutBoxModelObject(this)->layer()- >hasStyleDeterminedDirectCompositingReasons())) | 1790 if (!isText() && (!hasLayer() || !toLayoutBoxModelObject(this)->layer()- >hasStyleDeterminedDirectCompositingReasons())) |
| 1793 diff.setNeedsPaintInvalidationLayer(); | 1791 diff.setNeedsPaintInvalidationSubtree(); |
| 1794 } | 1792 } |
| 1795 | 1793 |
| 1796 // If opacity or zIndex changed, and the layer does not paint into its own s eparate backing, then we need to invalidate paints (also | 1794 // If opacity or zIndex changed, and the layer does not paint into its own s eparate backing, then we need to invalidate paints (also |
| 1797 // ignoring text nodes) | 1795 // ignoring text nodes) |
| 1798 if (diff.opacityChanged() || diff.zIndexChanged()) { | 1796 if (diff.opacityChanged() || diff.zIndexChanged()) { |
| 1799 if (!isText() && (!hasLayer() || !toLayoutBoxModelObject(this)->layer()- >hasStyleDeterminedDirectCompositingReasons())) | 1797 if (!isText() && (!hasLayer() || !toLayoutBoxModelObject(this)->layer()- >hasStyleDeterminedDirectCompositingReasons())) |
| 1800 diff.setNeedsPaintInvalidationLayer(); | 1798 diff.setNeedsPaintInvalidationSubtree(); |
| 1801 } | 1799 } |
| 1802 | 1800 |
| 1803 // If filter changed, and the layer does not paint into its own separate bac king or it paints with filters, then we need to invalidate paints. | 1801 // If filter changed, and the layer does not paint into its own separate bac king or it paints with filters, then we need to invalidate paints. |
| 1804 if (diff.filterChanged() && hasLayer()) { | 1802 if (diff.filterChanged() && hasLayer()) { |
| 1805 PaintLayer* layer = toLayoutBoxModelObject(this)->layer(); | 1803 PaintLayer* layer = toLayoutBoxModelObject(this)->layer(); |
| 1806 if (!layer->hasStyleDeterminedDirectCompositingReasons() || layer->paint sWithFilters()) | 1804 if (!layer->hasStyleDeterminedDirectCompositingReasons() || layer->paint sWithFilters()) |
| 1807 diff.setNeedsPaintInvalidationLayer(); | 1805 diff.setNeedsPaintInvalidationSubtree(); |
| 1808 } | 1806 } |
| 1809 | 1807 |
| 1810 // If backdrop filter changed, and the layer does not paint into its own sep arate backing or it paints with filters, then we need to invalidate paints. | 1808 // If backdrop filter changed, and the layer does not paint into its own sep arate backing or it paints with filters, then we need to invalidate paints. |
| 1811 if (diff.backdropFilterChanged() && hasLayer()) { | 1809 if (diff.backdropFilterChanged() && hasLayer()) { |
| 1812 PaintLayer* layer = toLayoutBoxModelObject(this)->layer(); | 1810 PaintLayer* layer = toLayoutBoxModelObject(this)->layer(); |
| 1813 if (!layer->hasStyleDeterminedDirectCompositingReasons() || layer->paint sWithBackdropFilters()) | 1811 if (!layer->hasStyleDeterminedDirectCompositingReasons() || layer->paint sWithBackdropFilters()) |
| 1814 diff.setNeedsPaintInvalidationLayer(); | 1812 diff.setNeedsPaintInvalidationSubtree(); |
| 1815 } | 1813 } |
| 1816 | 1814 |
| 1817 // Optimization: for decoration/color property changes, invalidation is only needed if we have style or text affected by these properties. | 1815 // Optimization: for decoration/color property changes, invalidation is only needed if we have style or text affected by these properties. |
| 1818 if (diff.textDecorationOrColorChanged() && !diff.needsPaintInvalidation()) { | 1816 if (diff.textDecorationOrColorChanged() && !diff.needsPaintInvalidation()) { |
| 1819 if (style()->hasBorder() || style()->hasOutline() | 1817 if (style()->hasBorder() || style()->hasOutline() |
| 1820 || style()->hasBackgroundRelatedColorReferencingCurrentColor() | 1818 || style()->hasBackgroundRelatedColorReferencingCurrentColor() |
| 1821 // Skip any text nodes that do not contain text boxes. Whitespace ca nnot be | 1819 // Skip any text nodes that do not contain text boxes. Whitespace ca nnot be |
| 1822 // skipped or we will miss invalidating decorations (e.g., underline s). | 1820 // skipped or we will miss invalidating decorations (e.g., underline s). |
| 1823 || (isText() && !isBR() && toLayoutText(this)->hasTextBoxes()) | 1821 || (isText() && !isBR() && toLayoutText(this)->hasTextBoxes()) |
| 1824 // Caret is painted in text color. | 1822 // Caret is painted in text color. |
| 1825 || (isLayoutBlock() && toLayoutBlock(this)->hasCaret()) | 1823 || (isLayoutBlock() && toLayoutBlock(this)->hasCaret()) |
| 1826 || (isSVG() && style()->svgStyle().isFillColorCurrentColor()) | 1824 || (isSVG() && style()->svgStyle().isFillColorCurrentColor()) |
| 1827 || (isSVG() && style()->svgStyle().isStrokeColorCurrentColor()) | 1825 || (isSVG() && style()->svgStyle().isStrokeColorCurrentColor()) |
| 1828 || isListMarker()) | 1826 || isListMarker()) |
| 1829 diff.setNeedsPaintInvalidationObject(); | 1827 diff.setNeedsPaintInvalidationObject(); |
| 1830 } | 1828 } |
| 1831 | 1829 |
| 1832 // The answer to layerTypeRequired() for plugins, iframes, and canvas can ch ange without the actual | 1830 // The answer to layerTypeRequired() for plugins, iframes, and canvas can ch ange without the actual |
| 1833 // style changing, since it depends on whether we decide to composite these elements. When the | 1831 // style changing, since it depends on whether we decide to composite these elements. When the |
| 1834 // layer status of one of these elements changes, we need to force a layout. | 1832 // layer status of one of these elements changes, we need to force a layout. |
| 1835 if (!diff.needsFullLayout() && style() && isBoxModelObject()) { | 1833 if (!diff.needsFullLayout() && style() && isBoxModelObject()) { |
| 1836 bool requiresLayer = toLayoutBoxModelObject(this)->layerTypeRequired() ! = NoPaintLayer; | 1834 bool requiresLayer = toLayoutBoxModelObject(this)->layerTypeRequired() ! = NoPaintLayer; |
| 1837 if (hasLayer() != requiresLayer) | 1835 if (hasLayer() != requiresLayer) |
| 1838 diff.setNeedsFullLayout(); | 1836 diff.setNeedsFullLayout(); |
| 1839 } | 1837 } |
| 1840 | 1838 |
| 1841 // If we have no layer(), just treat a PaintInvalidationLayer hint as a norm al paint invalidation. | |
| 1842 if (diff.needsPaintInvalidationLayer() && !hasLayer()) { | |
|
chrishtr
2016/05/09 22:20:41
Why can this code be removed?
Xianzhu
2016/05/10 17:17:12
I think if a style change affects the whole subtre
Xianzhu
2016/05/10 19:09:19
Try jobs finished. There are a lot of hits of this
| |
| 1843 diff.clearNeedsPaintInvalidation(); | |
| 1844 diff.setNeedsPaintInvalidationObject(); | |
| 1845 } | |
| 1846 | |
| 1847 return diff; | 1839 return diff; |
| 1848 } | 1840 } |
| 1849 | 1841 |
| 1850 void LayoutObject::setPseudoStyle(PassRefPtr<ComputedStyle> pseudoStyle) | 1842 void LayoutObject::setPseudoStyle(PassRefPtr<ComputedStyle> pseudoStyle) |
| 1851 { | 1843 { |
| 1852 ASSERT(pseudoStyle->styleType() == PseudoIdBefore || pseudoStyle->styleType( ) == PseudoIdAfter || pseudoStyle->styleType() == PseudoIdFirstLetter); | 1844 ASSERT(pseudoStyle->styleType() == PseudoIdBefore || pseudoStyle->styleType( ) == PseudoIdAfter || pseudoStyle->styleType() == PseudoIdFirstLetter); |
| 1853 | 1845 |
| 1854 // FIXME: We should consider just making all pseudo items use an inherited s tyle. | 1846 // FIXME: We should consider just making all pseudo items use an inherited s tyle. |
| 1855 | 1847 |
| 1856 // Images are special and must inherit the pseudoStyle so the width and heig ht of | 1848 // Images are special and must inherit the pseudoStyle so the width and heig ht of |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1990 } | 1982 } |
| 1991 | 1983 |
| 1992 if (diff.needsRecomputeOverflow() && !needsLayout()) { | 1984 if (diff.needsRecomputeOverflow() && !needsLayout()) { |
| 1993 // TODO(rhogan): Make inlines capable of recomputing overflow too. | 1985 // TODO(rhogan): Make inlines capable of recomputing overflow too. |
| 1994 if (isLayoutBlock()) | 1986 if (isLayoutBlock()) |
| 1995 setNeedsOverflowRecalcAfterStyleChange(); | 1987 setNeedsOverflowRecalcAfterStyleChange(); |
| 1996 else | 1988 else |
| 1997 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleCha nge); | 1989 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleCha nge); |
| 1998 } | 1990 } |
| 1999 | 1991 |
| 2000 if (diff.needsPaintInvalidationLayer() || updatedDiff.needsPaintInvalidation Layer()) | 1992 if (diff.needsPaintInvalidationSubtree() || updatedDiff.needsPaintInvalidati onSubtree()) |
| 2001 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants(); | 1993 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants(); |
| 2002 else if (diff.needsPaintInvalidationObject() || updatedDiff.needsPaintInvali dationObject()) | 1994 else if (diff.needsPaintInvalidationObject() || updatedDiff.needsPaintInvali dationObject()) |
| 2003 setShouldDoFullPaintInvalidation(); | 1995 setShouldDoFullPaintInvalidation(); |
| 2004 } | 1996 } |
| 2005 | 1997 |
| 2006 void LayoutObject::styleWillChange(StyleDifference diff, const ComputedStyle& ne wStyle) | 1998 void LayoutObject::styleWillChange(StyleDifference diff, const ComputedStyle& ne wStyle) |
| 2007 { | 1999 { |
| 2008 if (m_style) { | 2000 if (m_style) { |
| 2009 // If our z-index changes value or our visibility changes, | 2001 // If our z-index changes value or our visibility changes, |
| 2010 // we need to dirty our stacking context's z-order list. | 2002 // we need to dirty our stacking context's z-order list. |
| (...skipping 1446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3457 return; | 3449 return; |
| 3458 m_bitfields.setMayNeedPaintInvalidation(true); | 3450 m_bitfields.setMayNeedPaintInvalidation(true); |
| 3459 markAncestorsForPaintInvalidation(); | 3451 markAncestorsForPaintInvalidation(); |
| 3460 frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded(); | 3452 frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded(); |
| 3461 } | 3453 } |
| 3462 | 3454 |
| 3463 void LayoutObject::clearPaintInvalidationFlags(const PaintInvalidationState& pai ntInvalidationState) | 3455 void LayoutObject::clearPaintInvalidationFlags(const PaintInvalidationState& pai ntInvalidationState) |
| 3464 { | 3456 { |
| 3465 // paintInvalidationStateIsDirty should be kept in sync with the | 3457 // paintInvalidationStateIsDirty should be kept in sync with the |
| 3466 // booleans that are cleared below. | 3458 // booleans that are cleared below. |
| 3467 ASSERT(paintInvalidationState.forcedSubtreeInvalidationWithinContainer() || paintInvalidationState.forcedSubtreeInvalidationRectUpdateWithinContainer() || p aintInvalidationStateIsDirty()); | 3459 ASSERT(!shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState() || paintInvalidationStateIsDirty()); |
| 3468 clearShouldDoFullPaintInvalidation(); | 3460 clearShouldDoFullPaintInvalidation(); |
| 3469 m_bitfields.setChildShouldCheckForPaintInvalidation(false); | 3461 m_bitfields.setChildShouldCheckForPaintInvalidation(false); |
| 3470 m_bitfields.setNeededLayoutBecauseOfChildren(false); | 3462 m_bitfields.setNeededLayoutBecauseOfChildren(false); |
| 3471 m_bitfields.setShouldInvalidateOverflowForPaint(false); | 3463 m_bitfields.setShouldInvalidateOverflowForPaint(false); |
| 3472 m_bitfields.setMayNeedPaintInvalidation(false); | 3464 m_bitfields.setMayNeedPaintInvalidation(false); |
| 3473 m_bitfields.setShouldInvalidateSelection(false); | 3465 m_bitfields.setShouldInvalidateSelection(false); |
| 3474 } | 3466 } |
| 3475 | 3467 |
| 3476 bool LayoutObject::isAllowedToModifyLayoutTreeStructure(Document& document) | 3468 bool LayoutObject::isAllowedToModifyLayoutTreeStructure(Document& document) |
| 3477 { | 3469 { |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3603 clearPreviousPaintInvalidationRects(); | 3595 clearPreviousPaintInvalidationRects(); |
| 3604 } | 3596 } |
| 3605 | 3597 |
| 3606 void LayoutObject::invalidatePaintIncludingNonCompositingDescendants() | 3598 void LayoutObject::invalidatePaintIncludingNonCompositingDescendants() |
| 3607 { | 3599 { |
| 3608 // Since we're only painting non-composited layers, we know that they all sh are the same paintInvalidationContainer. | 3600 // Since we're only painting non-composited layers, we know that they all sh are the same paintInvalidationContainer. |
| 3609 const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintIn validation(); | 3601 const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintIn validation(); |
| 3610 traverseNonCompositingDescendants(*this, [&paintInvalidationContainer](Layou tObject& object) { | 3602 traverseNonCompositingDescendants(*this, [&paintInvalidationContainer](Layou tObject& object) { |
| 3611 if (object.hasLayer()) | 3603 if (object.hasLayer()) |
| 3612 toLayoutBoxModelObject(object).layer()->setNeedsRepaint(); | 3604 toLayoutBoxModelObject(object).layer()->setNeedsRepaint(); |
| 3613 object.invalidatePaintOfPreviousPaintInvalidationRect(paintInvalidationC ontainer, PaintInvalidationLayer); | 3605 object.invalidatePaintOfPreviousPaintInvalidationRect(paintInvalidationC ontainer, PaintInvalidationSubtree); |
| 3614 }); | 3606 }); |
| 3615 } | 3607 } |
| 3616 | 3608 |
| 3617 // FIXME: If we had a flag to force invalidations in a whole subtree, we could g et rid of this function (crbug.com/410097). | |
| 3618 void LayoutObject::setShouldDoFullPaintInvalidationIncludingNonCompositingDescen dants() | 3609 void LayoutObject::setShouldDoFullPaintInvalidationIncludingNonCompositingDescen dants() |
| 3619 { | 3610 { |
| 3620 // Need to access the current compositing status. | 3611 // Clear first because PaintInvalidationSubtree overrides other full paint i nvalidation reasons. |
| 3621 DisableCompositingQueryAsserts disabler; | 3612 clearShouldDoFullPaintInvalidation(); |
| 3622 traverseNonCompositingDescendants(*this, [](LayoutObject& object) { | 3613 setShouldDoFullPaintInvalidation(PaintInvalidationSubtree); |
| 3623 object.setShouldDoFullPaintInvalidation(); | |
| 3624 }); | |
| 3625 } | 3614 } |
| 3626 | 3615 |
| 3627 void LayoutObject::invalidatePaintIncludingNonSelfPaintingLayerDescendantsIntern al(const LayoutBoxModelObject& paintInvalidationContainer) | 3616 void LayoutObject::invalidatePaintIncludingNonSelfPaintingLayerDescendantsIntern al(const LayoutBoxModelObject& paintInvalidationContainer) |
| 3628 { | 3617 { |
| 3629 invalidatePaintOfPreviousPaintInvalidationRect(paintInvalidationContainer, P aintInvalidationLayer); | 3618 invalidatePaintOfPreviousPaintInvalidationRect(paintInvalidationContainer, P aintInvalidationSubtree); |
| 3630 for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibli ng()) { | 3619 for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibli ng()) { |
| 3631 if (child->hasLayer()) | 3620 if (child->hasLayer()) |
| 3632 toLayoutBoxModelObject(child)->layer()->setNeedsRepaint(); | 3621 toLayoutBoxModelObject(child)->layer()->setNeedsRepaint(); |
| 3633 if (!child->hasLayer() || !toLayoutBoxModelObject(child)->layer()->isSel fPaintingLayer()) | 3622 if (!child->hasLayer() || !toLayoutBoxModelObject(child)->layer()->isSel fPaintingLayer()) |
| 3634 child->invalidatePaintIncludingNonSelfPaintingLayerDescendantsIntern al(paintInvalidationContainer); | 3623 child->invalidatePaintIncludingNonSelfPaintingLayerDescendantsIntern al(paintInvalidationContainer); |
| 3635 } | 3624 } |
| 3636 } | 3625 } |
| 3637 | 3626 |
| 3638 void LayoutObject::invalidatePaintIncludingNonSelfPaintingLayerDescendants(const LayoutBoxModelObject& paintInvalidationContainer) | 3627 void LayoutObject::invalidatePaintIncludingNonSelfPaintingLayerDescendants(const LayoutBoxModelObject& paintInvalidationContainer) |
| 3639 { | 3628 { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3706 const blink::LayoutObject* root = object1; | 3695 const blink::LayoutObject* root = object1; |
| 3707 while (root->parent()) | 3696 while (root->parent()) |
| 3708 root = root->parent(); | 3697 root = root->parent(); |
| 3709 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); | 3698 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); |
| 3710 } else { | 3699 } else { |
| 3711 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); | 3700 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); |
| 3712 } | 3701 } |
| 3713 } | 3702 } |
| 3714 | 3703 |
| 3715 #endif | 3704 #endif |
| OLD | NEW |