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

Unified Diff: Source/core/rendering/RenderLayer.cpp

Issue 24921002: Make compositingState explicit (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: ready for review Created 7 years, 3 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
Index: Source/core/rendering/RenderLayer.cpp
diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp
index bf22001508a6ae178aa03294885d340e11aa34fa..6e8143d1369684b6277cfeccb2a91fd065898759 100644
--- a/Source/core/rendering/RenderLayer.cpp
+++ b/Source/core/rendering/RenderLayer.cpp
@@ -247,11 +247,11 @@ bool RenderLayer::canRender3DTransforms() const
bool RenderLayer::paintsWithFilters() const
{
- // FIXME: Eventually there will be more factors than isComposited() to decide whether or not to render the filter
if (!renderer()->hasFilter())
return false;
- if (!isComposited())
+ // FIXME: shouldn't we return true if this layer has a backing but paints into its ancestor?
Ian Vollick 2013/10/01 19:46:22 Whatever we decide for paintsWithTransparency, the
shawnsingh 2013/10/03 03:04:04 done.
+ if (!backing())
return true;
if (!m_backing || !m_backing->canCompositeFilters())
@@ -366,7 +366,7 @@ void RenderLayer::updateLayerPositions(RenderGeometryMap* geometryMap, UpdateLay
// Clear the IsCompositingUpdateRoot flag once we've found the first compositing layer in this update.
bool isUpdateRoot = (flags & IsCompositingUpdateRoot);
- if (isComposited())
+ if (backing())
flags &= ~IsCompositingUpdateRoot;
if (useRegionBasedColumns() && renderer()->isInFlowRenderFlowThread()) {
@@ -380,7 +380,7 @@ void RenderLayer::updateLayerPositions(RenderGeometryMap* geometryMap, UpdateLay
for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
child->updateLayerPositions(geometryMap, flags);
- if ((flags & UpdateCompositingLayers) && isComposited()) {
+ if ((flags & UpdateCompositingLayers) && backing()) {
RenderLayerBacking::UpdateAfterLayoutFlags updateFlags = RenderLayerBacking::CompositingChildrenOnly;
if (flags & NeedsFullRepaintInBacking)
updateFlags |= RenderLayerBacking::NeedsFullRepaint;
@@ -398,7 +398,7 @@ LayoutRect RenderLayer::repaintRectIncludingNonCompositingDescendants() const
LayoutRect repaintRect = m_repaintRect;
for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) {
// Don't include repaint rects for composited child layers; they will paint themselves and have a different origin.
- if (child->isComposited())
+ if (child->backing())
continue;
repaintRect.unite(child->repaintRectIncludingNonCompositingDescendants());
@@ -935,7 +935,7 @@ void RenderLayer::updatePagination()
m_isPaginated = false;
m_enclosingPaginationLayer = 0;
- if (isComposited() || !parent())
+ if (backing() || !parent())
return; // FIXME: We will have to deal with paginated compositing layers someday.
// FIXME: For now the RenderView can't be paginated. Eventually printing will move to a model where it is though.
@@ -1245,7 +1245,7 @@ bool RenderLayer::updateLayerPosition()
localPoint += offset;
}
} else if (parent()) {
- if (isComposited()) {
+ if (backing()) {
// FIXME: Composited layers ignore pagination, so about the best we can do is make sure they're offset into the appropriate column.
// They won't split across columns properly.
LayoutSize columnOffset;
@@ -1421,16 +1421,19 @@ inline bool RenderLayer::shouldRepaintAfterLayout() const
// Composited layers that were moved during a positioned movement only
// layout, don't need to be repainted. They just need to be recomposited.
ASSERT(m_repaintStatus == NeedsFullRepaintForPositionedMovementLayout);
- return !isComposited();
+ return !backing();
}
+// FIXME: having two different functions named enclosingCompositingLayer and enclosingCompositingLayerForRepaint
+// is error-prone and misleading for reading code that uses these functions - especially compounded with
+// the includeSelf option.
RenderLayer* RenderLayer::enclosingCompositingLayer(bool includeSelf) const
{
- if (includeSelf && isComposited())
+ if (includeSelf && backing())
return const_cast<RenderLayer*>(this);
for (const RenderLayer* curr = compositingContainer(this); curr; curr = compositingContainer(curr)) {
- if (curr->isComposited())
+ if (curr->backing())
return const_cast<RenderLayer*>(curr);
}
@@ -1439,11 +1442,11 @@ RenderLayer* RenderLayer::enclosingCompositingLayer(bool includeSelf) const
RenderLayer* RenderLayer::enclosingCompositingLayerForRepaint(bool includeSelf) const
{
- if (includeSelf && isComposited() && !backing()->paintsIntoCompositedAncestor())
+ if (includeSelf && compositingState() == PaintsIntoOwnBacking)
return const_cast<RenderLayer*>(this);
for (const RenderLayer* curr = compositingContainer(this); curr; curr = compositingContainer(curr)) {
- if (curr->isComposited() && !curr->backing()->paintsIntoCompositedAncestor())
+ if (curr->compositingState() == PaintsIntoOwnBacking)
return const_cast<RenderLayer*>(curr);
}
@@ -1481,7 +1484,7 @@ RenderLayer* RenderLayer::enclosingFilterLayer(bool includeSelf) const
RenderLayer* RenderLayer::enclosingFilterRepaintLayer() const
{
for (const RenderLayer* curr = this; curr; curr = curr->parent()) {
- if ((curr != this && curr->requiresFullLayerImageForFilters()) || curr->isComposited() || curr->isRootLayer())
+ if ((curr != this && curr->requiresFullLayerImageForFilters()) || curr->compositingState() == PaintsIntoOwnBacking || curr->isRootLayer())
return const_cast<RenderLayer*>(curr);
}
return 0;
@@ -1512,7 +1515,7 @@ void RenderLayer::setFilterBackendNeedsRepaintingInRect(const LayoutRect& rect)
FloatQuad repaintQuad(rectForRepaint);
LayoutRect parentLayerRect = renderer()->localToContainerQuad(repaintQuad, parentLayer->renderer()).enclosingBoundingBox();
- if (parentLayer->isComposited()) {
+ if (parentLayer->backing()) {
parentLayer->setBackingNeedsRepaintInRect(parentLayerRect);
return;
}
@@ -1543,7 +1546,7 @@ bool RenderLayer::hasAncestorWithFilterOutsets() const
RenderLayer* RenderLayer::clippingRootForPainting() const
{
- if (isComposited())
+ if (backing())
return const_cast<RenderLayer*>(this);
const RenderLayer* current = this;
@@ -1554,7 +1557,7 @@ RenderLayer* RenderLayer::clippingRootForPainting() const
current = compositingContainer(current);
ASSERT(current);
if (current->transform()
- || (current->isComposited() && !current->backing()->paintsIntoCompositedAncestor())
+ || (current->backing() && !current->backing()->paintsIntoCompositedAncestor())
)
return const_cast<RenderLayer*>(current);
}
@@ -1589,11 +1592,11 @@ bool RenderLayer::isTransparent() const
RenderLayer* RenderLayer::transparentPaintingAncestor()
{
- if (isComposited())
+ if (backing())
return 0;
for (RenderLayer* curr = parent(); curr; curr = curr->parent()) {
- if (curr->isComposited())
+ if (curr->backing())
return 0;
if (curr->isTransparent())
return curr;
@@ -2032,7 +2035,7 @@ bool RenderLayer::usesCompositedScrolling() const
if (box && (box->isIntristicallyScrollable(VerticalScrollbar) || box->isIntristicallyScrollable(HorizontalScrollbar)))
return false;
- return isComposited() && backing()->scrollingLayer();
+ return backing() && backing()->scrollingLayer();
}
bool RenderLayer::needsCompositedScrolling() const
@@ -2758,7 +2761,7 @@ void RenderLayer::positionOverflowControls(const IntSize& offsetFromRoot)
if (m_resizer)
m_resizer->setFrameRect(resizerCornerRect(borderBox, ResizerForPointer));
- if (isComposited())
+ if (backing())
backing()->positionOverflowControlsLayers(offsetFromRoot);
}
@@ -3050,7 +3053,7 @@ static bool paintForFixedRootBackground(const RenderLayer* layer, RenderLayer::P
void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
{
- if (isComposited()) {
+ if (backing()) {
// The updatingControlTints() painting pass goes through compositing layers,
// but we need to ensure that we don't cache clip rects computed with the wrong root in this case.
if (context->updatingControlTints() || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers)) {
@@ -4862,7 +4865,7 @@ IntRect RenderLayer::calculateLayerBounds(const RenderLayer* ancestorLayer, cons
const_cast<RenderLayer*>(this)->updateLayerListsIfNeeded();
if (RenderLayer* reflection = reflectionLayer()) {
- if (!reflection->isComposited()) {
+ if (!reflection->backing()) {
IntRect childUnionBounds = reflection->calculateLayerBounds(this, 0, descendantFlags);
unionBounds.unite(childUnionBounds);
}
@@ -4878,7 +4881,7 @@ IntRect RenderLayer::calculateLayerBounds(const RenderLayer* ancestorLayer, cons
size_t listSize = negZOrderList->size();
for (size_t i = 0; i < listSize; ++i) {
RenderLayer* curLayer = negZOrderList->at(i);
- if (flags & IncludeCompositedDescendants || !curLayer->isComposited()) {
+ if (flags & IncludeCompositedDescendants || !curLayer->backing()) {
IntRect childUnionBounds = curLayer->calculateLayerBounds(this, 0, descendantFlags);
unionBounds.unite(childUnionBounds);
}
@@ -4889,7 +4892,7 @@ IntRect RenderLayer::calculateLayerBounds(const RenderLayer* ancestorLayer, cons
size_t listSize = posZOrderList->size();
for (size_t i = 0; i < listSize; ++i) {
RenderLayer* curLayer = posZOrderList->at(i);
- if (flags & IncludeCompositedDescendants || !curLayer->isComposited()) {
+ if (flags & IncludeCompositedDescendants || !curLayer->backing()) {
IntRect childUnionBounds = curLayer->calculateLayerBounds(this, 0, descendantFlags);
unionBounds.unite(childUnionBounds);
}
@@ -4900,7 +4903,7 @@ IntRect RenderLayer::calculateLayerBounds(const RenderLayer* ancestorLayer, cons
size_t listSize = normalFlowList->size();
for (size_t i = 0; i < listSize; ++i) {
RenderLayer* curLayer = normalFlowList->at(i);
- if (flags & IncludeCompositedDescendants || !curLayer->isComposited()) {
+ if (flags & IncludeCompositedDescendants || !curLayer->backing()) {
IntRect curAbsBounds = curLayer->calculateLayerBounds(this, 0, descendantFlags);
unionBounds.unite(curAbsBounds);
}
@@ -4953,6 +4956,21 @@ void RenderLayer::clearClipRects(ClipRectsType typeToClear)
}
}
+CompositingState RenderLayer::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_backing)
+ return NotComposited;
+
+ if (m_backing && backing()->paintsIntoCompositedAncestor())
+ return HasOwnBackingButPaintsIntoAncestor;
+
+ ASSERT(m_backing);
+ return PaintsIntoOwnBacking;
+}
+
RenderLayerBacking* RenderLayer::ensureBacking()
{
if (!m_backing) {
@@ -5014,7 +5032,8 @@ GraphicsLayer* RenderLayer::layerForScrollCorner() const
bool RenderLayer::paintsWithTransform(PaintBehavior paintBehavior) const
{
- return transform() && ((paintBehavior & PaintBehaviorFlattenCompositingLayers) || !isComposited());
+ // FIXME: shouldn't we return true if this layer has a backing but paints into its ancestor?
+ return transform() && ((paintBehavior & PaintBehaviorFlattenCompositingLayers) || !backing());
}
bool RenderLayer::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) const
@@ -5065,7 +5084,7 @@ bool RenderLayer::listBackgroundIsKnownToBeOpaqueInRect(const Vector<RenderLayer
for (Vector<RenderLayer*>::const_reverse_iterator iter = list->rbegin(); iter != list->rend(); ++iter) {
const RenderLayer* childLayer = *iter;
- if (childLayer->isComposited())
+ if (childLayer->backing())
continue;
if (!childLayer->canUseConvertToLayerCoords())
@@ -5322,7 +5341,7 @@ void RenderLayer::repaintIncludingDescendants()
void RenderLayer::setBackingNeedsRepaint()
{
- ASSERT(isComposited());
+ ASSERT(backing());
backing()->setContentsNeedDisplay();
}
@@ -5330,8 +5349,8 @@ void RenderLayer::setBackingNeedsRepaintInRect(const LayoutRect& r)
{
// https://bugs.webkit.org/show_bug.cgi?id=61159 describes an unreproducible crash here,
// so assert but check that the layer is composited.
- ASSERT(isComposited());
- if (!isComposited()) {
+ ASSERT(backing());
+ if (!backing()) {
// If we're trying to repaint the placeholder document layer, propagate the
// repaint to the native view system.
LayoutRect absRect(r);
@@ -5352,7 +5371,7 @@ void RenderLayer::repaintIncludingNonCompositingDescendants(RenderLayerModelObje
renderer()->repaintUsingContainer(repaintContainer, pixelSnappedIntRect(renderer()->clippedOverflowRectForRepaint(repaintContainer)));
for (RenderLayer* curr = firstChild(); curr; curr = curr->nextSibling()) {
- if (!curr->isComposited())
+ if (!curr->backing())
curr->repaintIncludingNonCompositingDescendants(repaintContainer);
}
}
@@ -5558,7 +5577,7 @@ inline bool RenderLayer::needsCompositingLayersRebuiltForClip(const RenderStyle*
inline bool RenderLayer::needsCompositingLayersRebuiltForOverflow(const RenderStyle* oldStyle, const RenderStyle* newStyle) const
{
ASSERT(newStyle);
- return !isComposited() && oldStyle && (oldStyle->overflowX() != newStyle->overflowX()) && ancestorStackingContainer()->hasCompositingDescendant();
+ return !backing() && oldStyle && (oldStyle->overflowX() != newStyle->overflowX()) && ancestorStackingContainer()->hasCompositingDescendant();
}
inline bool RenderLayer::needsCompositingLayersRebuiltForFilters(const RenderStyle* oldStyle, const RenderStyle* newStyle, bool didPaintWithFilters) const
@@ -5602,7 +5621,7 @@ void RenderLayer::updateFilters(const RenderStyle* oldStyle, const RenderStyle*
updateOrRemoveFilterClients();
// During an accelerated animation, both WebKit and the compositor animate properties.
// However, WebKit shouldn't ask the compositor to update its filters if the compositor is performing the animation.
- bool shouldUpdateFilters = isComposited() && !renderer()->animation()->isRunningAcceleratedAnimationOnRenderer(renderer(), CSSPropertyWebkitFilter);
+ bool shouldUpdateFilters = backing() && !renderer()->animation()->isRunningAcceleratedAnimationOnRenderer(renderer(), CSSPropertyWebkitFilter);
if (shouldUpdateFilters)
backing()->updateFilters(renderer()->style());
updateOrRemoveFilterEffectRenderer();
@@ -5650,7 +5669,7 @@ void RenderLayer::styleChanged(StyleDifference, const RenderStyle* oldStyle)
|| needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle)
|| needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPaintWithFilters))
compositor()->setCompositingLayersNeedRebuild();
- else if (isComposited())
+ else if (backing())
backing()->updateGraphicsLayerGeometry();
}

Powered by Google App Engine
This is Rietveld 408576698