Home | History | Annotate | Download | only in layers
      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
    131