Chromium Code Reviews| Index: third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp |
| diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp |
| index 86176fa7819076bb8bebf5db97cc9b96570ad85a..4ba639057b55dfaf7d409fd972e006304c9f5482 100644 |
| --- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp |
| +++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp |
| @@ -4,27 +4,20 @@ |
| #include "core/paint/PaintLayerPainter.h" |
| -#include "core/frame/FrameView.h" |
| -#include "core/frame/Settings.h" |
| -#include "core/layout/LayoutBlock.h" |
| +#include "core/frame/LocalFrame.h" |
| #include "core/layout/LayoutView.h" |
| -#include "core/layout/svg/LayoutSVGResourceClipper.h" |
| -#include "core/page/Page.h" |
| +#include "core/paint/ClipPathClipper.h" |
| #include "core/paint/FilterPainter.h" |
| #include "core/paint/LayerClipRecorder.h" |
| #include "core/paint/ObjectPaintProperties.h" |
| #include "core/paint/PaintInfo.h" |
| #include "core/paint/PaintLayer.h" |
| -#include "core/paint/SVGClipPainter.h" |
| #include "core/paint/ScrollRecorder.h" |
| #include "core/paint/ScrollableAreaPainter.h" |
| #include "core/paint/Transform3DRecorder.h" |
| -#include "core/style/ClipPathOperation.h" |
| #include "platform/RuntimeEnabledFeatures.h" |
| #include "platform/geometry/FloatPoint3D.h" |
| #include "platform/graphics/GraphicsLayer.h" |
| -#include "platform/graphics/paint/ClipPathRecorder.h" |
| -#include "platform/graphics/paint/ClipRecorder.h" |
| #include "platform/graphics/paint/CompositingRecorder.h" |
| #include "platform/graphics/paint/DisplayItemCacheSkipper.h" |
| #include "platform/graphics/paint/PaintChunkProperties.h" |
| @@ -120,73 +113,6 @@ PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerContentsAndReflectio |
| return result; |
| } |
| -class ClipPathHelper { |
| -public: |
| - ClipPathHelper(GraphicsContext& context, const PaintLayer& paintLayer, PaintLayerPaintingInfo& paintingInfo, LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed, |
| - const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) |
| - : m_resourceClipper(0), m_paintLayer(paintLayer), m_context(context) |
| - { |
| - const ComputedStyle& style = paintLayer.layoutObject()->styleRef(); |
| - |
| - // Clip-path, like border radius, must not be applied to the contents of a composited-scrolling container. |
| - // It must, however, still be applied to the mask layer, so that the compositor can properly mask the |
| - // scrolling contents and scrollbars. |
| - if (!paintLayer.layoutObject()->hasClipPath() || (paintLayer.needsCompositedScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase))) |
| - return; |
| - |
| - m_clipperState = SVGClipPainter::ClipperNotApplied; |
| - |
| - paintingInfo.ancestorHasClipPathClipping = true; |
| - |
| - ASSERT(style.clipPath()); |
| - if (style.clipPath()->type() == ClipPathOperation::SHAPE) { |
| - ShapeClipPathOperation* clipPath = toShapeClipPathOperation(style.clipPath()); |
| - if (clipPath->isValid()) { |
| - if (!rootRelativeBoundsComputed) { |
| - rootRelativeBounds = paintLayer.physicalBoundingBoxIncludingReflectionAndStackingChildren(offsetFromRoot); |
| - rootRelativeBoundsComputed = true; |
| - } |
| - m_clipPathRecorder.emplace(context, *paintLayer.layoutObject(), clipPath->path(FloatRect(rootRelativeBounds))); |
| - } |
| - } else if (style.clipPath()->type() == ClipPathOperation::REFERENCE) { |
| - ReferenceClipPathOperation* referenceClipPathOperation = toReferenceClipPathOperation(style.clipPath()); |
| - Document& document = paintLayer.layoutObject()->document(); |
| - // FIXME: It doesn't work with forward or external SVG references (https://bugs.webkit.org/show_bug.cgi?id=90405) |
| - Element* element = document.getElementById(referenceClipPathOperation->fragment()); |
| - if (isSVGClipPathElement(element) && element->layoutObject()) { |
| - if (!rootRelativeBoundsComputed) { |
| - rootRelativeBounds = paintLayer.physicalBoundingBoxIncludingReflectionAndStackingChildren(offsetFromRoot); |
| - rootRelativeBoundsComputed = true; |
| - } |
| - |
| - m_resourceClipper = toLayoutSVGResourceClipper(toLayoutSVGResourceContainer(element->layoutObject())); |
| - // When SVG applies the clip and the coordinate system is "user space on use", we must explicitly pass in |
| - // the layer offset to have the clip paint in the correct location. When the coordinate system is |
| - // "object bounding box" the offset is already accounted for in the rootRelativeBounds. |
| - FloatPoint layerPositionOffset = m_resourceClipper->clipPathUnits() == SVGUnitTypes::kSvgUnitTypeUserspaceonuse ? |
| - FloatPoint(offsetFromRoot) : FloatPoint(); |
| - if (!SVGClipPainter(*m_resourceClipper).prepareEffect(*paintLayer.layoutObject(), FloatRect(rootRelativeBounds), |
| - FloatRect(rootRelativeBounds), layerPositionOffset, context, m_clipperState)) { |
| - // No need to post-apply the clipper if this failed. |
| - m_resourceClipper = 0; |
| - } |
| - } |
| - } |
| - } |
| - |
| - ~ClipPathHelper() |
| - { |
| - if (m_resourceClipper) |
| - SVGClipPainter(*m_resourceClipper).finishEffect(*m_paintLayer.layoutObject(), m_context, m_clipperState); |
| - } |
| -private: |
| - LayoutSVGResourceClipper* m_resourceClipper; |
| - Optional<ClipPathRecorder> m_clipPathRecorder; |
| - SVGClipPainter::ClipperState m_clipperState; |
| - const PaintLayer& m_paintLayer; |
| - GraphicsContext& m_context; |
| -}; |
| - |
| static bool shouldCreateSubsequence(const PaintLayer& paintLayer, GraphicsContext& context, const PaintLayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) |
| { |
| if (!RuntimeEnabledFeatures::paintOptimizationsEnabled()) |
| @@ -317,7 +243,23 @@ PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerContents(GraphicsCon |
| // These helpers output clip and compositing operations using a RAII pattern. Stack-allocated-varibles are destructed in the reverse order of construction, |
| // so they are nested properly. |
| - ClipPathHelper clipPathHelper(context, m_paintLayer, paintingInfo, rootRelativeBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags); |
| + Optional<ClipPathClipper> clipPathClipper; |
| + // Clip-path, like border radius, must not be applied to the contents of a composited-scrolling container. |
| + // It must, however, still be applied to the mask layer, so that the compositor can properly mask the |
| + // scrolling contents and scrollbars. |
| + if (m_paintLayer.layoutObject()->hasClipPath() && (!m_paintLayer.needsCompositedScrolling() || (paintFlags & PaintLayerPaintingChildClippingMaskPhase))) { |
| + if (!rootRelativeBoundsComputed) { |
| + rootRelativeBounds = m_paintLayer.physicalBoundingBoxIncludingReflectionAndStackingChildren(offsetFromRoot); |
| + rootRelativeBoundsComputed = true; |
| + } |
| + paintingInfo.ancestorHasClipPathClipping = true; |
| + // When SVG applies the clip and the coordinate system is "userspace on use", we must explicitly pass in |
| + // the layer offset to have the clip paint in the correct location. When the coordinate system is |
| + // "object bounding box" the offset is already accounted for in the rootRelativeBounds. |
|
Stephen Chennney
2016/08/22 16:02:58
This comment belongs in the new location.
fs
2016/08/22 16:23:54
Moved (w/ minor edits.)
|
| + FloatRect floatRootRelativeBounds(rootRelativeBounds); |
| + clipPathClipper.emplace( |
| + context, *m_paintLayer.layoutObject(), floatRootRelativeBounds, floatRootRelativeBounds, FloatPoint(offsetFromRoot)); |
| + } |
| Optional<CompositingRecorder> compositingRecorder; |
| // Blending operations must be performed only with the nearest ancestor stacking context. |