| OLD | NEW |
| 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/paint/LayerClipRecorder.h" | 5 #include "core/paint/LayerClipRecorder.h" |
| 6 | 6 |
| 7 #include "core/layout/ClipRect.h" | 7 #include "core/layout/ClipRect.h" |
| 8 #include "core/layout/LayoutView.h" | 8 #include "core/layout/LayoutView.h" |
| 9 #include "core/paint/PaintLayer.h" | 9 #include "core/paint/PaintLayer.h" |
| 10 #include "platform/geometry/IntRect.h" | 10 #include "platform/geometry/IntRect.h" |
| 11 #include "platform/graphics/GraphicsContext.h" | 11 #include "platform/graphics/GraphicsContext.h" |
| 12 #include "platform/graphics/GraphicsLayer.h" | 12 #include "platform/graphics/GraphicsLayer.h" |
| 13 #include "platform/graphics/paint/ClipRecorder.h" | 13 #include "platform/graphics/paint/ClipRecorder.h" |
| 14 #include "platform/graphics/paint/PaintController.h" | 14 #include "platform/graphics/paint/PaintController.h" |
| 15 | 15 |
| 16 namespace blink { | 16 namespace blink { |
| 17 | 17 |
| 18 LayerClipRecorder::LayerClipRecorder( | 18 LayerClipRecorder::LayerClipRecorder( |
| 19 GraphicsContext& graphicsContext, | 19 GraphicsContext& graphicsContext, |
| 20 const LayoutBoxModelObject& layoutObject, | 20 const LayoutBoxModelObject& layoutObject, |
| 21 DisplayItem::Type clipType, | 21 DisplayItem::Type clipType, |
| 22 const ClipRect& clipRect, | 22 const ClipRect& clipRect, |
| 23 const PaintLayerPaintingInfo* localPaintingInfo, | 23 const PaintLayerPaintingInfo* localPaintingInfo, |
| 24 const LayoutPoint& fragmentOffset, | 24 const LayoutPoint& fragmentOffset, |
| 25 PaintLayerFlags paintFlags, | 25 PaintLayerFlags paintFlags, |
| 26 BorderRadiusClippingRule rule) | 26 BorderRadiusClippingRule rule) |
| 27 : m_graphicsContext(graphicsContext), | 27 : m_graphicsContext(graphicsContext), |
| 28 m_layoutObject(layoutObject), | 28 m_layoutObject(layoutObject), |
| 29 m_clipType(clipType) { | 29 m_clipType(clipType) { |
| 30 IntRect snappedClipRect = pixelSnappedIntRect(clipRect.rect()); | 30 m_snappedClipRect = pixelSnappedIntRect(clipRect.rect()); |
| 31 Vector<FloatRoundedRect> roundedRects; | |
| 32 if (localPaintingInfo && clipRect.hasRadius()) { | 31 if (localPaintingInfo && clipRect.hasRadius()) { |
| 33 collectRoundedRectClips(*layoutObject.layer(), *localPaintingInfo, | 32 collectRoundedRectClips(*layoutObject.layer(), *localPaintingInfo, |
| 34 graphicsContext, fragmentOffset, paintFlags, rule, | 33 graphicsContext, fragmentOffset, paintFlags, rule); |
| 35 roundedRects); | |
| 36 } | 34 } |
| 37 | 35 |
| 38 m_graphicsContext.getPaintController().createAndAppend<ClipDisplayItem>( | 36 m_graphicsContext.getPaintController().createAndAppend<ClipDisplayItem>( |
| 39 layoutObject, m_clipType, snappedClipRect, roundedRects); | 37 layoutObject, m_clipType, m_snappedClipRect, m_roundedRects); |
| 40 } | 38 } |
| 41 | 39 |
| 42 static bool inContainingBlockChain(PaintLayer* startLayer, | 40 static bool inContainingBlockChain(PaintLayer* startLayer, |
| 43 PaintLayer* endLayer) { | 41 PaintLayer* endLayer) { |
| 44 if (startLayer == endLayer) | 42 if (startLayer == endLayer) |
| 45 return true; | 43 return true; |
| 46 | 44 |
| 47 LayoutView* view = startLayer->layoutObject()->view(); | 45 LayoutView* view = startLayer->layoutObject()->view(); |
| 48 for (const LayoutBlock* currentBlock = | 46 for (const LayoutBlock* currentBlock = |
| 49 startLayer->layoutObject()->containingBlock(); | 47 startLayer->layoutObject()->containingBlock(); |
| 50 currentBlock && currentBlock != view; | 48 currentBlock && currentBlock != view; |
| 51 currentBlock = currentBlock->containingBlock()) { | 49 currentBlock = currentBlock->containingBlock()) { |
| 52 if (currentBlock->layer() == endLayer) | 50 if (currentBlock->layer() == endLayer) |
| 53 return true; | 51 return true; |
| 54 } | 52 } |
| 55 | 53 |
| 56 return false; | 54 return false; |
| 57 } | 55 } |
| 58 | 56 |
| 59 void LayerClipRecorder::collectRoundedRectClips( | 57 void LayerClipRecorder::collectRoundedRectClips( |
| 60 PaintLayer& paintLayer, | 58 PaintLayer& paintLayer, |
| 61 const PaintLayerPaintingInfo& localPaintingInfo, | 59 const PaintLayerPaintingInfo& localPaintingInfo, |
| 62 GraphicsContext& context, | 60 GraphicsContext& context, |
| 63 const LayoutPoint& fragmentOffset, | 61 const LayoutPoint& fragmentOffset, |
| 64 PaintLayerFlags paintFlags, | 62 PaintLayerFlags paintFlags, |
| 65 BorderRadiusClippingRule rule, | 63 BorderRadiusClippingRule rule) { |
| 66 Vector<FloatRoundedRect>& roundedRectClips) { | |
| 67 // If the clip rect has been tainted by a border radius, then we have to walk | 64 // If the clip rect has been tainted by a border radius, then we have to walk |
| 68 // up our layer chain applying the clips from any layers with overflow. The | 65 // up our layer chain applying the clips from any layers with overflow. The |
| 69 // condition for being able to apply these clips is that the overflow object | 66 // condition for being able to apply these clips is that the overflow object |
| 70 // be in our containing block chain so we check that also. | 67 // be in our containing block chain so we check that also. |
| 71 for (PaintLayer* layer = rule == IncludeSelfForBorderRadius | 68 for (PaintLayer* layer = rule == IncludeSelfForBorderRadius |
| 72 ? &paintLayer | 69 ? &paintLayer |
| 73 : paintLayer.parent(); | 70 : paintLayer.parent(); |
| 74 layer; layer = layer->parent()) { | 71 layer; layer = layer->parent()) { |
| 75 // Composited scrolling layers handle border-radius clip in the compositor | 72 // Composited scrolling layers handle border-radius clip in the compositor |
| 76 // via a mask layer. We do not want to apply a border-radius clip to the | 73 // via a mask layer. We do not want to apply a border-radius clip to the |
| (...skipping 10 matching lines...) Expand all Loading... |
| 87 inContainingBlockChain(&paintLayer, layer)) { | 84 inContainingBlockChain(&paintLayer, layer)) { |
| 88 LayoutPoint delta(fragmentOffset); | 85 LayoutPoint delta(fragmentOffset); |
| 89 layer->convertToLayerCoords(localPaintingInfo.rootLayer, delta); | 86 layer->convertToLayerCoords(localPaintingInfo.rootLayer, delta); |
| 90 | 87 |
| 91 // The PaintLayer's size is pixel-snapped if it is a LayoutBox. We can't | 88 // The PaintLayer's size is pixel-snapped if it is a LayoutBox. We can't |
| 92 // use a pre-snapped border rect for clipping, since | 89 // use a pre-snapped border rect for clipping, since |
| 93 // getRoundedInnerBorderFor assumes it has not been snapped yet. | 90 // getRoundedInnerBorderFor assumes it has not been snapped yet. |
| 94 LayoutSize size(layer->layoutBox() | 91 LayoutSize size(layer->layoutBox() |
| 95 ? toLayoutBox(layer->layoutObject())->size() | 92 ? toLayoutBox(layer->layoutObject())->size() |
| 96 : LayoutSize(layer->size())); | 93 : LayoutSize(layer->size())); |
| 97 roundedRectClips.append( | 94 m_roundedRects.append( |
| 98 layer->layoutObject()->style()->getRoundedInnerBorderFor( | 95 layer->layoutObject()->style()->getRoundedInnerBorderFor( |
| 99 LayoutRect(delta, size))); | 96 LayoutRect(delta, size))); |
| 100 } | 97 } |
| 101 | 98 |
| 102 if (layer == localPaintingInfo.rootLayer) | 99 if (layer == localPaintingInfo.rootLayer) |
| 103 break; | 100 break; |
| 104 } | 101 } |
| 105 } | 102 } |
| 106 | 103 |
| 107 LayerClipRecorder::~LayerClipRecorder() { | 104 LayerClipRecorder::~LayerClipRecorder() { |
| 108 m_graphicsContext.getPaintController().endItem<EndClipDisplayItem>( | 105 m_graphicsContext.getPaintController().endItem<EndClipDisplayItem>( |
| 109 m_layoutObject, DisplayItem::clipTypeToEndClipType(m_clipType)); | 106 m_layoutObject, DisplayItem::clipTypeToEndClipType(m_clipType)); |
| 110 } | 107 } |
| 111 | 108 |
| 112 } // namespace blink | 109 } // namespace blink |
| OLD | NEW |