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 |