OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "cc/layer_iterator.h" | |
6 | |
7 #include "cc/layer.h" | |
8 #include "cc/layer_impl.h" | |
9 #include "cc/render_surface.h" | |
10 #include "cc/render_surface_impl.h" | |
11 | |
12 namespace cc { | |
13 | |
14 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | |
15 void LayerIteratorActions::BackToFront::begin(LayerIterator<LayerType, LayerList
, RenderSurfaceType, ActionType>& it) | |
16 { | |
17 it.m_targetRenderSurfaceLayerIndex = 0; | |
18 it.m_currentLayerIndex = LayerIteratorValue::LayerIndexRepresentingTargetRen
derSurface; | |
19 | |
20 m_highestTargetRenderSurfaceLayer = 0; | |
21 } | |
22 | |
23 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | |
24 void LayerIteratorActions::BackToFront::end(LayerIterator<LayerType, LayerList,
RenderSurfaceType, ActionType>& it) | |
25 { | |
26 it.m_targetRenderSurfaceLayerIndex = LayerIteratorValue::InvalidTargetRender
SurfaceLayerIndex; | |
27 it.m_currentLayerIndex = 0; | |
28 } | |
29 | |
30 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | |
31 void LayerIteratorActions::BackToFront::next(LayerIterator<LayerType, LayerList,
RenderSurfaceType, ActionType>& it) | |
32 { | |
33 // If the current layer has a RS, move to its layer list. Otherwise, visit t
he next layer in the current RS layer list. | |
34 if (it.currentLayerRepresentsContributingRenderSurface()) { | |
35 // Save our position in the childLayer list for the RenderSurfaceImpl, t
hen jump to the next RenderSurfaceImpl. Save where we | |
36 // came from in the next RenderSurfaceImpl so we can get back to it. | |
37 it.targetRenderSurface()->current_layer_index_history_ = it.m_currentLay
erIndex; | |
38 int previousTargetRenderSurfaceLayer = it.m_targetRenderSurfaceLayerInde
x; | |
39 | |
40 it.m_targetRenderSurfaceLayerIndex = ++m_highestTargetRenderSurfaceLayer
; | |
41 it.m_currentLayerIndex = LayerIteratorValue::LayerIndexRepresentingTarge
tRenderSurface; | |
42 | |
43 it.targetRenderSurface()->target_render_surface_layer_index_history_ = p
reviousTargetRenderSurfaceLayer; | |
44 } else { | |
45 ++it.m_currentLayerIndex; | |
46 | |
47 int targetRenderSurfaceNumChildren = it.targetRenderSurfaceChildren().si
ze(); | |
48 while (it.m_currentLayerIndex == targetRenderSurfaceNumChildren) { | |
49 // 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. | |
50 if (!it.m_targetRenderSurfaceLayerIndex) { | |
51 // End of the list | |
52 it.m_targetRenderSurfaceLayerIndex = LayerIteratorValue::Invalid
TargetRenderSurfaceLayerIndex; | |
53 it.m_currentLayerIndex = 0; | |
54 return; | |
55 } | |
56 it.m_targetRenderSurfaceLayerIndex = it.targetRenderSurface()->targe
t_render_surface_layer_index_history_; | |
57 it.m_currentLayerIndex = it.targetRenderSurface()->current_layer_ind
ex_history_ + 1; | |
58 | |
59 targetRenderSurfaceNumChildren = it.targetRenderSurfaceChildren().si
ze(); | |
60 } | |
61 } | |
62 } | |
63 | |
64 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | |
65 void LayerIteratorActions::FrontToBack::begin(LayerIterator<LayerType, LayerList
, RenderSurfaceType, ActionType>& it) | |
66 { | |
67 it.m_targetRenderSurfaceLayerIndex = 0; | |
68 it.m_currentLayerIndex = it.targetRenderSurfaceChildren().size() - 1; | |
69 goToHighestInSubtree(it); | |
70 } | |
71 | |
72 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | |
73 void LayerIteratorActions::FrontToBack::end(LayerIterator<LayerType, LayerList,
RenderSurfaceType, ActionType>& it) | |
74 { | |
75 it.m_targetRenderSurfaceLayerIndex = LayerIteratorValue::InvalidTargetRender
SurfaceLayerIndex; | |
76 it.m_currentLayerIndex = 0; | |
77 } | |
78 | |
79 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | |
80 void LayerIteratorActions::FrontToBack::next(LayerIterator<LayerType, LayerList,
RenderSurfaceType, ActionType>& it) | |
81 { | |
82 // Moves to the previous layer in the current RS layer list. Then we check i
f the | |
83 // new current layer has its own RS, in which case there are things in that
RS layer list that are higher, so | |
84 // we find the highest layer in that subtree. | |
85 // If we move back past the front of the list, we jump up to the previous RS
layer list, picking up again where we | |
86 // had previously recursed into the current RS layer list. | |
87 | |
88 if (!it.currentLayerRepresentsTargetRenderSurface()) { | |
89 // Subtracting one here will eventually cause the current layer to becom
e that layer | |
90 // representing the target render surface. | |
91 --it.m_currentLayerIndex; | |
92 goToHighestInSubtree(it); | |
93 } else { | |
94 while (it.currentLayerRepresentsTargetRenderSurface()) { | |
95 if (!it.m_targetRenderSurfaceLayerIndex) { | |
96 // End of the list | |
97 it.m_targetRenderSurfaceLayerIndex = LayerIteratorValue::Invalid
TargetRenderSurfaceLayerIndex; | |
98 it.m_currentLayerIndex = 0; | |
99 return; | |
100 } | |
101 it.m_targetRenderSurfaceLayerIndex = it.targetRenderSurface()->targe
t_render_surface_layer_index_history_; | |
102 it.m_currentLayerIndex = it.targetRenderSurface()->current_layer_ind
ex_history_; | |
103 } | |
104 } | |
105 } | |
106 | |
107 template <typename LayerType, typename LayerList, typename RenderSurfaceType, ty
pename ActionType> | |
108 void LayerIteratorActions::FrontToBack::goToHighestInSubtree(LayerIterator<Layer
Type, LayerList, RenderSurfaceType, ActionType>& it) | |
109 { | |
110 if (it.currentLayerRepresentsTargetRenderSurface()) | |
111 return; | |
112 while (it.currentLayerRepresentsContributingRenderSurface()) { | |
113 // Save where we were in the current target surface, move to the next on
e, and save the target surface that we | |
114 // came from there so we can go back to it. | |
115 it.targetRenderSurface()->current_layer_index_history_ = it.m_currentLay
erIndex; | |
116 int previousTargetRenderSurfaceLayer = it.m_targetRenderSurfaceLayerInde
x; | |
117 | |
118 for (LayerType* layer = it.currentLayer(); it.targetRenderSurfaceLayer()
!= layer; ++it.m_targetRenderSurfaceLayerIndex) { } | |
119 it.m_currentLayerIndex = it.targetRenderSurfaceChildren().size() - 1; | |
120 | |
121 it.targetRenderSurface()->target_render_surface_layer_index_history_ = p
reviousTargetRenderSurfaceLayer; | |
122 } | |
123 } | |
124 | |
125 typedef std::vector<scoped_refptr<Layer> > LayerList; | |
126 typedef std::vector<LayerImpl*> LayerImplList; | |
127 | |
128 // Declare each of the above functions for Layer and LayerImpl classes so that t
hey are linked. | |
129 template CC_EXPORT void LayerIteratorActions::BackToFront::begin(LayerIterator<L
ayer, LayerList, RenderSurface, BackToFront> &); | |
130 template CC_EXPORT void LayerIteratorActions::BackToFront::end(LayerIterator<Lay
er, LayerList, RenderSurface, BackToFront>&); | |
131 template CC_EXPORT void LayerIteratorActions::BackToFront::next(LayerIterator<La
yer, LayerList, RenderSurface, BackToFront>&); | |
132 | |
133 template CC_EXPORT void LayerIteratorActions::BackToFront::begin(LayerIterator<L
ayerImpl, LayerImplList, RenderSurfaceImpl, BackToFront>&); | |
134 template CC_EXPORT void LayerIteratorActions::BackToFront::end(LayerIterator<Lay
erImpl, LayerImplList, RenderSurfaceImpl, BackToFront>&); | |
135 template CC_EXPORT void LayerIteratorActions::BackToFront::next(LayerIterator<La
yerImpl, LayerImplList, RenderSurfaceImpl, BackToFront>&); | |
136 | |
137 template CC_EXPORT void LayerIteratorActions::FrontToBack::next(LayerIterator<La
yer, LayerList, RenderSurface, FrontToBack>&); | |
138 template CC_EXPORT void LayerIteratorActions::FrontToBack::end(LayerIterator<Lay
er, LayerList, RenderSurface, FrontToBack>&); | |
139 template CC_EXPORT void LayerIteratorActions::FrontToBack::begin(LayerIterator<L
ayer, LayerList, RenderSurface, FrontToBack>&); | |
140 template CC_EXPORT void LayerIteratorActions::FrontToBack::goToHighestInSubtree(
LayerIterator<Layer, LayerList, RenderSurface, FrontToBack>&); | |
141 | |
142 template CC_EXPORT void LayerIteratorActions::FrontToBack::next(LayerIterator<La
yerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>&); | |
143 template CC_EXPORT void LayerIteratorActions::FrontToBack::end(LayerIterator<Lay
erImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>&); | |
144 template CC_EXPORT void LayerIteratorActions::FrontToBack::begin(LayerIterator<L
ayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>&); | |
145 template CC_EXPORT void LayerIteratorActions::FrontToBack::goToHighestInSubtree(
LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>&); | |
146 | |
147 } // namespace cc | |
OLD | NEW |