| Index: cc/trees/property_tree.h
|
| diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8e07683c33030a0eec7b94dda67bebe6d2294442
|
| --- /dev/null
|
| +++ b/cc/trees/property_tree.h
|
| @@ -0,0 +1,139 @@
|
| +// Copyright 2014 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.
|
| +
|
| +#ifndef CC_TREES_PROPERTY_TREE_H_
|
| +#define CC_TREES_PROPERTY_TREE_H_
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "cc/base/cc_export.h"
|
| +#include "ui/gfx/rect.h"
|
| +#include "ui/gfx/transform.h"
|
| +
|
| +namespace cc {
|
| +
|
| +template <typename T>
|
| +struct CC_EXPORT TreeNode {
|
| + TreeNode() : id(-1), parent_id(-1), data() {}
|
| + int id;
|
| + int parent_id;
|
| + T data;
|
| +};
|
| +
|
| +struct CC_EXPORT TransformNodeData {
|
| + TransformNodeData();
|
| + ~TransformNodeData();
|
| +
|
| + gfx::Transform to_parent;
|
| + gfx::Transform from_parent;
|
| +
|
| + gfx::Transform to_screen;
|
| + gfx::Transform from_screen;
|
| +
|
| + int target_id;
|
| +
|
| + bool is_invertible;
|
| + bool ancestors_are_invertible;
|
| +
|
| + bool is_animated;
|
| + bool to_screen_is_animated;
|
| +
|
| + bool flattens;
|
| +
|
| + void set_to_parent(const gfx::Transform& transform) {
|
| + to_parent = transform;
|
| + is_invertible = to_parent.GetInverse(&from_parent);
|
| + }
|
| +};
|
| +
|
| +typedef TreeNode<TransformNodeData> TransformNode;
|
| +
|
| +struct CC_EXPORT ClipNodeData {
|
| + ClipNodeData();
|
| +
|
| + gfx::RectF clip;
|
| + gfx::RectF combined_clip;
|
| + int transform_id;
|
| + int target_id;
|
| +};
|
| +
|
| +typedef TreeNode<ClipNodeData> ClipNode;
|
| +
|
| +template <typename T>
|
| +class CC_EXPORT PropertyTree {
|
| + public:
|
| + PropertyTree();
|
| + virtual ~PropertyTree();
|
| +
|
| + int Insert(const T& tree_node, int parent_id);
|
| +
|
| + T* Node(int i) { return i > -1 ? &nodes_[i] : nullptr; }
|
| + const T* Node(int i) const { return i > -1 ? &nodes_[i] : nullptr; }
|
| +
|
| + T* parent(const T* t) {
|
| + return t->parent_id > -1 ? Node(t->parent_id) : nullptr;
|
| + }
|
| + const T* parent(const T* t) const {
|
| + return t->parent_id > -1 ? Node(t->parent_id) : nullptr;
|
| + }
|
| +
|
| + T* back() { return size() ? &nodes_[nodes_.size() - 1] : nullptr; }
|
| + const T* back() const {
|
| + return size() ? &nodes_[nodes_.size() - 1] : nullptr;
|
| + }
|
| +
|
| + void clear() { nodes_.clear(); }
|
| + size_t size() const { return nodes_.size(); }
|
| +
|
| + private:
|
| + // Copy and assign are permitted. This is how we do tree sync.
|
| + std::vector<T> nodes_;
|
| +};
|
| +
|
| +class CC_EXPORT TransformTree final : public PropertyTree<TransformNode> {
|
| + public:
|
| + // Computes the change of basis transform from node |source_id| to |dest_id|.
|
| + // The function returns false iff the inverse of a singular transform was
|
| + // used (and the result should, therefore, not be trusted).
|
| + bool ComputeTransform(int source_id,
|
| + int dest_id,
|
| + gfx::Transform* transform) const;
|
| +
|
| + // Returns true iff the nodes indexed by |source_id| and |dest_id| are 2D axis
|
| + // aligned with respect to one another.
|
| + bool Are2DAxisAligned(int source_id, int dest_id) const;
|
| +
|
| + // This recomputes the screen space transform (and its inverse) for the node
|
| + // at |id|.
|
| + void UpdateScreenSpaceTransform(int id);
|
| +
|
| + private:
|
| + // Returns true iff the node at |desc_id| is a descendant of the node at
|
| + // |anc_id|.
|
| + bool IsDescendant(int desc_id, int anc_id) const;
|
| +
|
| + // Returns the index of the lowest common ancestor of the nodes |a| and |b|.
|
| + int LowestCommonAncestor(int a, int b) const;
|
| +
|
| + // Computes the combined transform between |source_id| and |dest_id| and
|
| + // returns false if the inverse of a singular transform was used. These two
|
| + // nodes must be on the same ancestor chain.
|
| + bool CombineTransformsBetween(int source_id,
|
| + int dest_id,
|
| + gfx::Transform* transform) const;
|
| +
|
| + // Computes the combined inverse transform between |source_id| and |dest_id|
|
| + // and returns false if the inverse of a singular transform was used. These
|
| + // two nodes must be on the same ancestor chain.
|
| + bool CombineInversesBetween(int source_id,
|
| + int dest_id,
|
| + gfx::Transform* transform) const;
|
| +};
|
| +
|
| +class CC_EXPORT ClipTree final : public PropertyTree<ClipNode> {};
|
| +
|
| +} // namespace cc
|
| +
|
| +#endif // CC_TREES_PROPERTY_TREE_H_
|
|
|