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 #include "cc/trees/property_tree_builder.h" | 5 #include "cc/trees/property_tree_builder.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 541 | 541 |
| 542 return false; | 542 return false; |
| 543 } | 543 } |
| 544 | 544 |
| 545 template <typename LayerType> | 545 template <typename LayerType> |
| 546 bool AddEffectNodeIfNeeded( | 546 bool AddEffectNodeIfNeeded( |
| 547 const DataForRecursion<LayerType>& data_from_ancestor, | 547 const DataForRecursion<LayerType>& data_from_ancestor, |
| 548 LayerType* layer, | 548 LayerType* layer, |
| 549 DataForRecursion<LayerType>* data_for_children) { | 549 DataForRecursion<LayerType>* data_for_children) { |
| 550 const bool is_root = !layer->parent(); | 550 const bool is_root = !layer->parent(); |
| 551 const bool has_transparency = layer->opacity() != 1.f; | 551 const float opacity = layer->opacity(); |
|
weiliangc
2016/01/19 21:03:08
Don't think we need this cached?
jaydasika
2016/01/19 22:10:36
Removed
| |
| 552 const bool has_transparency = opacity != 1.f; | |
| 552 const bool has_animated_opacity = IsAnimatingOpacity(layer); | 553 const bool has_animated_opacity = IsAnimatingOpacity(layer); |
| 553 const bool should_create_render_surface = ShouldCreateRenderSurface( | 554 const bool should_create_render_surface = ShouldCreateRenderSurface( |
| 554 layer, data_from_ancestor.compound_transform_since_render_target, | 555 layer, data_from_ancestor.compound_transform_since_render_target, |
| 555 data_from_ancestor.axis_align_since_render_target); | 556 data_from_ancestor.axis_align_since_render_target); |
| 556 data_for_children->axis_align_since_render_target &= | 557 data_for_children->axis_align_since_render_target &= |
| 557 layer->AnimationsPreserveAxisAlignment(); | 558 layer->AnimationsPreserveAxisAlignment(); |
| 558 | 559 |
| 559 bool requires_node = is_root || has_transparency || has_animated_opacity || | 560 bool requires_node = is_root || has_transparency || has_animated_opacity || |
| 560 should_create_render_surface; | 561 should_create_render_surface; |
| 561 | 562 |
| 562 int parent_id = data_from_ancestor.effect_tree_parent; | 563 int parent_id = data_from_ancestor.effect_tree_parent; |
| 563 | 564 |
| 564 if (!requires_node) { | 565 if (!requires_node) { |
| 565 layer->SetEffectTreeIndex(parent_id); | 566 layer->SetEffectTreeIndex(parent_id); |
| 566 data_for_children->effect_tree_parent = parent_id; | 567 data_for_children->effect_tree_parent = parent_id; |
| 567 data_for_children->compound_transform_since_render_target *= | 568 data_for_children->compound_transform_since_render_target *= |
| 568 layer->transform(); | 569 layer->transform(); |
| 569 return false; | 570 return false; |
| 570 } | 571 } |
| 572 const bool has_copy_request = layer->HasCopyRequest(); | |
| 571 | 573 |
| 572 EffectNode node; | 574 EffectNode node; |
| 573 node.owner_id = layer->id(); | 575 node.owner_id = layer->id(); |
| 574 node.data.opacity = layer->opacity(); | 576 node.data.opacity = opacity; |
| 575 node.data.screen_space_opacity = layer->opacity(); | 577 node.data.screen_space_opacity = layer->opacity(); |
| 576 node.data.has_render_surface = should_create_render_surface; | 578 node.data.has_render_surface = should_create_render_surface; |
| 579 node.data.has_copy_request = has_copy_request; | |
| 580 node.data.has_background_filters = !layer->background_filters().IsEmpty(); | |
| 577 | 581 |
| 578 if (!is_root) { | 582 if (!is_root) { |
| 579 // The effect node's transform id is used only when we create a render | 583 // The effect node's transform id is used only when we create a render |
| 580 // surface. So, we can leave the default value when we don't create a render | 584 // surface. So, we can leave the default value when we don't create a render |
| 581 // surface. | 585 // surface. |
| 582 if (should_create_render_surface) { | 586 if (should_create_render_surface) { |
| 583 // In this case, we will create a transform node, so it's safe to use the | 587 // In this case, we will create a transform node, so it's safe to use the |
| 584 // next available id from the transform tree as this effect node's | 588 // next available id from the transform tree as this effect node's |
| 585 // transform id. | 589 // transform id. |
| 586 node.data.transform_id = | 590 node.data.transform_id = |
| 587 data_from_ancestor.transform_tree->next_available_id(); | 591 data_from_ancestor.transform_tree->next_available_id(); |
| 588 } | 592 } |
| 589 node.data.clip_id = data_from_ancestor.clip_tree_parent; | 593 node.data.clip_id = data_from_ancestor.clip_tree_parent; |
| 590 | 594 |
| 591 node.data.screen_space_opacity *= | 595 EffectNode* parent = data_from_ancestor.effect_tree->Node(parent_id); |
|
jaydasika
2016/01/19 22:31:36
Removed screen space opacity computation from prop
| |
| 592 data_from_ancestor.effect_tree->Node(parent_id) | 596 node.data.screen_space_opacity_is_animating = |
| 593 ->data.screen_space_opacity; | 597 parent->data.screen_space_opacity_is_animating || has_animated_opacity; |
| 594 } else { | 598 } else { |
| 595 // Root render surface acts the unbounded and untransformed to draw content | 599 // Root render surface acts the unbounded and untransformed to draw content |
| 596 // into. Transform node created from root layer (includes device scale | 600 // into. Transform node created from root layer (includes device scale |
| 597 // factor) and clip node created from root layer (include viewports) applies | 601 // factor) and clip node created from root layer (include viewports) applies |
| 598 // to root render surface's content, but not root render surface itself. | 602 // to root render surface's content, but not root render surface itself. |
| 599 node.data.transform_id = kRootPropertyTreeNodeId; | 603 node.data.transform_id = kRootPropertyTreeNodeId; |
| 600 node.data.clip_id = kRootPropertyTreeNodeId; | 604 node.data.clip_id = kRootPropertyTreeNodeId; |
| 605 node.data.screen_space_opacity_is_animating = has_animated_opacity; | |
| 601 } | 606 } |
| 602 data_for_children->effect_tree_parent = | 607 data_for_children->effect_tree_parent = |
| 603 data_for_children->effect_tree->Insert(node, parent_id); | 608 data_for_children->effect_tree->Insert(node, parent_id); |
| 604 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); | 609 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); |
| 605 if (should_create_render_surface) { | 610 if (should_create_render_surface) { |
| 606 data_for_children->compound_transform_since_render_target = | 611 data_for_children->compound_transform_since_render_target = |
| 607 gfx::Transform(); | 612 gfx::Transform(); |
| 608 data_for_children->axis_align_since_render_target = true; | 613 data_for_children->axis_align_since_render_target = true; |
| 609 } | 614 } |
| 610 return should_create_render_surface; | 615 return should_create_render_surface; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 630 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); | 635 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); |
| 631 } else { | 636 } else { |
| 632 layer->set_draw_blend_mode(layer->blend_mode()); | 637 layer->set_draw_blend_mode(layer->blend_mode()); |
| 633 } | 638 } |
| 634 | 639 |
| 635 bool created_transform_node = AddTransformNodeIfNeeded( | 640 bool created_transform_node = AddTransformNodeIfNeeded( |
| 636 data_from_parent, layer, created_render_surface, &data_for_children); | 641 data_from_parent, layer, created_render_surface, &data_for_children); |
| 637 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, | 642 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, |
| 638 created_transform_node, &data_for_children); | 643 created_transform_node, &data_for_children); |
| 639 | 644 |
| 640 data_for_children.is_hidden = | |
| 641 layer->hide_layer_and_subtree() || data_from_parent.is_hidden; | |
| 642 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden); | |
| 643 | |
| 644 for (size_t i = 0; i < layer->children().size(); ++i) { | 645 for (size_t i = 0; i < layer->children().size(); ++i) { |
| 645 if (!layer->child_at(i)->scroll_parent()) { | 646 if (!layer->child_at(i)->scroll_parent()) { |
| 646 DataForRecursionFromChild<LayerType> data_from_child; | 647 DataForRecursionFromChild<LayerType> data_from_child; |
| 647 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, | 648 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, |
| 648 &data_from_child); | 649 &data_from_child); |
| 649 data_to_parent->Merge(data_from_child); | 650 data_to_parent->Merge(data_from_child); |
| 650 } else { | 651 } else { |
| 651 // The child should be included in its scroll parent's list of scroll | 652 // The child should be included in its scroll parent's list of scroll |
| 652 // children. | 653 // children. |
| 653 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count( | 654 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count( |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 749 root_clip.data.clip = gfx::RectF(viewport); | 750 root_clip.data.clip = gfx::RectF(viewport); |
| 750 root_clip.data.transform_id = kRootPropertyTreeNodeId; | 751 root_clip.data.transform_id = kRootPropertyTreeNodeId; |
| 751 data_for_recursion.clip_tree_parent = | 752 data_for_recursion.clip_tree_parent = |
| 752 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); | 753 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); |
| 753 | 754 |
| 754 DataForRecursionFromChild<LayerType> data_from_child; | 755 DataForRecursionFromChild<LayerType> data_from_child; |
| 755 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); | 756 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); |
| 756 property_trees->needs_rebuild = false; | 757 property_trees->needs_rebuild = false; |
| 757 | 758 |
| 758 // The transform tree is kept up-to-date as it is built, but the | 759 // The transform tree is kept up-to-date as it is built, but the |
| 759 // combined_clips stored in the clip tree aren't computed during tree | 760 // combined_clips stored in the clip tree and the screen_space_opacity and |
| 760 // building. | 761 // is_drawn in the effect tree aren't computed during tree building. |
|
jaydasika
2016/01/19 22:31:36
Comment that we need to update effects.
| |
| 761 property_trees->transform_tree.set_needs_update(false); | 762 property_trees->transform_tree.set_needs_update(false); |
| 762 property_trees->clip_tree.set_needs_update(true); | 763 property_trees->clip_tree.set_needs_update(true); |
| 763 property_trees->effect_tree.set_needs_update(false); | 764 property_trees->effect_tree.set_needs_update(true); |
|
jaydasika
2016/01/19 22:10:36
This was the place I was referring to in a previou
| |
| 764 } | 765 } |
| 765 | 766 |
| 766 void PropertyTreeBuilder::BuildPropertyTrees( | 767 void PropertyTreeBuilder::BuildPropertyTrees( |
| 767 Layer* root_layer, | 768 Layer* root_layer, |
| 768 const Layer* page_scale_layer, | 769 const Layer* page_scale_layer, |
| 769 const Layer* inner_viewport_scroll_layer, | 770 const Layer* inner_viewport_scroll_layer, |
| 770 const Layer* outer_viewport_scroll_layer, | 771 const Layer* outer_viewport_scroll_layer, |
| 771 const Layer* overscroll_elasticity_layer, | 772 const Layer* overscroll_elasticity_layer, |
| 772 const gfx::Vector2dF& elastic_overscroll, | 773 const gfx::Vector2dF& elastic_overscroll, |
| 773 float page_scale_factor, | 774 float page_scale_factor, |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 795 const gfx::Transform& device_transform, | 796 const gfx::Transform& device_transform, |
| 796 PropertyTrees* property_trees) { | 797 PropertyTrees* property_trees) { |
| 797 BuildPropertyTreesTopLevelInternal( | 798 BuildPropertyTreesTopLevelInternal( |
| 798 root_layer, page_scale_layer, inner_viewport_scroll_layer, | 799 root_layer, page_scale_layer, inner_viewport_scroll_layer, |
| 799 outer_viewport_scroll_layer, overscroll_elasticity_layer, | 800 outer_viewport_scroll_layer, overscroll_elasticity_layer, |
| 800 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, | 801 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, |
| 801 device_transform, property_trees); | 802 device_transform, property_trees); |
| 802 } | 803 } |
| 803 | 804 |
| 804 } // namespace cc | 805 } // namespace cc |
| OLD | NEW |