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

Side by Side Diff: Source/core/paint/DeprecatedPaintLayerStackingNode.cpp

Issue 1188363002: Compute the normal flow list on the fly (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebaselined patch. Created 5 years, 6 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 #include "core/paint/DeprecatedPaintLayer.h" 50 #include "core/paint/DeprecatedPaintLayer.h"
51 #include "public/platform/Platform.h" 51 #include "public/platform/Platform.h"
52 52
53 namespace blink { 53 namespace blink {
54 54
55 // FIXME: This should not require DeprecatedPaintLayer. There is currently a cyc le where 55 // FIXME: This should not require DeprecatedPaintLayer. There is currently a cyc le where
56 // in order to determine if we shoulBeTreatedAsStackingContextForPainting() we h ave to ask the paint 56 // in order to determine if we shoulBeTreatedAsStackingContextForPainting() we h ave to ask the paint
57 // layer about some of its state. 57 // layer about some of its state.
58 DeprecatedPaintLayerStackingNode::DeprecatedPaintLayerStackingNode(LayoutBoxMode lObject& layoutObject) 58 DeprecatedPaintLayerStackingNode::DeprecatedPaintLayerStackingNode(LayoutBoxMode lObject& layoutObject)
59 : m_layoutObject(layoutObject) 59 : m_layoutObject(layoutObject)
60 , m_normalFlowListDirty(true)
61 #if ENABLE(ASSERT) 60 #if ENABLE(ASSERT)
62 , m_layerListMutationAllowed(true) 61 , m_layerListMutationAllowed(true)
63 , m_stackingParent(0) 62 , m_stackingParent(0)
64 #endif 63 #endif
65 { 64 {
66 m_isTreatedAsStackingContextForPainting = shouldBeTreatedAsStackingContextFo rPainting(); 65 m_isTreatedAsStackingContextForPainting = shouldBeTreatedAsStackingContextFo rPainting();
67 66
68 // Non-stacking contexts should have empty z-order lists. As this is already the case, 67 // Non-stacking contexts should have empty z-order lists. As this is already the case,
69 // there is no need to dirty / recompute these lists. 68 // there is no need to dirty / recompute these lists.
70 m_zOrderListsDirty = isStackingContext(); 69 m_zOrderListsDirty = isStackingContext();
71 } 70 }
72 71
73 DeprecatedPaintLayerStackingNode::~DeprecatedPaintLayerStackingNode() 72 DeprecatedPaintLayerStackingNode::~DeprecatedPaintLayerStackingNode()
74 { 73 {
75 #if ENABLE(ASSERT) 74 #if ENABLE(ASSERT)
76 if (!layoutObject().documentBeingDestroyed()) { 75 if (!layoutObject().documentBeingDestroyed()) {
77 ASSERT(!isInStackingParentZOrderLists()); 76 ASSERT(!isInStackingParentZOrderLists());
78 ASSERT(!isInStackingParentNormalFlowList());
79 77
80 updateStackingParentForZOrderLists(0); 78 updateStackingParentForZOrderLists(0);
81 updateStackingParentForNormalFlowList(0);
82 } 79 }
83 #endif 80 #endif
84 } 81 }
85 82
86 // Helper for the sorting of layers by z-index. 83 // Helper for the sorting of layers by z-index.
87 static inline bool compareZIndex(DeprecatedPaintLayerStackingNode* first, Deprec atedPaintLayerStackingNode* second) 84 static inline bool compareZIndex(DeprecatedPaintLayerStackingNode* first, Deprec atedPaintLayerStackingNode* second)
88 { 85 {
89 return first->zIndex() < second->zIndex(); 86 return first->zIndex() < second->zIndex();
90 } 87 }
91 88
(...skipping 21 matching lines...) Expand all
113 if (!layoutObject().documentBeingDestroyed()) 110 if (!layoutObject().documentBeingDestroyed())
114 compositor()->setNeedsCompositingUpdate(CompositingUpdateRebuildTree); 111 compositor()->setNeedsCompositingUpdate(CompositingUpdateRebuildTree);
115 } 112 }
116 113
117 void DeprecatedPaintLayerStackingNode::dirtyStackingContextZOrderLists() 114 void DeprecatedPaintLayerStackingNode::dirtyStackingContextZOrderLists()
118 { 115 {
119 if (DeprecatedPaintLayerStackingNode* stackingNode = ancestorStackingContext Node()) 116 if (DeprecatedPaintLayerStackingNode* stackingNode = ancestorStackingContext Node())
120 stackingNode->dirtyZOrderLists(); 117 stackingNode->dirtyZOrderLists();
121 } 118 }
122 119
123 void DeprecatedPaintLayerStackingNode::dirtyNormalFlowList()
124 {
125 ASSERT(m_layerListMutationAllowed);
126
127 #if ENABLE(ASSERT)
128 updateStackingParentForNormalFlowList(0);
129 #endif
130
131 if (m_normalFlowList)
132 m_normalFlowList->clear();
133 m_normalFlowListDirty = true;
134
135 if (!layoutObject().documentBeingDestroyed())
136 compositor()->setNeedsCompositingUpdate(CompositingUpdateRebuildTree);
137 }
138
139 static bool isInTopLayer(const LayoutObject& layoutObject) 120 static bool isInTopLayer(const LayoutObject& layoutObject)
140 { 121 {
141 const Node* node = layoutObject.node(); 122 const Node* node = layoutObject.node();
142 return node && node->isElementNode() && toElement(node)->isInTopLayer(); 123 return node && node->isElementNode() && toElement(node)->isInTopLayer();
143 } 124 }
144 125
145 void DeprecatedPaintLayerStackingNode::rebuildZOrderLists() 126 void DeprecatedPaintLayerStackingNode::rebuildZOrderLists()
146 { 127 {
147 ASSERT(m_layerListMutationAllowed); 128 ASSERT(m_layerListMutationAllowed);
148 ASSERT(isDirtyStackingContext()); 129 ASSERT(isDirtyStackingContext());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 } 177 }
197 } 178 }
198 179
199 #if ENABLE(ASSERT) 180 #if ENABLE(ASSERT)
200 updateStackingParentForZOrderLists(this); 181 updateStackingParentForZOrderLists(this);
201 #endif 182 #endif
202 183
203 m_zOrderListsDirty = false; 184 m_zOrderListsDirty = false;
204 } 185 }
205 186
206 void DeprecatedPaintLayerStackingNode::updateNormalFlowList()
207 {
208 if (!m_normalFlowListDirty)
209 return;
210
211 ASSERT(m_layerListMutationAllowed);
212
213 for (DeprecatedPaintLayer* child = layer()->firstChild(); child; child = chi ld->nextSibling()) {
214 if (!child->stackingNode()->isTreatedAsStackingContextForPainting() && ( !layer()->reflectionInfo() || layer()->reflectionInfo()->reflectionLayer() != ch ild)) {
215 if (!m_normalFlowList)
216 m_normalFlowList = adoptPtr(new Vector<DeprecatedPaintLayerStack ingNode*>);
217 m_normalFlowList->append(child->stackingNode());
218 }
219 }
220
221 #if ENABLE(ASSERT)
222 updateStackingParentForNormalFlowList(this);
223 #endif
224
225 m_normalFlowListDirty = false;
226 }
227
228 #if ENABLE(ASSERT) 187 #if ENABLE(ASSERT)
229 bool DeprecatedPaintLayerStackingNode::isInStackingParentZOrderLists() const 188 bool DeprecatedPaintLayerStackingNode::isInStackingParentZOrderLists() const
230 { 189 {
231 if (!m_stackingParent || m_stackingParent->zOrderListsDirty()) 190 if (!m_stackingParent || m_stackingParent->zOrderListsDirty())
232 return false; 191 return false;
233 192
234 if (m_stackingParent->posZOrderList() && m_stackingParent->posZOrderList()-> find(this) != kNotFound) 193 if (m_stackingParent->posZOrderList() && m_stackingParent->posZOrderList()-> find(this) != kNotFound)
235 return true; 194 return true;
236 195
237 if (m_stackingParent->negZOrderList() && m_stackingParent->negZOrderList()-> find(this) != kNotFound) 196 if (m_stackingParent->negZOrderList() && m_stackingParent->negZOrderList()-> find(this) != kNotFound)
238 return true; 197 return true;
239 198
240 return false; 199 return false;
241 } 200 }
242 201
243 bool DeprecatedPaintLayerStackingNode::isInStackingParentNormalFlowList() const
244 {
245 if (!m_stackingParent || m_stackingParent->normalFlowListDirty())
246 return false;
247
248 return (m_stackingParent->normalFlowList() && m_stackingParent->normalFlowLi st()->find(this) != kNotFound);
249 }
250
251 void DeprecatedPaintLayerStackingNode::updateStackingParentForZOrderLists(Deprec atedPaintLayerStackingNode* stackingParent) 202 void DeprecatedPaintLayerStackingNode::updateStackingParentForZOrderLists(Deprec atedPaintLayerStackingNode* stackingParent)
252 { 203 {
253 if (m_posZOrderList) { 204 if (m_posZOrderList) {
254 for (size_t i = 0; i < m_posZOrderList->size(); ++i) 205 for (size_t i = 0; i < m_posZOrderList->size(); ++i)
255 m_posZOrderList->at(i)->setStackingParent(stackingParent); 206 m_posZOrderList->at(i)->setStackingParent(stackingParent);
256 } 207 }
257 208
258 if (m_negZOrderList) { 209 if (m_negZOrderList) {
259 for (size_t i = 0; i < m_negZOrderList->size(); ++i) 210 for (size_t i = 0; i < m_negZOrderList->size(); ++i)
260 m_negZOrderList->at(i)->setStackingParent(stackingParent); 211 m_negZOrderList->at(i)->setStackingParent(stackingParent);
261 } 212 }
262 } 213 }
263 214
264 void DeprecatedPaintLayerStackingNode::updateStackingParentForNormalFlowList(Dep recatedPaintLayerStackingNode* stackingParent)
265 {
266 if (m_normalFlowList) {
267 for (size_t i = 0; i < m_normalFlowList->size(); ++i)
268 m_normalFlowList->at(i)->setStackingParent(stackingParent);
269 }
270 }
271 #endif 215 #endif
272 216
273 void DeprecatedPaintLayerStackingNode::updateLayerListsIfNeeded() 217 void DeprecatedPaintLayerStackingNode::updateLayerListsIfNeeded()
274 { 218 {
275 updateZOrderLists(); 219 updateZOrderLists();
276 updateNormalFlowList();
277 220
278 if (!layer()->reflectionInfo()) 221 if (!layer()->reflectionInfo())
279 return; 222 return;
280 223
281 DeprecatedPaintLayer* reflectionLayer = layer()->reflectionInfo()->reflectio nLayer(); 224 DeprecatedPaintLayer* reflectionLayer = layer()->reflectionInfo()->reflectio nLayer();
282 reflectionLayer->stackingNode()->updateZOrderLists(); 225 reflectionLayer->stackingNode()->updateZOrderLists();
283 reflectionLayer->stackingNode()->updateNormalFlowList();
284 } 226 }
285 227
286 void DeprecatedPaintLayerStackingNode::updateStackingNodesAfterStyleChange(const ComputedStyle* oldStyle) 228 void DeprecatedPaintLayerStackingNode::updateStackingNodesAfterStyleChange(const ComputedStyle* oldStyle)
287 { 229 {
288 bool wasStackingContext = oldStyle ? !oldStyle->hasAutoZIndex() : false; 230 bool wasStackingContext = oldStyle ? !oldStyle->hasAutoZIndex() : false;
289 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0; 231 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0;
290 232
291 bool isStackingContext = this->isStackingContext(); 233 bool isStackingContext = this->isStackingContext();
292 if (isStackingContext == wasStackingContext && oldZIndex == zIndex()) 234 if (isStackingContext == wasStackingContext && oldZIndex == zIndex())
293 return; 235 return;
294 236
295 dirtyStackingContextZOrderLists(); 237 dirtyStackingContextZOrderLists();
296 238
297 if (isStackingContext) 239 if (isStackingContext)
298 dirtyZOrderLists(); 240 dirtyZOrderLists();
299 else 241 else
300 clearZOrderLists(); 242 clearZOrderLists();
301 } 243 }
302 244
303 void DeprecatedPaintLayerStackingNode::updateIsTreatedAsStackingContextForPainti ng() 245 void DeprecatedPaintLayerStackingNode::updateIsTreatedAsStackingContextForPainti ng()
304 { 246 {
305 bool isTreatedAsStackingContextForPainting = shouldBeTreatedAsStackingContex tForPainting(); 247 bool isTreatedAsStackingContextForPainting = shouldBeTreatedAsStackingContex tForPainting();
306 if (isTreatedAsStackingContextForPainting == this->isTreatedAsStackingContex tForPainting()) 248 if (isTreatedAsStackingContextForPainting == this->isTreatedAsStackingContex tForPainting())
307 return; 249 return;
308 250
309 m_isTreatedAsStackingContextForPainting = isTreatedAsStackingContextForPaint ing; 251 m_isTreatedAsStackingContextForPainting = isTreatedAsStackingContextForPaint ing;
310 if (DeprecatedPaintLayer* p = layer()->parent()) 252 if (!layoutObject().documentBeingDestroyed() && !layer()->isRootLayer())
311 p->stackingNode()->dirtyNormalFlowList(); 253 compositor()->setNeedsCompositingUpdate(CompositingUpdateRebuildTree);
312 dirtyStackingContextZOrderLists(); 254 dirtyStackingContextZOrderLists();
313 } 255 }
314 256
315 DeprecatedPaintLayerStackingNode* DeprecatedPaintLayerStackingNode::ancestorStac kingContextNode() const 257 DeprecatedPaintLayerStackingNode* DeprecatedPaintLayerStackingNode::ancestorStac kingContextNode() const
316 { 258 {
317 for (DeprecatedPaintLayer* ancestor = layer()->parent(); ancestor; ancestor = ancestor->parent()) { 259 for (DeprecatedPaintLayer* ancestor = layer()->parent(); ancestor; ancestor = ancestor->parent()) {
318 DeprecatedPaintLayerStackingNode* stackingNode = ancestor->stackingNode( ); 260 DeprecatedPaintLayerStackingNode* stackingNode = ancestor->stackingNode( );
319 if (stackingNode->isStackingContext()) 261 if (stackingNode->isStackingContext())
320 return stackingNode; 262 return stackingNode;
321 } 263 }
322 return 0; 264 return 0;
323 } 265 }
324 266
325 DeprecatedPaintLayer* DeprecatedPaintLayerStackingNode::layer() const 267 DeprecatedPaintLayer* DeprecatedPaintLayerStackingNode::layer() const
326 { 268 {
327 return layoutObject().layer(); 269 return layoutObject().layer();
328 } 270 }
329 271
330 } // namespace blink 272 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/paint/DeprecatedPaintLayerStackingNode.h ('k') | Source/core/paint/DeprecatedPaintLayerStackingNodeIterator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698