Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Unified Diff: third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp

Issue 2265123002: Refactor ClipPathHelper in PaintLayerPainter.cpp for reuse (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move comment Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/core/paint/ClipPathClipper.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..fbc4742d1338503091c87560e5299f5ea1e4d78a 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,20 @@ 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;
+ 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.
« no previous file with comments | « third_party/WebKit/Source/core/paint/ClipPathClipper.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698