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

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

Issue 2484153003: Use an SVGElementProxy in ReferenceClipPathOperation (Closed)
Patch Set: Rebase; fix comments; findElement Created 4 years, 1 month 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
Index: third_party/WebKit/Source/core/paint/PaintLayer.cpp
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
index ec0536aca76519402847e4444979a0d646a4c544..552fcb53bae7c62861a5ba181e2a454e0944a562 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -110,6 +110,10 @@ struct SameSizeAsPaintLayer : DisplayItemClient {
static_assert(sizeof(PaintLayer) == sizeof(SameSizeAsPaintLayer),
"PaintLayer should stay small");
+bool isReferenceClipPath(const ClipPathOperation* clipOperation) {
+ return clipOperation && clipOperation->type() == ClipPathOperation::REFERENCE;
+}
+
} // namespace
using namespace HTMLNames;
@@ -179,9 +183,15 @@ PaintLayer::PaintLayer(LayoutBoxModelObject* layoutObject)
}
PaintLayer::~PaintLayer() {
- if (m_rareData && m_rareData->filterInfo) {
- layoutObject()->styleRef().filter().removeClient(m_rareData->filterInfo);
- m_rareData->filterInfo->clearLayer();
+ if (m_rareData && m_rareData->resourceInfo) {
+ const ComputedStyle& style = layoutObject()->styleRef();
+ if (style.hasFilter())
+ style.filter().removeClient(m_rareData->resourceInfo);
+ if (isReferenceClipPath(style.clipPath())) {
+ toReferenceClipPathOperation(style.clipPath())
+ ->removeClient(m_rareData->resourceInfo);
+ }
+ m_rareData->resourceInfo->clearLayer();
}
if (layoutObject()->frame() && layoutObject()->frame()->page()) {
if (ScrollingCoordinator* scrollingCoordinator =
@@ -2374,10 +2384,13 @@ bool PaintLayer::hitTestClippedOutByClipPath(
return !clipPath->path(FloatRect(referenceBox)).contains(point);
}
DCHECK_EQ(clipPathOperation->type(), ClipPathOperation::REFERENCE);
- ReferenceClipPathOperation* referenceClipPathOperation =
- toReferenceClipPathOperation(clipPathOperation);
- Element* element = layoutObject()->document().getElementById(
- referenceClipPathOperation->fragment());
+ Node* targetNode = layoutObject()->node();
+ if (!targetNode)
+ return false;
+ const ReferenceClipPathOperation& referenceClipPathOperation =
+ toReferenceClipPathOperation(*clipPathOperation);
+ SVGElement* element =
+ referenceClipPathOperation.findElement(targetNode->treeScope());
if (!isSVGClipPathElement(element) || !element->layoutObject())
return false;
LayoutSVGResourceClipper* clipper = toLayoutSVGResourceClipper(
@@ -2645,8 +2658,8 @@ void PaintLayer::ensureCompositedLayerMapping() {
m_rareData->compositedLayerMapping->setNeedsGraphicsLayerUpdate(
GraphicsLayerUpdateSubtree);
- if (PaintLayerFilterInfo* filterInfo = this->filterInfo())
- filterInfo->invalidateFilterChain();
+ if (PaintLayerResourceInfo* resourceInfo = this->resourceInfo())
+ resourceInfo->invalidateFilterChain();
}
void PaintLayer::clearCompositedLayerMapping(bool layerBeingDestroyed) {
@@ -2667,8 +2680,8 @@ void PaintLayer::clearCompositedLayerMapping(bool layerBeingDestroyed) {
if (layerBeingDestroyed)
return;
- if (PaintLayerFilterInfo* filterInfo = this->filterInfo())
- filterInfo->invalidateFilterChain();
+ if (PaintLayerResourceInfo* resourceInfo = this->resourceInfo())
+ resourceInfo->invalidateFilterChain();
}
void PaintLayer::setGroupedMapping(CompositedLayerMapping* groupedMapping,
@@ -2871,17 +2884,31 @@ void PaintLayer::updateFilters(const ComputedStyle* oldStyle,
if (!newStyle.hasFilterInducingProperty() &&
(!oldStyle || !oldStyle->hasFilterInducingProperty()))
return;
- const bool hadFilterInfo = filterInfo();
+ const bool hadResourceInfo = resourceInfo();
if (newStyle.hasFilterInducingProperty())
- newStyle.filter().addClient(&ensureFilterInfo());
- if (hadFilterInfo && oldStyle)
- oldStyle->filter().removeClient(filterInfo());
- if (!newStyle.hasFilterInducingProperty()) {
- removeFilterInfo();
+ newStyle.filter().addClient(&ensureResourceInfo());
+ if (hadResourceInfo && oldStyle)
+ oldStyle->filter().removeClient(resourceInfo());
+ if (PaintLayerResourceInfo* resourceInfo = this->resourceInfo())
+ resourceInfo->invalidateFilterChain();
+}
+
+void PaintLayer::updateClipPath(const ComputedStyle* oldStyle,
+ const ComputedStyle& newStyle) {
+ ClipPathOperation* newClipOperation = newStyle.clipPath();
+ ClipPathOperation* oldClipOperation =
+ oldStyle ? oldStyle->clipPath() : nullptr;
+ if (!newClipOperation && !oldClipOperation)
return;
+ const bool hadResourceInfo = resourceInfo();
+ if (isReferenceClipPath(newClipOperation)) {
+ toReferenceClipPathOperation(newClipOperation)
+ ->addClient(&ensureResourceInfo());
+ }
+ if (hadResourceInfo && isReferenceClipPath(oldClipOperation)) {
+ toReferenceClipPathOperation(oldClipOperation)
+ ->removeClient(resourceInfo());
}
- if (PaintLayerFilterInfo* filterInfo = this->filterInfo())
- filterInfo->invalidateFilterChain();
}
bool PaintLayer::attemptDirectCompositingUpdate(StyleDifference diff,
@@ -2967,6 +2994,7 @@ void PaintLayer::styleDidChange(StyleDifference diff,
updateTransform(oldStyle, layoutObject()->styleRef());
updateFilters(oldStyle, layoutObject()->styleRef());
+ updateClipPath(oldStyle, layoutObject()->styleRef());
setNeedsCompositingInputsUpdate();
}
@@ -3011,18 +3039,11 @@ PaintLayer::createCompositorFilterOperationsForBackdropFilter(
return builder.buildFilterOperations(style.backdropFilter());
}
-PaintLayerFilterInfo& PaintLayer::ensureFilterInfo() {
+PaintLayerResourceInfo& PaintLayer::ensureResourceInfo() {
PaintLayerRareData& rareData = ensureRareData();
- if (!rareData.filterInfo)
- rareData.filterInfo = new PaintLayerFilterInfo(this);
- return *rareData.filterInfo;
-}
-
-void PaintLayer::removeFilterInfo() {
- if (!m_rareData || !m_rareData->filterInfo)
- return;
- m_rareData->filterInfo->clearLayer();
- m_rareData->filterInfo = nullptr;
+ if (!rareData.resourceInfo)
+ rareData.resourceInfo = new PaintLayerResourceInfo(this);
+ return *rareData.resourceInfo;
}
void PaintLayer::removeAncestorOverflowLayer(const PaintLayer* removedLayer) {
@@ -3051,11 +3072,11 @@ FilterEffect* PaintLayer::lastFilterEffect() const {
// TODO(chrishtr): ensure (and assert) that compositing is clean here.
if (!paintsWithFilters())
return nullptr;
- PaintLayerFilterInfo* filterInfo = this->filterInfo();
- DCHECK(filterInfo);
+ PaintLayerResourceInfo* resourceInfo = this->resourceInfo();
+ DCHECK(resourceInfo);
- if (filterInfo->lastEffect())
- return filterInfo->lastEffect();
+ if (resourceInfo->lastEffect())
+ return resourceInfo->lastEffect();
const ComputedStyle& style = layoutObject()->styleRef();
FloatRect zoomedReferenceBox;
@@ -3063,9 +3084,9 @@ FilterEffect* PaintLayer::lastFilterEffect() const {
zoomedReferenceBox = boxForFilter();
FilterEffectBuilder builder(enclosingNode(), zoomedReferenceBox,
style.effectiveZoom());
- filterInfo->setLastEffect(
+ resourceInfo->setLastEffect(
builder.buildFilterEffect(addReflectionToFilterOperations(style)));
- return filterInfo->lastEffect();
+ return resourceInfo->lastEffect();
}
FloatRect PaintLayer::mapRectForFilter(const FloatRect& rect) const {
« no previous file with comments | « third_party/WebKit/Source/core/paint/PaintLayer.h ('k') | third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698