summaryrefslogtreecommitdiffstats
path: root/webkit/glue/stacking_order_iterator.h
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/glue/stacking_order_iterator.h')
-rwxr-xr-xwebkit/glue/stacking_order_iterator.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/webkit/glue/stacking_order_iterator.h b/webkit/glue/stacking_order_iterator.h
new file mode 100755
index 0000000..20dea41
--- /dev/null
+++ b/webkit/glue/stacking_order_iterator.h
@@ -0,0 +1,73 @@
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Provides some utilities for iterating over a RenderObject graph in
+// stacking order.
+
+#ifndef WEBKIT_GLUE_STACKING_ORDER_ITERATOR_H__
+#define WEBKIT_GLUE_STACKING_ORDER_ITERATOR_H__
+
+#include <vector>
+
+namespace WebCore {
+class RenderLayer;
+class RenderObject;
+}
+
+// Iterates over a subtree of RenderLayers in stacking order, back to
+// front. Modifying the RenderObject graph invalidates this iterator.
+//
+// TODO(tulrich): this could go in webkit.
+// TODO(tulrich): needs unittests.
+class RenderLayerIterator {
+ public:
+ RenderLayerIterator();
+
+ // Sets the RenderLayer subtree to iterate over.
+ void Reset(WebCore::RenderLayer* rl);
+
+ // Returns the next RenderLayer in stacking order, back to front.
+ WebCore::RenderLayer* Next();
+ private:
+ class Context {
+ public:
+ Context(WebCore::RenderLayer* layer);
+
+ bool HasMoreNeg();
+ Context NextNeg();
+ bool HasSelf();
+ WebCore::RenderLayer* NextSelf();
+ bool HasMoreOverflow();
+ Context NextOverflow();
+ bool HasMorePos();
+ Context NextPos();
+
+ private:
+ WebCore::RenderLayer* layer_;
+ size_t next_neg_;
+ size_t next_self_;
+ size_t next_overflow_;
+ size_t next_pos_;
+ };
+
+ std::vector<Context> context_stack_;
+};
+
+// Iterates over a subtree of RenderObjects below a given RenderLayer.
+//
+// TODO(tulrich): this could go in webkit.
+// TODO(tulrich): needs unittests.
+class StackingOrderIterator {
+ public:
+ StackingOrderIterator();
+ void Reset(WebCore::RenderLayer* rl);
+ WebCore::RenderObject* Next();
+
+ private:
+ RenderLayerIterator layer_iterator_;
+ WebCore::RenderObject* current_object_;
+ WebCore::RenderObject* current_layer_root_;
+};
+
+#endif // WEBKIT_GLUE_STACKING_ORDER_ITERATOR_H__