| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 #include "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "CCLayerIterator.h" | 7 #include "CCLayerIterator.h" |
| 8 | 8 |
| 9 #include "CCLayerImpl.h" | 9 #include "CCLayerImpl.h" |
| 10 #include "CCRenderSurface.h" | 10 #include "CCRenderSurface.h" |
| 11 #include "cc/layer.h" | 11 #include "cc/layer.h" |
| 12 #include "cc/render_surface.h" | 12 #include "cc/render_surface.h" |
| 13 | 13 |
| 14 namespace cc { | 14 namespace cc { |
| 15 | 15 |
| 16 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | 16 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> |
| 17 void CCLayerIteratorActions::BackToFront::begin(CCLayerIterator<LayerType, Layer
List, RenderSurfaceType, ActionType>& it) | 17 void LayerIteratorActions::BackToFront::begin(LayerIterator<LayerType, LayerList
, RenderSurfaceType, ActionType>& it) |
| 18 { | 18 { |
| 19 it.m_targetRenderSurfaceLayerIndex = 0; | 19 it.m_targetRenderSurfaceLayerIndex = 0; |
| 20 it.m_currentLayerIndex = CCLayerIteratorValue::LayerIndexRepresentingTargetR
enderSurface; | 20 it.m_currentLayerIndex = LayerIteratorValue::LayerIndexRepresentingTargetRen
derSurface; |
| 21 | 21 |
| 22 m_highestTargetRenderSurfaceLayer = 0; | 22 m_highestTargetRenderSurfaceLayer = 0; |
| 23 } | 23 } |
| 24 | 24 |
| 25 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | 25 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> |
| 26 void CCLayerIteratorActions::BackToFront::end(CCLayerIterator<LayerType, LayerLi
st, RenderSurfaceType, ActionType>& it) | 26 void LayerIteratorActions::BackToFront::end(LayerIterator<LayerType, LayerList,
RenderSurfaceType, ActionType>& it) |
| 27 { | 27 { |
| 28 it.m_targetRenderSurfaceLayerIndex = CCLayerIteratorValue::InvalidTargetRend
erSurfaceLayerIndex; | 28 it.m_targetRenderSurfaceLayerIndex = LayerIteratorValue::InvalidTargetRender
SurfaceLayerIndex; |
| 29 it.m_currentLayerIndex = 0; | 29 it.m_currentLayerIndex = 0; |
| 30 } | 30 } |
| 31 | 31 |
| 32 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | 32 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> |
| 33 void CCLayerIteratorActions::BackToFront::next(CCLayerIterator<LayerType, LayerL
ist, RenderSurfaceType, ActionType>& it) | 33 void LayerIteratorActions::BackToFront::next(LayerIterator<LayerType, LayerList,
RenderSurfaceType, ActionType>& it) |
| 34 { | 34 { |
| 35 // If the current layer has a RS, move to its layer list. Otherwise, visit t
he next layer in the current RS layer list. | 35 // If the current layer has a RS, move to its layer list. Otherwise, visit t
he next layer in the current RS layer list. |
| 36 if (it.currentLayerRepresentsContributingRenderSurface()) { | 36 if (it.currentLayerRepresentsContributingRenderSurface()) { |
| 37 // Save our position in the childLayer list for the RenderSurface, then
jump to the next RenderSurface. Save where we | 37 // Save our position in the childLayer list for the RenderSurfaceImpl, t
hen jump to the next RenderSurfaceImpl. Save where we |
| 38 // came from in the next RenderSurface so we can get back to it. | 38 // came from in the next RenderSurfaceImpl so we can get back to it. |
| 39 it.targetRenderSurface()->m_currentLayerIndexHistory = it.m_currentLayer
Index; | 39 it.targetRenderSurface()->m_currentLayerIndexHistory = it.m_currentLayer
Index; |
| 40 int previousTargetRenderSurfaceLayer = it.m_targetRenderSurfaceLayerInde
x; | 40 int previousTargetRenderSurfaceLayer = it.m_targetRenderSurfaceLayerInde
x; |
| 41 | 41 |
| 42 it.m_targetRenderSurfaceLayerIndex = ++m_highestTargetRenderSurfaceLayer
; | 42 it.m_targetRenderSurfaceLayerIndex = ++m_highestTargetRenderSurfaceLayer
; |
| 43 it.m_currentLayerIndex = CCLayerIteratorValue::LayerIndexRepresentingTar
getRenderSurface; | 43 it.m_currentLayerIndex = LayerIteratorValue::LayerIndexRepresentingTarge
tRenderSurface; |
| 44 | 44 |
| 45 it.targetRenderSurface()->m_targetRenderSurfaceLayerIndexHistory = previ
ousTargetRenderSurfaceLayer; | 45 it.targetRenderSurface()->m_targetRenderSurfaceLayerIndexHistory = previ
ousTargetRenderSurfaceLayer; |
| 46 } else { | 46 } else { |
| 47 ++it.m_currentLayerIndex; | 47 ++it.m_currentLayerIndex; |
| 48 | 48 |
| 49 int targetRenderSurfaceNumChildren = it.targetRenderSurfaceChildren().si
ze(); | 49 int targetRenderSurfaceNumChildren = it.targetRenderSurfaceChildren().si
ze(); |
| 50 while (it.m_currentLayerIndex == targetRenderSurfaceNumChildren) { | 50 while (it.m_currentLayerIndex == targetRenderSurfaceNumChildren) { |
| 51 // Jump back to the previous RenderSurface, and get back the positio
n where we were in that list, and move to the next position there. | 51 // Jump back to the previous RenderSurfaceImpl, and get back the pos
ition where we were in that list, and move to the next position there. |
| 52 if (!it.m_targetRenderSurfaceLayerIndex) { | 52 if (!it.m_targetRenderSurfaceLayerIndex) { |
| 53 // End of the list | 53 // End of the list |
| 54 it.m_targetRenderSurfaceLayerIndex = CCLayerIteratorValue::Inval
idTargetRenderSurfaceLayerIndex; | 54 it.m_targetRenderSurfaceLayerIndex = LayerIteratorValue::Invalid
TargetRenderSurfaceLayerIndex; |
| 55 it.m_currentLayerIndex = 0; | 55 it.m_currentLayerIndex = 0; |
| 56 return; | 56 return; |
| 57 } | 57 } |
| 58 it.m_targetRenderSurfaceLayerIndex = it.targetRenderSurface()->m_tar
getRenderSurfaceLayerIndexHistory; | 58 it.m_targetRenderSurfaceLayerIndex = it.targetRenderSurface()->m_tar
getRenderSurfaceLayerIndexHistory; |
| 59 it.m_currentLayerIndex = it.targetRenderSurface()->m_currentLayerInd
exHistory + 1; | 59 it.m_currentLayerIndex = it.targetRenderSurface()->m_currentLayerInd
exHistory + 1; |
| 60 | 60 |
| 61 targetRenderSurfaceNumChildren = it.targetRenderSurfaceChildren().si
ze(); | 61 targetRenderSurfaceNumChildren = it.targetRenderSurfaceChildren().si
ze(); |
| 62 } | 62 } |
| 63 } | 63 } |
| 64 } | 64 } |
| 65 | 65 |
| 66 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | 66 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> |
| 67 void CCLayerIteratorActions::FrontToBack::begin(CCLayerIterator<LayerType, Layer
List, RenderSurfaceType, ActionType>& it) | 67 void LayerIteratorActions::FrontToBack::begin(LayerIterator<LayerType, LayerList
, RenderSurfaceType, ActionType>& it) |
| 68 { | 68 { |
| 69 it.m_targetRenderSurfaceLayerIndex = 0; | 69 it.m_targetRenderSurfaceLayerIndex = 0; |
| 70 it.m_currentLayerIndex = it.targetRenderSurfaceChildren().size() - 1; | 70 it.m_currentLayerIndex = it.targetRenderSurfaceChildren().size() - 1; |
| 71 goToHighestInSubtree(it); | 71 goToHighestInSubtree(it); |
| 72 } | 72 } |
| 73 | 73 |
| 74 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | 74 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> |
| 75 void CCLayerIteratorActions::FrontToBack::end(CCLayerIterator<LayerType, LayerLi
st, RenderSurfaceType, ActionType>& it) | 75 void LayerIteratorActions::FrontToBack::end(LayerIterator<LayerType, LayerList,
RenderSurfaceType, ActionType>& it) |
| 76 { | 76 { |
| 77 it.m_targetRenderSurfaceLayerIndex = CCLayerIteratorValue::InvalidTargetRend
erSurfaceLayerIndex; | 77 it.m_targetRenderSurfaceLayerIndex = LayerIteratorValue::InvalidTargetRender
SurfaceLayerIndex; |
| 78 it.m_currentLayerIndex = 0; | 78 it.m_currentLayerIndex = 0; |
| 79 } | 79 } |
| 80 | 80 |
| 81 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | 81 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> |
| 82 void CCLayerIteratorActions::FrontToBack::next(CCLayerIterator<LayerType, LayerL
ist, RenderSurfaceType, ActionType>& it) | 82 void LayerIteratorActions::FrontToBack::next(LayerIterator<LayerType, LayerList,
RenderSurfaceType, ActionType>& it) |
| 83 { | 83 { |
| 84 // Moves to the previous layer in the current RS layer list. Then we check i
f the | 84 // Moves to the previous layer in the current RS layer list. Then we check i
f the |
| 85 // new current layer has its own RS, in which case there are things in that
RS layer list that are higher, so | 85 // new current layer has its own RS, in which case there are things in that
RS layer list that are higher, so |
| 86 // we find the highest layer in that subtree. | 86 // we find the highest layer in that subtree. |
| 87 // If we move back past the front of the list, we jump up to the previous RS
layer list, picking up again where we | 87 // If we move back past the front of the list, we jump up to the previous RS
layer list, picking up again where we |
| 88 // had previously recursed into the current RS layer list. | 88 // had previously recursed into the current RS layer list. |
| 89 | 89 |
| 90 if (!it.currentLayerRepresentsTargetRenderSurface()) { | 90 if (!it.currentLayerRepresentsTargetRenderSurface()) { |
| 91 // Subtracting one here will eventually cause the current layer to becom
e that layer | 91 // Subtracting one here will eventually cause the current layer to becom
e that layer |
| 92 // representing the target render surface. | 92 // representing the target render surface. |
| 93 --it.m_currentLayerIndex; | 93 --it.m_currentLayerIndex; |
| 94 goToHighestInSubtree(it); | 94 goToHighestInSubtree(it); |
| 95 } else { | 95 } else { |
| 96 while (it.currentLayerRepresentsTargetRenderSurface()) { | 96 while (it.currentLayerRepresentsTargetRenderSurface()) { |
| 97 if (!it.m_targetRenderSurfaceLayerIndex) { | 97 if (!it.m_targetRenderSurfaceLayerIndex) { |
| 98 // End of the list | 98 // End of the list |
| 99 it.m_targetRenderSurfaceLayerIndex = CCLayerIteratorValue::Inval
idTargetRenderSurfaceLayerIndex; | 99 it.m_targetRenderSurfaceLayerIndex = LayerIteratorValue::Invalid
TargetRenderSurfaceLayerIndex; |
| 100 it.m_currentLayerIndex = 0; | 100 it.m_currentLayerIndex = 0; |
| 101 return; | 101 return; |
| 102 } | 102 } |
| 103 it.m_targetRenderSurfaceLayerIndex = it.targetRenderSurface()->m_tar
getRenderSurfaceLayerIndexHistory; | 103 it.m_targetRenderSurfaceLayerIndex = it.targetRenderSurface()->m_tar
getRenderSurfaceLayerIndexHistory; |
| 104 it.m_currentLayerIndex = it.targetRenderSurface()->m_currentLayerInd
exHistory; | 104 it.m_currentLayerIndex = it.targetRenderSurface()->m_currentLayerInd
exHistory; |
| 105 } | 105 } |
| 106 } | 106 } |
| 107 } | 107 } |
| 108 | 108 |
| 109 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | 109 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> |
| 110 void CCLayerIteratorActions::FrontToBack::goToHighestInSubtree(CCLayerIterator<L
ayerType, LayerList, RenderSurfaceType, ActionType>& it) | 110 void LayerIteratorActions::FrontToBack::goToHighestInSubtree(LayerIterator<Layer
Type, LayerList, RenderSurfaceType, ActionType>& it) |
| 111 { | 111 { |
| 112 if (it.currentLayerRepresentsTargetRenderSurface()) | 112 if (it.currentLayerRepresentsTargetRenderSurface()) |
| 113 return; | 113 return; |
| 114 while (it.currentLayerRepresentsContributingRenderSurface()) { | 114 while (it.currentLayerRepresentsContributingRenderSurface()) { |
| 115 // Save where we were in the current target surface, move to the next on
e, and save the target surface that we | 115 // Save where we were in the current target surface, move to the next on
e, and save the target surface that we |
| 116 // came from there so we can go back to it. | 116 // came from there so we can go back to it. |
| 117 it.targetRenderSurface()->m_currentLayerIndexHistory = it.m_currentLayer
Index; | 117 it.targetRenderSurface()->m_currentLayerIndexHistory = it.m_currentLayer
Index; |
| 118 int previousTargetRenderSurfaceLayer = it.m_targetRenderSurfaceLayerInde
x; | 118 int previousTargetRenderSurfaceLayer = it.m_targetRenderSurfaceLayerInde
x; |
| 119 | 119 |
| 120 for (LayerType* layer = it.currentLayer(); it.targetRenderSurfaceLayer()
!= layer; ++it.m_targetRenderSurfaceLayerIndex) { } | 120 for (LayerType* layer = it.currentLayer(); it.targetRenderSurfaceLayer()
!= layer; ++it.m_targetRenderSurfaceLayerIndex) { } |
| 121 it.m_currentLayerIndex = it.targetRenderSurfaceChildren().size() - 1; | 121 it.m_currentLayerIndex = it.targetRenderSurfaceChildren().size() - 1; |
| 122 | 122 |
| 123 it.targetRenderSurface()->m_targetRenderSurfaceLayerIndexHistory = previ
ousTargetRenderSurfaceLayer; | 123 it.targetRenderSurface()->m_targetRenderSurfaceLayerIndexHistory = previ
ousTargetRenderSurfaceLayer; |
| 124 } | 124 } |
| 125 } | 125 } |
| 126 | 126 |
| 127 typedef std::vector<scoped_refptr<LayerChromium> > LayerChromiumList; | 127 typedef std::vector<scoped_refptr<Layer> > LayerList; |
| 128 typedef std::vector<CCLayerImpl*> CCLayerImplList; | 128 typedef std::vector<LayerImpl*> LayerImplList; |
| 129 | 129 |
| 130 // Declare each of the above functions for LayerChromium and CCLayerImpl classes
so that they are linked. | 130 // Declare each of the above functions for Layer and LayerImpl classes so that t
hey are linked. |
| 131 template void CCLayerIteratorActions::BackToFront::begin(CCLayerIterator<LayerCh
romium, LayerChromiumList, RenderSurfaceChromium, BackToFront> &); | 131 template void LayerIteratorActions::BackToFront::begin(LayerIterator<Layer, Laye
rList, RenderSurface, BackToFront> &); |
| 132 template void CCLayerIteratorActions::BackToFront::end(CCLayerIterator<LayerChro
mium, LayerChromiumList, RenderSurfaceChromium, BackToFront>&); | 132 template void LayerIteratorActions::BackToFront::end(LayerIterator<Layer, LayerL
ist, RenderSurface, BackToFront>&); |
| 133 template void CCLayerIteratorActions::BackToFront::next(CCLayerIterator<LayerChr
omium, LayerChromiumList, RenderSurfaceChromium, BackToFront>&); | 133 template void LayerIteratorActions::BackToFront::next(LayerIterator<Layer, Layer
List, RenderSurface, BackToFront>&); |
| 134 | 134 |
| 135 template void CCLayerIteratorActions::BackToFront::begin(CCLayerIterator<CCLayer
Impl, CCLayerImplList, CCRenderSurface, BackToFront>&); | 135 template void LayerIteratorActions::BackToFront::begin(LayerIterator<LayerImpl,
LayerImplList, RenderSurfaceImpl, BackToFront>&); |
| 136 template void CCLayerIteratorActions::BackToFront::end(CCLayerIterator<CCLayerIm
pl, CCLayerImplList, CCRenderSurface, BackToFront>&); | 136 template void LayerIteratorActions::BackToFront::end(LayerIterator<LayerImpl, La
yerImplList, RenderSurfaceImpl, BackToFront>&); |
| 137 template void CCLayerIteratorActions::BackToFront::next(CCLayerIterator<CCLayerI
mpl, CCLayerImplList, CCRenderSurface, BackToFront>&); | 137 template void LayerIteratorActions::BackToFront::next(LayerIterator<LayerImpl, L
ayerImplList, RenderSurfaceImpl, BackToFront>&); |
| 138 | 138 |
| 139 template void CCLayerIteratorActions::FrontToBack::next(CCLayerIterator<LayerChr
omium, LayerChromiumList, RenderSurfaceChromium, FrontToBack>&); | 139 template void LayerIteratorActions::FrontToBack::next(LayerIterator<Layer, Layer
List, RenderSurface, FrontToBack>&); |
| 140 template void CCLayerIteratorActions::FrontToBack::end(CCLayerIterator<LayerChro
mium, LayerChromiumList, RenderSurfaceChromium, FrontToBack>&); | 140 template void LayerIteratorActions::FrontToBack::end(LayerIterator<Layer, LayerL
ist, RenderSurface, FrontToBack>&); |
| 141 template void CCLayerIteratorActions::FrontToBack::begin(CCLayerIterator<LayerCh
romium, LayerChromiumList, RenderSurfaceChromium, FrontToBack>&); | 141 template void LayerIteratorActions::FrontToBack::begin(LayerIterator<Layer, Laye
rList, RenderSurface, FrontToBack>&); |
| 142 template void CCLayerIteratorActions::FrontToBack::goToHighestInSubtree(CCLayerI
terator<LayerChromium, LayerChromiumList, RenderSurfaceChromium, FrontToBack>&); | 142 template void LayerIteratorActions::FrontToBack::goToHighestInSubtree(LayerItera
tor<Layer, LayerList, RenderSurface, FrontToBack>&); |
| 143 | 143 |
| 144 template void CCLayerIteratorActions::FrontToBack::next(CCLayerIterator<CCLayerI
mpl, CCLayerImplList, CCRenderSurface, FrontToBack>&); | 144 template void LayerIteratorActions::FrontToBack::next(LayerIterator<LayerImpl, L
ayerImplList, RenderSurfaceImpl, FrontToBack>&); |
| 145 template void CCLayerIteratorActions::FrontToBack::end(CCLayerIterator<CCLayerIm
pl, CCLayerImplList, CCRenderSurface, FrontToBack>&); | 145 template void LayerIteratorActions::FrontToBack::end(LayerIterator<LayerImpl, La
yerImplList, RenderSurfaceImpl, FrontToBack>&); |
| 146 template void CCLayerIteratorActions::FrontToBack::begin(CCLayerIterator<CCLayer
Impl, CCLayerImplList, CCRenderSurface, FrontToBack>&); | 146 template void LayerIteratorActions::FrontToBack::begin(LayerIterator<LayerImpl,
LayerImplList, RenderSurfaceImpl, FrontToBack>&); |
| 147 template void CCLayerIteratorActions::FrontToBack::goToHighestInSubtree(CCLayerI
terator<CCLayerImpl, CCLayerImplList, CCRenderSurface, FrontToBack>&); | 147 template void LayerIteratorActions::FrontToBack::goToHighestInSubtree(LayerItera
tor<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>&); |
| 148 | 148 |
| 149 } // namespace cc | 149 } // namespace cc |
| OLD | NEW |