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 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
156 } | 156 } |
157 | 157 |
158 RenderGeometryMap& geometryMap() { return m_geometryMap; } | 158 RenderGeometryMap& geometryMap() { return m_geometryMap; } |
159 | 159 |
160 private: | 160 private: |
161 Vector<OverlapMapContainer> m_overlapStack; | 161 Vector<OverlapMapContainer> m_overlapStack; |
162 RenderGeometryMap m_geometryMap; | 162 RenderGeometryMap m_geometryMap; |
163 }; | 163 }; |
164 | 164 |
165 struct CompositingRecursionData { | 165 struct CompositingRecursionData { |
166 CompositingRecursionData(RenderLayer* compAncestor, RenderLayer* mostRecentC ompositedLayer, bool testOverlap) | 166 CompositingRecursionData(RenderLayer* compAncestor, RenderLayer* mostRecentC ompositedLayer, RenderLayerCompositor::BoundsUpdateType boundsUpdateType, bool t estOverlap) |
167 : m_compositingAncestor(compAncestor) | 167 : m_compositingAncestor(compAncestor) |
168 , m_mostRecentCompositedLayer(mostRecentCompositedLayer) | 168 , m_mostRecentCompositedLayer(mostRecentCompositedLayer) |
169 , m_recomputeLayerBoundsUpdateType(boundsUpdateType) | |
169 , m_subtreeIsCompositing(false) | 170 , m_subtreeIsCompositing(false) |
170 , m_hasUnisolatedCompositedBlendingDescendant(false) | 171 , m_hasUnisolatedCompositedBlendingDescendant(false) |
171 , m_testingOverlap(testOverlap) | 172 , m_testingOverlap(testOverlap) |
172 #ifndef NDEBUG | 173 #ifndef NDEBUG |
173 , m_depth(0) | 174 , m_depth(0) |
174 #endif | 175 #endif |
175 { | 176 { |
176 } | 177 } |
177 | 178 |
178 CompositingRecursionData(const CompositingRecursionData& other) | 179 CompositingRecursionData(const CompositingRecursionData& other) |
179 : m_compositingAncestor(other.m_compositingAncestor) | 180 : m_compositingAncestor(other.m_compositingAncestor) |
180 , m_mostRecentCompositedLayer(other.m_mostRecentCompositedLayer) | 181 , m_mostRecentCompositedLayer(other.m_mostRecentCompositedLayer) |
182 , m_recomputeLayerBoundsUpdateType(other.m_recomputeLayerBoundsUpdateTyp e) | |
181 , m_subtreeIsCompositing(other.m_subtreeIsCompositing) | 183 , m_subtreeIsCompositing(other.m_subtreeIsCompositing) |
182 , m_hasUnisolatedCompositedBlendingDescendant(other.m_hasUnisolatedCompo sitedBlendingDescendant) | 184 , m_hasUnisolatedCompositedBlendingDescendant(other.m_hasUnisolatedCompo sitedBlendingDescendant) |
183 , m_testingOverlap(other.m_testingOverlap) | 185 , m_testingOverlap(other.m_testingOverlap) |
184 #ifndef NDEBUG | 186 #ifndef NDEBUG |
185 , m_depth(other.m_depth + 1) | 187 , m_depth(other.m_depth + 1) |
186 #endif | 188 #endif |
187 { | 189 { |
188 } | 190 } |
189 | 191 |
190 RenderLayer* m_compositingAncestor; | 192 RenderLayer* m_compositingAncestor; |
191 RenderLayer* m_mostRecentCompositedLayer; // in paint order regardless of hi erarchy. | 193 RenderLayer* m_mostRecentCompositedLayer; // in paint order regardless of hi erarchy. |
194 RenderLayerCompositor::BoundsUpdateType m_recomputeLayerBoundsUpdateType; | |
192 bool m_subtreeIsCompositing; | 195 bool m_subtreeIsCompositing; |
193 bool m_hasUnisolatedCompositedBlendingDescendant; | 196 bool m_hasUnisolatedCompositedBlendingDescendant; |
194 bool m_testingOverlap; | 197 bool m_testingOverlap; |
195 #ifndef NDEBUG | 198 #ifndef NDEBUG |
196 int m_depth; | 199 int m_depth; |
197 #endif | 200 #endif |
198 }; | 201 }; |
199 | 202 |
200 RenderLayerCompositor::RenderLayerCompositor(RenderView& renderView) | 203 RenderLayerCompositor::RenderLayerCompositor(RenderView& renderView) |
201 : m_renderView(renderView) | 204 : m_renderView(renderView) |
202 , m_compositingReasonFinder(renderView) | 205 , m_compositingReasonFinder(renderView) |
203 , m_hasAcceleratedCompositing(true) | 206 , m_hasAcceleratedCompositing(true) |
204 , m_showRepaintCounter(false) | 207 , m_showRepaintCounter(false) |
205 , m_needsToRecomputeCompositingRequirements(false) | 208 , m_needsToRecomputeCompositingRequirements(false) |
206 , m_needsToUpdateLayerTreeGeometry(false) | 209 , m_needsToUpdateLayerTreeGeometry(false) |
207 , m_pendingUpdateType(GraphicsLayerUpdater::DoNotForceUpdate) | 210 , m_pendingUpdateType(GraphicsLayerUpdater::DoNotForceUpdate) |
211 , m_recomputeLayerBoundsUpdateType(RenderLayerCompositor::DoNotForceUpdate) | |
208 , m_compositing(false) | 212 , m_compositing(false) |
209 , m_compositingLayersNeedRebuild(false) | 213 , m_compositingLayersNeedRebuild(false) |
210 , m_forceCompositingMode(false) | 214 , m_forceCompositingMode(false) |
211 , m_needsUpdateCompositingRequirementsState(false) | 215 , m_needsUpdateCompositingRequirementsState(false) |
212 , m_isTrackingRepaints(false) | 216 , m_isTrackingRepaints(false) |
213 , m_rootLayerAttachment(RootLayerUnattached) | 217 , m_rootLayerAttachment(RootLayerUnattached) |
214 { | 218 { |
215 } | 219 } |
216 | 220 |
217 RenderLayerCompositor::~RenderLayerCompositor() | 221 RenderLayerCompositor::~RenderLayerCompositor() |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
361 return; | 365 return; |
362 | 366 |
363 switch (updateType) { | 367 switch (updateType) { |
364 case CompositingUpdateAfterStyleChange: | 368 case CompositingUpdateAfterStyleChange: |
365 m_needsToRecomputeCompositingRequirements = true; | 369 m_needsToRecomputeCompositingRequirements = true; |
366 break; | 370 break; |
367 case CompositingUpdateAfterLayout: | 371 case CompositingUpdateAfterLayout: |
368 m_needsToRecomputeCompositingRequirements = true; | 372 m_needsToRecomputeCompositingRequirements = true; |
369 // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. | 373 // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. |
370 m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate; | 374 m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate; |
375 // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. | |
376 m_recomputeLayerBoundsUpdateType = RenderLayerCompositor::ForceUpdate; | |
esprehn
2014/03/21 23:28:01
This is the RLC, you don't need the RenderLayerCom
ojan
2014/03/22 00:25:43
Done.
| |
371 break; | 377 break; |
372 case CompositingUpdateOnScroll: | 378 case CompositingUpdateOnScroll: |
373 m_needsToRecomputeCompositingRequirements = true; // Overlap can change with scrolling, so need to check for hierarchy updates. | 379 m_needsToRecomputeCompositingRequirements = true; // Overlap can change with scrolling, so need to check for hierarchy updates. |
374 m_needsToUpdateLayerTreeGeometry = true; | 380 m_needsToUpdateLayerTreeGeometry = true; |
375 // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. | 381 // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. |
376 m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate; | 382 m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate; |
383 // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. | |
384 m_recomputeLayerBoundsUpdateType = RenderLayerCompositor::ForceUpdate; | |
377 break; | 385 break; |
378 case CompositingUpdateOnCompositedScroll: | 386 case CompositingUpdateOnCompositedScroll: |
379 m_needsToUpdateLayerTreeGeometry = true; | 387 m_needsToUpdateLayerTreeGeometry = true; |
380 // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. | 388 // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. |
381 m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate; | 389 m_pendingUpdateType = GraphicsLayerUpdater::ForceUpdate; |
390 // FIXME: Ideally we'd be smarter about tracking dirtiness and wouldn't need a ForceUpdate here. | |
391 m_recomputeLayerBoundsUpdateType = RenderLayerCompositor::ForceUpdate; | |
382 break; | 392 break; |
383 case CompositingUpdateAfterCanvasContextChange: | 393 case CompositingUpdateAfterCanvasContextChange: |
384 m_needsToUpdateLayerTreeGeometry = true; | 394 m_needsToUpdateLayerTreeGeometry = true; |
385 break; | 395 break; |
386 } | 396 } |
387 | 397 |
388 m_renderView.frameView()->scheduleAnimation(); | 398 m_renderView.frameView()->scheduleAnimation(); |
389 } | 399 } |
390 | 400 |
391 void RenderLayerCompositor::updateCompositingLayers() | 401 void RenderLayerCompositor::updateCompositingLayers() |
(...skipping 12 matching lines...) Expand all Loading... | |
404 lifecycle().advanceTo(DocumentLifecycle::InCompositingUpdate); | 414 lifecycle().advanceTo(DocumentLifecycle::InCompositingUpdate); |
405 | 415 |
406 updateCompositingLayersInternal(); | 416 updateCompositingLayersInternal(); |
407 | 417 |
408 lifecycle().advanceTo(DocumentLifecycle::CompositingClean); | 418 lifecycle().advanceTo(DocumentLifecycle::CompositingClean); |
409 | 419 |
410 DocumentAnimations::startPendingAnimations(m_renderView.document()); | 420 DocumentAnimations::startPendingAnimations(m_renderView.document()); |
411 ASSERT(m_renderView.document().lifecycle().state() == DocumentLifecycle::Com positingClean); | 421 ASSERT(m_renderView.document().lifecycle().state() == DocumentLifecycle::Com positingClean); |
412 } | 422 } |
413 | 423 |
424 static void assertNeedsRecomputeBoundsBitsCleared(RenderLayer* updateRoot) | |
425 { | |
426 ASSERT(!updateRoot->needsToRecomputeBounds()); | |
427 for (RenderLayer* child = updateRoot->firstChild(); child; child = child->ne xtSibling()) | |
428 assertNeedsRecomputeBoundsBitsCleared(child); | |
429 } | |
430 | |
414 void RenderLayerCompositor::updateCompositingLayersInternal() | 431 void RenderLayerCompositor::updateCompositingLayersInternal() |
415 { | 432 { |
416 if (isMainFrame() && m_renderView.frameView()) | 433 if (isMainFrame() && m_renderView.frameView()) |
417 finishCompositingUpdateForFrameTree(&m_renderView.frameView()->frame()); | 434 finishCompositingUpdateForFrameTree(&m_renderView.frameView()->frame()); |
418 | 435 |
419 if (m_forceCompositingMode && !m_compositing) | 436 if (m_forceCompositingMode && !m_compositing) |
420 enableCompositingMode(true); | 437 enableCompositingMode(true); |
421 | 438 |
422 if (!m_needsToRecomputeCompositingRequirements && !m_compositing) | 439 if (!m_needsToRecomputeCompositingRequirements && !m_compositing) |
423 return; | 440 return; |
(...skipping 12 matching lines...) Expand all Loading... | |
436 m_compositingLayersNeedRebuild = false; | 453 m_compositingLayersNeedRebuild = false; |
437 m_needsToUpdateLayerTreeGeometry = false; | 454 m_needsToUpdateLayerTreeGeometry = false; |
438 m_needsToRecomputeCompositingRequirements = false; | 455 m_needsToRecomputeCompositingRequirements = false; |
439 m_pendingUpdateType = GraphicsLayerUpdater::DoNotForceUpdate; | 456 m_pendingUpdateType = GraphicsLayerUpdater::DoNotForceUpdate; |
440 | 457 |
441 RenderLayer* updateRoot = rootRenderLayer(); | 458 RenderLayer* updateRoot = rootRenderLayer(); |
442 | 459 |
443 if (needCompositingRequirementsUpdate) { | 460 if (needCompositingRequirementsUpdate) { |
444 // Go through the layers in presentation order, so that we can compute w hich RenderLayers need compositing layers. | 461 // Go through the layers in presentation order, so that we can compute w hich RenderLayers need compositing layers. |
445 // FIXME: we could maybe do this and the hierarchy udpate in one pass, b ut the parenting logic would be more complex. | 462 // FIXME: we could maybe do this and the hierarchy udpate in one pass, b ut the parenting logic would be more complex. |
446 CompositingRecursionData recursionData(updateRoot, 0, true); | 463 CompositingRecursionData recursionData(updateRoot, 0, m_recomputeLayerBo undsUpdateType, true); |
464 m_recomputeLayerBoundsUpdateType = RenderLayerCompositor::DoNotForceUpda te; | |
447 bool layersChanged = false; | 465 bool layersChanged = false; |
448 bool saw3DTransform = false; | 466 bool saw3DTransform = false; |
449 { | 467 { |
450 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::computeCompo sitingRequirements"); | 468 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::computeCompo sitingRequirements"); |
451 OverlapMap overlapTestRequestMap; | 469 OverlapMap overlapTestRequestMap; |
452 | 470 |
453 // FIXME: Passing these unclippedDescendants down and keeping track | 471 // FIXME: Passing these unclippedDescendants down and keeping track |
454 // of them dynamically, we are requiring a full tree walk. This | 472 // of them dynamically, we are requiring a full tree walk. This |
455 // should be removed as soon as proper overlap testing based on | 473 // should be removed as soon as proper overlap testing based on |
456 // scrolling and animation bounds is implemented (crbug.com/252472). | 474 // scrolling and animation bounds is implemented (crbug.com/252472). |
457 Vector<RenderLayer*> unclippedDescendants; | 475 Vector<RenderLayer*> unclippedDescendants; |
458 IntRect absoluteDecendantBoundingBox; | 476 IntRect absoluteDecendantBoundingBox; |
459 computeCompositingRequirements(0, updateRoot, &overlapTestRequestMap , recursionData, saw3DTransform, unclippedDescendants, absoluteDecendantBounding Box); | 477 computeCompositingRequirements(0, updateRoot, &overlapTestRequestMap , recursionData, saw3DTransform, unclippedDescendants, absoluteDecendantBounding Box); |
478 #if !ASSERT_DISABLED | |
479 assertNeedsRecomputeBoundsBitsCleared(updateRoot); | |
480 #endif | |
460 } | 481 } |
461 | 482 |
462 { | 483 { |
463 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::assignLayers ToBackings"); | 484 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::assignLayers ToBackings"); |
464 assignLayersToBackings(updateRoot, layersChanged); | 485 assignLayersToBackings(updateRoot, layersChanged); |
465 } | 486 } |
466 | 487 |
467 { | 488 { |
468 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::updateHasVis ibleNonLayerContentLoop"); | 489 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::updateHasVis ibleNonLayerContentLoop"); |
469 const FrameView::ScrollableAreaSet* scrollableAreas = m_renderView.f rameView()->scrollableAreas(); | 490 const FrameView::ScrollableAreaSet* scrollableAreas = m_renderView.f rameView()->scrollableAreas(); |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
855 // FIXME: This is called from within RenderLayer::removeChild, which is called from RenderObject::RemoveChild. | 876 // FIXME: This is called from within RenderLayer::removeChild, which is called from RenderObject::RemoveChild. |
856 // There's no guarantee that compositor state is up to date. | 877 // There's no guarantee that compositor state is up to date. |
857 DisableCompositingQueryAsserts disabler; | 878 DisableCompositingQueryAsserts disabler; |
858 repaintInCompositedAncestor(child, child->compositedLayerMapping()->comp ositedBounds()); | 879 repaintInCompositedAncestor(child, child->compositedLayerMapping()->comp ositedBounds()); |
859 } | 880 } |
860 | 881 |
861 setCompositingParent(child, 0); | 882 setCompositingParent(child, 0); |
862 setCompositingLayersNeedRebuild(); | 883 setCompositingLayersNeedRebuild(); |
863 } | 884 } |
864 | 885 |
865 void RenderLayerCompositor::addToOverlapMap(OverlapMap& overlapMap, RenderLayer* layer, IntRect& layerBounds) | 886 void RenderLayerCompositor::addToOverlapMap(OverlapMap& overlapMap, RenderLayer* layer, const IntRect& layerBounds) |
866 { | 887 { |
867 if (layer->isRootLayer()) | 888 if (layer->isRootLayer()) |
868 return; | 889 return; |
869 | 890 |
870 IntRect clipRect = pixelSnappedIntRect(layer->clipper().backgroundClipRect(C lipRectsContext(rootRenderLayer(), AbsoluteClipRects)).rect()); | 891 IntRect clipRect = pixelSnappedIntRect(layer->clipper().backgroundClipRect(C lipRectsContext(rootRenderLayer(), AbsoluteClipRects)).rect()); |
871 clipRect.intersect(layerBounds); | 892 clipRect.intersect(layerBounds); |
872 overlapMap.add(clipRect); | 893 overlapMap.add(clipRect); |
873 } | 894 } |
874 | 895 |
875 // Recurse through the layers in z-index and overflow order (which is equivalen t to painting order) | 896 // Recurse through the layers in z-index and overflow order (which is equivalen t to painting order) |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
933 // indices remain valid. | 954 // indices remain valid. |
934 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++) | 955 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++) |
935 unclippedDescendants.remove(unclippedDescendantsToRemove.at(unclippe dDescendantsToRemove.size() - i - 1)); | 956 unclippedDescendants.remove(unclippedDescendantsToRemove.at(unclippe dDescendantsToRemove.size() - i - 1)); |
936 | 957 |
937 if (reasonsToComposite & CompositingReasonOutOfFlowClipping) | 958 if (reasonsToComposite & CompositingReasonOutOfFlowClipping) |
938 unclippedDescendants.append(layer); | 959 unclippedDescendants.append(layer); |
939 } | 960 } |
940 | 961 |
941 IntRect absBounds; | 962 IntRect absBounds; |
942 if (overlapMap && !layer->isRootLayer()) { | 963 if (overlapMap && !layer->isRootLayer()) { |
943 absBounds = enclosingIntRect(overlapMap->geometryMap().absoluteRect(laye r->overlapBounds())); | 964 if (currentRecursionData.m_recomputeLayerBoundsUpdateType == RenderLayer Compositor::ForceUpdate || layer->needsToRecomputeBounds()) { |
965 // FIXME: If the absolute bounds didn't change, then we don't need t o ForceUpdate descendant RenderLayers. | |
966 currentRecursionData.m_recomputeLayerBoundsUpdateType = RenderLayerC ompositor::ForceUpdate; | |
967 absBounds = enclosingIntRect(overlapMap->geometryMap().absoluteRect( layer->overlapBounds())); | |
968 layer->setAbsoluteBoundingBoxForOverlap(absBounds); | |
969 } else { | |
970 absBounds = layer->cachedAbsoluteBoundingBox(); | |
971 } | |
944 // Setting the absBounds to 1x1 instead of 0x0 makes very little sense, | 972 // Setting the absBounds to 1x1 instead of 0x0 makes very little sense, |
945 // but removing this code will make JSGameBench sad. | 973 // but removing this code will make JSGameBench sad. |
946 // See https://codereview.chromium.org/13912020/ | 974 // See https://codereview.chromium.org/13912020/ |
947 if (absBounds.isEmpty()) | 975 if (absBounds.isEmpty()) |
948 absBounds.setSize(IntSize(1, 1)); | 976 absBounds.setSize(IntSize(1, 1)); |
977 } else { | |
978 layer->clearNeedsToRecomputeBounds(); | |
esprehn
2014/03/21 23:28:01
Can we just unconditionally call this?
ojan
2014/03/22 00:25:43
I changed assertNeedsRecomputeBoundsBitsCleared to
| |
949 } | 979 } |
980 | |
950 absoluteDecendantBoundingBox = absBounds; | 981 absoluteDecendantBoundingBox = absBounds; |
951 | 982 |
952 if (overlapMap && currentRecursionData.m_testingOverlap && !requiresComposit ingOrSquashing(directReasons)) | 983 if (overlapMap && currentRecursionData.m_testingOverlap && !requiresComposit ingOrSquashing(directReasons)) |
953 overlapCompositingReason = overlapMap->overlapsLayers(absBounds) ? Compo sitingReasonOverlap : CompositingReasonNone; | 984 overlapCompositingReason = overlapMap->overlapsLayers(absBounds) ? Compo sitingReasonOverlap : CompositingReasonNone; |
954 | 985 |
955 reasonsToComposite |= overlapCompositingReason; | 986 reasonsToComposite |= overlapCompositingReason; |
956 | 987 |
957 // The children of this layer don't need to composite, unless there is | 988 // The children of this layer don't need to composite, unless there is |
958 // a compositing layer among them, so start by inheriting the compositing | 989 // a compositing layer among them, so start by inheriting the compositing |
959 // ancestor with m_subtreeIsCompositing set to false. | 990 // ancestor with m_subtreeIsCompositing set to false. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1002 if (overlapMap) | 1033 if (overlapMap) |
1003 overlapMap->beginNewOverlapTestingContext(); | 1034 overlapMap->beginNewOverlapTestingContext(); |
1004 willBeCompositedOrSquashed = true; | 1035 willBeCompositedOrSquashed = true; |
1005 willHaveForegroundLayer = true; | 1036 willHaveForegroundLayer = true; |
1006 | 1037 |
1007 // FIXME: temporary solution for the first negative z-index composited child: | 1038 // FIXME: temporary solution for the first negative z-index composited child: |
1008 // re-compute the absBounds for the child so that we can add the | 1039 // re-compute the absBounds for the child so that we can add the |
1009 // negative z-index child's bounds to the new overlap context. | 1040 // negative z-index child's bounds to the new overlap context. |
1010 if (overlapMap) { | 1041 if (overlapMap) { |
1011 overlapMap->geometryMap().pushMappingsToAncestor(curNode ->layer(), layer); | 1042 overlapMap->geometryMap().pushMappingsToAncestor(curNode ->layer(), layer); |
1012 IntRect childAbsBounds = enclosingIntRect(overlapMap->ge ometryMap().absoluteRect(curNode->layer()->overlapBounds())); | 1043 // The above call to computeCompositinRequirements will have already updated this layer's absolute bounding box. |
1013 overlapMap->beginNewOverlapTestingContext(); | 1044 overlapMap->beginNewOverlapTestingContext(); |
1014 addToOverlapMap(*overlapMap, curNode->layer(), childAbsB ounds); | 1045 ASSERT(!curNode->layer()->needsToRecomputeBounds()); |
1046 addToOverlapMap(*overlapMap, curNode->layer(), curNode-> layer()->cachedAbsoluteBoundingBox()); | |
1015 overlapMap->finishCurrentOverlapTestingContext(); | 1047 overlapMap->finishCurrentOverlapTestingContext(); |
1016 overlapMap->geometryMap().popMappingsToAncestor(layer); | 1048 overlapMap->geometryMap().popMappingsToAncestor(layer); |
1017 } | 1049 } |
1018 } | 1050 } |
1019 } | 1051 } |
1020 } | 1052 } |
1021 } | 1053 } |
1022 | 1054 |
1023 if (overlapMap && willHaveForegroundLayer) { | 1055 if (overlapMap && willHaveForegroundLayer) { |
1024 ASSERT(willBeCompositedOrSquashed); | 1056 ASSERT(willBeCompositedOrSquashed); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1079 // second-from-top context of the stack. | 1111 // second-from-top context of the stack. |
1080 overlapMap->beginNewOverlapTestingContext(); | 1112 overlapMap->beginNewOverlapTestingContext(); |
1081 addToOverlapMap(*overlapMap, layer, absoluteDecendantBoundingBox); | 1113 addToOverlapMap(*overlapMap, layer, absoluteDecendantBoundingBox); |
1082 } | 1114 } |
1083 willBeCompositedOrSquashed = true; | 1115 willBeCompositedOrSquashed = true; |
1084 } | 1116 } |
1085 | 1117 |
1086 // If the original layer is composited, the reflection needs to be, too. | 1118 // If the original layer is composited, the reflection needs to be, too. |
1087 if (layer->reflectionInfo()) { | 1119 if (layer->reflectionInfo()) { |
1088 // FIXME: Shouldn't we call computeCompositingRequirements to handle a r eflection overlapping with another renderer? | 1120 // FIXME: Shouldn't we call computeCompositingRequirements to handle a r eflection overlapping with another renderer? |
1121 RenderLayer* reflectionLayer = layer->reflectionInfo()->reflectionLayer( ); | |
1122 reflectionLayer->clearNeedsToRecomputeBounds(); | |
1089 CompositingReasons reflectionCompositingReason = willBeCompositedOrSquas hed ? CompositingReasonReflectionOfCompositedParent : CompositingReasonNone; | 1123 CompositingReasons reflectionCompositingReason = willBeCompositedOrSquas hed ? CompositingReasonReflectionOfCompositedParent : CompositingReasonNone; |
1090 layer->reflectionInfo()->reflectionLayer()->setCompositingReasons(layer- >reflectionInfo()->reflectionLayer()->compositingReasons() | reflectionCompositi ngReason); | 1124 reflectionLayer->setCompositingReasons(reflectionLayer->compositingReaso ns() | reflectionCompositingReason); |
1091 } | 1125 } |
1092 | 1126 |
1093 // Subsequent layers in the parent's stacking context may also need to compo site. | 1127 // Subsequent layers in the parent's stacking context may also need to compo site. |
1094 if (childRecursionData.m_subtreeIsCompositing) | 1128 if (childRecursionData.m_subtreeIsCompositing) |
1095 currentRecursionData.m_subtreeIsCompositing = true; | 1129 currentRecursionData.m_subtreeIsCompositing = true; |
1096 | 1130 |
1097 if (willBeCompositedOrSquashed && layer->blendInfo().hasBlendMode()) | 1131 if (willBeCompositedOrSquashed && layer->blendInfo().hasBlendMode()) |
1098 currentRecursionData.m_hasUnisolatedCompositedBlendingDescendant = true; | 1132 currentRecursionData.m_hasUnisolatedCompositedBlendingDescendant = true; |
1099 | 1133 |
1100 // Set the flag to say that this SC has compositing children. | 1134 // Set the flag to say that this SC has compositing children. |
(...skipping 1139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2240 } else if (graphicsLayer == m_scrollLayer.get()) { | 2274 } else if (graphicsLayer == m_scrollLayer.get()) { |
2241 name = "LocalFrame Scrolling Layer"; | 2275 name = "LocalFrame Scrolling Layer"; |
2242 } else { | 2276 } else { |
2243 ASSERT_NOT_REACHED(); | 2277 ASSERT_NOT_REACHED(); |
2244 } | 2278 } |
2245 | 2279 |
2246 return name; | 2280 return name; |
2247 } | 2281 } |
2248 | 2282 |
2249 } // namespace WebCore | 2283 } // namespace WebCore |
OLD | NEW |