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

Side by Side Diff: Source/core/rendering/RenderLayer.cpp

Issue 13467028: Add an intermediate function to generate 2 paint-order lists. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fix rebase mistake Created 7 years, 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 #include "RenderTreeAsText.h" 93 #include "RenderTreeAsText.h"
94 #include "RenderView.h" 94 #include "RenderView.h"
95 #include "ScaleTransformOperation.h" 95 #include "ScaleTransformOperation.h"
96 #include "ScrollAnimator.h" 96 #include "ScrollAnimator.h"
97 #include "Scrollbar.h" 97 #include "Scrollbar.h"
98 #include "ScrollbarTheme.h" 98 #include "ScrollbarTheme.h"
99 #include "ScrollingCoordinator.h" 99 #include "ScrollingCoordinator.h"
100 #include "Settings.h" 100 #include "Settings.h"
101 #include "ShadowRoot.h" 101 #include "ShadowRoot.h"
102 #include "SourceGraphic.h" 102 #include "SourceGraphic.h"
103 #include "StaticHashSetNodeList.h"
103 #include "StylePropertySet.h" 104 #include "StylePropertySet.h"
104 #include "StyleResolver.h" 105 #include "StyleResolver.h"
105 #include "TextStream.h" 106 #include "TextStream.h"
106 #include "TransformationMatrix.h" 107 #include "TransformationMatrix.h"
107 #include "TranslateTransformOperation.h" 108 #include "TranslateTransformOperation.h"
108 #include "WebCoreMemoryInstrumentation.h" 109 #include "WebCoreMemoryInstrumentation.h"
109 #include <wtf/MemoryInstrumentationVector.h> 110 #include <wtf/MemoryInstrumentationVector.h>
110 #include <wtf/StdLibExtras.h> 111 #include <wtf/StdLibExtras.h>
111 #include <wtf/UnusedParam.h> 112 #include <wtf/UnusedParam.h>
112 #include <wtf/text/CString.h> 113 #include <wtf/text/CString.h>
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 633
633 if (!isStackingContext()) { 634 if (!isStackingContext()) {
634 bool newValue = maxIndex - minIndex == count; 635 bool newValue = maxIndex - minIndex == count;
635 bool didUpdate = newValue != m_descendantsAreContiguousInStackingOrder; 636 bool didUpdate = newValue != m_descendantsAreContiguousInStackingOrder;
636 m_descendantsAreContiguousInStackingOrder = newValue; 637 m_descendantsAreContiguousInStackingOrder = newValue;
637 if (didUpdate) 638 if (didUpdate)
638 updateNeedsCompositedScrolling(); 639 updateNeedsCompositedScrolling();
639 } 640 }
640 } 641 }
641 642
643 static inline bool isPositionedContainer(const RenderLayer* layer)
644 {
645 // FIXME: This is not in sync with containingBlock.
646 // RenderObject::canContainFixedPositionedObject() should probably be used
647 // instead.
648 RenderLayerModelObject* layerRenderer = layer->renderer();
649 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform();
650 }
651
652 enum StackingOrderDirection { FromBackground, FromForeground };
653
654 // We'd like to be able to iterate through a single paint order list, but for
655 // efficiency's sake, we hang onto two lists instead (namely, the pos and neg
656 // z-order lists produced by CollectLayers). This function allows us to index
657 // into these two lists as if they were one. It also allows us to index into
658 // this virtual list either from the start or from the end (i.e., in either
659 // stacking order direction).
660 static const RenderLayer* getStackingOrderElementAt(const Vector<RenderLayer*>* posZOrderList, const Vector<RenderLayer*>* negZOrderList, const StackingOrderDir ection direction, const size_t index)
661 {
662 size_t negZOrderListSize = negZOrderList ? negZOrderList->size() : 0;
663
664 if (direction == FromBackground) {
665 if (index < negZOrderListSize)
666 return negZOrderList->at(index);
667
668 return posZOrderList->at(index - negZOrderListSize);
669 }
670
671 size_t posZOrderListSize = posZOrderList ? posZOrderList->size() : 0;
672
673 if (index < posZOrderListSize)
674 return posZOrderList->at(posZOrderListSize - index - 1);
675
676 return negZOrderList->at(negZOrderListSize - (index - posZOrderListSize) - 1 );
677 }
678
679 // Compute what positive and negative z-order lists would look like before and
680 // after promotion, so we can later ensure that proper stacking order is
681 // preserved between the two sets of lists.
682 //
683 // A few examples:
684 // c = currentLayer
685 // - = negative z-order child of currentLayer
686 // + = positive z-order child of currentLayer
687 // a = positioned ancestor of currentLayer
688 // x = any other RenderLayer in the list
689 //
690 // (a) xxxxx-----++a+++x
691 // (b) xxx-----c++++++xx
692 //
693 //
694 // Normally the current layer would be painted in the normal flow list if it
695 // doesn't already appear in the positive z-order list. However, in the case
696 // that the layer has a positioned ancestor, it will paint directly after the
697 // positioned ancestor. In example (a), the current layer would be painted in
698 // the middle of its own positive z-order children, so promoting would cause a
699 // change in paint order (since a promoted layer will paint all of its positive
700 // z-order children strictly after it paints itself).
701 //
702 // In example (b), it is ok to promote the current layer only if it does not
703 // have a background. If it has a background, the background gets painted before
704 // the layer's negative z-order children, so again, a promotion would cause a
705 // change in paint order (causing the background to get painted after the
706 // negative z-order children instead of before).
707 void RenderLayer::collectBeforePromotionZOrderList(
Julien - ping for review 2013/04/22 21:49:30 Some of the line breaking are *really* weird (like
hartmanng 2013/04/23 21:32:37 Done.
708 RenderLayer* ancestorStackingContext,
709 OwnPtr<Vector<RenderLayer*> >& posZOrderListBeforePromote,
710 OwnPtr<Vector<RenderLayer*> >& negZOrderListBeforePromote)
711 {
712 // We can't use TemporaryChange<> here since m_needsCompositedScrolling and
713 // m_isNormalFlowOnly are both bitfields, so we have to do it the
714 // old-fashioned way.
715 bool oldNeedsCompositedScrolling = m_needsCompositedScrolling;
716 bool oldIsNormalFlowOnly = m_isNormalFlowOnly;
717
718 // Set the flag on the current layer, then rebuild ancestor stacking
719 // context's lists. This way, we can see the exact effects that promoting
720 // this layer would cause.
721 m_needsCompositedScrolling = false;
722 m_isNormalFlowOnly = shouldBeNormalFlowOnly();
723 ancestorStackingContext->rebuildZOrderLists(StopAtStackingContexts, posZOrde rListBeforePromote, negZOrderListBeforePromote, 0);
724
725 m_needsCompositedScrolling = oldNeedsCompositedScrolling;
726 m_isNormalFlowOnly = oldIsNormalFlowOnly;
727
728
729 size_t posZOrderListSizeBeforePromote = posZOrderListBeforePromote ? posZOrd erListBeforePromote->size() : 0;
730
731 const RenderLayer* positionedAncestor = parent();
732 while (positionedAncestor && !isPositionedContainer(positionedAncestor) && ! positionedAncestor->isStackingContext())
733 positionedAncestor = positionedAncestor->parent();
734 if (positionedAncestor && (!isPositionedContainer(positionedAncestor) || pos itionedAncestor->isStackingContext()))
735 positionedAncestor = 0;
736
737 bool currentLayerIsInPosZOrderListBeforePromote = false;
738
739 for (size_t index = 0; index < posZOrderListSizeBeforePromote; index++) {
740 if (posZOrderListBeforePromote->at(index) == this) {
741 currentLayerIsInPosZOrderListBeforePromote = true;
742 break;
743 }
744 }
745
746 // Insert this into the posZOrderistBeforePromote directly after the
747 // positioned ancestor, if there is one. Otherwise, add it to the very
748 // beginning.
749 //
750 // The current layer will appear in the z-order lists after promotion, so
751 // for a meaningful comparison, we must insert it in the z-order lists
752 // before promotion if it does not appear there already.
753 if (!currentLayerIsInPosZOrderListBeforePromote) {
754 if (!positionedAncestor) {
755 if (!posZOrderListBeforePromote)
756 posZOrderListBeforePromote = adoptPtr(new Vector<RenderLayer*>() );
757
758 posZOrderListBeforePromote->prepend(this);
759 posZOrderListSizeBeforePromote++;
760 } else {
761 for (size_t index = 0; index < posZOrderListSizeBeforePromote; index ++) {
762 if (posZOrderListBeforePromote->at(index) == positionedAncestor) {
763 posZOrderListBeforePromote->insert(index + 1, this);
764 posZOrderListSizeBeforePromote++;
765 break;
766 }
767 }
768 }
769 }
770 }
771
772 void RenderLayer::collectAfterPromotionZOrderList(
773 RenderLayer* ancestorStackingContext,
774 OwnPtr<Vector<RenderLayer*> >& posZOrderListAfterPromote,
775 OwnPtr<Vector<RenderLayer*> >& negZOrderListAfterPromote)
776 {
777 // We can't use TemporaryChange<> here since m_needsCompositedScrolling and
778 // m_isNormalFlowOnly are both bitfields, so we have to do it the
779 // old-fashioned way.
780 bool oldNeedsCompositedScrolling = m_needsCompositedScrolling;
781 bool oldIsNormalFlowOnly = m_isNormalFlowOnly;
782
783 // Set the flag on the current layer, then rebuild ancestor stacking
784 // context's lists. This way, we can see the exact effects that promoting
785 // this layer would cause.
786 m_isNormalFlowOnly = false;
787 m_needsCompositedScrolling = true;
788 ancestorStackingContext->rebuildZOrderLists(StopAtStackingContexts, posZOrde rListAfterPromote, negZOrderListAfterPromote, this);
789
790 m_needsCompositedScrolling = oldNeedsCompositedScrolling;
791 m_isNormalFlowOnly = oldIsNormalFlowOnly;
792 }
793
794 #ifndef NDEBUG
795 String RenderLayer::paintOrderListsAsText()
796 {
797 OwnPtr<Vector<RenderLayer*> > posZOrderListBeforePromote;
798 OwnPtr<Vector<RenderLayer*> > negZOrderListBeforePromote;
799 OwnPtr<Vector<RenderLayer*> > posZOrderListAfterPromote;
800 OwnPtr<Vector<RenderLayer*> > negZOrderListAfterPromote;
801
802 RenderLayer* ancestorStackingContext = this;
803
804 while (ancestorStackingContext) {
805 if (ancestorStackingContext != this && ancestorStackingContext->isStacki ngContext())
Julien - ping for review 2013/04/22 21:49:30 The 'ancestorStackingContext != this' check is art
hartmanng 2013/04/23 21:32:37 Done.
806 break;
807 ancestorStackingContext = ancestorStackingContext->parent();
808 }
Julien - ping for review 2013/04/22 21:49:30 This should be in its own function really as it is
hartmanng 2013/04/23 21:32:37 Done.
809
810 if (!ancestorStackingContext)
811 return String();
812
813 collectBeforePromotionZOrderList(ancestorStackingContext, posZOrderListBefor ePromote, negZOrderListBeforePromote);
814 collectAfterPromotionZOrderList(ancestorStackingContext, posZOrderListAfterP romote, negZOrderListAfterPromote);
Julien - ping for review 2013/04/22 21:49:30 The code duplication makes me sad. It seems that i
hartmanng 2013/04/23 21:32:37 I'm not sure I understand your suggestion. collec
815
816 size_t posZOrderListSizeBeforePromote = posZOrderListBeforePromote ? posZOrd erListBeforePromote->size() : 0;
817 size_t negZOrderListSizeBeforePromote = negZOrderListBeforePromote ? negZOrd erListBeforePromote->size() : 0;
818 size_t posZOrderListSizeAfterPromote = posZOrderListAfterPromote ? posZOrder ListAfterPromote->size() : 0;
819 size_t negZOrderListSizeAfterPromote = negZOrderListAfterPromote ? negZOrder ListAfterPromote->size() : 0;
820
821 size_t sizeBeforePromote = posZOrderListSizeBeforePromote + negZOrderListSiz eBeforePromote;
822 size_t sizeAfterPromote = posZOrderListSizeAfterPromote + negZOrderListSizeA fterPromote;
823
824 TextStream ts;
825
826 ts << "Layer: " << this << " \"" << debugName() << "\", z-index: " << render er()->style()->zIndex() << "\n";
827
828 ts << " stacking context's paint order list BEFORE promote:\n";
829 for (size_t index = 0; index < sizeBeforePromote; index++) {
830 const RenderLayer* layerBeforePromote = getStackingOrderElementAt(posZOr derListBeforePromote.get(), negZOrderListBeforePromote.get(), FromBackground, in dex);
831 ts << " " << layerBeforePromote << " \"" << layerBeforePromote->debug Name() << "\", z-index: " << layerBeforePromote->renderer()->style()->zIndex() < < "\n";
832 }
833
834 ts << " stacking context's paint order list AFTER promote:\n";
835 for (size_t index = 0; index < sizeAfterPromote; index++) {
836 const RenderLayer* layerAfterPromote = getStackingOrderElementAt(posZOrd erListAfterPromote.get(), negZOrderListAfterPromote.get(), FromBackground, index );
837 ts << " " << layerAfterPromote << " \"" << layerAfterPromote->debugNa me() << "\", z-index: " << layerAfterPromote->renderer()->style()->zIndex() << " \n";
838 }
839
840 return ts.release();
841 }
842 #endif
843
844 PassRefPtr<NodeList> RenderLayer::paintOrderListBeforePromote()
hartmanng 2013/04/23 21:32:37 I reworked these two functions, and the ones in In
845 {
846 OwnPtr<Vector<RenderLayer*> > posZOrderListBeforePromote;
847 OwnPtr<Vector<RenderLayer*> > negZOrderListBeforePromote;
848
849 RenderLayer* ancestorStackingContext = this;
850
851 while (ancestorStackingContext) {
852 if (ancestorStackingContext != this && ancestorStackingContext->isStacki ngContext())
853 break;
854 ancestorStackingContext = ancestorStackingContext->parent();
855 }
856
857 if (!ancestorStackingContext)
858 return 0;
859
860 collectBeforePromotionZOrderList(ancestorStackingContext,
861 posZOrderListBeforePromote, negZOrderListBeforePromote);
862
863 size_t posZOrderListSizeBeforePromote = posZOrderListBeforePromote ? posZOrd erListBeforePromote->size() : 0;
864 size_t negZOrderListSizeBeforePromote = negZOrderListBeforePromote ? negZOrd erListBeforePromote->size() : 0;
865
866 size_t sizeBeforePromote = posZOrderListSizeBeforePromote + negZOrderListSiz eBeforePromote;
867
868 ListHashSet<RefPtr<Node> > listBeforePromote;
869 for (size_t index = 0; index < sizeBeforePromote; index++) {
870 const RenderLayer* layerBeforePromote = getStackingOrderElementAt(posZOr derListBeforePromote.get(), negZOrderListBeforePromote.get(), FromBackground, in dex);
871 listBeforePromote.add(layerBeforePromote->renderer()->node());
872 }
873
874 return StaticHashSetNodeList::adopt(listBeforePromote);
875 }
876
877 PassRefPtr<NodeList> RenderLayer::paintOrderListAfterPromote()
878 {
879 OwnPtr<Vector<RenderLayer*> > posZOrderListAfterPromote;
880 OwnPtr<Vector<RenderLayer*> > negZOrderListAfterPromote;
881
882 RenderLayer* ancestorStackingContext = this;
883
884 while (ancestorStackingContext) {
885 if (ancestorStackingContext != this && ancestorStackingContext->isStacki ngContext())
886 break;
887 ancestorStackingContext = ancestorStackingContext->parent();
888 }
889
890 if (!ancestorStackingContext)
891 return 0;
892
893 collectAfterPromotionZOrderList(ancestorStackingContext,
894 posZOrderListAfterPromote, negZOrderListAfterPromote);
895
896 size_t posZOrderListSizeAfterPromote = posZOrderListAfterPromote ? posZOrder ListAfterPromote->size() : 0;
897 size_t negZOrderListSizeAfterPromote = negZOrderListAfterPromote ? negZOrder ListAfterPromote->size() : 0;
898
899 size_t sizeAfterPromote = posZOrderListSizeAfterPromote + negZOrderListSizeA fterPromote;
900
901 ListHashSet<RefPtr<Node> > listAfterPromote;
902 for (size_t index = 0; index < sizeAfterPromote; index++) {
903 const RenderLayer* layerAfterPromote = getStackingOrderElementAt(posZOrd erListAfterPromote.get(), negZOrderListAfterPromote.get(), FromBackground, index );
904 listAfterPromote.add(layerAfterPromote->renderer()->node());
905 }
906
907 return StaticHashSetNodeList::adopt(listAfterPromote);
908 }
909
910
642 void RenderLayer::computeRepaintRects(const RenderLayerModelObject* repaintConta iner, const RenderGeometryMap* geometryMap) 911 void RenderLayer::computeRepaintRects(const RenderLayerModelObject* repaintConta iner, const RenderGeometryMap* geometryMap)
643 { 912 {
644 ASSERT(!m_visibleContentStatusDirty); 913 ASSERT(!m_visibleContentStatusDirty);
645 914
646 m_repaintRect = renderer()->clippedOverflowRectForRepaint(repaintContainer); 915 m_repaintRect = renderer()->clippedOverflowRectForRepaint(repaintContainer);
647 m_outlineBox = renderer()->outlineBoundsForRepaint(repaintContainer, geometr yMap); 916 m_outlineBox = renderer()->outlineBoundsForRepaint(repaintContainer, geometr yMap);
648 } 917 }
649 918
650 919
651 void RenderLayer::computeRepaintRectsIncludingDescendants() 920 void RenderLayer::computeRepaintRectsIncludingDescendants()
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
1266 RenderLayer* RenderLayer::stackingContext() const 1535 RenderLayer* RenderLayer::stackingContext() const
1267 { 1536 {
1268 RenderLayer* layer = parent(); 1537 RenderLayer* layer = parent();
1269 while (layer && !layer->isStackingContext()) 1538 while (layer && !layer->isStackingContext())
1270 layer = layer->parent(); 1539 layer = layer->parent();
1271 1540
1272 ASSERT(!layer || layer->isStackingContext()); 1541 ASSERT(!layer || layer->isStackingContext());
1273 return layer; 1542 return layer;
1274 } 1543 }
1275 1544
1276 static inline bool isPositionedContainer(RenderLayer* layer)
1277 {
1278 RenderLayerModelObject* layerRenderer = layer->renderer();
1279 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform();
1280 }
1281
1282 static inline bool isFixedPositionedContainer(RenderLayer* layer) 1545 static inline bool isFixedPositionedContainer(RenderLayer* layer)
1283 { 1546 {
1284 return layer->isRootLayer() || layer->hasTransform(); 1547 return layer->isRootLayer() || layer->hasTransform();
1285 } 1548 }
1286 1549
1287 RenderLayer* RenderLayer::enclosingPositionedAncestor() const 1550 RenderLayer* RenderLayer::enclosingPositionedAncestor() const
1288 { 1551 {
1289 RenderLayer* curr = parent(); 1552 RenderLayer* curr = parent();
1290 while (curr && !isPositionedContainer(curr)) 1553 while (curr && !isPositionedContainer(curr))
1291 curr = curr->parent(); 1554 curr = curr->parent();
(...skipping 4243 matching lines...) Expand 10 before | Expand all | Expand 10 after
5535 } 5798 }
5536 5799
5537 void RenderLayer::rebuildZOrderLists() 5800 void RenderLayer::rebuildZOrderLists()
5538 { 5801 {
5539 ASSERT(m_layerListMutationAllowed); 5802 ASSERT(m_layerListMutationAllowed);
5540 ASSERT(isDirtyStackingContainer()); 5803 ASSERT(isDirtyStackingContainer());
5541 rebuildZOrderLists(StopAtStackingContainers, m_posZOrderList, m_negZOrderLis t); 5804 rebuildZOrderLists(StopAtStackingContainers, m_posZOrderList, m_negZOrderLis t);
5542 m_zOrderListsDirty = false; 5805 m_zOrderListsDirty = false;
5543 } 5806 }
5544 5807
5545 void RenderLayer::rebuildZOrderLists(CollectLayersBehavior behavior, OwnPtr<Vect or<RenderLayer*> >& posZOrderList, OwnPtr<Vector<RenderLayer*> >& negZOrderList) 5808 void RenderLayer::rebuildZOrderLists(CollectLayersBehavior behavior, OwnPtr<Vect or<RenderLayer*> >& posZOrderList, OwnPtr<Vector<RenderLayer*> >& negZOrderList, const RenderLayer* layerToForceAsStackingContainer)
5546 { 5809 {
5547 bool includeHiddenLayers = compositor()->inCompositingMode(); 5810 bool includeHiddenLayers = compositor()->inCompositingMode();
5548 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 5811 for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
5549 if (!m_reflection || reflectionLayer() != child) 5812 if (!m_reflection || reflectionLayer() != child)
5550 child->collectLayers(includeHiddenLayers, behavior, posZOrderList, n egZOrderList); 5813 child->collectLayers(includeHiddenLayers, behavior, posZOrderList, n egZOrderList, layerToForceAsStackingContainer);
5551 5814
5552 // Sort the two lists. 5815 // Sort the two lists.
5553 if (posZOrderList) 5816 if (posZOrderList)
5554 std::stable_sort(posZOrderList->begin(), posZOrderList->end(), compareZI ndex); 5817 std::stable_sort(posZOrderList->begin(), posZOrderList->end(), compareZI ndex);
5555 5818
5556 if (negZOrderList) 5819 if (negZOrderList)
5557 std::stable_sort(negZOrderList->begin(), negZOrderList->end(), compareZI ndex); 5820 std::stable_sort(negZOrderList->begin(), negZOrderList->end(), compareZI ndex);
5558 5821
5559 #if ENABLE(DIALOG_ELEMENT) 5822 #if ENABLE(DIALOG_ELEMENT)
5560 // Append layers for top layer elements after normal layer collection, to en sure they are on top regardless of z-indexes. 5823 // Append layers for top layer elements after normal layer collection, to en sure they are on top regardless of z-indexes.
(...skipping 24 matching lines...) Expand all
5585 if (child->isNormalFlowOnly() && (!m_reflection || reflectionLayer() != child)) { 5848 if (child->isNormalFlowOnly() && (!m_reflection || reflectionLayer() != child)) {
5586 if (!m_normalFlowList) 5849 if (!m_normalFlowList)
5587 m_normalFlowList = adoptPtr(new Vector<RenderLayer*>); 5850 m_normalFlowList = adoptPtr(new Vector<RenderLayer*>);
5588 m_normalFlowList->append(child); 5851 m_normalFlowList->append(child);
5589 } 5852 }
5590 } 5853 }
5591 5854
5592 m_normalFlowListDirty = false; 5855 m_normalFlowListDirty = false;
5593 } 5856 }
5594 5857
5595 void RenderLayer::collectLayers(bool includeHiddenLayers, CollectLayersBehavior behavior, OwnPtr<Vector<RenderLayer*> >& posBuffer, OwnPtr<Vector<RenderLayer*> >& negBuffer) 5858 void RenderLayer::collectLayers(bool includeHiddenLayers, CollectLayersBehavior behavior, OwnPtr<Vector<RenderLayer*> >& posBuffer, OwnPtr<Vector<RenderLayer*> >& negBuffer, const RenderLayer* layerToForceAsStackingContainer)
5596 { 5859 {
5597 #if ENABLE(DIALOG_ELEMENT) 5860 #if ENABLE(DIALOG_ELEMENT)
5598 if (isInTopLayer()) 5861 if (isInTopLayer())
5599 return; 5862 return;
5600 #endif 5863 #endif
5601 5864
5602 updateDescendantDependentFlags(); 5865 updateDescendantDependentFlags();
5603 5866
5604 bool isStacking = behavior == StopAtStackingContexts ? isStackingContext() : isStackingContainer(); 5867 bool isStacking = false;
5868
5869 switch (behavior) {
5870 case StopAtStackingContexts:
5871 isStacking = (this == layerToForceAsStackingContainer) || isStacking Context();
5872 break;
5873
5874 case StopAtStackingContainers:
5875 isStacking = (this == layerToForceAsStackingContainer) || isStacking Container();
5876 break;
5877 }
5878
5605 // Overflow layers are just painted by their enclosing layers, so they don't get put in zorder lists. 5879 // Overflow layers are just painted by their enclosing layers, so they don't get put in zorder lists.
5606 bool includeHiddenLayer = includeHiddenLayers || (m_hasVisibleContent || (m_ hasVisibleDescendant && isStacking)); 5880 bool includeHiddenLayer = includeHiddenLayers || (m_hasVisibleContent || (m_ hasVisibleDescendant && isStacking));
5607 if (includeHiddenLayer && !isNormalFlowOnly() && !isOutOfFlowRenderFlowThrea d()) { 5881 if (includeHiddenLayer && !isNormalFlowOnly() && !isOutOfFlowRenderFlowThrea d()) {
5608 // Determine which buffer the child should be in. 5882 // Determine which buffer the child should be in.
5609 OwnPtr<Vector<RenderLayer*> >& buffer = (zIndex() >= 0) ? posBuffer : ne gBuffer; 5883 OwnPtr<Vector<RenderLayer*> >& buffer = (zIndex() >= 0) ? posBuffer : ne gBuffer;
5610 5884
5611 // Create the buffer if it doesn't exist yet. 5885 // Create the buffer if it doesn't exist yet.
5612 if (!buffer) 5886 if (!buffer)
5613 buffer = adoptPtr(new Vector<RenderLayer*>); 5887 buffer = adoptPtr(new Vector<RenderLayer*>);
5614 5888
5615 // Append ourselves at the end of the appropriate buffer. 5889 // Append ourselves at the end of the appropriate buffer.
5616 buffer->append(this); 5890 buffer->append(this);
5617 } 5891 }
5618 5892
5619 // Recur into our children to collect more layers, but only if we don't esta blish 5893 // Recur into our children to collect more layers, but only if we don't esta blish
5620 // a stacking context/container. 5894 // a stacking context/container.
5621 if ((includeHiddenLayers || m_hasVisibleDescendant) && !isStacking) { 5895 if ((includeHiddenLayers || m_hasVisibleDescendant) && !isStacking) {
5622 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 5896 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
5623 // Ignore reflections. 5897 // Ignore reflections.
5624 if (!m_reflection || reflectionLayer() != child) 5898 if (!m_reflection || reflectionLayer() != child)
5625 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer); 5899 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContainer);
5626 } 5900 }
5627 } 5901 }
5628 } 5902 }
5629 5903
5630 void RenderLayer::updateLayerListsIfNeeded() 5904 void RenderLayer::updateLayerListsIfNeeded()
5631 { 5905 {
5632 bool shouldUpdateDescendantsAreContiguousInStackingOrder = acceleratedCompos itingForOverflowScrollEnabled() && isStackingContext() && (m_zOrderListsDirty || m_normalFlowListDirty) && m_descendantsAreContiguousInStackingOrderDirty; 5906 bool shouldUpdateDescendantsAreContiguousInStackingOrder = acceleratedCompos itingForOverflowScrollEnabled() && isStackingContext() && (m_zOrderListsDirty || m_normalFlowListDirty) && m_descendantsAreContiguousInStackingOrderDirty;
5633 updateZOrderLists(); 5907 updateZOrderLists();
5634 updateNormalFlowList(); 5908 updateNormalFlowList();
5635 5909
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after
6326 } 6600 }
6327 } 6601 }
6328 6602
6329 void showLayerTree(const WebCore::RenderObject* renderer) 6603 void showLayerTree(const WebCore::RenderObject* renderer)
6330 { 6604 {
6331 if (!renderer) 6605 if (!renderer)
6332 return; 6606 return;
6333 showLayerTree(renderer->enclosingLayer()); 6607 showLayerTree(renderer->enclosingLayer());
6334 } 6608 }
6335 #endif 6609 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698