Index: third_party/WebKit/Source/core/paint/BoxClipper.cpp |
diff --git a/third_party/WebKit/Source/core/paint/BoxClipper.cpp b/third_party/WebKit/Source/core/paint/BoxClipper.cpp |
index 506b1b9857038199f92e41f337ffeb32f72becfa..f6d1b8e16a7bf99ad7756bef212793551d780dfa 100644 |
--- a/third_party/WebKit/Source/core/paint/BoxClipper.cpp |
+++ b/third_party/WebKit/Source/core/paint/BoxClipper.cpp |
@@ -5,6 +5,7 @@ |
#include "core/paint/BoxClipper.h" |
#include "core/layout/LayoutBox.h" |
+#include "core/layout/svg/LayoutSVGRoot.h" |
#include "core/paint/ObjectPaintProperties.h" |
#include "core/paint/PaintInfo.h" |
#include "core/paint/PaintLayer.h" |
@@ -15,12 +16,23 @@ |
namespace blink { |
+static bool boxNeedsClip(const LayoutBox& box) |
+{ |
+ if (box.hasControlClip()) |
+ return true; |
+ if (box.isSVGRoot() && toLayoutSVGRoot(box).shouldApplyViewportClip()) |
+ return true; |
+ if (box.hasLayer() && box.layer()->isSelfPaintingLayer()) |
+ return false; |
+ return box.hasOverflowClip() || box.styleRef().containsPaint(); |
+} |
+ |
BoxClipper::BoxClipper(const LayoutBox& box, const PaintInfo& paintInfo, const LayoutPoint& accumulatedOffset, ContentsClipBehavior contentsClipBehavior) |
: m_box(box) |
, m_paintInfo(paintInfo) |
, m_clipType(DisplayItem::kUninitializedType) |
{ |
- ASSERT(m_paintInfo.phase != PaintPhaseSelfBlockBackgroundOnly && m_paintInfo.phase != PaintPhaseSelfOutlineOnly); |
+ DCHECK(m_paintInfo.phase != PaintPhaseSelfBlockBackgroundOnly && m_paintInfo.phase != PaintPhaseSelfOutlineOnly); |
if (m_paintInfo.phase == PaintPhaseMask) |
return; |
@@ -35,13 +47,10 @@ BoxClipper::BoxClipper(const LayoutBox& box, const PaintInfo& paintInfo, const L |
return; |
} |
- bool isControlClip = m_box.hasControlClip(); |
- bool isOverflowOrContainmentClip = (m_box.hasOverflowClip() || box.styleRef().containsPaint()) && !(m_box.hasLayer() && m_box.layer()->isSelfPaintingLayer()); |
- |
- if (!isControlClip && !isOverflowOrContainmentClip) |
+ if (!boxNeedsClip(m_box)) |
return; |
- LayoutRect clipRect = isControlClip ? m_box.controlClipRect(accumulatedOffset) : m_box.overflowClipRect(accumulatedOffset); |
+ LayoutRect clipRect = m_box.hasControlClip() ? m_box.controlClipRect(accumulatedOffset) : m_box.overflowClipRect(accumulatedOffset); |
FloatRoundedRect clipRoundedRect(0, 0, 0, 0); |
bool hasBorderRadius = m_box.style()->hasBorderRadius(); |
if (hasBorderRadius) |
@@ -77,7 +86,7 @@ BoxClipper::~BoxClipper() |
if (m_clipType == DisplayItem::kUninitializedType) |
return; |
- DCHECK(m_box.hasControlClip() || ((m_box.hasOverflowClip() || m_box.style()->containsPaint()) && !(m_box.hasLayer() && m_box.layer()->isSelfPaintingLayer()))); |
+ DCHECK(boxNeedsClip(m_box)); |
m_paintInfo.context.getPaintController().endItem<EndClipDisplayItem>(m_box, DisplayItem::clipTypeToEndClipType(m_clipType)); |
} |