void RenderLayerStackingNode::collectLayers(OwnPtr<Vector<RenderLayerStackingNode*> >& posBuffer, OwnPtr<Vector<RenderLayerStackingNode*> >& negBuffer, const RenderLayerStackingNode* nodeToForceAsStackingContainer, CollectLayersBehavior collectLayersBehavior) { if (layer()->isInTopLayer()) return; layer()->updateDescendantDependentFlags(); bool isStacking = false; bool isNormalFlow = false; switch (collectLayersBehavior) { case ForceLayerToStackingContainer: ASSERT(nodeToForceAsStackingContainer); if (this == nodeToForceAsStackingContainer) { isStacking = true; isNormalFlow = false; } else { isStacking = isStackingContext(); isNormalFlow = shouldBeNormalFlowOnlyIgnoringCompositedScrolling(); } break; case OverflowScrollCanBeStackingContainers: ASSERT(!nodeToForceAsStackingContainer); isStacking = isStackingContainer(); isNormalFlow = isNormalFlowOnly(); break; case OnlyStackingContextsCanBeStackingContainers: isStacking = isStackingContext(); isNormalFlow = shouldBeNormalFlowOnlyIgnoringCompositedScrolling(); break; } // Overflow layers are just painted by their enclosing layers, so they don't get put in zorder lists. if (!isNormalFlow && !layer()->isOutOfFlowRenderFlowThread()) { // Determine which buffer the child should be in. OwnPtr<Vector<RenderLayerStackingNode*> >& buffer = (zIndex() >= 0) ? posBuffer : negBuffer; // Create the buffer if it doesn't exist yet. if (!buffer) buffer = adoptPtr(new Vector<RenderLayerStackingNode*>); // Append ourselves at the end of the appropriate buffer. buffer->append(this); } // Recur into our children to collect more layers, but only if we don't establish // a stacking context/container. if (!isStacking) { for (RenderLayer* child = layer()->firstChild(); child; child = child->nextSibling()) { // Ignore reflections. if (!layer()->reflectionInfo() || layer()->reflectionInfo()->reflectionLayer() != child) child->stackingNode()->collectLayers(posBuffer, negBuffer, nodeToForceAsStackingContainer, collectLayersBehavior); } } }
void RenderLayerStackingNode::collectLayers(OwnPtr<Vector<RenderLayerStackingNode*> >& posBuffer, OwnPtr<Vector<RenderLayerStackingNode*> >& negBuffer) { if (layer()->isInTopLayer()) return; layer()->updateDescendantDependentFlags(); if (!isNormalFlowOnly()) { OwnPtr<Vector<RenderLayerStackingNode*> >& buffer = (zIndex() >= 0) ? posBuffer : negBuffer; if (!buffer) buffer = adoptPtr(new Vector<RenderLayerStackingNode*>); buffer->append(this); } if (!isStackingContext()) { for (RenderLayer* child = layer()->firstChild(); child; child = child->nextSibling()) { if (!layer()->reflectionInfo() || layer()->reflectionInfo()->reflectionLayer() != child) child->stackingNode()->collectLayers(posBuffer, negBuffer); } } }