Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(548)

Unified Diff: cc/layers/layer_iterator.h

Issue 180243014: Revert "Revert 253606 "Revert 251238 "cc: Clean up iterator template to ..."" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/debug/debug_rect_history.cc ('k') | cc/layers/layer_iterator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/layers/layer_iterator.h
diff --git a/cc/layers/layer_iterator.h b/cc/layers/layer_iterator.h
index f929eb69bd0e87fd066583738a0cd5c9a49f355f..5b13273254574107c0fccb23d8b327f5729653e0 100644
--- a/cc/layers/layer_iterator.h
+++ b/cc/layers/layer_iterator.h
@@ -5,6 +5,7 @@
#ifndef CC_LAYERS_LAYER_ITERATOR_H_
#define CC_LAYERS_LAYER_ITERATOR_H_
+#include "base/memory/ref_counted.h"
#include "cc/base/cc_export.h"
#include "cc/trees/layer_tree_host_common.h"
@@ -18,7 +19,11 @@ namespace cc {
//
// void DoStuffOnLayers(
// const RenderSurfaceLayerList& render_surface_layer_list) {
-// typedef LayerIterator<Layer> LayerIteratorType;
+// typedef LayerIterator<Layer,
+// RenderSurfaceLayerList,
+// RenderSurface,
+// LayerIteratorActions::FrontToBack>
+// LayerIteratorType;
//
// LayerIteratorType end =
// LayerIteratorType::End(&render_surface_layer_list);
@@ -100,11 +105,15 @@ template <typename LayerType> struct LayerIteratorPosition {
// An iterator class for walking over layers in the
// RenderSurface-Layer tree.
-template <typename LayerType>
+template <typename LayerType,
+ typename LayerList,
+ typename RenderSurfaceType,
+ typename IteratorActionType>
class LayerIterator {
- typedef LayerIterator<LayerType> LayerIteratorType;
- typedef typename LayerType::RenderSurfaceListType LayerList;
- typedef typename LayerType::RenderSurfaceType RenderSurfaceType;
+ typedef LayerIterator<LayerType,
+ LayerList,
+ RenderSurfaceType,
+ IteratorActionType> LayerIteratorType;
public:
LayerIterator() : render_surface_layer_list_(NULL) {}
@@ -117,7 +126,7 @@ class LayerIterator {
}
LayerIteratorType& operator++() {
- MoveToNext();
+ actions_.Next(this);
return *this;
}
bool operator==(const LayerIterator& other) const {
@@ -167,81 +176,15 @@ class LayerIterator {
for (size_t i = 0; i < render_surface_layer_list->size(); ++i) {
if (!render_surface_layer_list->at(i)->render_surface()) {
NOTREACHED();
- MoveToEnd();
+ actions_.End(this);
return;
}
}
if (start && !render_surface_layer_list->empty())
- MoveToBegin();
+ actions_.Begin(this);
else
- MoveToEnd();
- }
-
- void MoveToBegin() {
- target_render_surface_layer_index_ = 0;
- current_layer_index_ = target_render_surface_children().size() - 1;
- MoveToHighestInSubtree();
- }
-
- void MoveToEnd() {
- target_render_surface_layer_index_ =
- LayerIteratorValue::kInvalidTargetRenderSurfaceLayerIndex;
- current_layer_index_ = 0;
- }
-
- void MoveToNext() {
- // Moves to the previous layer in the current RS layer list.
- // Then we check if the new current layer has its own RS,
- // in which case there are things in that RS layer list that are higher,
- // so we find the highest layer in that subtree.
- // If we move back past the front of the list,
- // we jump up to the previous RS layer list, picking up again where we
- // had previously recursed into the current RS layer list.
-
- if (!current_layer_represents_target_render_surface()) {
- // Subtracting one here will eventually cause the current layer
- // to become that layer representing the target render surface.
- --current_layer_index_;
- MoveToHighestInSubtree();
- } else {
- while (current_layer_represents_target_render_surface()) {
- if (!target_render_surface_layer_index_) {
- // End of the list.
- target_render_surface_layer_index_ =
- LayerIteratorValue::kInvalidTargetRenderSurfaceLayerIndex;
- current_layer_index_ = 0;
- return;
- }
- target_render_surface_layer_index_ =
- target_render_surface()->target_render_surface_layer_index_history_;
- current_layer_index_ =
- target_render_surface()->current_layer_index_history_;
- }
- }
- }
-
- void MoveToHighestInSubtree() {
- if (current_layer_represents_target_render_surface())
- return;
- while (current_layer_represents_contributing_render_surface()) {
- // Save where we were in the current target surface, move to the next one,
- // and save the target surface that we came from there
- // so we can go back to it.
- target_render_surface()->current_layer_index_history_ =
- current_layer_index_;
- int previous_target_render_surface_layer =
- target_render_surface_layer_index_;
-
- for (LayerType* layer = current_layer();
- target_render_surface_layer() != layer;
- ++target_render_surface_layer_index_) {
- }
- current_layer_index_ = target_render_surface_children().size() - 1;
-
- target_render_surface()->target_render_surface_layer_index_history_ =
- previous_target_render_surface_layer;
- }
+ actions_.End(this);
}
inline LayerType* current_layer() const {
@@ -266,6 +209,7 @@ class LayerIterator {
return target_render_surface()->layer_list();
}
+ IteratorActionType actions_;
const LayerList* render_surface_layer_list_;
// The iterator's current position.
@@ -284,6 +228,44 @@ class LayerIterator {
// the target surface, this is done by setting the current_layerIndex
// to a value of LayerIteratorValue::LayerRepresentingTargetRenderSurface.
int current_layer_index_;
+
+ friend struct LayerIteratorActions;
+};
+
+// Orderings for iterating over the RenderSurface-Layer tree.
+struct CC_EXPORT LayerIteratorActions {
+ // Walks layers sorted by z-order from front to back
+ class CC_EXPORT FrontToBack {
+ public:
+ template <typename LayerType,
+ typename LayerList,
+ typename RenderSurfaceType,
+ typename ActionType>
+ void Begin(
+ LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it);
+
+ template <typename LayerType,
+ typename LayerList,
+ typename RenderSurfaceType,
+ typename ActionType>
+ void End(
+ LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it);
+
+ template <typename LayerType,
+ typename LayerList,
+ typename RenderSurfaceType,
+ typename ActionType>
+ void Next(
+ LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it);
+
+ private:
+ template <typename LayerType,
+ typename LayerList,
+ typename RenderSurfaceType,
+ typename ActionType>
+ void GoToHighestInSubtree(
+ LayerIterator<LayerType, LayerList, RenderSurfaceType, ActionType>* it);
+ };
};
} // namespace cc
« no previous file with comments | « cc/debug/debug_rect_history.cc ('k') | cc/layers/layer_iterator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698