| Index: third_party/WebKit/Source/core/paint/ClipPathClipper.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/ClipPathClipper.cpp b/third_party/WebKit/Source/core/paint/ClipPathClipper.cpp
|
| index 723110707b67b346556153faf2addf2e7fc21451..4351c73c849716e31a1eda109058614dde79b871 100644
|
| --- a/third_party/WebKit/Source/core/paint/ClipPathClipper.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/ClipPathClipper.cpp
|
| @@ -5,36 +5,59 @@
|
| #include "core/paint/ClipPathClipper.h"
|
|
|
| #include "core/layout/svg/LayoutSVGResourceClipper.h"
|
| +#include "core/layout/svg/SVGResources.h"
|
| +#include "core/layout/svg/SVGResourcesCache.h"
|
| +#include "core/paint/SVGClipPainter.h"
|
| #include "core/style/ClipPathOperation.h"
|
| #include "platform/graphics/paint/ClipPathRecorder.h"
|
|
|
| namespace blink {
|
|
|
| +namespace {
|
| +
|
| +LayoutSVGResourceClipper* resolveElementReference(
|
| + const LayoutObject& layoutObject,
|
| + const ReferenceClipPathOperation& referenceClipPathOperation)
|
| +{
|
| + if (layoutObject.isSVG()) {
|
| + // The reference will have been resolved in
|
| + // SVGResources::buildResources, so we can just use the LayoutObject's
|
| + // SVGResources.
|
| + SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject(&layoutObject);
|
| + return resources ? resources->clipper() : nullptr;
|
| + }
|
| + // TODO(fs): It doesn't work with forward or external SVG references (https://bugs.webkit.org/show_bug.cgi?id=90405)
|
| + Element* element = layoutObject.document().getElementById(referenceClipPathOperation.fragment());
|
| + if (!isSVGClipPathElement(element) || !element->layoutObject())
|
| + return nullptr;
|
| + return toLayoutSVGResourceClipper(toLayoutSVGResourceContainer(element->layoutObject()));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| ClipPathClipper::ClipPathClipper(
|
| GraphicsContext& context,
|
| + ClipPathOperation& clipPathOperation,
|
| const LayoutObject& layoutObject,
|
| const FloatRect& referenceBox,
|
| const FloatPoint& origin)
|
| : m_resourceClipper(nullptr)
|
| - , m_clipperState(SVGClipPainter::ClipperNotApplied)
|
| + , m_clipperState(ClipperState::NotApplied)
|
| , m_layoutObject(layoutObject)
|
| , m_context(context)
|
| {
|
| - DCHECK(layoutObject.styleRef().clipPath());
|
| - ClipPathOperation* clipPathOperation = layoutObject.styleRef().clipPath();
|
| - if (clipPathOperation->type() == ClipPathOperation::SHAPE) {
|
| - ShapeClipPathOperation* shape = toShapeClipPathOperation(clipPathOperation);
|
| - if (!shape->isValid())
|
| + if (clipPathOperation.type() == ClipPathOperation::SHAPE) {
|
| + ShapeClipPathOperation& shape = toShapeClipPathOperation(clipPathOperation);
|
| + if (!shape.isValid())
|
| return;
|
| - m_clipPathRecorder.emplace(context, layoutObject, shape->path(referenceBox));
|
| + m_clipPathRecorder.emplace(context, layoutObject, shape.path(referenceBox));
|
| + m_clipperState = ClipperState::AppliedPath;
|
| } else {
|
| - DCHECK_EQ(clipPathOperation->type(), ClipPathOperation::REFERENCE);
|
| - ReferenceClipPathOperation* referenceClipPathOperation = toReferenceClipPathOperation(clipPathOperation);
|
| - // TODO(fs): It doesn't work with forward or external SVG references (https://bugs.webkit.org/show_bug.cgi?id=90405)
|
| - Element* element = layoutObject.document().getElementById(referenceClipPathOperation->fragment());
|
| - if (!isSVGClipPathElement(element) || !element->layoutObject())
|
| + DCHECK_EQ(clipPathOperation.type(), ClipPathOperation::REFERENCE);
|
| + LayoutSVGResourceClipper* clipper = resolveElementReference(
|
| + layoutObject, toReferenceClipPathOperation(clipPathOperation));
|
| + if (!clipper)
|
| return;
|
| - LayoutSVGResourceClipper* clipper = toLayoutSVGResourceClipper(toLayoutSVGResourceContainer(element->layoutObject()));
|
| // Compute the (conservative) bounds of the clip-path.
|
| FloatRect clipPathBounds = clipper->resourceBoundingBox(referenceBox);
|
| // When SVG applies the clip, and the coordinate system is "userspace on use", we must explicitly pass in
|
|
|