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

Unified Diff: cc/trees/property_tree.h

Issue 816543004: Update from https://crrev.com/308996 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years 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/trees/occlusion_tracker_unittest.cc ('k') | cc/trees/property_tree.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_
« no previous file with comments | « cc/trees/occlusion_tracker_unittest.cc ('k') | cc/trees/property_tree.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698