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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 | 180 |
181 if (layer->shouldIsolateCompositedDescendants()) { | 181 if (layer->shouldIsolateCompositedDescendants()) { |
182 DCHECK(layer->stackingNode()->isStackingContext()); | 182 DCHECK(layer->stackingNode()->isStackingContext()); |
183 subtreeReasons |= CompositingReasonIsolateCompositedDescendants; | 183 subtreeReasons |= CompositingReasonIsolateCompositedDescendants; |
184 } | 184 } |
185 | 185 |
186 // FIXME: This should move into | 186 // FIXME: This should move into |
187 // CompositingReasonFinder::potentialCompositingReasonsFromStyle, but theres | 187 // CompositingReasonFinder::potentialCompositingReasonsFromStyle, but theres |
188 // a poor interaction with LayoutTextControlSingleLine, which sets this | 188 // a poor interaction with LayoutTextControlSingleLine, which sets this |
189 // hasOverflowClip directly. | 189 // hasOverflowClip directly. |
190 if (layer->layoutObject()->hasClipRelatedProperty()) | 190 if (layer->layoutObject().hasClipRelatedProperty()) |
191 subtreeReasons |= CompositingReasonClipsCompositingDescendants; | 191 subtreeReasons |= CompositingReasonClipsCompositingDescendants; |
192 | 192 |
193 if (layer->layoutObject()->style()->position() == EPosition::kFixed) | 193 if (layer->layoutObject().style()->position() == EPosition::kFixed) |
194 subtreeReasons |= CompositingReasonPositionFixedWithCompositedDescendants; | 194 subtreeReasons |= CompositingReasonPositionFixedWithCompositedDescendants; |
195 } | 195 } |
196 | 196 |
197 // A layer with preserve-3d or perspective only needs to be composited if | 197 // A layer with preserve-3d or perspective only needs to be composited if |
198 // there are descendant layers that will be affected by the preserve-3d or | 198 // there are descendant layers that will be affected by the preserve-3d or |
199 // perspective. | 199 // perspective. |
200 if (has3DTransformedDescendants) { | 200 if (has3DTransformedDescendants) { |
201 subtreeReasons |= layer->potentialCompositingReasonsFromStyle() & | 201 subtreeReasons |= layer->potentialCompositingReasonsFromStyle() & |
202 CompositingReasonCombo3DDescendants; | 202 CompositingReasonCombo3DDescendants; |
203 } | 203 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 | 248 |
249 CompositingReasons reasonsToComposite = CompositingReasonNone; | 249 CompositingReasons reasonsToComposite = CompositingReasonNone; |
250 CompositingReasons directReasons = | 250 CompositingReasons directReasons = |
251 m_compositingReasonFinder.directReasons(layer); | 251 m_compositingReasonFinder.directReasons(layer); |
252 | 252 |
253 // Video is special. It's the only PaintLayer type that can both have | 253 // Video is special. It's the only PaintLayer type that can both have |
254 // PaintLayer children and whose children can't use its backing to render | 254 // PaintLayer children and whose children can't use its backing to render |
255 // into. These children (the controls) always need to be promoted into their | 255 // into. These children (the controls) always need to be promoted into their |
256 // own layers to draw on top of the accelerated video. | 256 // own layers to draw on top of the accelerated video. |
257 if (currentRecursionData.m_compositingAncestor && | 257 if (currentRecursionData.m_compositingAncestor && |
258 currentRecursionData.m_compositingAncestor->layoutObject()->isVideo()) | 258 currentRecursionData.m_compositingAncestor->layoutObject().isVideo()) |
259 directReasons |= CompositingReasonVideoOverlay; | 259 directReasons |= CompositingReasonVideoOverlay; |
260 | 260 |
261 bool hasCompositedScrollingAncestor = | 261 bool hasCompositedScrollingAncestor = |
262 layer->ancestorScrollingLayer() && | 262 layer->ancestorScrollingLayer() && |
263 (m_compositingReasonFinder.directReasons( | 263 (m_compositingReasonFinder.directReasons( |
264 layer->ancestorScrollingLayer()) & | 264 layer->ancestorScrollingLayer()) & |
265 CompositingReasonOverflowScrollingTouch); | 265 CompositingReasonOverflowScrollingTouch); |
266 | 266 |
267 // TODO(chrishtr): use |hasCompositedScrollingAncestor| instead. | 267 // TODO(chrishtr): use |hasCompositedScrollingAncestor| instead. |
268 if (currentRecursionData.m_hasCompositedScrollingAncestor && | 268 if (currentRecursionData.m_hasCompositedScrollingAncestor && |
269 layer->layoutObject()->styleRef().hasViewportConstrainedPosition()) | 269 layer->layoutObject().styleRef().hasViewportConstrainedPosition()) |
270 directReasons |= CompositingReasonScrollDependentPosition; | 270 directReasons |= CompositingReasonScrollDependentPosition; |
271 | 271 |
272 bool canBeComposited = compositor->canBeComposited(layer); | 272 bool canBeComposited = compositor->canBeComposited(layer); |
273 if (canBeComposited) { | 273 if (canBeComposited) { |
274 reasonsToComposite |= directReasons; | 274 reasonsToComposite |= directReasons; |
275 | 275 |
276 if (layer->isRootLayer() && compositor->rootShouldAlwaysComposite()) | 276 if (layer->isRootLayer() && compositor->rootShouldAlwaysComposite()) |
277 reasonsToComposite |= CompositingReasonRoot; | 277 reasonsToComposite |= CompositingReasonRoot; |
278 | 278 |
279 // Add CompositingReasonOverflowScrollingTouch for layers that do not | 279 // Add CompositingReasonOverflowScrollingTouch for layers that do not |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 | 312 |
313 // TODO(chrishtr): use |hasCompositedScrollingAncestor| instead. | 313 // TODO(chrishtr): use |hasCompositedScrollingAncestor| instead. |
314 if (currentRecursionData.m_hasCompositedScrollingAncestor) { | 314 if (currentRecursionData.m_hasCompositedScrollingAncestor) { |
315 Vector<size_t> unclippedDescendantsToRemove; | 315 Vector<size_t> unclippedDescendantsToRemove; |
316 for (size_t i = 0; i < unclippedDescendants.size(); i++) { | 316 for (size_t i = 0; i < unclippedDescendants.size(); i++) { |
317 PaintLayer* unclippedDescendant = unclippedDescendants.at(i); | 317 PaintLayer* unclippedDescendant = unclippedDescendants.at(i); |
318 // If we've reached the containing block of one of the unclipped | 318 // If we've reached the containing block of one of the unclipped |
319 // descendants, that element is no longer relevant to whether or not we | 319 // descendants, that element is no longer relevant to whether or not we |
320 // should opt in. Unfortunately we can't easily remove from the list | 320 // should opt in. Unfortunately we can't easily remove from the list |
321 // while we're iterating, so we have to store it for later removal. | 321 // while we're iterating, so we have to store it for later removal. |
322 if (unclippedDescendant->layoutObject()->containingBlock() == | 322 if (unclippedDescendant->layoutObject().containingBlock() == |
323 layer->layoutObject()) { | 323 &layer->layoutObject()) { |
324 unclippedDescendantsToRemove.push_back(i); | 324 unclippedDescendantsToRemove.push_back(i); |
325 continue; | 325 continue; |
326 } | 326 } |
327 if (layer->scrollsWithRespectTo(unclippedDescendant)) | 327 if (layer->scrollsWithRespectTo(unclippedDescendant)) |
328 reasonsToComposite |= CompositingReasonAssumedOverlap; | 328 reasonsToComposite |= CompositingReasonAssumedOverlap; |
329 } | 329 } |
330 | 330 |
331 // Remove irrelevant unclipped descendants in reverse order so our stored | 331 // Remove irrelevant unclipped descendants in reverse order so our stored |
332 // indices remain valid. | 332 // indices remain valid. |
333 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++) { | 333 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++) { |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 !hasCompositedScrollingAncestor); | 503 !hasCompositedScrollingAncestor); |
504 willBeCompositedOrSquashed = true; | 504 willBeCompositedOrSquashed = true; |
505 } | 505 } |
506 | 506 |
507 if (willBeCompositedOrSquashed) { | 507 if (willBeCompositedOrSquashed) { |
508 reasonsToComposite |= layer->potentialCompositingReasonsFromStyle() & | 508 reasonsToComposite |= layer->potentialCompositingReasonsFromStyle() & |
509 CompositingReasonInlineTransform; | 509 CompositingReasonInlineTransform; |
510 } | 510 } |
511 | 511 |
512 if (willBeCompositedOrSquashed && | 512 if (willBeCompositedOrSquashed && |
513 layer->layoutObject()->style()->hasBlendMode()) | 513 layer->layoutObject().style()->hasBlendMode()) |
514 currentRecursionData.m_hasUnisolatedCompositedBlendingDescendant = true; | 514 currentRecursionData.m_hasUnisolatedCompositedBlendingDescendant = true; |
515 | 515 |
516 // Tell the parent it has compositing descendants. | 516 // Tell the parent it has compositing descendants. |
517 if (willBeCompositedOrSquashed) | 517 if (willBeCompositedOrSquashed) |
518 currentRecursionData.m_subtreeIsCompositing = true; | 518 currentRecursionData.m_subtreeIsCompositing = true; |
519 | 519 |
520 // Turn overlap testing off for later layers if it's already off, or if we | 520 // Turn overlap testing off for later layers if it's already off, or if we |
521 // have an animating transform. Note that if the layer clips its | 521 // have an animating transform. Note that if the layer clips its |
522 // descendants, there's no reason to propagate the child animation to the | 522 // descendants, there's no reason to propagate the child animation to the |
523 // parent layers. That's because we know for sure the animation is contained | 523 // parent layers. That's because we know for sure the animation is contained |
524 // inside the clipping rectangle, which is already added to the overlap map. | 524 // inside the clipping rectangle, which is already added to the overlap map. |
525 bool isCompositedClippingLayer = | 525 bool isCompositedClippingLayer = |
526 canBeComposited && | 526 canBeComposited && |
527 (reasonsToComposite & CompositingReasonClipsCompositingDescendants); | 527 (reasonsToComposite & CompositingReasonClipsCompositingDescendants); |
528 bool isCompositedWithInlineTransform = | 528 bool isCompositedWithInlineTransform = |
529 reasonsToComposite & CompositingReasonInlineTransform; | 529 reasonsToComposite & CompositingReasonInlineTransform; |
530 if ((!childRecursionData.m_testingOverlap && !isCompositedClippingLayer) || | 530 if ((!childRecursionData.m_testingOverlap && !isCompositedClippingLayer) || |
531 layer->layoutObject()->style()->hasCurrentTransformAnimation() || | 531 layer->layoutObject().style()->hasCurrentTransformAnimation() || |
532 isCompositedWithInlineTransform) | 532 isCompositedWithInlineTransform) |
533 currentRecursionData.m_testingOverlap = false; | 533 currentRecursionData.m_testingOverlap = false; |
534 | 534 |
535 if (childRecursionData.m_compositingAncestor == layer) | 535 if (childRecursionData.m_compositingAncestor == layer) |
536 overlapMap.finishCurrentOverlapTestingContext(); | 536 overlapMap.finishCurrentOverlapTestingContext(); |
537 | 537 |
538 descendantHas3DTransform |= | 538 descendantHas3DTransform |= |
539 anyDescendantHas3DTransform || layer->has3DTransform(); | 539 anyDescendantHas3DTransform || layer->has3DTransform(); |
540 } | 540 } |
541 | 541 |
542 // At this point we have finished collecting all reasons to composite this | 542 // At this point we have finished collecting all reasons to composite this |
543 // layer. | 543 // layer. |
544 layer->setCompositingReasons(reasonsToComposite); | 544 layer->setCompositingReasons(reasonsToComposite); |
545 } | 545 } |
546 | 546 |
547 } // namespace blink | 547 } // namespace blink |
OLD | NEW |