Upstream version 5.34.98.0
[platform/framework/web/crosswalk.git] / src / cc / layers / layer_iterator.cc
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/layers/layer_iterator.h"
6
7 #include <vector>
8
9 #include "cc/layers/layer.h"
10 #include "cc/layers/layer_impl.h"
11 #include "cc/layers/render_surface.h"
12 #include "cc/layers/render_surface_impl.h"
13
14 namespace cc {
15
16 template <typename LayerType,
17           typename LayerList,
18           typename RenderSurfaceType,
19           typename ActionType>
20 void LayerIteratorActions::FrontToBack::Begin(
21     LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) {
22   it->target_render_surface_layer_index_ = 0;
23   it->current_layer_index_ = it->target_render_surface_children().size() - 1;
24   GoToHighestInSubtree(it);
25 }
26
27 template <typename LayerType,
28           typename LayerList,
29           typename RenderSurfaceType,
30           typename ActionType>
31 void LayerIteratorActions::FrontToBack::End(
32     LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) {
33   it->target_render_surface_layer_index_ =
34       LayerIteratorValue::kInvalidTargetRenderSurfaceLayerIndex;
35   it->current_layer_index_ = 0;
36 }
37
38 template <typename LayerType,
39           typename LayerList,
40           typename RenderSurfaceType,
41           typename ActionType>
42 void LayerIteratorActions::FrontToBack::Next(
43     LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) {
44   // Moves to the previous layer in the current RS layer list.
45   // Then we check if the new current layer has its own RS,
46   // in which case there are things in that RS layer list that are higher,
47   // so we find the highest layer in that subtree.
48   // If we move back past the front of the list,
49   // we jump up to the previous RS layer list, picking up again where we
50   // had previously recursed into the current RS layer list.
51
52   if (!it->current_layer_represents_target_render_surface()) {
53     // Subtracting one here will eventually cause the current layer
54     // to become that layer representing the target render surface.
55     --it->current_layer_index_;
56     GoToHighestInSubtree(it);
57   } else {
58     while (it->current_layer_represents_target_render_surface()) {
59       if (!it->target_render_surface_layer_index_) {
60         // End of the list
61         it->target_render_surface_layer_index_ =
62             LayerIteratorValue::kInvalidTargetRenderSurfaceLayerIndex;
63         it->current_layer_index_ = 0;
64         return;
65       }
66       it->target_render_surface_layer_index_ = it->target_render_surface()
67           ->target_render_surface_layer_index_history_;
68       it->current_layer_index_ =
69           it->target_render_surface()->current_layer_index_history_;
70     }
71   }
72 }
73
74 template <typename LayerType,
75           typename LayerList,
76           typename RenderSurfaceType,
77           typename ActionType>
78 void LayerIteratorActions::FrontToBack::GoToHighestInSubtree(
79     LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) {
80   if (it->current_layer_represents_target_render_surface())
81     return;
82   while (it->current_layer_represents_contributing_render_surface()) {
83     // Save where we were in the current target surface, move to the next one,
84     // and save the target surface that we came from there
85     // so we can go back to it.
86     it->target_render_surface()->current_layer_index_history_ =
87         it->current_layer_index_;
88     int previous_target_render_surface_layer =
89         it->target_render_surface_layer_index_;
90
91     for (LayerType* layer = it->current_layer();
92          it->target_render_surface_layer() != layer;
93          ++it->target_render_surface_layer_index_) {
94     }
95     it->current_layer_index_ = it->target_render_surface_children().size() - 1;
96
97     it->target_render_surface()->target_render_surface_layer_index_history_ =
98         previous_target_render_surface_layer;
99   }
100 }
101
102 // Declare each of the above functions for Layer and LayerImpl classes
103 // so that they are linked.
104 template CC_EXPORT void LayerIteratorActions::FrontToBack::Next(
105     LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, FrontToBack>*
106         it);
107 template CC_EXPORT void LayerIteratorActions::FrontToBack::End(
108     LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, FrontToBack>*
109         it);
110 template CC_EXPORT void LayerIteratorActions::FrontToBack::Begin(
111     LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, FrontToBack>*
112         it);
113 template CC_EXPORT void LayerIteratorActions::FrontToBack::GoToHighestInSubtree(
114     LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, FrontToBack>*
115         it);
116
117 template CC_EXPORT void LayerIteratorActions::FrontToBack::Next(
118     LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>*
119         it);
120 template CC_EXPORT void LayerIteratorActions::FrontToBack::End(
121     LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>*
122         it);
123 template CC_EXPORT void LayerIteratorActions::FrontToBack::Begin(
124     LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>*
125         it);
126 template CC_EXPORT void LayerIteratorActions::FrontToBack::GoToHighestInSubtree(
127     LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>*
128         it);
129
130 }  // namespace cc