| 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 <memory> | 10 #include <memory> |
| 11 #include <unordered_map> | 11 #include <unordered_map> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "cc/animation/element_id.h" | 14 #include "cc/animation/element_id.h" |
| 15 #include "cc/base/cc_export.h" | 15 #include "cc/base/cc_export.h" |
| 16 #include "cc/base/synced_property.h" | 16 #include "cc/base/synced_property.h" |
| 17 #include "cc/output/filter_operations.h" | |
| 18 #include "ui/gfx/geometry/rect_f.h" | 17 #include "ui/gfx/geometry/rect_f.h" |
| 19 #include "ui/gfx/geometry/scroll_offset.h" | 18 #include "ui/gfx/geometry/scroll_offset.h" |
| 20 #include "ui/gfx/transform.h" | 19 #include "ui/gfx/transform.h" |
| 21 | 20 |
| 22 namespace base { | 21 namespace base { |
| 23 namespace trace_event { | 22 namespace trace_event { |
| 24 class TracedValue; | 23 class TracedValue; |
| 25 } | 24 } |
| 26 } | 25 } |
| 27 | 26 |
| 28 namespace cc { | 27 namespace cc { |
| 29 | 28 |
| 30 namespace proto { | 29 namespace proto { |
| 31 class ClipNodeData; | |
| 32 class EffectNodeData; | |
| 33 class PropertyTree; | 30 class PropertyTree; |
| 34 class PropertyTrees; | 31 class PropertyTrees; |
| 35 class ScrollNodeData; | 32 class ScrollNodeData; |
| 36 class TransformNodeData; | |
| 37 class TransformCachedNodeData; | |
| 38 class TransformTreeData; | |
| 39 class TreeNode; | 33 class TreeNode; |
| 40 } // namespace proto | 34 } // namespace proto |
| 41 | 35 |
| 42 class CopyOutputRequest; | 36 class CopyOutputRequest; |
| 43 class LayerTreeImpl; | 37 class LayerTreeImpl; |
| 44 class RenderSurfaceImpl; | |
| 45 class ScrollState; | 38 class ScrollState; |
| 39 struct ClipNode; |
| 40 struct EffectNode; |
| 46 struct ScrollAndScaleSet; | 41 struct ScrollAndScaleSet; |
| 42 struct ScrollNode; |
| 43 struct TransformNode; |
| 44 struct TransformCachedNodeData; |
| 47 | 45 |
| 48 // ------------------------------*IMPORTANT*--------------------------------- | 46 // ------------------------------*IMPORTANT*--------------------------------- |
| 49 // Each class declared here has a corresponding proto defined in | 47 // Each class declared here has a corresponding proto defined in |
| 50 // cc/proto/property_tree.proto. When making any changes to a class structure | 48 // cc/proto/property_tree.proto. When making any changes to a class structure |
| 51 // including addition/deletion/updation of a field, please also make the | 49 // including addition/deletion/updation of a field, please also make the |
| 52 // change to its proto and the ToProtobuf and FromProtobuf methods for that | 50 // change to its proto and the ToProtobuf and FromProtobuf methods for that |
| 53 // class. | 51 // class. |
| 54 | 52 |
| 55 typedef SyncedProperty<AdditionGroup<gfx::ScrollOffset>> SyncedScrollOffset; | 53 typedef SyncedProperty<AdditionGroup<gfx::ScrollOffset>> SyncedScrollOffset; |
| 56 | 54 |
| 57 template <typename T> | |
| 58 struct CC_EXPORT TreeNode { | |
| 59 TreeNode() : id(-1), parent_id(-1), owner_id(-1), data() {} | |
| 60 int id; | |
| 61 int parent_id; | |
| 62 int owner_id; | |
| 63 T data; | |
| 64 | |
| 65 bool operator==(const TreeNode<T>& other) const; | |
| 66 | |
| 67 void ToProtobuf(proto::TreeNode* proto) const; | |
| 68 void FromProtobuf(const proto::TreeNode& proto); | |
| 69 | |
| 70 void AsValueInto(base::trace_event::TracedValue* value) const; | |
| 71 }; | |
| 72 | |
| 73 struct CC_EXPORT TransformNodeData { | |
| 74 TransformNodeData(); | |
| 75 TransformNodeData(const TransformNodeData& other); | |
| 76 ~TransformNodeData(); | |
| 77 | |
| 78 // The local transform information is combined to form to_parent (ignoring | |
| 79 // snapping) as follows: | |
| 80 // | |
| 81 // to_parent = M_post_local * T_scroll * M_local * M_pre_local. | |
| 82 // | |
| 83 // The pre/post may seem odd when read LTR, but we multiply our points from | |
| 84 // the right, so the pre_local matrix affects the result "first". This lines | |
| 85 // up with the notions of pre/post used in skia and gfx::Transform. | |
| 86 // | |
| 87 // TODO(vollick): The values labeled with "will be moved..." take up a lot of | |
| 88 // space, but are only necessary for animated or scrolled nodes (otherwise | |
| 89 // we'll just use the baked to_parent). These values will be ultimately stored | |
| 90 // directly on the transform/scroll display list items when that's possible, | |
| 91 // or potentially in a scroll tree. | |
| 92 // | |
| 93 // TODO(vollick): will be moved when accelerated effects are implemented. | |
| 94 gfx::Transform pre_local; | |
| 95 gfx::Transform local; | |
| 96 gfx::Transform post_local; | |
| 97 | |
| 98 gfx::Transform to_parent; | |
| 99 | |
| 100 // This is the node with respect to which source_offset is defined. This will | |
| 101 // not be needed once layerization moves to cc, but is needed in order to | |
| 102 // efficiently update the transform tree for changes to position in the layer | |
| 103 // tree. | |
| 104 int source_node_id; | |
| 105 | |
| 106 // This id determines which 3d rendering context the node is in. 0 is a | |
| 107 // special value and indicates that the node is not in any 3d rendering | |
| 108 // context. | |
| 109 int sorting_context_id; | |
| 110 | |
| 111 // TODO(vollick): will be moved when accelerated effects are implemented. | |
| 112 bool needs_local_transform_update : 1; | |
| 113 | |
| 114 bool node_and_ancestors_are_animated_or_invertible : 1; | |
| 115 | |
| 116 bool is_invertible : 1; | |
| 117 bool ancestors_are_invertible : 1; | |
| 118 | |
| 119 bool has_potential_animation : 1; | |
| 120 bool is_currently_animating : 1; | |
| 121 bool to_screen_is_potentially_animated : 1; | |
| 122 bool has_only_translation_animations : 1; | |
| 123 | |
| 124 // Flattening, when needed, is only applied to a node's inherited transform, | |
| 125 // never to its local transform. | |
| 126 bool flattens_inherited_transform : 1; | |
| 127 | |
| 128 // This is true if the to_parent transform at every node on the path to the | |
| 129 // root is flat. | |
| 130 bool node_and_ancestors_are_flat : 1; | |
| 131 | |
| 132 // This is needed to know if a layer can use lcd text. | |
| 133 bool node_and_ancestors_have_only_integer_translation : 1; | |
| 134 | |
| 135 bool scrolls : 1; | |
| 136 | |
| 137 bool needs_sublayer_scale : 1; | |
| 138 | |
| 139 // These are used to position nodes wrt the right or bottom of the inner or | |
| 140 // outer viewport. | |
| 141 bool affected_by_inner_viewport_bounds_delta_x : 1; | |
| 142 bool affected_by_inner_viewport_bounds_delta_y : 1; | |
| 143 bool affected_by_outer_viewport_bounds_delta_x : 1; | |
| 144 bool affected_by_outer_viewport_bounds_delta_y : 1; | |
| 145 | |
| 146 // Layer scale factor is used as a fallback when we either cannot adjust | |
| 147 // raster scale or if the raster scale cannot be extracted from the screen | |
| 148 // space transform. For layers in the subtree of the page scale layer, the | |
| 149 // layer scale factor should include the page scale factor. | |
| 150 bool in_subtree_of_page_scale_layer : 1; | |
| 151 | |
| 152 // We need to track changes to to_screen transform to compute the damage rect. | |
| 153 bool transform_changed : 1; | |
| 154 | |
| 155 // TODO(vollick): will be moved when accelerated effects are implemented. | |
| 156 float post_local_scale_factor; | |
| 157 | |
| 158 gfx::Vector2dF sublayer_scale; | |
| 159 | |
| 160 // TODO(vollick): will be moved when accelerated effects are implemented. | |
| 161 gfx::ScrollOffset scroll_offset; | |
| 162 | |
| 163 // We scroll snap where possible, but this means fixed-pos elements must be | |
| 164 // adjusted. This value stores the snapped amount for this purpose. | |
| 165 gfx::Vector2dF scroll_snap; | |
| 166 | |
| 167 // TODO(vollick): will be moved when accelerated effects are implemented. | |
| 168 gfx::Vector2dF source_offset; | |
| 169 gfx::Vector2dF source_to_parent; | |
| 170 | |
| 171 bool operator==(const TransformNodeData& other) const; | |
| 172 | |
| 173 void set_to_parent(const gfx::Transform& transform) { | |
| 174 to_parent = transform; | |
| 175 is_invertible = to_parent.IsInvertible(); | |
| 176 } | |
| 177 | |
| 178 void update_pre_local_transform(const gfx::Point3F& transform_origin); | |
| 179 | |
| 180 void update_post_local_transform(const gfx::PointF& position, | |
| 181 const gfx::Point3F& transform_origin); | |
| 182 | |
| 183 void ToProtobuf(proto::TreeNode* proto) const; | |
| 184 void FromProtobuf(const proto::TreeNode& proto); | |
| 185 | |
| 186 void AsValueInto(base::trace_event::TracedValue* value) const; | |
| 187 }; | |
| 188 | |
| 189 // TODO(sunxd): move this into PropertyTrees::cached_data_. | |
| 190 struct CC_EXPORT TransformCachedNodeData { | |
| 191 TransformCachedNodeData(); | |
| 192 TransformCachedNodeData(const TransformCachedNodeData& other); | |
| 193 ~TransformCachedNodeData(); | |
| 194 | |
| 195 gfx::Transform from_target; | |
| 196 gfx::Transform to_target; | |
| 197 gfx::Transform from_screen; | |
| 198 gfx::Transform to_screen; | |
| 199 int target_id; | |
| 200 // This id is used for all content that draws into a render surface associated | |
| 201 // with this transform node. | |
| 202 int content_target_id; | |
| 203 | |
| 204 bool operator==(const TransformCachedNodeData& other) const; | |
| 205 | |
| 206 void ToProtobuf(proto::TransformCachedNodeData* proto) const; | |
| 207 void FromProtobuf(const proto::TransformCachedNodeData& proto); | |
| 208 }; | |
| 209 | |
| 210 typedef TreeNode<TransformNodeData> TransformNode; | |
| 211 | |
| 212 struct CC_EXPORT ClipNodeData { | |
| 213 ClipNodeData(); | |
| 214 ClipNodeData(const ClipNodeData& other); | |
| 215 | |
| 216 // The clip rect that this node contributes, expressed in the space of its | |
| 217 // transform node. | |
| 218 gfx::RectF clip; | |
| 219 | |
| 220 // Clip nodes are uses for two reasons. First, they are used for determining | |
| 221 // which parts of each layer are visible. Second, they are used for | |
| 222 // determining whether a clip needs to be applied when drawing a layer, and if | |
| 223 // so, the rect that needs to be used. These can be different since not all | |
| 224 // clips need to be applied directly to each layer. For example, a layer is | |
| 225 // implicitly clipped by the bounds of its target render surface and by clips | |
| 226 // applied to this surface. |combined_clip_in_target_space| is used for | |
| 227 // computing visible rects, and |clip_in_target_space| is used for computing | |
| 228 // clips applied at draw time. Both rects are expressed in the space of the | |
| 229 // target transform node, and may include clips contributed by ancestors. | |
| 230 gfx::RectF combined_clip_in_target_space; | |
| 231 gfx::RectF clip_in_target_space; | |
| 232 | |
| 233 // The id of the transform node that defines the clip node's local space. | |
| 234 int transform_id; | |
| 235 | |
| 236 // The id of the transform node that defines the clip node's target space. | |
| 237 int target_id; | |
| 238 | |
| 239 // Whether this node contributes a new clip (that is, whether |clip| needs to | |
| 240 // be applied), rather than only inheriting ancestor clips. | |
| 241 bool applies_local_clip : 1; | |
| 242 | |
| 243 // When true, |clip_in_target_space| does not include clips from ancestor | |
| 244 // nodes. | |
| 245 bool layer_clipping_uses_only_local_clip : 1; | |
| 246 | |
| 247 // True if target surface needs to be drawn with a clip applied. | |
| 248 bool target_is_clipped : 1; | |
| 249 | |
| 250 // True if layers with this clip tree node need to be drawn with a clip | |
| 251 // applied. | |
| 252 bool layers_are_clipped : 1; | |
| 253 bool layers_are_clipped_when_surfaces_disabled : 1; | |
| 254 | |
| 255 // Nodes that correspond to unclipped surfaces disregard ancestor clips. | |
| 256 bool resets_clip : 1; | |
| 257 | |
| 258 bool operator==(const ClipNodeData& other) const; | |
| 259 | |
| 260 void ToProtobuf(proto::TreeNode* proto) const; | |
| 261 void FromProtobuf(const proto::TreeNode& proto); | |
| 262 void AsValueInto(base::trace_event::TracedValue* value) const; | |
| 263 }; | |
| 264 | |
| 265 typedef TreeNode<ClipNodeData> ClipNode; | |
| 266 | |
| 267 struct CC_EXPORT EffectNodeData { | |
| 268 EffectNodeData(); | |
| 269 EffectNodeData(const EffectNodeData& other); | |
| 270 | |
| 271 float opacity; | |
| 272 float screen_space_opacity; | |
| 273 | |
| 274 FilterOperations background_filters; | |
| 275 | |
| 276 gfx::Vector2dF sublayer_scale; | |
| 277 | |
| 278 bool has_render_surface; | |
| 279 RenderSurfaceImpl* render_surface; | |
| 280 bool has_copy_request; | |
| 281 bool hidden_by_backface_visibility; | |
| 282 bool double_sided; | |
| 283 bool is_drawn; | |
| 284 // TODO(jaydasika) : Delete this after implementation of | |
| 285 // SetHideLayerAndSubtree is cleaned up. (crbug.com/595843) | |
| 286 bool subtree_hidden; | |
| 287 bool has_potential_opacity_animation; | |
| 288 bool is_currently_animating_opacity; | |
| 289 // We need to track changes to effects on the compositor to compute damage | |
| 290 // rect. | |
| 291 bool effect_changed; | |
| 292 int num_copy_requests_in_subtree; | |
| 293 bool has_unclipped_descendants; | |
| 294 int transform_id; | |
| 295 int clip_id; | |
| 296 // Effect node id of which this effect contributes to. | |
| 297 int target_id; | |
| 298 int mask_layer_id; | |
| 299 int replica_layer_id; | |
| 300 int replica_mask_layer_id; | |
| 301 | |
| 302 bool operator==(const EffectNodeData& other) const; | |
| 303 | |
| 304 void ToProtobuf(proto::TreeNode* proto) const; | |
| 305 void FromProtobuf(const proto::TreeNode& proto); | |
| 306 void AsValueInto(base::trace_event::TracedValue* value) const; | |
| 307 }; | |
| 308 | |
| 309 typedef TreeNode<EffectNodeData> EffectNode; | |
| 310 | |
| 311 struct CC_EXPORT ScrollNodeData { | |
| 312 ScrollNodeData(); | |
| 313 ScrollNodeData(const ScrollNodeData& other); | |
| 314 | |
| 315 bool scrollable; | |
| 316 uint32_t main_thread_scrolling_reasons; | |
| 317 bool contains_non_fast_scrollable_region; | |
| 318 gfx::Size scroll_clip_layer_bounds; | |
| 319 gfx::Size bounds; | |
| 320 bool max_scroll_offset_affected_by_page_scale; | |
| 321 bool is_inner_viewport_scroll_layer; | |
| 322 bool is_outer_viewport_scroll_layer; | |
| 323 gfx::Vector2dF offset_to_transform_parent; | |
| 324 bool should_flatten; | |
| 325 bool user_scrollable_horizontal; | |
| 326 bool user_scrollable_vertical; | |
| 327 ElementId element_id; | |
| 328 int transform_id; | |
| 329 // Number of drawn layers pointing to this node or any of its descendants. | |
| 330 int num_drawn_descendants; | |
| 331 | |
| 332 bool operator==(const ScrollNodeData& other) const; | |
| 333 | |
| 334 void ToProtobuf(proto::TreeNode* proto) const; | |
| 335 void FromProtobuf(const proto::TreeNode& proto); | |
| 336 void AsValueInto(base::trace_event::TracedValue* value) const; | |
| 337 }; | |
| 338 | |
| 339 typedef TreeNode<ScrollNodeData> ScrollNode; | |
| 340 | |
| 341 class PropertyTrees; | 55 class PropertyTrees; |
| 342 | 56 |
| 343 template <typename T> | 57 template <typename T> |
| 344 class CC_EXPORT PropertyTree { | 58 class CC_EXPORT PropertyTree { |
| 345 public: | 59 public: |
| 346 PropertyTree(); | 60 PropertyTree(); |
| 347 PropertyTree(const PropertyTree& other) = delete; | 61 PropertyTree(const PropertyTree& other) = delete; |
| 62 |
| 63 // These C++ special member functions cannot be implicit inline because |
| 64 // they are exported by CC_EXPORT. They will be instantiated in every |
| 65 // compilation units that included this header, and compilation can fail |
| 66 // because T may be incomplete. |
| 348 ~PropertyTree(); | 67 ~PropertyTree(); |
| 68 PropertyTree<T>& operator=(const PropertyTree<T>&); |
| 349 | 69 |
| 350 bool operator==(const PropertyTree<T>& other) const; | 70 bool operator==(const PropertyTree<T>& other) const; |
| 351 | 71 |
| 352 int Insert(const T& tree_node, int parent_id); | 72 int Insert(const T& tree_node, int parent_id); |
| 353 | 73 |
| 354 T* Node(int i) { | 74 T* Node(int i) { |
| 355 // TODO(vollick): remove this. | 75 // TODO(vollick): remove this. |
| 356 CHECK(i < static_cast<int>(nodes_.size())); | 76 CHECK(i < static_cast<int>(nodes_.size())); |
| 357 return i > -1 ? &nodes_[i] : nullptr; | 77 return i > -1 ? &nodes_[i] : nullptr; |
| 358 } | 78 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 private: | 115 private: |
| 396 std::vector<T> nodes_; | 116 std::vector<T> nodes_; |
| 397 | 117 |
| 398 bool needs_update_; | 118 bool needs_update_; |
| 399 PropertyTrees* property_trees_; | 119 PropertyTrees* property_trees_; |
| 400 }; | 120 }; |
| 401 | 121 |
| 402 class CC_EXPORT TransformTree final : public PropertyTree<TransformNode> { | 122 class CC_EXPORT TransformTree final : public PropertyTree<TransformNode> { |
| 403 public: | 123 public: |
| 404 TransformTree(); | 124 TransformTree(); |
| 125 |
| 126 // These C++ special member functions cannot be implicit inline because |
| 127 // they are exported by CC_EXPORT. They will be instantiated in every |
| 128 // compilation units that included this header, and compilation can fail |
| 129 // because TransformCachedNodeData may be incomplete. |
| 130 TransformTree(const TransformTree&) = delete; |
| 405 ~TransformTree(); | 131 ~TransformTree(); |
| 132 TransformTree& operator=(const TransformTree&); |
| 406 | 133 |
| 407 bool operator==(const TransformTree& other) const; | 134 bool operator==(const TransformTree& other) const; |
| 408 | 135 |
| 409 int Insert(const TransformNode& tree_node, int parent_id); | 136 int Insert(const TransformNode& tree_node, int parent_id); |
| 410 | 137 |
| 411 void clear(); | 138 void clear(); |
| 412 | 139 |
| 413 // Computes the change of basis transform from node |source_id| to |dest_id|. | 140 // Computes the change of basis transform from node |source_id| to |dest_id|. |
| 414 // The function returns false iff the inverse of a singular transform was | 141 // The function returns false iff the inverse of a singular transform was |
| 415 // used (and the result should, therefore, not be trusted). Transforms may | 142 // used (and the result should, therefore, not be trusted). Transforms may |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 gfx::Vector2dF inner_viewport_container_bounds_delta_; | 570 gfx::Vector2dF inner_viewport_container_bounds_delta_; |
| 844 gfx::Vector2dF outer_viewport_container_bounds_delta_; | 571 gfx::Vector2dF outer_viewport_container_bounds_delta_; |
| 845 gfx::Vector2dF inner_viewport_scroll_bounds_delta_; | 572 gfx::Vector2dF inner_viewport_scroll_bounds_delta_; |
| 846 | 573 |
| 847 PropertyTreesCachedData cached_data_; | 574 PropertyTreesCachedData cached_data_; |
| 848 }; | 575 }; |
| 849 | 576 |
| 850 } // namespace cc | 577 } // namespace cc |
| 851 | 578 |
| 852 #endif // CC_TREES_PROPERTY_TREE_H_ | 579 #endif // CC_TREES_PROPERTY_TREE_H_ |
| OLD | NEW |