OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. |
3 * Copyright (C) 2014 Google Inc. All rights reserved. | 3 * Copyright (C) 2014 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 // FIXME: we could maybe do this and the hierarchy update in one pass, but t
he parenting logic would be more complex. | 198 // FIXME: we could maybe do this and the hierarchy update in one pass, but t
he parenting logic would be more complex. |
199 RecursionData recursionData(root); | 199 RecursionData recursionData(root); |
200 OverlapMap overlapTestRequestMap; | 200 OverlapMap overlapTestRequestMap; |
201 bool saw3DTransform = false; | 201 bool saw3DTransform = false; |
202 | 202 |
203 // FIXME: Passing these unclippedDescendants down and keeping track | 203 // FIXME: Passing these unclippedDescendants down and keeping track |
204 // of them dynamically, we are requiring a full tree walk. This | 204 // of them dynamically, we are requiring a full tree walk. This |
205 // should be removed as soon as proper overlap testing based on | 205 // should be removed as soon as proper overlap testing based on |
206 // scrolling and animation bounds is implemented (crbug.com/252472). | 206 // scrolling and animation bounds is implemented (crbug.com/252472). |
207 Vector<PaintLayer*> unclippedDescendants; | 207 Vector<PaintLayer*> unclippedDescendants; |
208 IntRect absoluteDecendantBoundingBox; | 208 IntRect absoluteDescendantBoundingBox; |
209 updateRecursive(0, root, overlapTestRequestMap, recursionData, saw3DTransfor
m, unclippedDescendants, absoluteDecendantBoundingBox); | 209 updateRecursive(0, root, overlapTestRequestMap, recursionData, saw3DTransfor
m, unclippedDescendants, absoluteDescendantBoundingBox); |
210 } | 210 } |
211 | 211 |
212 void CompositingRequirementsUpdater::updateRecursive(PaintLayer* ancestorLayer,
PaintLayer* layer, OverlapMap& overlapMap, RecursionData& currentRecursionData,
bool& descendantHas3DTransform, Vector<PaintLayer*>& unclippedDescendants, IntRe
ct& absoluteDecendantBoundingBox) | 212 void CompositingRequirementsUpdater::updateRecursive(PaintLayer* ancestorLayer,
PaintLayer* layer, OverlapMap& overlapMap, RecursionData& currentRecursionData, |
| 213 bool& descendantHas3DTransform, Vector<PaintLayer*>& unclippedDescendants, I
ntRect& absoluteDescendantBoundingBox) |
213 { | 214 { |
214 PaintLayerCompositor* compositor = m_layoutView.compositor(); | 215 PaintLayerCompositor* compositor = m_layoutView.compositor(); |
215 | 216 |
216 layer->stackingNode()->updateLayerListsIfNeeded(); | 217 layer->stackingNode()->updateLayerListsIfNeeded(); |
217 | 218 |
218 CompositingReasons reasonsToComposite = CompositingReasonNone; | 219 CompositingReasons reasonsToComposite = CompositingReasonNone; |
219 CompositingReasons directReasons = m_compositingReasonFinder.directReasons(l
ayer); | 220 CompositingReasons directReasons = m_compositingReasonFinder.directReasons(l
ayer); |
220 | 221 |
221 // Video is special. It's the only PaintLayer type that can both have | 222 // Video is special. It's the only PaintLayer type that can both have |
222 // PaintLayer children and whose children can't use its backing to render | 223 // PaintLayer children and whose children can't use its backing to render |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 // Remove irrelevant unclipped descendants in reverse order so our store
d | 281 // Remove irrelevant unclipped descendants in reverse order so our store
d |
281 // indices remain valid. | 282 // indices remain valid. |
282 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++) | 283 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++) |
283 unclippedDescendants.remove(unclippedDescendantsToRemove.at(unclippe
dDescendantsToRemove.size() - i - 1)); | 284 unclippedDescendants.remove(unclippedDescendantsToRemove.at(unclippe
dDescendantsToRemove.size() - i - 1)); |
284 | 285 |
285 if (reasonsToComposite & CompositingReasonOutOfFlowClipping) | 286 if (reasonsToComposite & CompositingReasonOutOfFlowClipping) |
286 unclippedDescendants.append(layer); | 287 unclippedDescendants.append(layer); |
287 } | 288 } |
288 | 289 |
289 const IntRect& absBounds = layer->clippedAbsoluteBoundingBox(); | 290 const IntRect& absBounds = layer->clippedAbsoluteBoundingBox(); |
290 absoluteDecendantBoundingBox = absBounds; | 291 absoluteDescendantBoundingBox = absBounds; |
291 | 292 |
292 if (currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing
(directReasons)) | 293 if (currentRecursionData.m_testingOverlap && !requiresCompositingOrSquashing
(directReasons)) |
293 overlapCompositingReason = overlapMap.overlapsLayers(absBounds) ? Compos
itingReasonOverlap : CompositingReasonNone; | 294 overlapCompositingReason = overlapMap.overlapsLayers(absBounds) ? Compos
itingReasonOverlap : CompositingReasonNone; |
294 | 295 |
295 reasonsToComposite |= overlapCompositingReason; | 296 reasonsToComposite |= overlapCompositingReason; |
296 | 297 |
297 // The children of this layer don't need to composite, unless there is | 298 // The children of this layer don't need to composite, unless there is |
298 // a compositing layer among them, so start by inheriting the compositing | 299 // a compositing layer among them, so start by inheriting the compositing |
299 // ancestor with m_subtreeIsCompositing set to false. | 300 // ancestor with m_subtreeIsCompositing set to false. |
300 RecursionData childRecursionData = currentRecursionData; | 301 RecursionData childRecursionData = currentRecursionData; |
(...skipping 16 matching lines...) Expand all Loading... |
317 #if ENABLE(ASSERT) | 318 #if ENABLE(ASSERT) |
318 LayerListMutationDetector mutationChecker(layer->stackingNode()); | 319 LayerListMutationDetector mutationChecker(layer->stackingNode()); |
319 #endif | 320 #endif |
320 | 321 |
321 bool anyDescendantHas3DTransform = false; | 322 bool anyDescendantHas3DTransform = false; |
322 bool willHaveForegroundLayer = false; | 323 bool willHaveForegroundLayer = false; |
323 | 324 |
324 if (layer->stackingNode()->isStackingContext()) { | 325 if (layer->stackingNode()->isStackingContext()) { |
325 PaintLayerStackingNodeIterator iterator(*layer->stackingNode(), Negative
ZOrderChildren); | 326 PaintLayerStackingNodeIterator iterator(*layer->stackingNode(), Negative
ZOrderChildren); |
326 while (PaintLayerStackingNode* curNode = iterator.next()) { | 327 while (PaintLayerStackingNode* curNode = iterator.next()) { |
327 IntRect absoluteChildDecendantBoundingBox; | 328 IntRect absoluteChildDescendantBoundingBox; |
328 updateRecursive(layer, curNode->layer(), overlapMap, childRecursionD
ata, anyDescendantHas3DTransform, unclippedDescendants, absoluteChildDecendantBo
undingBox); | 329 updateRecursive(layer, curNode->layer(), overlapMap, childRecursionD
ata, anyDescendantHas3DTransform, unclippedDescendants, absoluteChildDescendantB
oundingBox); |
329 absoluteDecendantBoundingBox.unite(absoluteChildDecendantBoundingBox
); | 330 absoluteDescendantBoundingBox.unite(absoluteChildDescendantBoundingB
ox); |
330 | 331 |
331 // If we have to make a layer for this child, make one now so we can
have a contents layer | 332 // If we have to make a layer for this child, make one now so we can
have a contents layer |
332 // (since we need to ensure that the -ve z-order child renders under
neath our contents). | 333 // (since we need to ensure that the -ve z-order child renders under
neath our contents). |
333 if (childRecursionData.m_subtreeIsCompositing) { | 334 if (childRecursionData.m_subtreeIsCompositing) { |
334 reasonsToComposite |= CompositingReasonNegativeZIndexChildren; | 335 reasonsToComposite |= CompositingReasonNegativeZIndexChildren; |
335 | 336 |
336 if (!willBeCompositedOrSquashed) { | 337 if (!willBeCompositedOrSquashed) { |
337 // make layer compositing | 338 // make layer compositing |
338 childRecursionData.m_compositingAncestor = layer; | 339 childRecursionData.m_compositingAncestor = layer; |
339 overlapMap.beginNewOverlapTestingContext(); | 340 overlapMap.beginNewOverlapTestingContext(); |
(...skipping 19 matching lines...) Expand all Loading... |
359 // children, and start with a fresh new empty context. | 360 // children, and start with a fresh new empty context. |
360 overlapMap.finishCurrentOverlapTestingContext(); | 361 overlapMap.finishCurrentOverlapTestingContext(); |
361 overlapMap.beginNewOverlapTestingContext(); | 362 overlapMap.beginNewOverlapTestingContext(); |
362 // This layer is going to be composited, so children can safely ignore t
he fact that there's an | 363 // This layer is going to be composited, so children can safely ignore t
he fact that there's an |
363 // animation running behind this layer, meaning they can rely on the ove
rlap map testing again | 364 // animation running behind this layer, meaning they can rely on the ove
rlap map testing again |
364 childRecursionData.m_testingOverlap = true; | 365 childRecursionData.m_testingOverlap = true; |
365 } | 366 } |
366 | 367 |
367 PaintLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowCh
ildren | PositiveZOrderChildren); | 368 PaintLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowCh
ildren | PositiveZOrderChildren); |
368 while (PaintLayerStackingNode* curNode = iterator.next()) { | 369 while (PaintLayerStackingNode* curNode = iterator.next()) { |
369 IntRect absoluteChildDecendantBoundingBox; | 370 IntRect absoluteChildDescendantBoundingBox; |
370 updateRecursive(layer, curNode->layer(), overlapMap, childRecursionData,
anyDescendantHas3DTransform, unclippedDescendants, absoluteChildDecendantBoundi
ngBox); | 371 updateRecursive(layer, curNode->layer(), overlapMap, childRecursionData,
anyDescendantHas3DTransform, unclippedDescendants, absoluteChildDescendantBound
ingBox); |
371 absoluteDecendantBoundingBox.unite(absoluteChildDecendantBoundingBox); | 372 absoluteDescendantBoundingBox.unite(absoluteChildDescendantBoundingBox); |
372 } | 373 } |
373 | 374 |
374 // Now that the subtree has been traversed, we can check for compositing rea
sons that depended on the state of the subtree. | 375 // Now that the subtree has been traversed, we can check for compositing rea
sons that depended on the state of the subtree. |
375 | 376 |
376 if (layer->stackingNode()->isStackingContext()) { | 377 if (layer->stackingNode()->isStackingContext()) { |
377 layer->setShouldIsolateCompositedDescendants(childRecursionData.m_hasUni
solatedCompositedBlendingDescendant); | 378 layer->setShouldIsolateCompositedDescendants(childRecursionData.m_hasUni
solatedCompositedBlendingDescendant); |
378 } else { | 379 } else { |
379 layer->setShouldIsolateCompositedDescendants(false); | 380 layer->setShouldIsolateCompositedDescendants(false); |
380 currentRecursionData.m_hasUnisolatedCompositedBlendingDescendant = child
RecursionData.m_hasUnisolatedCompositedBlendingDescendant; | 381 currentRecursionData.m_hasUnisolatedCompositedBlendingDescendant = child
RecursionData.m_hasUnisolatedCompositedBlendingDescendant; |
381 } | 382 } |
(...skipping 24 matching lines...) Expand all Loading... |
406 | 407 |
407 // Now check for reasons to become composited that depend on the state o
f descendant layers. | 408 // Now check for reasons to become composited that depend on the state o
f descendant layers. |
408 CompositingReasons subtreeCompositingReasons = subtreeReasonsForComposit
ing(layer, childRecursionData.m_subtreeIsCompositing, anyDescendantHas3DTransfor
m); | 409 CompositingReasons subtreeCompositingReasons = subtreeReasonsForComposit
ing(layer, childRecursionData.m_subtreeIsCompositing, anyDescendantHas3DTransfor
m); |
409 reasonsToComposite |= subtreeCompositingReasons; | 410 reasonsToComposite |= subtreeCompositingReasons; |
410 if (!willBeCompositedOrSquashed && canBeComposited && requiresCompositin
gOrSquashing(subtreeCompositingReasons)) { | 411 if (!willBeCompositedOrSquashed && canBeComposited && requiresCompositin
gOrSquashing(subtreeCompositingReasons)) { |
411 childRecursionData.m_compositingAncestor = layer; | 412 childRecursionData.m_compositingAncestor = layer; |
412 // FIXME: this context push is effectively a no-op but needs to exis
t for | 413 // FIXME: this context push is effectively a no-op but needs to exis
t for |
413 // now, because the code is designed to push overlap information to
the | 414 // now, because the code is designed to push overlap information to
the |
414 // second-from-top context of the stack. | 415 // second-from-top context of the stack. |
415 overlapMap.beginNewOverlapTestingContext(); | 416 overlapMap.beginNewOverlapTestingContext(); |
416 overlapMap.add(layer, absoluteDecendantBoundingBox); | 417 overlapMap.add(layer, absoluteDescendantBoundingBox); |
417 willBeCompositedOrSquashed = true; | 418 willBeCompositedOrSquashed = true; |
418 } | 419 } |
419 | 420 |
420 if (willBeCompositedOrSquashed) | 421 if (willBeCompositedOrSquashed) |
421 reasonsToComposite |= layer->potentialCompositingReasonsFromStyle()
& CompositingReasonInlineTransform; | 422 reasonsToComposite |= layer->potentialCompositingReasonsFromStyle()
& CompositingReasonInlineTransform; |
422 | 423 |
423 // If the original layer is composited, the reflection needs to be, too. | 424 // If the original layer is composited, the reflection needs to be, too. |
424 if (layer->reflectionInfo()) { | 425 if (layer->reflectionInfo()) { |
425 // FIXME: Shouldn't we call computeCompositingRequirements to handle
a reflection overlapping with another layoutObject? | 426 // FIXME: Shouldn't we call computeCompositingRequirements to handle
a reflection overlapping with another layoutObject? |
426 PaintLayer* reflectionLayer = layer->reflectionInfo()->reflectionLay
er(); | 427 PaintLayer* reflectionLayer = layer->reflectionInfo()->reflectionLay
er(); |
(...skipping 17 matching lines...) Expand all Loading... |
444 currentRecursionData.m_testingOverlap = false; | 445 currentRecursionData.m_testingOverlap = false; |
445 | 446 |
446 if (childRecursionData.m_compositingAncestor == layer) | 447 if (childRecursionData.m_compositingAncestor == layer) |
447 overlapMap.finishCurrentOverlapTestingContext(); | 448 overlapMap.finishCurrentOverlapTestingContext(); |
448 | 449 |
449 descendantHas3DTransform |= anyDescendantHas3DTransform || layer->has3DT
ransform(); | 450 descendantHas3DTransform |= anyDescendantHas3DTransform || layer->has3DT
ransform(); |
450 } | 451 } |
451 | 452 |
452 // At this point we have finished collecting all reasons to composite this l
ayer. | 453 // At this point we have finished collecting all reasons to composite this l
ayer. |
453 layer->setCompositingReasons(reasonsToComposite); | 454 layer->setCompositingReasons(reasonsToComposite); |
454 | |
455 } | 455 } |
456 | 456 |
457 } // namespace blink | 457 } // namespace blink |
OLD | NEW |