Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CC_TREES_PROPERTY_TREE_H_ | 5 #ifndef CC_TREES_PROPERTY_TREE_H_ |
| 6 #define CC_TREES_PROPERTY_TREE_H_ | 6 #define CC_TREES_PROPERTY_TREE_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include <map> | |
| 10 #include <memory> | 11 #include <memory> |
| 11 #include <unordered_map> | 12 #include <unordered_map> |
| 12 #include <vector> | 13 #include <vector> |
| 13 | 14 |
| 14 #include "cc/animation/element_id.h" | 15 #include "cc/animation/element_id.h" |
| 15 #include "cc/base/cc_export.h" | 16 #include "cc/base/cc_export.h" |
| 16 #include "cc/base/synced_property.h" | 17 #include "cc/base/synced_property.h" |
| 17 #include "cc/output/filter_operations.h" | 18 #include "cc/output/filter_operations.h" |
| 18 #include "ui/gfx/geometry/rect_f.h" | 19 #include "ui/gfx/geometry/rect_f.h" |
| 19 #include "ui/gfx/geometry/scroll_offset.h" | 20 #include "ui/gfx/geometry/scroll_offset.h" |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 TransformTree& operator=(const TransformTree&); | 136 TransformTree& operator=(const TransformTree&); |
| 136 | 137 |
| 137 bool operator==(const TransformTree& other) const; | 138 bool operator==(const TransformTree& other) const; |
| 138 | 139 |
| 139 static const int kContentsRootNodeId = 1; | 140 static const int kContentsRootNodeId = 1; |
| 140 | 141 |
| 141 int Insert(const TransformNode& tree_node, int parent_id); | 142 int Insert(const TransformNode& tree_node, int parent_id); |
| 142 | 143 |
| 143 void clear(); | 144 void clear(); |
| 144 | 145 |
| 145 // Computes the change of basis transform from node |source_id| to |dest_id|. | |
| 146 // The function returns false iff the inverse of a singular transform was | |
| 147 // used (and the result should, therefore, not be trusted). Transforms may | |
| 148 // be computed between any pair of nodes that have an ancestor/descendant | |
| 149 // relationship. Transforms between other pairs of nodes may only be computed | |
| 150 // if the following condition holds: let id1 the larger id and let id2 be the | |
| 151 // other id; then the nearest ancestor of node id1 whose id is smaller than | |
| 152 // id2 is the lowest common ancestor of the pair of nodes, and the transform | |
| 153 // from this lowest common ancestor to node id2 is only a 2d translation. | |
| 154 bool ComputeTransform(int source_id, | |
| 155 int dest_id, | |
| 156 gfx::Transform* transform) const; | |
| 157 | |
| 158 void OnTransformAnimated(const gfx::Transform& transform, | 146 void OnTransformAnimated(const gfx::Transform& transform, |
| 159 int id, | 147 int id, |
| 160 LayerTreeImpl* layer_tree_impl); | 148 LayerTreeImpl* layer_tree_impl); |
| 161 // Computes the change of basis transform from node |source_id| to |dest_id|. | 149 // Computes the change of basis transform from node |source_id| to |dest_id|. |
| 162 // This is used by scroll children to compute transform from their scroll | 150 // This is used by scroll children to compute transform from their scroll |
| 163 // parent space (source) to their parent space (destination) and it can atmost | 151 // parent space (source) to their parent space (destination) and it can atmost |
| 164 // be a translation. This function assumes that the path from source to | 152 // be a translation. This function assumes that the path from source to |
| 165 // destination has only translations. So, it should not be called when there | 153 // destination has only translations. So, it should not be called when there |
| 166 // can be intermediate 3d transforms but the end result is a translation. | 154 // can be intermediate 3d transforms but the end result is a translation. |
| 167 bool ComputeTranslation(int source_id, | 155 bool ComputeTranslation(int source_id, |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 225 const std::vector<int>& nodes_affected_by_inner_viewport_bounds_delta() | 213 const std::vector<int>& nodes_affected_by_inner_viewport_bounds_delta() |
| 226 const { | 214 const { |
| 227 return nodes_affected_by_inner_viewport_bounds_delta_; | 215 return nodes_affected_by_inner_viewport_bounds_delta_; |
| 228 } | 216 } |
| 229 const std::vector<int>& nodes_affected_by_outer_viewport_bounds_delta() | 217 const std::vector<int>& nodes_affected_by_outer_viewport_bounds_delta() |
| 230 const { | 218 const { |
| 231 return nodes_affected_by_outer_viewport_bounds_delta_; | 219 return nodes_affected_by_outer_viewport_bounds_delta_; |
| 232 } | 220 } |
| 233 | 221 |
| 234 const gfx::Transform& FromTarget(int node_id, int effect) const; | 222 const gfx::Transform& FromTarget(int node_id, int effect) const; |
| 235 void SetFromTarget(int node_id, const gfx::Transform& transform); | |
| 236 | |
| 237 // TODO(sunxd): Remove target space transforms in cached data when we | |
| 238 // completely implement computing draw transforms on demand. | |
| 239 const gfx::Transform& ToTarget(int node_id, int effect_id) const; | 223 const gfx::Transform& ToTarget(int node_id, int effect_id) const; |
| 240 void SetToTarget(int node_id, const gfx::Transform& transform); | |
| 241 | 224 |
| 242 const gfx::Transform& FromScreen(int node_id) const; | 225 const gfx::Transform& FromScreen(int node_id) const; |
| 243 void SetFromScreen(int node_id, const gfx::Transform& transform); | 226 void SetFromScreen(int node_id, const gfx::Transform& transform); |
| 244 | 227 |
| 245 const gfx::Transform& ToScreen(int node_id) const; | 228 const gfx::Transform& ToScreen(int node_id) const; |
| 246 void SetToScreen(int node_id, const gfx::Transform& transform); | 229 void SetToScreen(int node_id, const gfx::Transform& transform); |
| 247 | 230 |
| 248 int TargetId(int node_id) const; | 231 int TargetId(int node_id) const; |
| 249 void SetTargetId(int node_id, int target_id); | 232 void SetTargetId(int node_id, int target_id); |
| 250 | 233 |
| 251 int ContentTargetId(int node_id) const; | 234 int ContentTargetId(int node_id) const; |
| 252 void SetContentTargetId(int node_id, int content_target_id); | 235 void SetContentTargetId(int node_id, int content_target_id); |
| 253 | 236 |
| 254 const std::vector<TransformCachedNodeData>& cached_data() const { | 237 const std::vector<TransformCachedNodeData>& cached_data() const { |
| 255 return cached_data_; | 238 return cached_data_; |
| 256 } | 239 } |
| 257 | 240 |
| 258 void ToProtobuf(proto::PropertyTree* proto) const; | 241 void ToProtobuf(proto::PropertyTree* proto) const; |
| 259 void FromProtobuf(const proto::PropertyTree& proto, | 242 void FromProtobuf(const proto::PropertyTree& proto, |
| 260 std::unordered_map<int, int>* node_id_to_index_map); | 243 std::unordered_map<int, int>* node_id_to_index_map); |
| 261 | 244 |
| 262 // Computes the combined transform between |source_id| and |dest_id|. These | |
| 263 // two nodes must be on the same ancestor chain. | |
| 264 void CombineTransformsBetween(int source_id, | |
| 265 int dest_id, | |
| 266 gfx::Transform* transform) const; | |
| 267 | |
| 268 // Computes the combined inverse transform between |source_id| and |dest_id| | |
| 269 // and returns false if the inverse of a singular transform was used. These | |
| 270 // two nodes must be on the same ancestor chain. | |
| 271 bool CombineInversesBetween(int source_id, | |
| 272 int dest_id, | |
| 273 gfx::Transform* transform) const; | |
| 274 | |
| 275 private: | 245 private: |
| 276 // Returns true iff the node at |desc_id| is a descendant of the node at | 246 // Returns true iff the node at |desc_id| is a descendant of the node at |
| 277 // |anc_id|. | 247 // |anc_id|. |
| 278 bool IsDescendant(int desc_id, int anc_id) const; | 248 bool IsDescendant(int desc_id, int anc_id) const; |
| 279 | 249 |
| 280 void UpdateLocalTransform(TransformNode* node); | 250 void UpdateLocalTransform(TransformNode* node); |
| 281 void UpdateScreenSpaceTransform(TransformNode* node, | 251 void UpdateScreenSpaceTransform(TransformNode* node, |
| 282 TransformNode* parent_node, | 252 TransformNode* parent_node, |
| 283 TransformNode* target_node); | 253 TransformNode* target_node); |
| 284 void UpdateSurfaceContentsScale(TransformNode* node); | 254 void UpdateSurfaceContentsScale(TransformNode* node); |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 514 | 484 |
| 515 // TODO(sunxd): Move screen space transforms here if it can improve | 485 // TODO(sunxd): Move screen space transforms here if it can improve |
| 516 // performance. | 486 // performance. |
| 517 DrawTransformData() | 487 DrawTransformData() |
| 518 : update_number(-1), transforms(gfx::Transform(), gfx::Transform()) {} | 488 : update_number(-1), transforms(gfx::Transform(), gfx::Transform()) {} |
| 519 }; | 489 }; |
| 520 | 490 |
| 521 struct PropertyTreesCachedData { | 491 struct PropertyTreesCachedData { |
| 522 int property_tree_update_number; | 492 int property_tree_update_number; |
| 523 std::vector<AnimationScaleData> animation_scales; | 493 std::vector<AnimationScaleData> animation_scales; |
| 524 mutable std::vector<std::unordered_map<int, DrawTransformData>> | 494 mutable std::vector<std::map<int, DrawTransformData>> draw_transforms; |
|
ajuma
2016/09/07 14:51:23
As discussed offline, please compare the performan
sunxd
2016/09/07 15:20:02
Acknowledged.
| |
| 525 draw_transforms; | |
| 526 | 495 |
| 527 PropertyTreesCachedData(); | 496 PropertyTreesCachedData(); |
| 528 ~PropertyTreesCachedData(); | 497 ~PropertyTreesCachedData(); |
| 529 }; | 498 }; |
| 530 | 499 |
| 531 class CC_EXPORT PropertyTrees final { | 500 class CC_EXPORT PropertyTrees final { |
| 532 public: | 501 public: |
| 533 PropertyTrees(); | 502 PropertyTrees(); |
| 534 PropertyTrees(const PropertyTrees& other) = delete; | 503 PropertyTrees(const PropertyTrees& other) = delete; |
| 535 ~PropertyTrees(); | 504 ~PropertyTrees(); |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 560 bool changed; | 529 bool changed; |
| 561 // We cache a global bool for full tree damages to avoid walking the entire | 530 // We cache a global bool for full tree damages to avoid walking the entire |
| 562 // tree. | 531 // tree. |
| 563 // TODO(jaydasika): Changes to transform and effects that damage the entire | 532 // TODO(jaydasika): Changes to transform and effects that damage the entire |
| 564 // tree should be tracked by this bool. Currently, they are tracked by the | 533 // tree should be tracked by this bool. Currently, they are tracked by the |
| 565 // individual nodes. | 534 // individual nodes. |
| 566 bool full_tree_damaged; | 535 bool full_tree_damaged; |
| 567 int sequence_number; | 536 int sequence_number; |
| 568 bool is_main_thread; | 537 bool is_main_thread; |
| 569 bool is_active; | 538 bool is_active; |
| 570 bool verify_transform_tree_calculations; | |
| 571 | 539 |
| 572 void clear(); | 540 void clear(); |
| 573 | 541 |
| 574 void SetInnerViewportContainerBoundsDelta(gfx::Vector2dF bounds_delta); | 542 void SetInnerViewportContainerBoundsDelta(gfx::Vector2dF bounds_delta); |
| 575 void SetOuterViewportContainerBoundsDelta(gfx::Vector2dF bounds_delta); | 543 void SetOuterViewportContainerBoundsDelta(gfx::Vector2dF bounds_delta); |
| 576 void SetInnerViewportScrollBoundsDelta(gfx::Vector2dF bounds_delta); | 544 void SetInnerViewportScrollBoundsDelta(gfx::Vector2dF bounds_delta); |
| 577 void PushOpacityIfNeeded(PropertyTrees* target_tree); | 545 void PushOpacityIfNeeded(PropertyTrees* target_tree); |
| 578 void RemoveIdFromIdToIndexMaps(int id); | 546 void RemoveIdFromIdToIndexMaps(int id); |
| 579 bool IsInIdToIndexMap(TreeType tree_type, int id); | 547 bool IsInIdToIndexMap(TreeType tree_type, int id); |
| 580 void UpdateChangeTracking(); | 548 void UpdateChangeTracking(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 622 gfx::Vector2dF inner_viewport_container_bounds_delta_; | 590 gfx::Vector2dF inner_viewport_container_bounds_delta_; |
| 623 gfx::Vector2dF outer_viewport_container_bounds_delta_; | 591 gfx::Vector2dF outer_viewport_container_bounds_delta_; |
| 624 gfx::Vector2dF inner_viewport_scroll_bounds_delta_; | 592 gfx::Vector2dF inner_viewport_scroll_bounds_delta_; |
| 625 | 593 |
| 626 PropertyTreesCachedData cached_data_; | 594 PropertyTreesCachedData cached_data_; |
| 627 }; | 595 }; |
| 628 | 596 |
| 629 } // namespace cc | 597 } // namespace cc |
| 630 | 598 |
| 631 #endif // CC_TREES_PROPERTY_TREE_H_ | 599 #endif // CC_TREES_PROPERTY_TREE_H_ |
| OLD | NEW |