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

Unified Diff: cc/layers/layer_iterator.h

Issue 156603005: cc: Clean up iterator template to only take 1 parameter. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: iteratorcleanup: 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 5b13273254574107c0fccb23d8b327f5729653e0..1e12ee43a18758b8b5fa524f49d882983aeb80f3 100644
--- a/cc/layers/layer_iterator.h
+++ b/cc/layers/layer_iterator.h
@@ -5,7 +5,6 @@
#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"
@@ -19,11 +18,7 @@ namespace cc {
//
// void DoStuffOnLayers(
// const RenderSurfaceLayerList& render_surface_layer_list) {
-// typedef LayerIterator<Layer,
-// RenderSurfaceLayerList,
-// RenderSurface,
-// LayerIteratorActions::FrontToBack>
-// LayerIteratorType;
+// typedef LayerIterator<Layer> LayerIteratorType;
//
// LayerIteratorType end =
// LayerIteratorType::End(&render_surface_layer_list);
@@ -103,17 +98,20 @@ template <typename LayerType> struct LayerIteratorPosition {
LayerType* current_layer;
};
+struct LayerIteratorPadding {
+ // This struct has nothing in it! It exists to make the LayerIterator a bit
+ // larger for debugging some weird behaviour when this CL previously landed.
+ // See crbug.com/345757 for more details.
+ void Foo() {}
+};
+
// An iterator class for walking over layers in the
// RenderSurface-Layer tree.
-template <typename LayerType,
- typename LayerList,
- typename RenderSurfaceType,
- typename IteratorActionType>
+template <typename LayerType>
class LayerIterator {
- typedef LayerIterator<LayerType,
- LayerList,
- RenderSurfaceType,
- IteratorActionType> LayerIteratorType;
+ typedef LayerIterator<LayerType> LayerIteratorType;
+ typedef typename LayerType::RenderSurfaceListType LayerList;
+ typedef typename LayerType::RenderSurfaceType RenderSurfaceType;
public:
LayerIterator() : render_surface_layer_list_(NULL) {}
@@ -126,7 +124,7 @@ class LayerIterator {
}
LayerIteratorType& operator++() {
- actions_.Next(this);
+ MoveToNext();
return *this;
}
bool operator==(const LayerIterator& other) const {
@@ -176,15 +174,81 @@ class LayerIterator {
for (size_t i = 0; i < render_surface_layer_list->size(); ++i) {
if (!render_surface_layer_list->at(i)->render_surface()) {
NOTREACHED();
- actions_.End(this);
+ MoveToEnd();
return;
}
}
if (start && !render_surface_layer_list->empty())
- actions_.Begin(this);
+ MoveToBegin();
else
- actions_.End(this);
+ 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;
+ }
}
inline LayerType* current_layer() const {
@@ -209,7 +273,7 @@ class LayerIterator {
return target_render_surface()->layer_list();
}
- IteratorActionType actions_;
+ LayerIteratorPadding padding_;
const LayerList* render_surface_layer_list_;
// The iterator's current position.
@@ -228,44 +292,6 @@ 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