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 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 | 504 |
505 // If the layer has some translucency and does not have a preserves-3d | 505 // If the layer has some translucency and does not have a preserves-3d |
506 // transform style. This condition only needs a render surface if two or more | 506 // transform style. This condition only needs a render surface if two or more |
507 // layers in the subtree overlap. But checking layer overlaps is unnecessarily | 507 // layers in the subtree overlap. But checking layer overlaps is unnecessarily |
508 // costly so instead we conservatively create a surface whenever at least two | 508 // costly so instead we conservatively create a surface whenever at least two |
509 // layers draw content for this subtree. | 509 // layers draw content for this subtree. |
510 bool at_least_two_layers_in_subtree_draw_content = | 510 bool at_least_two_layers_in_subtree_draw_content = |
511 num_descendants_that_draw_content > 0 && | 511 num_descendants_that_draw_content > 0 && |
512 (layer->DrawsContent() || num_descendants_that_draw_content > 1); | 512 (layer->DrawsContent() || num_descendants_that_draw_content > 1); |
513 | 513 |
514 if (layer->opacity() != 1.f && layer->should_flatten_transform() && | 514 if (layer->EffectiveOpacity() != 1.f && layer->should_flatten_transform() && |
515 at_least_two_layers_in_subtree_draw_content) { | 515 at_least_two_layers_in_subtree_draw_content) { |
516 TRACE_EVENT_INSTANT0( | 516 TRACE_EVENT_INSTANT0( |
517 "cc", "PropertyTreeBuilder::ShouldCreateRenderSurface opacity", | 517 "cc", "PropertyTreeBuilder::ShouldCreateRenderSurface opacity", |
518 TRACE_EVENT_SCOPE_THREAD); | 518 TRACE_EVENT_SCOPE_THREAD); |
519 DCHECK(!is_root); | 519 DCHECK(!is_root); |
520 return true; | 520 return true; |
521 } | 521 } |
522 // If the layer has isolation. | 522 // If the layer has isolation. |
523 // TODO(rosca): to be optimized - create separate rendering surface only when | 523 // TODO(rosca): to be optimized - create separate rendering surface only when |
524 // the blending descendants might have access to the content behind this layer | 524 // the blending descendants might have access to the content behind this layer |
(...skipping 16 matching lines...) Expand all 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 bool has_transparency = layer->EffectiveOpacity() != 1.f; |
552 const bool has_animated_opacity = IsAnimatingOpacity(layer); | 552 const bool has_animated_opacity = IsAnimatingOpacity(layer); |
553 const bool should_create_render_surface = ShouldCreateRenderSurface( | 553 const bool should_create_render_surface = ShouldCreateRenderSurface( |
554 layer, data_from_ancestor.compound_transform_since_render_target, | 554 layer, data_from_ancestor.compound_transform_since_render_target, |
555 data_from_ancestor.axis_align_since_render_target); | 555 data_from_ancestor.axis_align_since_render_target); |
556 data_for_children->axis_align_since_render_target &= | 556 data_for_children->axis_align_since_render_target &= |
557 layer->AnimationsPreserveAxisAlignment(); | 557 layer->AnimationsPreserveAxisAlignment(); |
558 | 558 |
559 bool requires_node = is_root || has_transparency || has_animated_opacity || | 559 bool requires_node = is_root || has_transparency || has_animated_opacity || |
560 should_create_render_surface; | 560 should_create_render_surface; |
561 | 561 |
562 int parent_id = data_from_ancestor.effect_tree_parent; | 562 int parent_id = data_from_ancestor.effect_tree_parent; |
563 | 563 |
564 if (!requires_node) { | 564 if (!requires_node) { |
565 layer->SetEffectTreeIndex(parent_id); | 565 layer->SetEffectTreeIndex(parent_id); |
566 data_for_children->effect_tree_parent = parent_id; | 566 data_for_children->effect_tree_parent = parent_id; |
567 data_for_children->compound_transform_since_render_target *= | 567 data_for_children->compound_transform_since_render_target *= |
568 layer->transform(); | 568 layer->transform(); |
569 return false; | 569 return false; |
570 } | 570 } |
571 | 571 |
572 EffectNode node; | 572 EffectNode node; |
573 node.owner_id = layer->id(); | 573 node.owner_id = layer->id(); |
574 node.data.opacity = layer->opacity(); | 574 node.data.opacity = layer->EffectiveOpacity(); |
575 node.data.screen_space_opacity = layer->opacity(); | |
576 node.data.has_render_surface = should_create_render_surface; | 575 node.data.has_render_surface = should_create_render_surface; |
| 576 node.data.has_copy_request = layer->HasCopyRequest(); |
| 577 node.data.has_background_filters = !layer->background_filters().IsEmpty(); |
577 | 578 |
578 if (!is_root) { | 579 if (!is_root) { |
579 // The effect node's transform id is used only when we create a render | 580 // 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 | 581 // surface. So, we can leave the default value when we don't create a render |
581 // surface. | 582 // surface. |
582 if (should_create_render_surface) { | 583 if (should_create_render_surface) { |
583 // In this case, we will create a transform node, so it's safe to use the | 584 // 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 | 585 // next available id from the transform tree as this effect node's |
585 // transform id. | 586 // transform id. |
586 node.data.transform_id = | 587 node.data.transform_id = |
587 data_from_ancestor.transform_tree->next_available_id(); | 588 data_from_ancestor.transform_tree->next_available_id(); |
588 } | 589 } |
589 node.data.clip_id = data_from_ancestor.clip_tree_parent; | 590 node.data.clip_id = data_from_ancestor.clip_tree_parent; |
590 | 591 |
591 node.data.screen_space_opacity *= | 592 EffectNode* parent = data_from_ancestor.effect_tree->Node(parent_id); |
592 data_from_ancestor.effect_tree->Node(parent_id) | 593 node.data.screen_space_opacity_is_animating = |
593 ->data.screen_space_opacity; | 594 parent->data.screen_space_opacity_is_animating || has_animated_opacity; |
594 } else { | 595 } else { |
595 // Root render surface acts the unbounded and untransformed to draw content | 596 // Root render surface acts the unbounded and untransformed to draw content |
596 // into. Transform node created from root layer (includes device scale | 597 // into. Transform node created from root layer (includes device scale |
597 // factor) and clip node created from root layer (include viewports) applies | 598 // factor) and clip node created from root layer (include viewports) applies |
598 // to root render surface's content, but not root render surface itself. | 599 // to root render surface's content, but not root render surface itself. |
599 node.data.transform_id = kRootPropertyTreeNodeId; | 600 node.data.transform_id = kRootPropertyTreeNodeId; |
600 node.data.clip_id = kRootPropertyTreeNodeId; | 601 node.data.clip_id = kRootPropertyTreeNodeId; |
| 602 node.data.screen_space_opacity_is_animating = has_animated_opacity; |
601 } | 603 } |
602 data_for_children->effect_tree_parent = | 604 data_for_children->effect_tree_parent = |
603 data_for_children->effect_tree->Insert(node, parent_id); | 605 data_for_children->effect_tree->Insert(node, parent_id); |
604 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); | 606 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); |
605 if (should_create_render_surface) { | 607 if (should_create_render_surface) { |
606 data_for_children->compound_transform_since_render_target = | 608 data_for_children->compound_transform_since_render_target = |
607 gfx::Transform(); | 609 gfx::Transform(); |
608 data_for_children->axis_align_since_render_target = true; | 610 data_for_children->axis_align_since_render_target = true; |
609 } | 611 } |
610 return should_create_render_surface; | 612 return should_create_render_surface; |
(...skipping 19 matching lines...) Expand all Loading... |
630 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); | 632 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); |
631 } else { | 633 } else { |
632 layer->set_draw_blend_mode(layer->blend_mode()); | 634 layer->set_draw_blend_mode(layer->blend_mode()); |
633 } | 635 } |
634 | 636 |
635 bool created_transform_node = AddTransformNodeIfNeeded( | 637 bool created_transform_node = AddTransformNodeIfNeeded( |
636 data_from_parent, layer, created_render_surface, &data_for_children); | 638 data_from_parent, layer, created_render_surface, &data_for_children); |
637 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, | 639 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, |
638 created_transform_node, &data_for_children); | 640 created_transform_node, &data_for_children); |
639 | 641 |
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) { | 642 for (size_t i = 0; i < layer->children().size(); ++i) { |
645 if (!layer->child_at(i)->scroll_parent()) { | 643 if (!layer->child_at(i)->scroll_parent()) { |
646 DataForRecursionFromChild<LayerType> data_from_child; | 644 DataForRecursionFromChild<LayerType> data_from_child; |
647 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, | 645 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, |
648 &data_from_child); | 646 &data_from_child); |
649 data_to_parent->Merge(data_from_child); | 647 data_to_parent->Merge(data_from_child); |
650 } else { | 648 } else { |
651 // The child should be included in its scroll parent's list of scroll | 649 // The child should be included in its scroll parent's list of scroll |
652 // children. | 650 // children. |
653 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count( | 651 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); | 747 root_clip.data.clip = gfx::RectF(viewport); |
750 root_clip.data.transform_id = kRootPropertyTreeNodeId; | 748 root_clip.data.transform_id = kRootPropertyTreeNodeId; |
751 data_for_recursion.clip_tree_parent = | 749 data_for_recursion.clip_tree_parent = |
752 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); | 750 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); |
753 | 751 |
754 DataForRecursionFromChild<LayerType> data_from_child; | 752 DataForRecursionFromChild<LayerType> data_from_child; |
755 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); | 753 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); |
756 property_trees->needs_rebuild = false; | 754 property_trees->needs_rebuild = false; |
757 | 755 |
758 // The transform tree is kept up-to-date as it is built, but the | 756 // 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 | 757 // combined_clips stored in the clip tree and the screen_space_opacity and |
760 // building. | 758 // is_drawn in the effect tree aren't computed during tree building. |
761 property_trees->transform_tree.set_needs_update(false); | 759 property_trees->transform_tree.set_needs_update(false); |
762 property_trees->clip_tree.set_needs_update(true); | 760 property_trees->clip_tree.set_needs_update(true); |
763 property_trees->effect_tree.set_needs_update(false); | 761 property_trees->effect_tree.set_needs_update(true); |
764 } | 762 } |
765 | 763 |
766 void PropertyTreeBuilder::BuildPropertyTrees( | 764 void PropertyTreeBuilder::BuildPropertyTrees( |
767 Layer* root_layer, | 765 Layer* root_layer, |
768 const Layer* page_scale_layer, | 766 const Layer* page_scale_layer, |
769 const Layer* inner_viewport_scroll_layer, | 767 const Layer* inner_viewport_scroll_layer, |
770 const Layer* outer_viewport_scroll_layer, | 768 const Layer* outer_viewport_scroll_layer, |
771 const Layer* overscroll_elasticity_layer, | 769 const Layer* overscroll_elasticity_layer, |
772 const gfx::Vector2dF& elastic_overscroll, | 770 const gfx::Vector2dF& elastic_overscroll, |
773 float page_scale_factor, | 771 float page_scale_factor, |
(...skipping 21 matching lines...) Expand all Loading... |
795 const gfx::Transform& device_transform, | 793 const gfx::Transform& device_transform, |
796 PropertyTrees* property_trees) { | 794 PropertyTrees* property_trees) { |
797 BuildPropertyTreesTopLevelInternal( | 795 BuildPropertyTreesTopLevelInternal( |
798 root_layer, page_scale_layer, inner_viewport_scroll_layer, | 796 root_layer, page_scale_layer, inner_viewport_scroll_layer, |
799 outer_viewport_scroll_layer, overscroll_elasticity_layer, | 797 outer_viewport_scroll_layer, overscroll_elasticity_layer, |
800 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, | 798 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, |
801 device_transform, property_trees); | 799 device_transform, property_trees); |
802 } | 800 } |
803 | 801 |
804 } // namespace cc | 802 } // namespace cc |
OLD | NEW |