Index: Source/core/rendering/RenderLayer.cpp |
diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp |
index dd85f036da86732a0da7525da31f448a5a183465..ea83bc9e465458e5b59d3e73b430a8b72a3eb3e3 100644 |
--- a/Source/core/rendering/RenderLayer.cpp |
+++ b/Source/core/rendering/RenderLayer.cpp |
@@ -1575,7 +1575,8 @@ void RenderLayer::paint(GraphicsContext* context, const LayoutRect& damageRect, |
OverlapTestRequestMap overlapTestRequests; |
LayerPaintingInfo paintingInfo(this, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot, &overlapTestRequests); |
- paintLayer(context, paintingInfo, paintFlags); |
+ if (shouldPaintLayerInSoftwareMode(context, paintingInfo, paintFlags)) |
+ paintLayer(context, paintingInfo, paintFlags); |
OverlapTestRequestMap::iterator end = overlapTestRequests.end(); |
for (OverlapTestRequestMap::iterator it = overlapTestRequests.begin(); it != end; ++it) |
@@ -1662,11 +1663,6 @@ static void performOverlapTests(OverlapTestRequestMap& overlapTestRequests, cons |
overlapTestRequests.removeAll(overlappedRequestClients); |
} |
-static bool shouldDoSoftwarePaint(const RenderLayer* layer, bool paintingReflection) |
-{ |
- return paintingReflection && !layer->has3DTransform(); |
-} |
- |
static inline bool shouldSuppressPaintingLayer(RenderLayer* layer) |
{ |
// Avoid painting descendants of the root layer when stylesheets haven't loaded. This eliminates FOUC. |
@@ -1693,17 +1689,13 @@ void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo& |
// https://code.google.com/p/chromium/issues/detail?id=343772 |
DisableCompositingQueryAsserts disabler; |
- if (compositingState() != NotComposited && compositingState() != PaintsIntoGroupedBacking) { |
- // 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 (compositingState() != NotComposited) { |
if (context->updatingControlTints() || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers)) { |
+ // 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. |
+ // FIXME: ok, but what about PaintBehaviorFlattenCompositingLayers? That's for printing. |
+ // FIXME: why isn't the code here global, as opposed to being set on each paintLayer() call? |
paintFlags |= PaintLayerUncachedClipRects; |
- } else if (!compositedLayerMapping()->paintsIntoCompositedAncestor() |
- && !shouldDoSoftwarePaint(this, paintFlags & PaintLayerPaintingReflection) |
- && !paintForFixedRootBackground(this, paintFlags)) { |
- // If this RenderLayer should paint into its own backing, that will be done via CompositedLayerMapping::paintContents() |
- // and CompositedLayerMapping::doPaintTask(). |
- return; |
} |
} else if (viewportConstrainedNotCompositedReason() == NotCompositedForBoundsOutOfView) { |
// Don't paint out-of-view viewport constrained layers (when doing prepainting) because they will never be visible |
@@ -2033,6 +2025,18 @@ void RenderLayer::paintLayerByApplyingTransform(GraphicsContext* context, const |
paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags); |
} |
+bool RenderLayer::shouldPaintLayerInSoftwareMode(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) |
+{ |
+ DisableCompositingQueryAsserts disabler; |
+ |
+ return compositingState() == NotComposited |
+ || compositingState() == HasOwnBackingButPaintsIntoAncestor |
+ || context->updatingControlTints() |
+ || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers) |
+ || ((paintFlags & PaintLayerPaintingReflection) && !has3DTransform()) |
+ || paintForFixedRootBackground(this, paintFlags); |
+} |
+ |
void RenderLayer::paintChildren(unsigned childrenToVisit, GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) |
{ |
if (!hasSelfPaintingLayerDescendant()) |
@@ -2045,9 +2049,9 @@ void RenderLayer::paintChildren(unsigned childrenToVisit, GraphicsContext* conte |
RenderLayerStackingNodeIterator iterator(*m_stackingNode, childrenToVisit); |
while (RenderLayerStackingNode* child = iterator.next()) { |
RenderLayer* childLayer = child->layer(); |
- |
- // Squashed RenderLayers should not paint into their ancestor. |
- if (childLayer->compositingState() == PaintsIntoGroupedBacking) |
+ // If this RenderLayer should paint into its own backing or a grouped backing, that will be done via CompositedLayerMapping::paintContents() |
+ // and CompositedLayerMapping::doPaintTask(). |
+ if (!childLayer->shouldPaintLayerInSoftwareMode(context, paintingInfo, paintFlags)) |
continue; |
if (!childLayer->isPaginated()) |