| 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 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 | 513 |
| 514 // If the layer has some translucency and does not have a preserves-3d | 514 // If the layer has some translucency and does not have a preserves-3d |
| 515 // transform style. This condition only needs a render surface if two or more | 515 // transform style. This condition only needs a render surface if two or more |
| 516 // layers in the subtree overlap. But checking layer overlaps is unnecessarily | 516 // layers in the subtree overlap. But checking layer overlaps is unnecessarily |
| 517 // costly so instead we conservatively create a surface whenever at least two | 517 // costly so instead we conservatively create a surface whenever at least two |
| 518 // layers draw content for this subtree. | 518 // layers draw content for this subtree. |
| 519 bool at_least_two_layers_in_subtree_draw_content = | 519 bool at_least_two_layers_in_subtree_draw_content = |
| 520 num_descendants_that_draw_content > 0 && | 520 num_descendants_that_draw_content > 0 && |
| 521 (layer->DrawsContent() || num_descendants_that_draw_content > 1); | 521 (layer->DrawsContent() || num_descendants_that_draw_content > 1); |
| 522 | 522 |
| 523 if (layer->opacity() != 1.f && layer->should_flatten_transform() && | 523 if (layer->EffectiveOpacity() != 1.f && layer->should_flatten_transform() && |
| 524 at_least_two_layers_in_subtree_draw_content) { | 524 at_least_two_layers_in_subtree_draw_content) { |
| 525 TRACE_EVENT_INSTANT0( | 525 TRACE_EVENT_INSTANT0( |
| 526 "cc", "PropertyTreeBuilder::ShouldCreateRenderSurface opacity", | 526 "cc", "PropertyTreeBuilder::ShouldCreateRenderSurface opacity", |
| 527 TRACE_EVENT_SCOPE_THREAD); | 527 TRACE_EVENT_SCOPE_THREAD); |
| 528 DCHECK(!is_root); | 528 DCHECK(!is_root); |
| 529 return true; | 529 return true; |
| 530 } | 530 } |
| 531 // If the layer has isolation. | 531 // If the layer has isolation. |
| 532 // TODO(rosca): to be optimized - create separate rendering surface only when | 532 // TODO(rosca): to be optimized - create separate rendering surface only when |
| 533 // the blending descendants might have access to the content behind this layer | 533 // the blending descendants might have access to the content behind this layer |
| (...skipping 16 matching lines...) Expand all Loading... |
| 550 | 550 |
| 551 return false; | 551 return false; |
| 552 } | 552 } |
| 553 | 553 |
| 554 template <typename LayerType> | 554 template <typename LayerType> |
| 555 bool AddEffectNodeIfNeeded( | 555 bool AddEffectNodeIfNeeded( |
| 556 const DataForRecursion<LayerType>& data_from_ancestor, | 556 const DataForRecursion<LayerType>& data_from_ancestor, |
| 557 LayerType* layer, | 557 LayerType* layer, |
| 558 DataForRecursion<LayerType>* data_for_children) { | 558 DataForRecursion<LayerType>* data_for_children) { |
| 559 const bool is_root = !layer->parent(); | 559 const bool is_root = !layer->parent(); |
| 560 const bool has_transparency = layer->opacity() != 1.f; | 560 const bool has_transparency = layer->EffectiveOpacity() != 1.f; |
| 561 const bool has_animated_opacity = IsAnimatingOpacity(layer); | 561 const bool has_animated_opacity = IsAnimatingOpacity(layer); |
| 562 const bool should_create_render_surface = ShouldCreateRenderSurface( | 562 const bool should_create_render_surface = ShouldCreateRenderSurface( |
| 563 layer, data_from_ancestor.compound_transform_since_render_target, | 563 layer, data_from_ancestor.compound_transform_since_render_target, |
| 564 data_from_ancestor.axis_align_since_render_target); | 564 data_from_ancestor.axis_align_since_render_target); |
| 565 data_for_children->axis_align_since_render_target &= | 565 data_for_children->axis_align_since_render_target &= |
| 566 layer->AnimationsPreserveAxisAlignment(); | 566 layer->AnimationsPreserveAxisAlignment(); |
| 567 | 567 |
| 568 bool requires_node = is_root || has_transparency || has_animated_opacity || | 568 bool requires_node = is_root || has_transparency || has_animated_opacity || |
| 569 should_create_render_surface; | 569 should_create_render_surface; |
| 570 | 570 |
| 571 int parent_id = data_from_ancestor.effect_tree_parent; | 571 int parent_id = data_from_ancestor.effect_tree_parent; |
| 572 | 572 |
| 573 if (!requires_node) { | 573 if (!requires_node) { |
| 574 layer->SetEffectTreeIndex(parent_id); | 574 layer->SetEffectTreeIndex(parent_id); |
| 575 data_for_children->effect_tree_parent = parent_id; | 575 data_for_children->effect_tree_parent = parent_id; |
| 576 data_for_children->compound_transform_since_render_target *= | 576 data_for_children->compound_transform_since_render_target *= |
| 577 layer->transform(); | 577 layer->transform(); |
| 578 return false; | 578 return false; |
| 579 } | 579 } |
| 580 | 580 |
| 581 EffectNode node; | 581 EffectNode node; |
| 582 node.owner_id = layer->id(); | 582 node.owner_id = layer->id(); |
| 583 node.data.opacity = layer->opacity(); | 583 node.data.opacity = layer->EffectiveOpacity(); |
| 584 node.data.screen_space_opacity = layer->opacity(); | |
| 585 node.data.has_render_surface = should_create_render_surface; | 584 node.data.has_render_surface = should_create_render_surface; |
| 585 node.data.has_copy_request = layer->HasCopyRequest(); |
| 586 node.data.has_background_filters = !layer->background_filters().IsEmpty(); |
| 586 | 587 |
| 587 if (!is_root) { | 588 if (!is_root) { |
| 588 // The effect node's transform id is used only when we create a render | 589 // The effect node's transform id is used only when we create a render |
| 589 // surface. So, we can leave the default value when we don't create a render | 590 // surface. So, we can leave the default value when we don't create a render |
| 590 // surface. | 591 // surface. |
| 591 if (should_create_render_surface) { | 592 if (should_create_render_surface) { |
| 592 // In this case, we will create a transform node, so it's safe to use the | 593 // In this case, we will create a transform node, so it's safe to use the |
| 593 // next available id from the transform tree as this effect node's | 594 // next available id from the transform tree as this effect node's |
| 594 // transform id. | 595 // transform id. |
| 595 node.data.transform_id = | 596 node.data.transform_id = |
| 596 data_from_ancestor.transform_tree->next_available_id(); | 597 data_from_ancestor.transform_tree->next_available_id(); |
| 597 } | 598 } |
| 598 node.data.clip_id = data_from_ancestor.clip_tree_parent; | 599 node.data.clip_id = data_from_ancestor.clip_tree_parent; |
| 599 | 600 |
| 600 node.data.screen_space_opacity *= | 601 EffectNode* parent = data_from_ancestor.effect_tree->Node(parent_id); |
| 601 data_from_ancestor.effect_tree->Node(parent_id) | 602 node.data.screen_space_opacity_is_animating = |
| 602 ->data.screen_space_opacity; | 603 parent->data.screen_space_opacity_is_animating || has_animated_opacity; |
| 603 } else { | 604 } else { |
| 604 // Root render surface acts the unbounded and untransformed to draw content | 605 // Root render surface acts the unbounded and untransformed to draw content |
| 605 // into. Transform node created from root layer (includes device scale | 606 // into. Transform node created from root layer (includes device scale |
| 606 // factor) and clip node created from root layer (include viewports) applies | 607 // factor) and clip node created from root layer (include viewports) applies |
| 607 // to root render surface's content, but not root render surface itself. | 608 // to root render surface's content, but not root render surface itself. |
| 608 node.data.transform_id = kRootPropertyTreeNodeId; | 609 node.data.transform_id = kRootPropertyTreeNodeId; |
| 609 node.data.clip_id = kRootPropertyTreeNodeId; | 610 node.data.clip_id = kRootPropertyTreeNodeId; |
| 611 node.data.screen_space_opacity_is_animating = has_animated_opacity; |
| 610 } | 612 } |
| 611 data_for_children->effect_tree_parent = | 613 data_for_children->effect_tree_parent = |
| 612 data_for_children->effect_tree->Insert(node, parent_id); | 614 data_for_children->effect_tree->Insert(node, parent_id); |
| 613 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); | 615 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); |
| 614 if (should_create_render_surface) { | 616 if (should_create_render_surface) { |
| 615 data_for_children->compound_transform_since_render_target = | 617 data_for_children->compound_transform_since_render_target = |
| 616 gfx::Transform(); | 618 gfx::Transform(); |
| 617 data_for_children->axis_align_since_render_target = true; | 619 data_for_children->axis_align_since_render_target = true; |
| 618 } | 620 } |
| 619 return should_create_render_surface; | 621 return should_create_render_surface; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 639 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); | 641 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); |
| 640 } else { | 642 } else { |
| 641 layer->set_draw_blend_mode(layer->blend_mode()); | 643 layer->set_draw_blend_mode(layer->blend_mode()); |
| 642 } | 644 } |
| 643 | 645 |
| 644 bool created_transform_node = AddTransformNodeIfNeeded( | 646 bool created_transform_node = AddTransformNodeIfNeeded( |
| 645 data_from_parent, layer, created_render_surface, &data_for_children); | 647 data_from_parent, layer, created_render_surface, &data_for_children); |
| 646 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, | 648 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, |
| 647 created_transform_node, &data_for_children); | 649 created_transform_node, &data_for_children); |
| 648 | 650 |
| 649 data_for_children.is_hidden = | |
| 650 layer->hide_layer_and_subtree() || data_from_parent.is_hidden; | |
| 651 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden); | |
| 652 | |
| 653 for (size_t i = 0; i < layer->children().size(); ++i) { | 651 for (size_t i = 0; i < layer->children().size(); ++i) { |
| 654 if (!layer->child_at(i)->scroll_parent()) { | 652 if (!layer->child_at(i)->scroll_parent()) { |
| 655 DataForRecursionFromChild<LayerType> data_from_child; | 653 DataForRecursionFromChild<LayerType> data_from_child; |
| 656 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, | 654 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, |
| 657 &data_from_child); | 655 &data_from_child); |
| 658 data_to_parent->Merge(data_from_child); | 656 data_to_parent->Merge(data_from_child); |
| 659 } else { | 657 } else { |
| 660 // The child should be included in its scroll parent's list of scroll | 658 // The child should be included in its scroll parent's list of scroll |
| 661 // children. | 659 // children. |
| 662 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count( | 660 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count( |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 root_clip.data.clip = gfx::RectF(viewport); | 759 root_clip.data.clip = gfx::RectF(viewport); |
| 762 root_clip.data.transform_id = kRootPropertyTreeNodeId; | 760 root_clip.data.transform_id = kRootPropertyTreeNodeId; |
| 763 data_for_recursion.clip_tree_parent = | 761 data_for_recursion.clip_tree_parent = |
| 764 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); | 762 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); |
| 765 | 763 |
| 766 DataForRecursionFromChild<LayerType> data_from_child; | 764 DataForRecursionFromChild<LayerType> data_from_child; |
| 767 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); | 765 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); |
| 768 property_trees->needs_rebuild = false; | 766 property_trees->needs_rebuild = false; |
| 769 | 767 |
| 770 // The transform tree is kept up-to-date as it is built, but the | 768 // The transform tree is kept up-to-date as it is built, but the |
| 771 // combined_clips stored in the clip tree aren't computed during tree | 769 // combined_clips stored in the clip tree and the screen_space_opacity and |
| 772 // building. | 770 // is_drawn in the effect tree aren't computed during tree building. |
| 773 property_trees->transform_tree.set_needs_update(false); | 771 property_trees->transform_tree.set_needs_update(false); |
| 774 property_trees->clip_tree.set_needs_update(true); | 772 property_trees->clip_tree.set_needs_update(true); |
| 775 property_trees->effect_tree.set_needs_update(false); | 773 property_trees->effect_tree.set_needs_update(true); |
| 776 } | 774 } |
| 777 | 775 |
| 778 void PropertyTreeBuilder::BuildPropertyTrees( | 776 void PropertyTreeBuilder::BuildPropertyTrees( |
| 779 Layer* root_layer, | 777 Layer* root_layer, |
| 780 const Layer* page_scale_layer, | 778 const Layer* page_scale_layer, |
| 781 const Layer* inner_viewport_scroll_layer, | 779 const Layer* inner_viewport_scroll_layer, |
| 782 const Layer* outer_viewport_scroll_layer, | 780 const Layer* outer_viewport_scroll_layer, |
| 783 const Layer* overscroll_elasticity_layer, | 781 const Layer* overscroll_elasticity_layer, |
| 784 const gfx::Vector2dF& elastic_overscroll, | 782 const gfx::Vector2dF& elastic_overscroll, |
| 785 float page_scale_factor, | 783 float page_scale_factor, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 807 const gfx::Transform& device_transform, | 805 const gfx::Transform& device_transform, |
| 808 PropertyTrees* property_trees) { | 806 PropertyTrees* property_trees) { |
| 809 BuildPropertyTreesTopLevelInternal( | 807 BuildPropertyTreesTopLevelInternal( |
| 810 root_layer, page_scale_layer, inner_viewport_scroll_layer, | 808 root_layer, page_scale_layer, inner_viewport_scroll_layer, |
| 811 outer_viewport_scroll_layer, overscroll_elasticity_layer, | 809 outer_viewport_scroll_layer, overscroll_elasticity_layer, |
| 812 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, | 810 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, |
| 813 device_transform, property_trees); | 811 device_transform, property_trees); |
| 814 } | 812 } |
| 815 | 813 |
| 816 } // namespace cc | 814 } // namespace cc |
| OLD | NEW |