Chromium Code Reviews| Index: third_party/WebKit/Source/core/paint/DeprecatedPaintLayerPainter.cpp |
| diff --git a/third_party/WebKit/Source/core/paint/DeprecatedPaintLayerPainter.cpp b/third_party/WebKit/Source/core/paint/DeprecatedPaintLayerPainter.cpp |
| index 1d3ec1dd161fab0c2ee0e6d031e9614376a5a082..e036df4ee69393769a533f0e71692e1001bd157c 100644 |
| --- a/third_party/WebKit/Source/core/paint/DeprecatedPaintLayerPainter.cpp |
| +++ b/third_party/WebKit/Source/core/paint/DeprecatedPaintLayerPainter.cpp |
| @@ -220,28 +220,8 @@ DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintLayer |
| if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !m_paintLayer.layoutObject()->isLayoutView() && !m_paintLayer.layoutObject()->isDocumentElement()) |
| return result; |
| - Optional<SubsequenceRecorder> subsequenceRecorder; |
| - |
| - bool scrollOffsetAccumulationChanged = paintingInfoArg.scrollOffsetAccumulation != m_paintLayer.previousScrollOffsetAccumulationForPainting(); |
| - if (scrollOffsetAccumulationChanged) |
| - m_paintLayer.setPreviousScrollOffsetAccumulationForPainting(paintingInfoArg.scrollOffsetAccumulation); |
| - |
| - if (!isPaintingOverlayScrollbars |
| - && !paintingInfoArg.disableSubsequenceCache |
| - && !(paintingInfoArg.globalPaintFlags() & GlobalPaintFlattenCompositingLayers) |
| - && !(paintFlags & PaintLayerPaintingReflection) |
| - && !(paintFlags & PaintLayerPaintingRootBackgroundOnly)) { |
| - if (!scrollOffsetAccumulationChanged && !m_paintLayer.needsRepaint() && SubsequenceRecorder::useCachedSubsequenceIfPossible(*context, m_paintLayer)) |
| - return result; |
| - subsequenceRecorder.emplace(*context, m_paintLayer); |
| - } |
| - |
| DeprecatedPaintLayerPaintingInfo paintingInfo = paintingInfoArg; |
| - if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled() |
| - && (m_paintLayer.layoutObject()->hasOverflowClip() || m_paintLayer.layoutObject()->hasClip())) |
| - paintingInfo.disableSubsequenceCache = true; |
| - |
| // Ensure our lists are up-to-date. |
| m_paintLayer.stackingNode()->updateLayerListsIfNeeded(); |
| @@ -356,10 +336,7 @@ DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintLayer |
| paintChildClippingMaskForFragments(layerFragments, context, localPaintingInfo, paintingRootForLayoutObject, paintFlags); |
| } |
| - // Set subsequence not cacheable if the bounding box of this layer and descendants is not fully contained |
| - // by paintRect, because later paintRect changes may expose new contents which will need repainting. |
| - if (result == MaybeNotFullyPainted && subsequenceRecorder) |
| - subsequenceRecorder->setUncacheable(); |
| + m_paintLayer.setPreviousScrollOffsetAccumulationForPainting(paintingInfoArg.scrollOffsetAccumulation); |
| return result; |
| } |
| @@ -492,12 +469,39 @@ DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintChild |
| LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode()); |
| #endif |
| - IntSize scrollOffsetAccumulation = paintingInfo.scrollOffsetAccumulation; |
| + DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode(), childrenToVisit); |
| + DeprecatedPaintLayerStackingNode* child = iterator.next(); |
| + if (!child) |
| + return result; |
| + |
| + DisplayItem::Type subsequenceType; |
| + if (childrenToVisit == NegativeZOrderChildren) { |
| + subsequenceType = DisplayItem::SubsequenceNegativeZOrder; |
| + } else { |
| + ASSERT(childrenToVisit == (NormalFlowChildren | PositiveZOrderChildren)); |
| + subsequenceType = DisplayItem::SubsequenceNormalFlowAndPositiveZOrder; |
| + } |
| + |
| + Optional<SubsequenceRecorder> subsequenceRecorder; |
| + if (!paintingInfo.disableSubsequenceCache |
| + && !(paintingInfo.globalPaintFlags() & GlobalPaintFlattenCompositingLayers) |
| + && !(paintFlags & PaintLayerPaintingReflection) |
| + && !(paintFlags & PaintLayerPaintingRootBackgroundOnly)) { |
| + if (!m_paintLayer.needsRepaint() |
| + && paintingInfo.scrollOffsetAccumulation == m_paintLayer.previousScrollOffsetAccumulationForPainting() |
| + && SubsequenceRecorder::useCachedSubsequenceIfPossible(*context, m_paintLayer, subsequenceType)) |
| + return result; |
| + subsequenceRecorder.emplace(*context, m_paintLayer, subsequenceType); |
| + } |
| + |
| + IntSize scrollOffsetAccumulationForChildren = paintingInfo.scrollOffsetAccumulation; |
| if (m_paintLayer.layoutObject()->hasOverflowClip()) |
| - scrollOffsetAccumulation += m_paintLayer.layoutBox()->scrolledContentOffset(); |
| + scrollOffsetAccumulationForChildren += m_paintLayer.layoutBox()->scrolledContentOffset(); |
| - DeprecatedPaintLayerStackingNodeIterator iterator(*m_paintLayer.stackingNode(), childrenToVisit); |
| - while (DeprecatedPaintLayerStackingNode* child = iterator.next()) { |
| + bool disableChildSubsequenceCache = !RuntimeEnabledFeatures::slimmingPaintV2Enabled() |
|
pdr.
2015/09/30 23:36:54
Nit: Should this be !RuntimeEnabledFeatures::slimm
Xianzhu
2015/09/30 23:48:48
No. This is to workaround the effect of ancestor c
|
| + && (m_paintLayer.layoutObject()->hasOverflowClip() || m_paintLayer.layoutObject()->hasClip()); |
| + |
| + for (; child; child = iterator.next()) { |
| DeprecatedPaintLayerPainter childPainter(*child->layer()); |
| // If this Layer should paint into its own backing or a grouped backing, that will be done via CompositedDeprecatedPaintLayerMapping::paintContents() |
| // and CompositedDeprecatedPaintLayerMapping::doPaintTask(). |
| @@ -505,7 +509,8 @@ DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintChild |
| continue; |
| DeprecatedPaintLayerPaintingInfo childPaintingInfo = paintingInfo; |
| - childPaintingInfo.scrollOffsetAccumulation = scrollOffsetAccumulation; |
| + childPaintingInfo.disableSubsequenceCache = disableChildSubsequenceCache; |
| + childPaintingInfo.scrollOffsetAccumulation = scrollOffsetAccumulationForChildren; |
| // Rare case: accumulate scroll offset of non-stacking-context ancestors up to m_paintLayer. |
| for (DeprecatedPaintLayer* parentLayer = child->layer()->parent(); parentLayer != &m_paintLayer; parentLayer = parentLayer->parent()) { |
| if (parentLayer->layoutObject()->hasOverflowClip()) |
| @@ -515,6 +520,12 @@ DeprecatedPaintLayerPainter::PaintResult DeprecatedPaintLayerPainter::paintChild |
| if (childPainter.paintLayer(context, childPaintingInfo, paintFlags) == MaybeNotFullyPainted) |
| result = MaybeNotFullyPainted; |
| } |
| + |
| + // Set subsequence not cacheable if the bounding box of this layer and descendants is not fully contained |
| + // by paintRect, because later paintRect changes may expose new contents which will need repainting. |
| + if (result == MaybeNotFullyPainted && subsequenceRecorder) |
| + subsequenceRecorder->setUncacheable(); |
| + |
| return result; |
| } |