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 #include "cc/trees/property_tree_builder.h" | 5 #include "cc/trees/property_tree_builder.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 int clip_tree_parent; | 31 int clip_tree_parent; |
32 int opacity_tree_parent; | 32 int opacity_tree_parent; |
33 const LayerType* page_scale_layer; | 33 const LayerType* page_scale_layer; |
34 float page_scale_factor; | 34 float page_scale_factor; |
35 float device_scale_factor; | 35 float device_scale_factor; |
36 bool in_subtree_of_page_scale_application_layer; | 36 bool in_subtree_of_page_scale_application_layer; |
37 bool should_flatten; | 37 bool should_flatten; |
38 bool ancestor_clips_subtree; | 38 bool ancestor_clips_subtree; |
39 const gfx::Transform* device_transform; | 39 const gfx::Transform* device_transform; |
40 gfx::Vector2dF scroll_compensation_adjustment; | 40 gfx::Vector2dF scroll_compensation_adjustment; |
| 41 int sequence_number; |
41 }; | 42 }; |
42 | 43 |
43 template <typename LayerType> | 44 template <typename LayerType> |
44 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, | 45 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, |
45 LayerType* layer) { | 46 LayerType* layer) { |
46 return layer->position_constraint().is_fixed_position() | 47 return layer->position_constraint().is_fixed_position() |
47 ? data.transform_fixed_parent | 48 ? data.transform_fixed_parent |
48 : data.transform_tree_parent; | 49 : data.transform_tree_parent; |
49 } | 50 } |
50 | 51 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 gfx::PointF() + layer->offset_to_transform_parent(), layer->bounds()); | 142 gfx::PointF() + layer->offset_to_transform_parent(), layer->bounds()); |
142 node.data.transform_id = transform_parent->transform_tree_index(); | 143 node.data.transform_id = transform_parent->transform_tree_index(); |
143 node.data.target_id = | 144 node.data.target_id = |
144 data_for_children->render_target->transform_tree_index(); | 145 data_for_children->render_target->transform_tree_index(); |
145 node.owner_id = layer->id(); | 146 node.owner_id = layer->id(); |
146 | 147 |
147 data_for_children->clip_tree_parent = | 148 data_for_children->clip_tree_parent = |
148 data_for_children->clip_tree->Insert(node, parent_id); | 149 data_for_children->clip_tree->Insert(node, parent_id); |
149 } | 150 } |
150 | 151 |
151 layer->set_clip_tree_index( | 152 layer->SetClipTreeIndex( |
152 has_unclipped_surface ? 0 : data_for_children->clip_tree_parent); | 153 has_unclipped_surface ? 0 : data_for_children->clip_tree_parent); |
153 | 154 |
154 // TODO(awoloszyn): Right now when we hit a node with a replica, we reset the | 155 // TODO(awoloszyn): Right now when we hit a node with a replica, we reset the |
155 // clip for all children since we may need to draw. We need to figure out a | 156 // clip for all children since we may need to draw. We need to figure out a |
156 // better way, since we will need both the clipped and unclipped versions. | 157 // better way, since we will need both the clipped and unclipped versions. |
157 } | 158 } |
158 | 159 |
159 template <typename LayerType> | 160 template <typename LayerType> |
160 bool AddTransformNodeIfNeeded( | 161 bool AddTransformNodeIfNeeded( |
161 const DataForRecursion<LayerType>& data_from_ancestor, | 162 const DataForRecursion<LayerType>& data_from_ancestor, |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 if (source_index != parent_index) { | 227 if (source_index != parent_index) { |
227 gfx::Transform to_parent; | 228 gfx::Transform to_parent; |
228 data_from_ancestor.transform_tree->ComputeTransform( | 229 data_from_ancestor.transform_tree->ComputeTransform( |
229 source_index, parent_index, &to_parent); | 230 source_index, parent_index, &to_parent); |
230 source_to_parent = to_parent.To2dTranslation(); | 231 source_to_parent = to_parent.To2dTranslation(); |
231 } | 232 } |
232 layer->set_offset_to_transform_parent(source_offset + source_to_parent + | 233 layer->set_offset_to_transform_parent(source_offset + source_to_parent + |
233 local_offset); | 234 local_offset); |
234 layer->set_should_flatten_transform_from_property_tree( | 235 layer->set_should_flatten_transform_from_property_tree( |
235 data_from_ancestor.should_flatten); | 236 data_from_ancestor.should_flatten); |
236 layer->set_transform_tree_index(parent_index); | 237 layer->SetTransformTreeIndex(parent_index); |
237 return false; | 238 return false; |
238 } | 239 } |
239 | 240 |
240 data_for_children->transform_tree->Insert(TransformNode(), parent_index); | 241 data_for_children->transform_tree->Insert(TransformNode(), parent_index); |
241 | 242 |
242 TransformNode* node = data_for_children->transform_tree->back(); | 243 TransformNode* node = data_for_children->transform_tree->back(); |
243 layer->set_transform_tree_index(node->id); | 244 layer->SetTransformTreeIndex(node->id); |
244 | 245 |
245 node->data.scrolls = is_scrollable; | 246 node->data.scrolls = is_scrollable; |
246 node->data.flattens_inherited_transform = data_for_children->should_flatten; | 247 node->data.flattens_inherited_transform = data_for_children->should_flatten; |
247 | 248 |
248 // Surfaces inherently flatten transforms. | 249 // Surfaces inherently flatten transforms. |
249 data_for_children->should_flatten = | 250 data_for_children->should_flatten = |
250 layer->should_flatten_transform() || has_surface; | 251 layer->should_flatten_transform() || has_surface; |
251 node->data.target_id = | 252 node->data.target_id = |
252 data_from_ancestor.render_target->transform_tree_index(); | 253 data_from_ancestor.render_target->transform_tree_index(); |
253 node->data.content_target_id = | 254 node->data.content_target_id = |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 LayerType* layer, | 320 LayerType* layer, |
320 DataForRecursion<LayerType>* data_for_children) { | 321 DataForRecursion<LayerType>* data_for_children) { |
321 const bool is_root = !layer->parent(); | 322 const bool is_root = !layer->parent(); |
322 const bool has_transparency = layer->opacity() != 1.f; | 323 const bool has_transparency = layer->opacity() != 1.f; |
323 const bool has_animated_opacity = IsAnimatingOpacity(layer); | 324 const bool has_animated_opacity = IsAnimatingOpacity(layer); |
324 bool requires_node = is_root || has_transparency || has_animated_opacity; | 325 bool requires_node = is_root || has_transparency || has_animated_opacity; |
325 | 326 |
326 int parent_id = data_from_ancestor.opacity_tree_parent; | 327 int parent_id = data_from_ancestor.opacity_tree_parent; |
327 | 328 |
328 if (!requires_node) { | 329 if (!requires_node) { |
329 layer->set_opacity_tree_index(parent_id); | 330 layer->SetOpacityTreeIndex(parent_id); |
330 data_for_children->opacity_tree_parent = parent_id; | 331 data_for_children->opacity_tree_parent = parent_id; |
331 return; | 332 return; |
332 } | 333 } |
333 | 334 |
334 OpacityNode node; | 335 OpacityNode node; |
335 node.owner_id = layer->id(); | 336 node.owner_id = layer->id(); |
336 node.data = layer->opacity(); | 337 node.data = layer->opacity(); |
337 data_for_children->opacity_tree_parent = | 338 data_for_children->opacity_tree_parent = |
338 data_for_children->opacity_tree->Insert(node, parent_id); | 339 data_for_children->opacity_tree->Insert(node, parent_id); |
339 layer->set_opacity_tree_index(data_for_children->opacity_tree_parent); | 340 layer->SetOpacityTreeIndex(data_for_children->opacity_tree_parent); |
340 } | 341 } |
341 | 342 |
342 template <typename LayerType> | 343 template <typename LayerType> |
343 void BuildPropertyTreesInternal( | 344 void BuildPropertyTreesInternal( |
344 LayerType* layer, | 345 LayerType* layer, |
345 const DataForRecursion<LayerType>& data_from_parent) { | 346 const DataForRecursion<LayerType>& data_from_parent) { |
| 347 layer->set_property_tree_sequence_number(data_from_parent.sequence_number); |
346 DataForRecursion<LayerType> data_for_children(data_from_parent); | 348 DataForRecursion<LayerType> data_for_children(data_from_parent); |
347 if (layer->render_surface()) | 349 if (layer->render_surface()) |
348 data_for_children.render_target = layer; | 350 data_for_children.render_target = layer; |
349 | 351 |
350 bool created_transform_node = | 352 bool created_transform_node = |
351 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children); | 353 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children); |
352 AddClipNodeIfNeeded(data_from_parent, layer, created_transform_node, | 354 AddClipNodeIfNeeded(data_from_parent, layer, created_transform_node, |
353 &data_for_children); | 355 &data_for_children); |
354 | 356 |
355 if (data_from_parent.opacity_tree) | 357 if (data_from_parent.opacity_tree) |
(...skipping 20 matching lines...) Expand all Loading... |
376 } // namespace | 378 } // namespace |
377 | 379 |
378 template <typename LayerType> | 380 template <typename LayerType> |
379 void BuildPropertyTreesTopLevelInternal(LayerType* root_layer, | 381 void BuildPropertyTreesTopLevelInternal(LayerType* root_layer, |
380 const LayerType* page_scale_layer, | 382 const LayerType* page_scale_layer, |
381 float page_scale_factor, | 383 float page_scale_factor, |
382 float device_scale_factor, | 384 float device_scale_factor, |
383 const gfx::Rect& viewport, | 385 const gfx::Rect& viewport, |
384 const gfx::Transform& device_transform, | 386 const gfx::Transform& device_transform, |
385 PropertyTrees* property_trees) { | 387 PropertyTrees* property_trees) { |
| 388 property_trees->sequence_number++; |
| 389 |
386 DataForRecursion<LayerType> data_for_recursion; | 390 DataForRecursion<LayerType> data_for_recursion; |
387 data_for_recursion.transform_tree = &property_trees->transform_tree; | 391 data_for_recursion.transform_tree = &property_trees->transform_tree; |
388 data_for_recursion.clip_tree = &property_trees->clip_tree; | 392 data_for_recursion.clip_tree = &property_trees->clip_tree; |
389 data_for_recursion.opacity_tree = &property_trees->opacity_tree; | 393 data_for_recursion.opacity_tree = &property_trees->opacity_tree; |
390 data_for_recursion.transform_tree_parent = nullptr; | 394 data_for_recursion.transform_tree_parent = nullptr; |
391 data_for_recursion.transform_fixed_parent = nullptr; | 395 data_for_recursion.transform_fixed_parent = nullptr; |
392 data_for_recursion.render_target = root_layer; | 396 data_for_recursion.render_target = root_layer; |
393 data_for_recursion.clip_tree_parent = 0; | 397 data_for_recursion.clip_tree_parent = 0; |
394 data_for_recursion.opacity_tree_parent = -1; | 398 data_for_recursion.opacity_tree_parent = -1; |
395 data_for_recursion.page_scale_layer = page_scale_layer; | 399 data_for_recursion.page_scale_layer = page_scale_layer; |
396 data_for_recursion.page_scale_factor = page_scale_factor; | 400 data_for_recursion.page_scale_factor = page_scale_factor; |
397 data_for_recursion.device_scale_factor = device_scale_factor; | 401 data_for_recursion.device_scale_factor = device_scale_factor; |
398 data_for_recursion.in_subtree_of_page_scale_application_layer = false; | 402 data_for_recursion.in_subtree_of_page_scale_application_layer = false; |
399 data_for_recursion.should_flatten = false; | 403 data_for_recursion.should_flatten = false; |
400 data_for_recursion.ancestor_clips_subtree = true; | 404 data_for_recursion.ancestor_clips_subtree = true; |
401 data_for_recursion.device_transform = &device_transform; | 405 data_for_recursion.device_transform = &device_transform; |
402 | 406 |
403 data_for_recursion.transform_tree->clear(); | 407 data_for_recursion.transform_tree->clear(); |
404 data_for_recursion.clip_tree->clear(); | 408 data_for_recursion.clip_tree->clear(); |
405 data_for_recursion.opacity_tree->clear(); | 409 data_for_recursion.opacity_tree->clear(); |
| 410 data_for_recursion.sequence_number = property_trees->sequence_number; |
406 | 411 |
407 ClipNode root_clip; | 412 ClipNode root_clip; |
408 root_clip.data.clip = viewport; | 413 root_clip.data.clip = viewport; |
409 root_clip.data.transform_id = 0; | 414 root_clip.data.transform_id = 0; |
410 data_for_recursion.clip_tree_parent = | 415 data_for_recursion.clip_tree_parent = |
411 data_for_recursion.clip_tree->Insert(root_clip, 0); | 416 data_for_recursion.clip_tree->Insert(root_clip, 0); |
412 BuildPropertyTreesInternal(root_layer, data_for_recursion); | 417 BuildPropertyTreesInternal(root_layer, data_for_recursion); |
413 property_trees->needs_rebuild = false; | 418 property_trees->needs_rebuild = false; |
414 | 419 |
415 // The transform tree is kept up-to-date as it is built, but the | 420 // The transform tree is kept up-to-date as it is built, but the |
(...skipping 27 matching lines...) Expand all Loading... |
443 float device_scale_factor, | 448 float device_scale_factor, |
444 const gfx::Rect& viewport, | 449 const gfx::Rect& viewport, |
445 const gfx::Transform& device_transform, | 450 const gfx::Transform& device_transform, |
446 PropertyTrees* property_trees) { | 451 PropertyTrees* property_trees) { |
447 BuildPropertyTreesTopLevelInternal( | 452 BuildPropertyTreesTopLevelInternal( |
448 root_layer, page_scale_layer, page_scale_factor, device_scale_factor, | 453 root_layer, page_scale_layer, page_scale_factor, device_scale_factor, |
449 viewport, device_transform, property_trees); | 454 viewport, device_transform, property_trees); |
450 } | 455 } |
451 | 456 |
452 } // namespace cc | 457 } // namespace cc |
OLD | NEW |