OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 | 5 |
6 #include "config.h" | 6 #include "config.h" |
7 | 7 |
8 #include "CCLayerTreeHostCommon.h" | 8 #include "CCLayerTreeHostCommon.h" |
9 | 9 |
10 #include "CCLayerImpl.h" | 10 #include "CCLayerImpl.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 | 105 |
106 template<typename LayerType> | 106 template<typename LayerType> |
107 static inline bool layerClipsSubtree(LayerType* layer) | 107 static inline bool layerClipsSubtree(LayerType* layer) |
108 { | 108 { |
109 return layer->masksToBounds() || layer->maskLayer(); | 109 return layer->masksToBounds() || layer->maskLayer(); |
110 } | 110 } |
111 | 111 |
112 template<typename LayerType> | 112 template<typename LayerType> |
113 static IntRect calculateVisibleContentRect(LayerType* layer) | 113 static IntRect calculateVisibleContentRect(LayerType* layer) |
114 { | 114 { |
115 ASSERT(layer->renderTarget()); | 115 DCHECK(layer->renderTarget()); |
116 | 116 |
117 // Nothing is visible if the layer bounds are empty. | 117 // Nothing is visible if the layer bounds are empty. |
118 if (!layer->drawsContent() || layer->contentBounds().isEmpty() || layer->dra
wableContentRect().isEmpty()) | 118 if (!layer->drawsContent() || layer->contentBounds().isEmpty() || layer->dra
wableContentRect().isEmpty()) |
119 return IntRect(); | 119 return IntRect(); |
120 | 120 |
121 IntRect targetSurfaceClipRect; | 121 IntRect targetSurfaceClipRect; |
122 | 122 |
123 // First, compute visible bounds in target surface space. | 123 // First, compute visible bounds in target surface space. |
124 if (layer->renderTarget()->renderSurface()->clipRect().isEmpty()) | 124 if (layer->renderTarget()->renderSurface()->clipRect().isEmpty()) |
125 targetSurfaceClipRect = layer->drawableContentRect(); | 125 targetSurfaceClipRect = layer->drawableContentRect(); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 // | 180 // |
181 // Note, if the layer should not have been drawn due to being fully transpar
ent, | 181 // Note, if the layer should not have been drawn due to being fully transpar
ent, |
182 // we would have skipped the entire subtree and never made it into this func
tion, | 182 // we would have skipped the entire subtree and never made it into this func
tion, |
183 // so it is safe to omit this check here. | 183 // so it is safe to omit this check here. |
184 | 184 |
185 if (!layer->drawsContent() || layer->bounds().isEmpty()) | 185 if (!layer->drawsContent() || layer->bounds().isEmpty()) |
186 return true; | 186 return true; |
187 | 187 |
188 LayerType* backfaceTestLayer = layer; | 188 LayerType* backfaceTestLayer = layer; |
189 if (layer->useParentBackfaceVisibility()) { | 189 if (layer->useParentBackfaceVisibility()) { |
190 ASSERT(layer->parent()); | 190 DCHECK(layer->parent()); |
191 ASSERT(!layer->parent()->useParentBackfaceVisibility()); | 191 DCHECK(!layer->parent()->useParentBackfaceVisibility()); |
192 backfaceTestLayer = layer->parent(); | 192 backfaceTestLayer = layer->parent(); |
193 } | 193 } |
194 | 194 |
195 // The layer should not be drawn if (1) it is not double-sided and (2) the b
ack of the layer is known to be facing the screen. | 195 // The layer should not be drawn if (1) it is not double-sided and (2) the b
ack of the layer is known to be facing the screen. |
196 if (!backfaceTestLayer->doubleSided() && transformToScreenIsKnown(backfaceTe
stLayer) && isLayerBackFaceVisible(backfaceTestLayer)) | 196 if (!backfaceTestLayer->doubleSided() && transformToScreenIsKnown(backfaceTe
stLayer) && isLayerBackFaceVisible(backfaceTestLayer)) |
197 return true; | 197 return true; |
198 | 198 |
199 return false; | 199 return false; |
200 } | 200 } |
201 | 201 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 // Should be called just before the recursive calculateDrawTransformsInternal(). | 347 // Should be called just before the recursive calculateDrawTransformsInternal(). |
348 template<typename LayerType, typename LayerList> | 348 template<typename LayerType, typename LayerList> |
349 void setupRootLayerAndSurfaceForRecursion(LayerType* rootLayer, LayerList& rende
rSurfaceLayerList, const IntSize& deviceViewportSize) | 349 void setupRootLayerAndSurfaceForRecursion(LayerType* rootLayer, LayerList& rende
rSurfaceLayerList, const IntSize& deviceViewportSize) |
350 { | 350 { |
351 if (!rootLayer->renderSurface()) | 351 if (!rootLayer->renderSurface()) |
352 rootLayer->createRenderSurface(); | 352 rootLayer->createRenderSurface(); |
353 | 353 |
354 rootLayer->renderSurface()->setContentRect(IntRect(IntPoint::zero(), deviceV
iewportSize)); | 354 rootLayer->renderSurface()->setContentRect(IntRect(IntPoint::zero(), deviceV
iewportSize)); |
355 rootLayer->renderSurface()->clearLayerLists(); | 355 rootLayer->renderSurface()->clearLayerLists(); |
356 | 356 |
357 ASSERT(renderSurfaceLayerList.empty()); | 357 DCHECK(renderSurfaceLayerList.empty()); |
358 renderSurfaceLayerList.push_back(rootLayer); | 358 renderSurfaceLayerList.push_back(rootLayer); |
359 } | 359 } |
360 | 360 |
361 // Recursively walks the layer tree starting at the given node and computes all
the | 361 // Recursively walks the layer tree starting at the given node and computes all
the |
362 // necessary transformations, clipRects, render surfaces, etc. | 362 // necessary transformations, clipRects, render surfaces, etc. |
363 template<typename LayerType, typename LayerList, typename RenderSurfaceType, typ
ename LayerSorter> | 363 template<typename LayerType, typename LayerList, typename RenderSurfaceType, typ
ename LayerSorter> |
364 static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay
er, const WebTransformationMatrix& parentMatrix, | 364 static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay
er, const WebTransformationMatrix& parentMatrix, |
365 const WebTransformationMatrix& fullHierarchyMatrix, const WebTransformationM
atrix& currentScrollCompensationMatrix, | 365 const WebTransformationMatrix& fullHierarchyMatrix, const WebTransformationM
atrix& currentScrollCompensationMatrix, |
366 const IntRect& clipRectFromAncestor, bool ancestorClipsSubtree, | 366 const IntRect& clipRectFromAncestor, bool ancestorClipsSubtree, |
367 RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceL
ayerList, LayerList& layerList, | 367 RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceL
ayerList, LayerList& layerList, |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
592 } else { | 592 } else { |
593 layer->setDrawTransform(drawTransform); | 593 layer->setDrawTransform(drawTransform); |
594 layer->setDrawTransformIsAnimating(animatingTransformToTarget); | 594 layer->setDrawTransformIsAnimating(animatingTransformToTarget); |
595 layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen); | 595 layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen); |
596 sublayerMatrix = combinedTransform; | 596 sublayerMatrix = combinedTransform; |
597 | 597 |
598 layer->setDrawOpacity(drawOpacity); | 598 layer->setDrawOpacity(drawOpacity); |
599 layer->setDrawOpacityIsAnimating(drawOpacityIsAnimating); | 599 layer->setDrawOpacityIsAnimating(drawOpacityIsAnimating); |
600 | 600 |
601 if (layer != rootLayer) { | 601 if (layer != rootLayer) { |
602 ASSERT(layer->parent()); | 602 DCHECK(layer->parent()); |
603 layer->clearRenderSurface(); | 603 layer->clearRenderSurface(); |
604 | 604 |
605 // Layers without renderSurfaces directly inherit the ancestor's cli
p status. | 605 // Layers without renderSurfaces directly inherit the ancestor's cli
p status. |
606 subtreeShouldBeClipped = ancestorClipsSubtree; | 606 subtreeShouldBeClipped = ancestorClipsSubtree; |
607 if (ancestorClipsSubtree) | 607 if (ancestorClipsSubtree) |
608 clipRectForSubtree = clipRectFromAncestor; | 608 clipRectForSubtree = clipRectFromAncestor; |
609 | 609 |
610 // Layers that are not their own renderTarget will render into the t
arget of their nearest ancestor. | 610 // Layers that are not their own renderTarget will render into the t
arget of their nearest ancestor. |
611 layer->setRenderTarget(layer->parent()->renderTarget()); | 611 layer->setRenderTarget(layer->parent()->renderTarget()); |
612 } else { | 612 } else { |
613 // FIXME: This root layer special case code should eventually go awa
y. https://bugs.webkit.org/show_bug.cgi?id=92290 | 613 // FIXME: This root layer special case code should eventually go awa
y. https://bugs.webkit.org/show_bug.cgi?id=92290 |
614 ASSERT(!layer->parent()); | 614 DCHECK(!layer->parent()); |
615 ASSERT(layer->renderSurface()); | 615 DCHECK(layer->renderSurface()); |
616 ASSERT(ancestorClipsSubtree); | 616 DCHECK(ancestorClipsSubtree); |
617 layer->renderSurface()->setClipRect(clipRectFromAncestor); | 617 layer->renderSurface()->setClipRect(clipRectFromAncestor); |
618 subtreeShouldBeClipped = false; | 618 subtreeShouldBeClipped = false; |
619 } | 619 } |
620 } | 620 } |
621 | 621 |
622 IntRect rectInTargetSpace = enclosingIntRect(CCMathUtil::mapClippedRect(laye
r->drawTransform(), contentRect)); | 622 IntRect rectInTargetSpace = enclosingIntRect(CCMathUtil::mapClippedRect(laye
r->drawTransform(), contentRect)); |
623 | 623 |
624 if (layerClipsSubtree(layer)) { | 624 if (layerClipsSubtree(layer)) { |
625 subtreeShouldBeClipped = true; | 625 subtreeShouldBeClipped = true; |
626 if (ancestorClipsSubtree && !layer->renderSurface()) { | 626 if (ancestorClipsSubtree && !layer->renderSurface()) { |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 if (!layer->renderSurface()->layerList().size()) { | 730 if (!layer->renderSurface()->layerList().size()) { |
731 // FIXME: Originally we asserted that this layer was already at the
end of the | 731 // FIXME: Originally we asserted that this layer was already at the
end of the |
732 // list, and only needed to remove that layer. For now, we re
move the | 732 // list, and only needed to remove that layer. For now, we re
move the |
733 // entire subtree of surfaces to fix a crash bug. The root ca
use is | 733 // entire subtree of surfaces to fix a crash bug. The root ca
use is |
734 // https://bugs.webkit.org/show_bug.cgi?id=74147 and we shoul
d be able | 734 // https://bugs.webkit.org/show_bug.cgi?id=74147 and we shoul
d be able |
735 // to put the original assert after fixing that. | 735 // to put the original assert after fixing that. |
736 while (renderSurfaceLayerList.back() != layer) { | 736 while (renderSurfaceLayerList.back() != layer) { |
737 renderSurfaceLayerList.back()->clearRenderSurface(); | 737 renderSurfaceLayerList.back()->clearRenderSurface(); |
738 renderSurfaceLayerList.pop_back(); | 738 renderSurfaceLayerList.pop_back(); |
739 } | 739 } |
740 ASSERT(renderSurfaceLayerList.back() == layer); | 740 DCHECK(renderSurfaceLayerList.back() == layer); |
741 renderSurfaceLayerList.pop_back(); | 741 renderSurfaceLayerList.pop_back(); |
742 layer->clearRenderSurface(); | 742 layer->clearRenderSurface(); |
743 return; | 743 return; |
744 } | 744 } |
745 } | 745 } |
746 | 746 |
747 // If neither this layer nor any of its children were added, early out. | 747 // If neither this layer nor any of its children were added, early out. |
748 if (sortingStartIndex == descendants.size()) | 748 if (sortingStartIndex == descendants.size()) |
749 return; | 749 return; |
750 | 750 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 | 856 |
857 foundLayer = currentLayer; | 857 foundLayer = currentLayer; |
858 break; | 858 break; |
859 } | 859 } |
860 | 860 |
861 // This can potentially return 0, which means the viewportPoint did not succ
essfully hit test any layers, not even the root layer. | 861 // This can potentially return 0, which means the viewportPoint did not succ
essfully hit test any layers, not even the root layer. |
862 return foundLayer; | 862 return foundLayer; |
863 } | 863 } |
864 | 864 |
865 } // namespace cc | 865 } // namespace cc |
OLD | NEW |