diff options
Diffstat (limited to 'webkit/glue/stacking_order_iterator.h')
-rwxr-xr-x | webkit/glue/stacking_order_iterator.h | 73 |
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__ |