Chromium Code Reviews| Index: third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp |
| diff --git a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp |
| index bf339c75be25aa053e7c3c8cf958451a9c1f6024..10c5d49a581a791a51a0b03be3be41a935da1268 100644 |
| --- a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp |
| +++ b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp |
| @@ -114,27 +114,25 @@ static bool isAncestorOfOrEqualTo(const ClipPaintPropertyNode* a, |
| return b == a; |
| } |
| -FloatClipRect PrePaintTreeWalk::clipRectForContext( |
| +void PrePaintTreeWalk::computeClipRectForContext( |
| const PaintPropertyTreeBuilderContext::ContainingBlockContext& context, |
| const EffectPaintPropertyNode* effect, |
| const PropertyTreeState& ancestorState, |
| const LayoutPoint& ancestorPaintOffset, |
| - bool& hasClip) { |
| + bool& hasClip, |
| + FloatClipRect& clipRect) { |
| // Only return a non-infinite clip if clips differ, or the "ancestor" state is |
| // actually an ancestor clip. This ensures no accuracy issues due to |
| // transforms applied to infinite rects. |
| if (isAncestorOfOrEqualTo(context.clip, ancestorState.clip())) |
| - return FloatClipRect(); |
| + clipRect = FloatClipRect(); |
| hasClip = true; |
| - |
| PropertyTreeState localState(context.transform, context.clip, effect); |
| - FloatClipRect rect( |
| - m_geometryMapper.sourceToDestinationClipRect(localState, ancestorState)); |
| - |
| - rect.moveBy(-FloatPoint(ancestorPaintOffset)); |
| - return rect; |
| + clipRect = |
| + m_geometryMapper.sourceToDestinationClipRect(localState, ancestorState); |
| + clipRect.moveBy(-FloatPoint(ancestorPaintOffset)); |
| } |
| void PrePaintTreeWalk::invalidatePaintLayerOptimizationsIfNeeded( |
| @@ -180,26 +178,31 @@ void PrePaintTreeWalk::invalidatePaintLayerOptimizationsIfNeeded( |
| RefPtr<ClipRects> clipRects = ClipRects::create(); |
|
Xianzhu
2017/03/10 00:06:49
(Can be follow-up) We can also skip line 178-210 i
chrishtr
2017/03/10 01:45:29
Do you mean if ancestorState.clip() is above all o
|
| const LayoutPoint& ancestorPaintOffset = |
| context.ancestorTransformedOrRootPaintLayer->layoutObject().paintOffset(); |
| - clipRects->setOverflowClipRect( |
| - clipRectForContext(context.treeBuilderContext.current, effect, |
| - ancestorState, ancestorPaintOffset, hasClip)); |
| + |
| + FloatClipRect clipRect; |
| + computeClipRectForContext(context.treeBuilderContext.current, effect, |
| + ancestorState, ancestorPaintOffset, hasClip, |
| + clipRect); |
| + clipRects->setOverflowClipRect(clipRect); |
| #ifdef CHECK_CLIP_RECTS |
| CHECK(!hasClip || |
| clipRects->overflowClipRect() == oldClipRects.overflowClipRect()) |
| << "rect= " << clipRects->overflowClipRect().toString(); |
| #endif |
| - clipRects->setFixedClipRect( |
| - clipRectForContext(context.treeBuilderContext.fixedPosition, effect, |
| - ancestorState, ancestorPaintOffset, hasClip)); |
| + computeClipRectForContext(context.treeBuilderContext.fixedPosition, effect, |
| + ancestorState, ancestorPaintOffset, hasClip, |
| + clipRect); |
| + clipRects->setFixedClipRect(clipRect); |
| #ifdef CHECK_CLIP_RECTS |
| CHECK(hasClip || clipRects->fixedClipRect() == oldClipRects.fixedClipRect()) |
| << " fixed=" << clipRects->fixedClipRect().toString(); |
| #endif |
| - clipRects->setPosClipRect( |
| - clipRectForContext(context.treeBuilderContext.absolutePosition, effect, |
| - ancestorState, ancestorPaintOffset, hasClip)); |
| + computeClipRectForContext(context.treeBuilderContext.absolutePosition, effect, |
| + ancestorState, ancestorPaintOffset, hasClip, |
| + clipRect); |
| + clipRects->setPosClipRect(clipRect); |
| #ifdef CHECK_CLIP_RECTS |
| CHECK(!hasClip || clipRects->posClipRect() == oldClipRects.posClipRect()) |
| << " abs=" << clipRects->posClipRect().toString(); |