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 f30cfee4a9b410a8374ddc2ddd53ad814de30549..791357a5c10127cf4a5ddeb6d07862c387acd5af 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp |
@@ -97,10 +97,44 @@ namespace { |
static CompositingQueryMode gCompositingQueryMode = |
CompositingQueriesAreOnlyAllowedInCertainDocumentLifecyclePhases; |
+struct SameSizeAsPaintLayer : DisplayItemClient { |
+ int bitFields; |
+ void* pointers[8]; |
+ LayoutUnit layoutUnits[4]; |
+ IntSize size; |
+ OwnPtrWillBePersistent<PaintLayerScrollableArea> scrollableArea; |
+ struct { |
+ IntRect rect; |
+ void* pointers[2]; |
+ } ancestorCompositingInputs; |
+ struct { |
+ void* pointers[2]; |
+ } clipper; |
+ struct { |
+ IntSize size; |
+ void* pointer; |
+ LayoutRect rect; |
+ } previousPaintStatus; |
+}; |
+ |
+static_assert(sizeof(PaintLayer) == sizeof(SameSizeAsPaintLayer), "PaintLayer should stay small"); |
+ |
} // namespace |
using namespace HTMLNames; |
+PaintLayerRareData::PaintLayerRareData() |
+ : enclosingPaginationLayer(nullptr) |
+ , potentialCompositingReasonsFromStyle(CompositingReasonNone) |
+ , compositingReasons(CompositingReasonNone) |
+ , groupedMapping(nullptr) |
+{ |
+} |
+ |
+PaintLayerRareData::~PaintLayerRareData() |
+{ |
+} |
+ |
PaintLayer::PaintLayer(LayoutBoxModelObject* layoutObject, PaintLayerType type) |
: m_layerType(type) |
, m_hasSelfPaintingLayerDescendant(false) |
@@ -129,6 +163,9 @@ PaintLayer::PaintLayer(LayoutBoxModelObject* layoutObject, PaintLayerType type) |
, m_previousPaintResult(PaintLayerPainter::FullyPainted) |
, m_needsPaintPhaseDescendantOutlines(false) |
, m_needsPaintPhaseFloat(false) |
+ , m_hasDescendantWithClipPath(false) |
+ , m_hasNonIsolatedDescendantWithBlendMode(false) |
+ , m_hasAncestorWithClipPath(false) |
, m_layoutObject(layoutObject) |
, m_parent(0) |
, m_previous(0) |
@@ -137,10 +174,6 @@ PaintLayer::PaintLayer(LayoutBoxModelObject* layoutObject, PaintLayerType type) |
, m_last(0) |
, m_staticInlinePosition(0) |
, m_staticBlockPosition(0) |
- , m_enclosingPaginationLayer(0) |
- , m_potentialCompositingReasonsFromStyle(CompositingReasonNone) |
- , m_compositingReasons(CompositingReasonNone) |
- , m_groupedMapping(0) |
, m_clipper(*layoutObject) |
{ |
updateStackingNode(); |
@@ -174,8 +207,8 @@ PaintLayer::~PaintLayer() |
clearCompositedLayerMapping(true); |
- if (m_reflectionInfo) |
- m_reflectionInfo->destroy(); |
+ if (PaintLayerReflectionInfo* reflectionInfo = this->reflectionInfo()) |
+ reflectionInfo->destroy(); |
if (m_scrollableArea) |
m_scrollableArea->dispose(); |
@@ -220,8 +253,8 @@ void PaintLayer::contentChanged(ContentChangeType changeType) |
compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); |
} |
- if (m_compositedLayerMapping) |
- m_compositedLayerMapping->contentChanged(changeType); |
+ if (CompositedLayerMapping* compositedLayerMapping = this->compositedLayerMapping()) |
+ compositedLayerMapping->contentChanged(changeType); |
} |
bool PaintLayer::paintsWithFilters() const |
@@ -231,7 +264,7 @@ bool PaintLayer::paintsWithFilters() const |
// https://code.google.com/p/chromium/issues/detail?id=343759 |
DisableCompositingQueryAsserts disabler; |
- return !m_compositedLayerMapping || compositingState() != PaintsIntoOwnBacking; |
+ return !compositedLayerMapping() || compositingState() != PaintsIntoOwnBacking; |
} |
bool PaintLayer::paintsWithBackdropFilters() const |
@@ -241,17 +274,18 @@ bool PaintLayer::paintsWithBackdropFilters() const |
// https://code.google.com/p/chromium/issues/detail?id=343759 |
DisableCompositingQueryAsserts disabler; |
- return !m_compositedLayerMapping || compositingState() != PaintsIntoOwnBacking; |
+ return !compositedLayerMapping() || compositingState() != PaintsIntoOwnBacking; |
} |
LayoutSize PaintLayer::subpixelAccumulation() const |
{ |
- return m_subpixelAccumulation; |
+ return m_rareData ? m_rareData->subpixelAccumulation : LayoutSize(); |
} |
void PaintLayer::setSubpixelAccumulation(const LayoutSize& size) |
{ |
- m_subpixelAccumulation = size; |
+ if (m_rareData || !size.isZero()) |
+ ensureRareData().subpixelAccumulation = size; |
} |
void PaintLayer::updateLayerPositionsAfterLayout() |
@@ -273,8 +307,8 @@ void PaintLayer::updateLayerPositionRecursive() |
{ |
updateLayerPosition(); |
- if (m_reflectionInfo) |
- m_reflectionInfo->reflection()->layout(); |
+ if (m_rareData && m_rareData->reflectionInfo) |
+ m_rareData->reflectionInfo->reflection()->layout(); |
// FIXME(400589): We would like to do this in PaintLayerScrollableArea::updateAfterLayout, |
// but it depends on the size computed by updateLayerPosition. |
@@ -358,12 +392,12 @@ void PaintLayer::updateLayerPositionsAfterScrollRecursive(const DoubleSize& scro |
void PaintLayer::updateTransformationMatrix() |
{ |
- if (m_transform) { |
+ if (TransformationMatrix* transform = this->transform()) { |
LayoutBox* box = layoutBox(); |
ASSERT(box); |
- m_transform->makeIdentity(); |
- box->style()->applyTransform(*m_transform, LayoutSize(box->pixelSnappedSize()), ComputedStyle::IncludeTransformOrigin, ComputedStyle::IncludeMotionPath, ComputedStyle::IncludeIndependentTransformProperties); |
- makeMatrixRenderable(*m_transform, compositor()->hasAcceleratedCompositing()); |
+ transform->makeIdentity(); |
+ box->style()->applyTransform(*transform, LayoutSize(box->pixelSnappedSize()), ComputedStyle::IncludeTransformOrigin, ComputedStyle::IncludeMotionPath, ComputedStyle::IncludeIndependentTransformProperties); |
+ makeMatrixRenderable(*transform, compositor()->hasAcceleratedCompositing()); |
} |
} |
@@ -377,12 +411,12 @@ void PaintLayer::updateTransform(const ComputedStyle* oldStyle, const ComputedSt |
bool hasTransform = layoutObject()->hasTransformRelatedProperty() && newStyle.hasTransform(); |
bool had3DTransform = has3DTransform(); |
- bool hadTransform = m_transform; |
+ bool hadTransform = transform(); |
if (hasTransform != hadTransform) { |
if (hasTransform) |
- m_transform = adoptPtr(new TransformationMatrix); |
+ ensureRareData().transform = adoptPtr(new TransformationMatrix); |
else |
- m_transform.clear(); |
+ m_rareData->transform.clear(); |
// PaintLayers with transforms act as clip rects roots, so clear the cached clip rects here. |
m_clipper.clearClipRectsIncludingDescendants(); |
@@ -418,23 +452,24 @@ PaintLayer* PaintLayer::renderingContextRoot() |
TransformationMatrix PaintLayer::currentTransform() const |
{ |
- if (!m_transform) |
- return TransformationMatrix(); |
- return *m_transform; |
+ if (TransformationMatrix* transform = this->transform()) |
+ return *transform; |
+ return TransformationMatrix(); |
} |
TransformationMatrix PaintLayer::renderableTransform(GlobalPaintFlags globalPaintFlags) const |
{ |
- if (!m_transform) |
+ TransformationMatrix* transform = this->transform(); |
+ if (!transform) |
return TransformationMatrix(); |
if (globalPaintFlags & GlobalPaintFlattenCompositingLayers) { |
- TransformationMatrix matrix = *m_transform; |
+ TransformationMatrix matrix = *transform; |
makeMatrixRenderable(matrix, false /* flatten 3d */); |
return matrix; |
} |
- return *m_transform; |
+ return *transform; |
} |
void PaintLayer::convertFromFlowThreadToVisualBoundingBoxInAncestor(const PaintLayer* ancestorLayer, LayoutRect& rect) const |
@@ -465,7 +500,8 @@ void PaintLayer::convertFromFlowThreadToVisualBoundingBoxInAncestor(const PaintL |
void PaintLayer::updatePaginationRecursive(bool needsPaginationUpdate) |
{ |
- m_enclosingPaginationLayer = 0; |
+ if (m_rareData) |
+ m_rareData->enclosingPaginationLayer = nullptr; |
if (layoutObject()->isLayoutFlowThread()) |
needsPaginationUpdate = true; |
@@ -477,7 +513,7 @@ void PaintLayer::updatePaginationRecursive(bool needsPaginationUpdate) |
// enclosingPaginationLayer instead of using a simple bit, since we want to be able to get back |
// to that layer easily. |
if (LayoutFlowThread* containingFlowThread = layoutObject()->flowThreadContainingBlock()) |
- m_enclosingPaginationLayer = containingFlowThread->layer(); |
+ ensureRareData().enclosingPaginationLayer = containingFlowThread->layer(); |
} |
for (PaintLayer* child = firstChild(); child; child = child->nextSibling()) |
@@ -486,7 +522,8 @@ void PaintLayer::updatePaginationRecursive(bool needsPaginationUpdate) |
void PaintLayer::clearPaginationRecursive() |
{ |
- m_enclosingPaginationLayer = 0; |
+ if (m_rareData) |
+ m_rareData->enclosingPaginationLayer = nullptr; |
for (PaintLayer* child = firstChild(); child; child = child->nextSibling()) |
child->clearPaginationRecursive(); |
} |
@@ -773,11 +810,12 @@ bool PaintLayer::updateLayerPosition() |
bool positionOrOffsetChanged = false; |
if (layoutObject()->isInFlowPositioned()) { |
LayoutSize newOffset = layoutObject()->offsetForInFlowPosition(); |
- positionOrOffsetChanged = newOffset != m_offsetForInFlowPosition; |
- m_offsetForInFlowPosition = newOffset; |
- localPoint.move(m_offsetForInFlowPosition); |
- } else { |
- m_offsetForInFlowPosition = LayoutSize(); |
+ positionOrOffsetChanged = newOffset != offsetForInFlowPosition(); |
+ if (m_rareData || !newOffset.isZero()) |
+ ensureRareData().offsetForInFlowPosition = newOffset; |
+ localPoint.move(newOffset); |
+ } else if (m_rareData) { |
+ m_rareData->offsetForInFlowPosition = LayoutSize(); |
} |
// FIXME: We'd really like to just get rid of the concept of a layer rectangle and rely on the layoutObjects. |
@@ -871,11 +909,9 @@ PaintLayer* PaintLayer::enclosingTransformedAncestor() const |
LayoutPoint PaintLayer::computeOffsetFromTransformedAncestor() const |
{ |
- const AncestorDependentCompositingInputs& properties = ancestorDependentCompositingInputs(); |
- |
TransformState transformState(TransformState::ApplyTransformDirection, FloatPoint()); |
// FIXME: add a test that checks flipped writing mode and ApplyContainerFlip are correct. |
- layoutObject()->mapLocalToAncestor(properties.transformAncestor ? properties.transformAncestor->layoutObject() : 0, transformState, ApplyContainerFlip); |
+ layoutObject()->mapLocalToAncestor(transformAncestor() ? transformAncestor()->layoutObject() : nullptr, transformState, ApplyContainerFlip); |
transformState.flatten(); |
return LayoutPoint(transformState.lastPlanarPoint()); |
} |
@@ -956,15 +992,21 @@ void PaintLayer::setNeedsCompositingInputsUpdate() |
compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositingInputChange); |
} |
-void PaintLayer::updateAncestorDependentCompositingInputs(const AncestorDependentCompositingInputs& compositingInputs) |
+void PaintLayer::updateAncestorDependentCompositingInputs(const AncestorDependentCompositingInputs& compositingInputs, const RareAncestorDependentCompositingInputs& rareCompositingInputs, bool hasAncestorWithClipPath) |
{ |
m_ancestorDependentCompositingInputs = compositingInputs; |
+ if (rareCompositingInputs.isDefault()) |
+ m_rareAncestorDependentCompositingInputs.clear(); |
+ else |
+ m_rareAncestorDependentCompositingInputs = adoptPtr(new RareAncestorDependentCompositingInputs(rareCompositingInputs)); |
+ m_hasAncestorWithClipPath = hasAncestorWithClipPath; |
m_needsAncestorDependentCompositingInputsUpdate = false; |
} |
-void PaintLayer::updateDescendantDependentCompositingInputs(const DescendantDependentCompositingInputs& compositingInputs) |
+void PaintLayer::updateDescendantDependentCompositingInputs(bool hasDescendantWithClipPath, bool hasNonIsolatedDescendantWithBlendMode) |
{ |
- m_descendantDependentCompositingInputs = compositingInputs; |
+ m_hasDescendantWithClipPath = hasDescendantWithClipPath; |
+ m_hasNonIsolatedDescendantWithBlendMode = hasNonIsolatedDescendantWithBlendMode; |
m_needsDescendantDependentCompositingInputsUpdate = false; |
} |
@@ -978,7 +1020,8 @@ void PaintLayer::didUpdateCompositingInputs() |
bool PaintLayer::hasNonIsolatedDescendantWithBlendMode() const |
{ |
- if (descendantDependentCompositingInputs().hasNonIsolatedDescendantWithBlendMode) |
+ ASSERT(!m_needsDescendantDependentCompositingInputsUpdate); |
+ if (m_hasNonIsolatedDescendantWithBlendMode) |
return true; |
if (layoutObject()->isSVGRoot()) |
return toLayoutSVGRoot(layoutObject())->hasNonIsolatedBlendingDescendants(); |
@@ -987,9 +1030,12 @@ bool PaintLayer::hasNonIsolatedDescendantWithBlendMode() const |
void PaintLayer::setCompositingReasons(CompositingReasons reasons, CompositingReasons mask) |
{ |
- if ((compositingReasons() & mask) == (reasons & mask)) |
+ CompositingReasons oldReasons = m_rareData ? m_rareData->compositingReasons : CompositingReasonNone; |
+ if ((oldReasons & mask) == (reasons & mask)) |
return; |
- m_compositingReasons = (reasons & mask) | (compositingReasons() & ~mask); |
+ CompositingReasons newReasons = (reasons & mask) | (oldReasons & ~mask); |
+ if (m_rareData || newReasons != CompositingReasonNone) |
+ ensureRareData().compositingReasons = newReasons; |
} |
void PaintLayer::setHasCompositingDescendant(bool hasCompositingDescendant) |
@@ -1230,8 +1276,8 @@ void PaintLayer::removeOnlyThisLayer() |
// Remove the child reflection layer before moving other child layers. |
// The reflection layer should not be moved to the parent. |
- if (m_reflectionInfo) |
- removeChild(m_reflectionInfo->reflectionLayer()); |
+ if (PaintLayerReflectionInfo* reflectionInfo = this->reflectionInfo()) |
+ removeChild(reflectionInfo->reflectionLayer()); |
// Now walk our kids and reattach them to our parent. |
PaintLayer* current = m_first; |
@@ -1374,12 +1420,11 @@ void PaintLayer::updateReflectionInfo(const ComputedStyle* oldStyle) |
{ |
ASSERT(!oldStyle || !layoutObject()->style()->reflectionDataEquivalent(oldStyle)); |
if (layoutObject()->hasReflection()) { |
- if (!m_reflectionInfo) |
- m_reflectionInfo = adoptPtr(new PaintLayerReflectionInfo(*layoutBox())); |
- m_reflectionInfo->updateAfterStyleChange(oldStyle); |
- } else if (m_reflectionInfo) { |
- m_reflectionInfo->destroy(); |
- m_reflectionInfo = nullptr; |
+ ensureRareData().reflectionInfo = adoptPtr(new PaintLayerReflectionInfo(*layoutBox())); |
+ m_rareData->reflectionInfo->updateAfterStyleChange(oldStyle); |
+ } else if (m_rareData && m_rareData->reflectionInfo) { |
+ m_rareData->reflectionInfo->destroy(); |
+ m_rareData->reflectionInfo = nullptr; |
} |
} |
@@ -2024,7 +2069,8 @@ void PaintLayer::addBlockSelectionGapsBounds(const LayoutRect& bounds) |
{ |
if (RuntimeEnabledFeatures::selectionPaintingWithoutSelectionGapsEnabled()) |
return; |
- m_blockSelectionGapsBounds.unite(enclosingIntRect(bounds)); |
+ if (!bounds.isEmpty()) |
+ ensureRareData().blockSelectionGapsBounds.unite(enclosingIntRect(bounds)); |
blockSelectionGapsBoundsChanged(); |
} |
@@ -2032,7 +2078,8 @@ void PaintLayer::clearBlockSelectionGapsBounds() |
{ |
if (RuntimeEnabledFeatures::selectionPaintingWithoutSelectionGapsEnabled()) |
return; |
- m_blockSelectionGapsBounds = IntRect(); |
+ if (m_rareData) |
+ m_rareData->blockSelectionGapsBounds = IntRect(); |
for (PaintLayer* child = firstChild(); child; child = child->nextSibling()) |
child->clearBlockSelectionGapsBounds(); |
blockSelectionGapsBoundsChanged(); |
@@ -2049,10 +2096,10 @@ void PaintLayer::invalidatePaintForBlockSelectionGaps() |
child->invalidatePaintForBlockSelectionGaps(); |
} |
- if (m_blockSelectionGapsBounds.isEmpty()) |
+ if (!m_rareData || m_rareData->blockSelectionGapsBounds.isEmpty()) |
return; |
- LayoutRect rect(m_blockSelectionGapsBounds); |
+ LayoutRect rect(m_rareData->blockSelectionGapsBounds); |
if (layoutObject()->hasOverflowClip()) { |
LayoutBox* box = layoutBox(); |
rect.move(-box->scrolledContentOffset()); |
@@ -2270,12 +2317,12 @@ CompositingState PaintLayer::compositingState() const |
// This is computed procedurally so there is no redundant state variable that |
// can get out of sync from the real actual compositing state. |
- if (m_groupedMapping) { |
- ASSERT(!m_compositedLayerMapping); |
+ if (groupedMapping()) { |
+ ASSERT(!compositedLayerMapping()); |
return PaintsIntoGroupedBacking; |
} |
- if (!m_compositedLayerMapping) |
+ if (!compositedLayerMapping()) |
return NotComposited; |
return PaintsIntoOwnBacking; |
@@ -2291,7 +2338,7 @@ bool PaintLayer::isAllowedToQueryCompositingState() const |
CompositedLayerMapping* PaintLayer::compositedLayerMapping() const |
{ |
ASSERT(isAllowedToQueryCompositingState()); |
- return m_compositedLayerMapping.get(); |
+ return m_rareData ? m_rareData->compositedLayerMapping.get() : nullptr; |
} |
GraphicsLayer* PaintLayer::graphicsLayerBacking() const |
@@ -2320,11 +2367,11 @@ GraphicsLayer* PaintLayer::graphicsLayerBackingForScrolling() const |
void PaintLayer::ensureCompositedLayerMapping() |
{ |
- if (m_compositedLayerMapping) |
+ if (m_rareData && m_rareData->compositedLayerMapping) |
return; |
- m_compositedLayerMapping = adoptPtr(new CompositedLayerMapping(*this)); |
- m_compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); |
+ ensureRareData().compositedLayerMapping = adoptPtr(new CompositedLayerMapping(*this)); |
+ m_rareData->compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); |
updateOrRemoveFilterEffectBuilder(); |
} |
@@ -2340,7 +2387,8 @@ void PaintLayer::clearCompositedLayerMapping(bool layerBeingDestroyed) |
compositingParent->compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); |
} |
- m_compositedLayerMapping.clear(); |
+ if (m_rareData) |
+ m_rareData->compositedLayerMapping.clear(); |
if (!layerBeingDestroyed) |
updateOrRemoveFilterEffectBuilder(); |
@@ -2348,27 +2396,29 @@ void PaintLayer::clearCompositedLayerMapping(bool layerBeingDestroyed) |
void PaintLayer::setGroupedMapping(CompositedLayerMapping* groupedMapping, SetGroupMappingOptions options) |
{ |
- if (groupedMapping == m_groupedMapping) |
+ CompositedLayerMapping* oldGroupedMapping = this->groupedMapping(); |
+ if (groupedMapping == oldGroupedMapping) |
return; |
- if (options == InvalidateLayerAndRemoveFromMapping && m_groupedMapping) { |
- m_groupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); |
- m_groupedMapping->removeLayerFromSquashingGraphicsLayer(this); |
+ if (options == InvalidateLayerAndRemoveFromMapping && oldGroupedMapping) { |
+ oldGroupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); |
+ oldGroupedMapping->removeLayerFromSquashingGraphicsLayer(this); |
} |
- m_groupedMapping = groupedMapping; |
- ASSERT(!m_groupedMapping || m_groupedMapping->verifyLayerInSquashingVector(this)); |
- if (options == InvalidateLayerAndRemoveFromMapping && m_groupedMapping) |
- m_groupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); |
+ if (m_rareData || groupedMapping) |
+ ensureRareData().groupedMapping = groupedMapping; |
+ ASSERT(!groupedMapping || groupedMapping->verifyLayerInSquashingVector(this)); |
+ if (options == InvalidateLayerAndRemoveFromMapping && groupedMapping) |
+ groupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree); |
} |
bool PaintLayer::hasCompositedMask() const |
{ |
- return m_compositedLayerMapping && m_compositedLayerMapping->hasMaskLayer(); |
+ return m_rareData && m_rareData->compositedLayerMapping && m_rareData->compositedLayerMapping->hasMaskLayer(); |
} |
bool PaintLayer::hasCompositedClippingMask() const |
{ |
- return m_compositedLayerMapping && m_compositedLayerMapping->hasChildClippingMaskLayer(); |
+ return m_rareData && m_rareData->compositedLayerMapping && m_rareData->compositedLayerMapping->hasChildClippingMaskLayer(); |
} |
bool PaintLayer::paintsWithTransform(GlobalPaintFlags globalPaintFlags) const |
@@ -2502,7 +2552,7 @@ void PaintLayer::updateFilters(const ComputedStyle* oldStyle, const ComputedStyl |
bool PaintLayer::attemptDirectCompositingUpdate(StyleDifference diff, const ComputedStyle* oldStyle) |
{ |
- CompositingReasons oldPotentialCompositingReasonsFromStyle = m_potentialCompositingReasonsFromStyle; |
+ CompositingReasons oldPotentialCompositingReasonsFromStyle = potentialCompositingReasonsFromStyle(); |
compositor()->updatePotentialCompositingReasonsFromStyle(this); |
// This function implements an optimization for transforms and opacity. |
@@ -2516,7 +2566,7 @@ bool PaintLayer::attemptDirectCompositingUpdate(StyleDifference diff, const Comp |
return false; |
// The potentialCompositingReasonsFromStyle could have changed without |
// a corresponding StyleDifference if an animation started or ended. |
- if (m_potentialCompositingReasonsFromStyle != oldPotentialCompositingReasonsFromStyle) |
+ if (potentialCompositingReasonsFromStyle() != oldPotentialCompositingReasonsFromStyle) |
return false; |
// We could add support for reflections if we updated the transform on |
// the reflection layers. |
@@ -2529,7 +2579,7 @@ bool PaintLayer::attemptDirectCompositingUpdate(StyleDifference diff, const Comp |
// scheduleSVGFilterLayerUpdateHack(). |
if (layoutObject()->node() && layoutObject()->node()->svgFilterNeedsLayerUpdate()) |
return false; |
- if (!m_compositedLayerMapping) |
+ if (!m_rareData || !m_rareData->compositedLayerMapping) |
return false; |
// To cut off almost all the work in the compositing update for |
@@ -2538,7 +2588,7 @@ bool PaintLayer::attemptDirectCompositingUpdate(StyleDifference diff, const Comp |
// CompositingReasonInlineTransform from the m_compositingReasons, which |
// means that the inline transform actually triggered assumed overlap in |
// the overlap map. |
- if (diff.transformChanged() && !(m_compositingReasons & CompositingReasonInlineTransform)) |
+ if (diff.transformChanged() && (!m_rareData || !(m_rareData->compositingReasons & CompositingReasonInlineTransform))) |
return false; |
// We composite transparent Layers differently from non-transparent |
@@ -2559,7 +2609,7 @@ bool PaintLayer::attemptDirectCompositingUpdate(StyleDifference diff, const Comp |
// that just handles transforms and opacity. GraphicsLayerUpdateLocal |
// will also program bounds, clips, and many other properties that could |
// not possibly have changed. |
- m_compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateLocal); |
+ m_rareData->compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateLocal); |
compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterGeometryChange); |
if (m_scrollableArea) |