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::BackToFront::Begin( 21 LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) { 22 it->target_render_surface_layer_index_ = 0; 23 it->current_layer_index_ = 24 LayerIteratorValue::kLayerIndexRepresentingTargetRenderSurface; 25 26 highest_target_render_surface_layer_ = 0; 27 } 28 29 template <typename LayerType, 30 typename LayerList, 31 typename RenderSurfaceType, 32 typename ActionType> 33 void LayerIteratorActions::BackToFront::End( 34 LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) { 35 it->target_render_surface_layer_index_ = 36 LayerIteratorValue::kInvalidTargetRenderSurfaceLayerIndex; 37 it->current_layer_index_ = 0; 38 } 39 40 template <typename LayerType, 41 typename LayerList, 42 typename RenderSurfaceType, 43 typename ActionType> 44 void LayerIteratorActions::BackToFront::Next( 45 LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) { 46 // If the current layer has a RS, move to its layer list. Otherwise, 47 // visit the next layer in the current RS layer list. 48 if (it->current_layer_represents_contributing_render_surface()) { 49 // Save our position in the child_layers list for the RenderSurface, 50 // then jump to the next RenderSurface. Save where we 51 // came from in the next RenderSurface so we can get back to it. 52 it->target_render_surface()->current_layer_index_history_ = 53 it->current_layer_index_; 54 int previous_target_render_surface_layer = 55 it->target_render_surface_layer_index_; 56 57 it->target_render_surface_layer_index_ = 58 ++highest_target_render_surface_layer_; 59 it->current_layer_index_ = 60 LayerIteratorValue::kLayerIndexRepresentingTargetRenderSurface; 61 62 it->target_render_surface()->target_render_surface_layer_index_history_ = 63 previous_target_render_surface_layer; 64 } else { 65 ++it->current_layer_index_; 66 67 int target_render_surface_num_children = 68 it->target_render_surface_children().size(); 69 while (it->current_layer_index_ == target_render_surface_num_children) { 70 // Jump back to the previous RenderSurface, 71 // and get back the position where we were in that list, 72 // and move to the next position there. 73 if (!it->target_render_surface_layer_index_) { 74 // End of the list 75 it->target_render_surface_layer_index_ = 76 LayerIteratorValue::kInvalidTargetRenderSurfaceLayerIndex; 77 it->current_layer_index_ = 0; 78 return; 79 } 80 it->target_render_surface_layer_index_ = it->target_render_surface() 81 ->target_render_surface_layer_index_history_; 82 it->current_layer_index_ = 83 it->target_render_surface()->current_layer_index_history_ + 1; 84 85 target_render_surface_num_children = 86 it->target_render_surface_children().size(); 87 } 88 } 89 } 90 91 template <typename LayerType, 92 typename LayerList, 93 typename RenderSurfaceType, 94 typename ActionType> 95 void LayerIteratorActions::FrontToBack::Begin( 96 LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) { 97 it->target_render_surface_layer_index_ = 0; 98 it->current_layer_index_ = it->target_render_surface_children().size() - 1; 99 GoToHighestInSubtree(it); 100 } 101 102 template <typename LayerType, 103 typename LayerList, 104 typename RenderSurfaceType, 105 typename ActionType> 106 void LayerIteratorActions::FrontToBack::End( 107 LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) { 108 it->target_render_surface_layer_index_ = 109 LayerIteratorValue::kInvalidTargetRenderSurfaceLayerIndex; 110 it->current_layer_index_ = 0; 111 } 112 113 template <typename LayerType, 114 typename LayerList, 115 typename RenderSurfaceType, 116 typename ActionType> 117 void LayerIteratorActions::FrontToBack::Next( 118 LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) { 119 // Moves to the previous layer in the current RS layer list. 120 // Then we check if the new current layer has its own RS, 121 // in which case there are things in that RS layer list that are higher, 122 // so we find the highest layer in that subtree. 123 // If we move back past the front of the list, 124 // we jump up to the previous RS layer list, picking up again where we 125 // had previously recursed into the current RS layer list. 126 127 if (!it->current_layer_represents_target_render_surface()) { 128 // Subtracting one here will eventually cause the current layer 129 // to become that layer representing the target render surface. 130 --it->current_layer_index_; 131 GoToHighestInSubtree(it); 132 } else { 133 while (it->current_layer_represents_target_render_surface()) { 134 if (!it->target_render_surface_layer_index_) { 135 // End of the list 136 it->target_render_surface_layer_index_ = 137 LayerIteratorValue::kInvalidTargetRenderSurfaceLayerIndex; 138 it->current_layer_index_ = 0; 139 return; 140 } 141 it->target_render_surface_layer_index_ = it->target_render_surface() 142 ->target_render_surface_layer_index_history_; 143 it->current_layer_index_ = 144 it->target_render_surface()->current_layer_index_history_; 145 } 146 } 147 } 148 149 template <typename LayerType, 150 typename LayerList, 151 typename RenderSurfaceType, 152 typename ActionType> 153 void LayerIteratorActions::FrontToBack::GoToHighestInSubtree( 154 LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it) { 155 if (it->current_layer_represents_target_render_surface()) 156 return; 157 while (it->current_layer_represents_contributing_render_surface()) { 158 // Save where we were in the current target surface, move to the next one, 159 // and save the target surface that we came from there 160 // so we can go back to it. 161 it->target_render_surface()->current_layer_index_history_ = 162 it->current_layer_index_; 163 int previous_target_render_surface_layer = 164 it->target_render_surface_layer_index_; 165 166 for (LayerType* layer = it->current_layer(); 167 it->target_render_surface_layer() != layer; 168 ++it->target_render_surface_layer_index_) { 169 } 170 it->current_layer_index_ = it->target_render_surface_children().size() - 1; 171 172 it->target_render_surface()->target_render_surface_layer_index_history_ = 173 previous_target_render_surface_layer; 174 } 175 } 176 177 // Declare each of the above functions for Layer and LayerImpl classes 178 // so that they are linked. 179 template CC_EXPORT void LayerIteratorActions::BackToFront::Begin( 180 LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, BackToFront>* 181 it); 182 template CC_EXPORT void LayerIteratorActions::BackToFront::End( 183 LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, BackToFront>* 184 it); 185 template CC_EXPORT void LayerIteratorActions::BackToFront::Next( 186 LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, BackToFront>* 187 it); 188 189 template CC_EXPORT void LayerIteratorActions::BackToFront::Begin( 190 LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, BackToFront>* 191 it); 192 template CC_EXPORT void LayerIteratorActions::BackToFront::End( 193 LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, BackToFront>* 194 it); 195 template CC_EXPORT void LayerIteratorActions::BackToFront::Next( 196 LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, BackToFront>* 197 it); 198 199 template CC_EXPORT void LayerIteratorActions::FrontToBack::Next( 200 LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, FrontToBack>* 201 it); 202 template CC_EXPORT void LayerIteratorActions::FrontToBack::End( 203 LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, FrontToBack>* 204 it); 205 template CC_EXPORT void LayerIteratorActions::FrontToBack::Begin( 206 LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, FrontToBack>* 207 it); 208 template CC_EXPORT void LayerIteratorActions::FrontToBack::GoToHighestInSubtree( 209 LayerIterator<Layer, RenderSurfaceLayerList, RenderSurface, FrontToBack>* 210 it); 211 212 template CC_EXPORT void LayerIteratorActions::FrontToBack::Next( 213 LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>* 214 it); 215 template CC_EXPORT void LayerIteratorActions::FrontToBack::End( 216 LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>* 217 it); 218 template CC_EXPORT void LayerIteratorActions::FrontToBack::Begin( 219 LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>* 220 it); 221 template CC_EXPORT void LayerIteratorActions::FrontToBack::GoToHighestInSubtree( 222 LayerIterator<LayerImpl, LayerImplList, RenderSurfaceImpl, FrontToBack>* 223 it); 224 225 } // namespace cc 226