| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/layers/layer_impl.h" | 5 #include "cc/layers/layer_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 } | 128 } |
| 129 | 129 |
| 130 void LayerImpl::SetDebugInfo( | 130 void LayerImpl::SetDebugInfo( |
| 131 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> debug_info) { | 131 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> debug_info) { |
| 132 owned_debug_info_ = std::move(debug_info); | 132 owned_debug_info_ = std::move(debug_info); |
| 133 debug_info_ = owned_debug_info_.get(); | 133 debug_info_ = owned_debug_info_.get(); |
| 134 SetNeedsPushProperties(); | 134 SetNeedsPushProperties(); |
| 135 } | 135 } |
| 136 | 136 |
| 137 void LayerImpl::DistributeScroll(ScrollState* scroll_state) { | 137 void LayerImpl::DistributeScroll(ScrollState* scroll_state) { |
| 138 ScrollTree& scroll_tree = layer_tree_impl()->property_trees()->scroll_tree; | 138 ScrollTree& scroll_tree = GetScrollTree(); |
| 139 ScrollNode* scroll_node = scroll_tree.Node(scroll_tree_index()); | 139 ScrollNode* scroll_node = scroll_tree.Node(scroll_tree_index()); |
| 140 scroll_tree.DistributeScroll(scroll_node, scroll_state); | 140 scroll_tree.DistributeScroll(scroll_node, scroll_state); |
| 141 } | 141 } |
| 142 | 142 |
| 143 void LayerImpl::SetTransformTreeIndex(int index) { | 143 void LayerImpl::SetTransformTreeIndex(int index) { |
| 144 transform_tree_index_ = index; | 144 transform_tree_index_ = index; |
| 145 } | 145 } |
| 146 | 146 |
| 147 void LayerImpl::SetClipTreeIndex(int index) { | 147 void LayerImpl::SetClipTreeIndex(int index) { |
| 148 clip_tree_index_ = index; | 148 clip_tree_index_ = index; |
| 149 } | 149 } |
| 150 | 150 |
| 151 void LayerImpl::SetEffectTreeIndex(int index) { | 151 void LayerImpl::SetEffectTreeIndex(int index) { |
| 152 effect_tree_index_ = index; | 152 effect_tree_index_ = index; |
| 153 } | 153 } |
| 154 | 154 |
| 155 int LayerImpl::render_target_effect_tree_index() const { | 155 int LayerImpl::render_target_effect_tree_index() const { |
| 156 EffectNode* effect_node = | 156 EffectNode* effect_node = GetEffectTree().Node(effect_tree_index_); |
| 157 layer_tree_impl_->property_trees()->effect_tree.Node(effect_tree_index_); | 157 return effect_node->render_surface ? effect_node->id : effect_node->target_id; |
| 158 if (effect_node->render_surface) | |
| 159 return effect_node->id; | |
| 160 else | |
| 161 return effect_node->target_id; | |
| 162 } | 158 } |
| 163 | 159 |
| 164 void LayerImpl::SetScrollTreeIndex(int index) { | 160 void LayerImpl::SetScrollTreeIndex(int index) { |
| 165 scroll_tree_index_ = index; | 161 scroll_tree_index_ = index; |
| 166 } | 162 } |
| 167 | 163 |
| 168 void LayerImpl::ClearRenderSurfaceLayerList() { | 164 void LayerImpl::ClearRenderSurfaceLayerList() { |
| 169 if (render_surface_) | 165 if (render_surface_) |
| 170 render_surface_->ClearLayerLists(); | 166 render_surface_->ClearLayerLists(); |
| 171 } | 167 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 } | 275 } |
| 280 } | 276 } |
| 281 | 277 |
| 282 void LayerImpl::GetContentsResourceId(ResourceId* resource_id, | 278 void LayerImpl::GetContentsResourceId(ResourceId* resource_id, |
| 283 gfx::Size* resource_size) const { | 279 gfx::Size* resource_size) const { |
| 284 NOTREACHED(); | 280 NOTREACHED(); |
| 285 *resource_id = 0; | 281 *resource_id = 0; |
| 286 } | 282 } |
| 287 | 283 |
| 288 gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) { | 284 gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) { |
| 289 ScrollTree& scroll_tree = layer_tree_impl()->property_trees()->scroll_tree; | 285 ScrollTree& scroll_tree = GetScrollTree(); |
| 290 ScrollNode* scroll_node = scroll_tree.Node(scroll_tree_index()); | 286 ScrollNode* scroll_node = scroll_tree.Node(scroll_tree_index()); |
| 291 return scroll_tree.ScrollBy(scroll_node, scroll, layer_tree_impl()); | 287 return scroll_tree.ScrollBy(scroll_node, scroll, layer_tree_impl()); |
| 292 } | 288 } |
| 293 | 289 |
| 294 void LayerImpl::SetScrollClipLayer(int scroll_clip_layer_id) { | 290 void LayerImpl::SetScrollClipLayer(int scroll_clip_layer_id) { |
| 295 if (scroll_clip_layer_id_ == scroll_clip_layer_id) | 291 if (scroll_clip_layer_id_ == scroll_clip_layer_id) |
| 296 return; | 292 return; |
| 297 | 293 |
| 298 layer_tree_impl()->UnregisterScrollLayer(this); | 294 layer_tree_impl()->UnregisterScrollLayer(this); |
| 299 scroll_clip_layer_id_ = scroll_clip_layer_id; | 295 scroll_clip_layer_id_ = scroll_clip_layer_id; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 layer->SetDebugInfo(std::move(owned_debug_info_)); | 384 layer->SetDebugInfo(std::move(owned_debug_info_)); |
| 389 | 385 |
| 390 // Reset any state that should be cleared for the next update. | 386 // Reset any state that should be cleared for the next update. |
| 391 layer_property_changed_ = false; | 387 layer_property_changed_ = false; |
| 392 needs_push_properties_ = false; | 388 needs_push_properties_ = false; |
| 393 update_rect_ = gfx::Rect(); | 389 update_rect_ = gfx::Rect(); |
| 394 layer_tree_impl()->RemoveLayerShouldPushProperties(this); | 390 layer_tree_impl()->RemoveLayerShouldPushProperties(this); |
| 395 } | 391 } |
| 396 | 392 |
| 397 bool LayerImpl::IsAffectedByPageScale() const { | 393 bool LayerImpl::IsAffectedByPageScale() const { |
| 398 TransformTree& transform_tree = | 394 TransformTree& transform_tree = GetTransformTree(); |
| 399 layer_tree_impl()->property_trees()->transform_tree; | |
| 400 return transform_tree.Node(transform_tree_index()) | 395 return transform_tree.Node(transform_tree_index()) |
| 401 ->in_subtree_of_page_scale_layer; | 396 ->in_subtree_of_page_scale_layer; |
| 402 } | 397 } |
| 403 | 398 |
| 404 gfx::Vector2dF LayerImpl::FixedContainerSizeDelta() const { | 399 gfx::Vector2dF LayerImpl::FixedContainerSizeDelta() const { |
| 405 LayerImpl* scroll_clip_layer = | 400 LayerImpl* scroll_clip_layer = |
| 406 layer_tree_impl()->LayerById(scroll_clip_layer_id_); | 401 layer_tree_impl()->LayerById(scroll_clip_layer_id_); |
| 407 if (!scroll_clip_layer) | 402 if (!scroll_clip_layer) |
| 408 return gfx::Vector2dF(); | 403 return gfx::Vector2dF(); |
| 409 | 404 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 list = new base::ListValue; | 444 list = new base::ListValue; |
| 450 for (size_t i = 0; i < test_properties()->children.size(); ++i) | 445 for (size_t i = 0; i < test_properties()->children.size(); ++i) |
| 451 list->Append(test_properties()->children[i]->LayerTreeAsJson()); | 446 list->Append(test_properties()->children[i]->LayerTreeAsJson()); |
| 452 result->Set("Children", list); | 447 result->Set("Children", list); |
| 453 | 448 |
| 454 return result; | 449 return result; |
| 455 } | 450 } |
| 456 | 451 |
| 457 bool LayerImpl::LayerPropertyChanged() const { | 452 bool LayerImpl::LayerPropertyChanged() const { |
| 458 if (layer_property_changed_ || | 453 if (layer_property_changed_ || |
| 459 (layer_tree_impl()->property_trees() && | 454 (GetPropertyTrees() && GetPropertyTrees()->full_tree_damaged)) |
| 460 layer_tree_impl()->property_trees()->full_tree_damaged)) | |
| 461 return true; | 455 return true; |
| 462 if (transform_tree_index() == TransformTree::kInvalidNodeId) | 456 if (transform_tree_index() == TransformTree::kInvalidNodeId) |
| 463 return false; | 457 return false; |
| 464 TransformNode* transform_node = | 458 TransformNode* transform_node = |
| 465 layer_tree_impl()->property_trees()->transform_tree.Node( | 459 GetTransformTree().Node(transform_tree_index()); |
| 466 transform_tree_index()); | |
| 467 if (transform_node && transform_node->transform_changed) | 460 if (transform_node && transform_node->transform_changed) |
| 468 return true; | 461 return true; |
| 469 if (effect_tree_index() == EffectTree::kInvalidNodeId) | 462 if (effect_tree_index() == EffectTree::kInvalidNodeId) |
| 470 return false; | 463 return false; |
| 471 EffectNode* effect_node = | 464 EffectNode* effect_node = GetEffectTree().Node(effect_tree_index()); |
| 472 layer_tree_impl()->property_trees()->effect_tree.Node( | |
| 473 effect_tree_index()); | |
| 474 if (effect_node && effect_node->effect_changed) | 465 if (effect_node && effect_node->effect_changed) |
| 475 return true; | 466 return true; |
| 476 return false; | 467 return false; |
| 477 } | 468 } |
| 478 | 469 |
| 479 void LayerImpl::NoteLayerPropertyChanged() { | 470 void LayerImpl::NoteLayerPropertyChanged() { |
| 480 layer_property_changed_ = true; | 471 layer_property_changed_ = true; |
| 481 layer_tree_impl()->set_needs_update_draw_properties(); | 472 layer_tree_impl()->set_needs_update_draw_properties(); |
| 482 SetNeedsPushProperties(); | 473 SetNeedsPushProperties(); |
| 483 } | 474 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 500 needs_push_properties_ = false; | 491 needs_push_properties_ = false; |
| 501 | 492 |
| 502 update_rect_.SetRect(0, 0, 0, 0); | 493 update_rect_.SetRect(0, 0, 0, 0); |
| 503 damage_rect_.SetRect(0, 0, 0, 0); | 494 damage_rect_.SetRect(0, 0, 0, 0); |
| 504 | 495 |
| 505 if (render_surface_) | 496 if (render_surface_) |
| 506 render_surface_->ResetPropertyChangedFlags(); | 497 render_surface_->ResetPropertyChangedFlags(); |
| 507 } | 498 } |
| 508 | 499 |
| 509 int LayerImpl::num_copy_requests_in_target_subtree() { | 500 int LayerImpl::num_copy_requests_in_target_subtree() { |
| 510 return layer_tree_impl() | 501 return GetEffectTree() |
| 511 ->property_trees() | 502 .Node(effect_tree_index()) |
| 512 ->effect_tree.Node(effect_tree_index()) | |
| 513 ->num_copy_requests_in_subtree; | 503 ->num_copy_requests_in_subtree; |
| 514 } | 504 } |
| 515 | 505 |
| 516 void LayerImpl::UpdatePropertyTreeTransformIsAnimated(bool is_animated) { | 506 void LayerImpl::UpdatePropertyTreeTransformIsAnimated(bool is_animated) { |
| 517 PropertyTrees* property_trees = layer_tree_impl()->property_trees(); | 507 PropertyTrees* property_trees = GetPropertyTrees(); |
| 518 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 508 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 519 id())) { | 509 id())) { |
| 520 TransformNode* node = property_trees->transform_tree.Node( | 510 TransformTree& transform_tree = GetTransformTree(); |
| 521 property_trees->transform_id_to_index_map[id()]); | 511 TransformNode* node = |
| 512 transform_tree.Node(property_trees->transform_id_to_index_map[id()]); |
| 522 // A LayerImpl's own current state is insufficient for determining whether | 513 // A LayerImpl's own current state is insufficient for determining whether |
| 523 // it owns a TransformNode, since this depends on the state of the | 514 // it owns a TransformNode, since this depends on the state of the |
| 524 // corresponding Layer at the time of the last commit. For example, if | 515 // corresponding Layer at the time of the last commit. For example, if |
| 525 // |is_animated| is false, this might mean a transform animation just ticked | 516 // |is_animated| is false, this might mean a transform animation just ticked |
| 526 // past its finish point (so the LayerImpl still owns a TransformNode) or it | 517 // past its finish point (so the LayerImpl still owns a TransformNode) or it |
| 527 // might mean that a transform animation was removed during commit or | 518 // might mean that a transform animation was removed during commit or |
| 528 // activation (and, in that case, the LayerImpl will no longer own a | 519 // activation (and, in that case, the LayerImpl will no longer own a |
| 529 // TransformNode, unless it has non-animation-related reasons for owning a | 520 // TransformNode, unless it has non-animation-related reasons for owning a |
| 530 // node). | 521 // node). |
| 531 if (node->has_potential_animation != is_animated) { | 522 if (node->has_potential_animation != is_animated) { |
| 532 node->has_potential_animation = is_animated; | 523 node->has_potential_animation = is_animated; |
| 533 if (is_animated) { | 524 if (is_animated) { |
| 534 node->has_only_translation_animations = HasOnlyTranslationTransforms(); | 525 node->has_only_translation_animations = HasOnlyTranslationTransforms(); |
| 535 } else { | 526 } else { |
| 536 node->has_only_translation_animations = true; | 527 node->has_only_translation_animations = true; |
| 537 } | 528 } |
| 538 | 529 |
| 539 property_trees->transform_tree.set_needs_update(true); | 530 transform_tree.set_needs_update(true); |
| 540 layer_tree_impl()->set_needs_update_draw_properties(); | 531 layer_tree_impl()->set_needs_update_draw_properties(); |
| 541 } | 532 } |
| 542 } | 533 } |
| 543 } | 534 } |
| 544 | 535 |
| 545 void LayerImpl::UpdatePropertyTreeForScrollingAndAnimationIfNeeded() { | 536 void LayerImpl::UpdatePropertyTreeForScrollingAndAnimationIfNeeded() { |
| 546 if (scrollable()) | 537 if (scrollable()) |
| 547 UpdatePropertyTreeScrollOffset(); | 538 UpdatePropertyTreeScrollOffset(); |
| 548 | 539 |
| 549 if (HasAnyAnimationTargetingProperty(TargetProperty::TRANSFORM)) { | 540 if (HasAnyAnimationTargetingProperty(TargetProperty::TRANSFORM)) { |
| 550 UpdatePropertyTreeTransformIsAnimated( | 541 UpdatePropertyTreeTransformIsAnimated( |
| 551 HasPotentiallyRunningTransformAnimation()); | 542 HasPotentiallyRunningTransformAnimation()); |
| 552 } | 543 } |
| 553 } | 544 } |
| 554 | 545 |
| 555 gfx::ScrollOffset LayerImpl::ScrollOffsetForAnimation() const { | 546 gfx::ScrollOffset LayerImpl::ScrollOffsetForAnimation() const { |
| 556 return CurrentScrollOffset(); | 547 return CurrentScrollOffset(); |
| 557 } | 548 } |
| 558 | 549 |
| 559 void LayerImpl::OnIsAnimatingChanged(const PropertyAnimationState& mask, | 550 void LayerImpl::OnIsAnimatingChanged(const PropertyAnimationState& mask, |
| 560 const PropertyAnimationState& state) { | 551 const PropertyAnimationState& state) { |
| 561 DCHECK(layer_tree_impl_); | 552 DCHECK(layer_tree_impl_); |
| 562 PropertyTrees* property_trees = layer_tree_impl()->property_trees(); | 553 PropertyTrees* property_trees = GetPropertyTrees(); |
| 563 | 554 |
| 564 TransformNode* transform_node = nullptr; | 555 TransformNode* transform_node = nullptr; |
| 565 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 556 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 566 id())) { | 557 id())) { |
| 567 transform_node = property_trees->transform_tree.Node( | 558 transform_node = GetTransformTree().Node( |
| 568 property_trees->transform_id_to_index_map[id()]); | 559 property_trees->transform_id_to_index_map[id()]); |
| 569 } | 560 } |
| 570 | 561 |
| 571 EffectNode* effect_node = nullptr; | 562 EffectNode* effect_node = nullptr; |
| 572 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id())) { | 563 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id())) { |
| 573 effect_node = property_trees->effect_tree.Node( | 564 effect_node = |
| 574 property_trees->effect_id_to_index_map[id()]); | 565 GetEffectTree().Node(property_trees->effect_id_to_index_map[id()]); |
| 575 } | 566 } |
| 576 | 567 |
| 577 for (int property = TargetProperty::FIRST_TARGET_PROPERTY; | 568 for (int property = TargetProperty::FIRST_TARGET_PROPERTY; |
| 578 property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) { | 569 property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) { |
| 579 switch (property) { | 570 switch (property) { |
| 580 case TargetProperty::TRANSFORM: | 571 case TargetProperty::TRANSFORM: |
| 581 if (transform_node) { | 572 if (transform_node) { |
| 582 if (mask.currently_running[property]) | 573 if (mask.currently_running[property]) |
| 583 transform_node->is_currently_animating = | 574 transform_node->is_currently_animating = |
| 584 state.currently_running[property]; | 575 state.currently_running[property]; |
| 585 if (mask.potentially_animating[property]) { | 576 if (mask.potentially_animating[property]) { |
| 586 UpdatePropertyTreeTransformIsAnimated( | 577 UpdatePropertyTreeTransformIsAnimated( |
| 587 state.potentially_animating[property]); | 578 state.potentially_animating[property]); |
| 588 was_ever_ready_since_last_transform_animation_ = false; | 579 was_ever_ready_since_last_transform_animation_ = false; |
| 589 } | 580 } |
| 590 } | 581 } |
| 591 break; | 582 break; |
| 592 case TargetProperty::OPACITY: | 583 case TargetProperty::OPACITY: |
| 593 if (effect_node) { | 584 if (effect_node) { |
| 594 if (mask.currently_running[property]) | 585 if (mask.currently_running[property]) |
| 595 effect_node->is_currently_animating_opacity = | 586 effect_node->is_currently_animating_opacity = |
| 596 state.currently_running[property]; | 587 state.currently_running[property]; |
| 597 if (mask.potentially_animating[property]) { | 588 if (mask.potentially_animating[property]) { |
| 598 effect_node->has_potential_opacity_animation = | 589 effect_node->has_potential_opacity_animation = |
| 599 state.potentially_animating[property]; | 590 state.potentially_animating[property]; |
| 600 property_trees->effect_tree.set_needs_update(true); | 591 GetEffectTree().set_needs_update(true); |
| 601 } | 592 } |
| 602 } | 593 } |
| 603 break; | 594 break; |
| 604 case TargetProperty::FILTER: | 595 case TargetProperty::FILTER: |
| 605 if (effect_node) { | 596 if (effect_node) { |
| 606 if (mask.currently_running[property]) | 597 if (mask.currently_running[property]) |
| 607 effect_node->is_currently_animating_filter = | 598 effect_node->is_currently_animating_filter = |
| 608 state.currently_running[property]; | 599 state.currently_running[property]; |
| 609 if (mask.potentially_animating[property]) | 600 if (mask.potentially_animating[property]) |
| 610 effect_node->has_potential_filter_animation = | 601 effect_node->has_potential_filter_animation = |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 NoteLayerPropertyChanged(); | 634 NoteLayerPropertyChanged(); |
| 644 } | 635 } |
| 645 | 636 |
| 646 void LayerImpl::SetBoundsDelta(const gfx::Vector2dF& bounds_delta) { | 637 void LayerImpl::SetBoundsDelta(const gfx::Vector2dF& bounds_delta) { |
| 647 DCHECK(IsActive()); | 638 DCHECK(IsActive()); |
| 648 if (bounds_delta_ == bounds_delta) | 639 if (bounds_delta_ == bounds_delta) |
| 649 return; | 640 return; |
| 650 | 641 |
| 651 bounds_delta_ = bounds_delta; | 642 bounds_delta_ = bounds_delta; |
| 652 | 643 |
| 653 PropertyTrees* property_trees = layer_tree_impl()->property_trees(); | 644 PropertyTrees* property_trees = GetPropertyTrees(); |
| 654 if (this == layer_tree_impl()->InnerViewportContainerLayer()) | 645 if (this == layer_tree_impl()->InnerViewportContainerLayer()) |
| 655 property_trees->SetInnerViewportContainerBoundsDelta(bounds_delta); | 646 property_trees->SetInnerViewportContainerBoundsDelta(bounds_delta); |
| 656 else if (this == layer_tree_impl()->OuterViewportContainerLayer()) | 647 else if (this == layer_tree_impl()->OuterViewportContainerLayer()) |
| 657 property_trees->SetOuterViewportContainerBoundsDelta(bounds_delta); | 648 property_trees->SetOuterViewportContainerBoundsDelta(bounds_delta); |
| 658 else if (this == layer_tree_impl()->InnerViewportScrollLayer()) | 649 else if (this == layer_tree_impl()->InnerViewportScrollLayer()) |
| 659 property_trees->SetInnerViewportScrollBoundsDelta(bounds_delta); | 650 property_trees->SetInnerViewportScrollBoundsDelta(bounds_delta); |
| 660 | 651 |
| 661 layer_tree_impl()->DidUpdateScrollState(id()); | 652 layer_tree_impl()->DidUpdateScrollState(id()); |
| 662 | 653 |
| 663 if (masks_to_bounds()) { | 654 if (masks_to_bounds()) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 | 713 |
| 723 void LayerImpl::SetMasksToBounds(bool masks_to_bounds) { | 714 void LayerImpl::SetMasksToBounds(bool masks_to_bounds) { |
| 724 masks_to_bounds_ = masks_to_bounds; | 715 masks_to_bounds_ = masks_to_bounds; |
| 725 } | 716 } |
| 726 | 717 |
| 727 void LayerImpl::SetContentsOpaque(bool opaque) { | 718 void LayerImpl::SetContentsOpaque(bool opaque) { |
| 728 contents_opaque_ = opaque; | 719 contents_opaque_ = opaque; |
| 729 } | 720 } |
| 730 | 721 |
| 731 float LayerImpl::Opacity() const { | 722 float LayerImpl::Opacity() const { |
| 732 PropertyTrees* property_trees = layer_tree_impl()->property_trees(); | 723 PropertyTrees* property_trees = GetPropertyTrees(); |
| 733 if (!property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id())) | 724 if (!property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id())) |
| 734 return 1.f; | 725 return 1.f; |
| 735 EffectNode* node = property_trees->effect_tree.Node( | 726 EffectNode* node = |
| 736 property_trees->effect_id_to_index_map[id()]); | 727 GetEffectTree().Node(property_trees->effect_id_to_index_map[id()]); |
| 737 return node->opacity; | 728 return node->opacity; |
| 738 } | 729 } |
| 739 | 730 |
| 740 const gfx::Transform& LayerImpl::Transform() const { | 731 const gfx::Transform& LayerImpl::Transform() const { |
| 741 PropertyTrees* property_trees = layer_tree_impl()->property_trees(); | 732 PropertyTrees* property_trees = GetPropertyTrees(); |
| 742 DCHECK(property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 733 DCHECK(property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 743 id())); | 734 id())); |
| 744 TransformNode* node = property_trees->transform_tree.Node( | 735 TransformNode* node = |
| 745 property_trees->transform_id_to_index_map[id()]); | 736 GetTransformTree().Node(property_trees->transform_id_to_index_map[id()]); |
| 746 return node->local; | 737 return node->local; |
| 747 } | 738 } |
| 748 | 739 |
| 749 void LayerImpl::SetElementId(ElementId element_id) { | 740 void LayerImpl::SetElementId(ElementId element_id) { |
| 750 if (element_id == element_id_) | 741 if (element_id == element_id_) |
| 751 return; | 742 return; |
| 752 | 743 |
| 753 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), | 744 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), |
| 754 "LayerImpl::SetElementId", "element", | 745 "LayerImpl::SetElementId", "element", |
| 755 element_id.AsValue().release()); | 746 element_id.AsValue().release()); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 update_rect_ = update_rect; | 822 update_rect_ = update_rect; |
| 832 SetNeedsPushProperties(); | 823 SetNeedsPushProperties(); |
| 833 } | 824 } |
| 834 | 825 |
| 835 void LayerImpl::AddDamageRect(const gfx::Rect& damage_rect) { | 826 void LayerImpl::AddDamageRect(const gfx::Rect& damage_rect) { |
| 836 damage_rect_.Union(damage_rect); | 827 damage_rect_.Union(damage_rect); |
| 837 } | 828 } |
| 838 | 829 |
| 839 void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) { | 830 void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) { |
| 840 DCHECK(IsActive()); | 831 DCHECK(IsActive()); |
| 841 if (layer_tree_impl()->property_trees()->scroll_tree.SetScrollOffset( | 832 if (GetScrollTree().SetScrollOffset(id(), scroll_offset)) |
| 842 id(), scroll_offset)) | |
| 843 layer_tree_impl()->DidUpdateScrollOffset(id()); | 833 layer_tree_impl()->DidUpdateScrollOffset(id()); |
| 844 } | 834 } |
| 845 | 835 |
| 846 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const { | 836 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const { |
| 847 return layer_tree_impl()->property_trees()->scroll_tree.current_scroll_offset( | 837 return GetScrollTree().current_scroll_offset(id()); |
| 848 id()); | |
| 849 } | 838 } |
| 850 | 839 |
| 851 void LayerImpl::UpdatePropertyTreeScrollOffset() { | 840 void LayerImpl::UpdatePropertyTreeScrollOffset() { |
| 852 // TODO(enne): in the future, scrolling should update the scroll tree | 841 // TODO(enne): in the future, scrolling should update the scroll tree |
| 853 // directly instead of going through layers. | 842 // directly instead of going through layers. |
| 854 TransformTree& transform_tree = | 843 TransformTree& transform_tree = GetTransformTree(); |
| 855 layer_tree_impl()->property_trees()->transform_tree; | |
| 856 TransformNode* node = transform_tree.Node(transform_tree_index_); | 844 TransformNode* node = transform_tree.Node(transform_tree_index_); |
| 857 gfx::ScrollOffset current_offset = CurrentScrollOffset(); | 845 gfx::ScrollOffset current_offset = CurrentScrollOffset(); |
| 858 if (node->scroll_offset != current_offset) { | 846 if (node->scroll_offset != current_offset) { |
| 859 node->scroll_offset = current_offset; | 847 node->scroll_offset = current_offset; |
| 860 node->needs_local_transform_update = true; | 848 node->needs_local_transform_update = true; |
| 861 transform_tree.set_needs_update(true); | 849 transform_tree.set_needs_update(true); |
| 862 } | 850 } |
| 863 } | 851 } |
| 864 | 852 |
| 865 SimpleEnclosedRegion LayerImpl::VisibleOpaqueRegion() const { | 853 SimpleEnclosedRegion LayerImpl::VisibleOpaqueRegion() const { |
| 866 if (contents_opaque()) | 854 if (contents_opaque()) |
| 867 return SimpleEnclosedRegion(visible_layer_rect()); | 855 return SimpleEnclosedRegion(visible_layer_rect()); |
| 868 return SimpleEnclosedRegion(); | 856 return SimpleEnclosedRegion(); |
| 869 } | 857 } |
| 870 | 858 |
| 871 void LayerImpl::DidBeginTracing() {} | 859 void LayerImpl::DidBeginTracing() {} |
| 872 | 860 |
| 873 void LayerImpl::ReleaseResources() {} | 861 void LayerImpl::ReleaseResources() {} |
| 874 | 862 |
| 875 void LayerImpl::ReleaseTileResources() {} | 863 void LayerImpl::ReleaseTileResources() {} |
| 876 | 864 |
| 877 void LayerImpl::RecreateTileResources() {} | 865 void LayerImpl::RecreateTileResources() {} |
| 878 | 866 |
| 879 gfx::ScrollOffset LayerImpl::MaxScrollOffset() const { | 867 gfx::ScrollOffset LayerImpl::MaxScrollOffset() const { |
| 880 return layer_tree_impl()->property_trees()->scroll_tree.MaxScrollOffset( | 868 return GetScrollTree().MaxScrollOffset(scroll_tree_index()); |
| 881 scroll_tree_index()); | |
| 882 } | 869 } |
| 883 | 870 |
| 884 gfx::ScrollOffset LayerImpl::ClampScrollOffsetToLimits( | 871 gfx::ScrollOffset LayerImpl::ClampScrollOffsetToLimits( |
| 885 gfx::ScrollOffset offset) const { | 872 gfx::ScrollOffset offset) const { |
| 886 offset.SetToMin(MaxScrollOffset()); | 873 offset.SetToMin(MaxScrollOffset()); |
| 887 offset.SetToMax(gfx::ScrollOffset()); | 874 offset.SetToMax(gfx::ScrollOffset()); |
| 888 return offset; | 875 return offset; |
| 889 } | 876 } |
| 890 | 877 |
| 891 gfx::Vector2dF LayerImpl::ClampScrollToMaxScrollOffset() { | 878 gfx::Vector2dF LayerImpl::ClampScrollToMaxScrollOffset() { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1000 if (should_have_render_surface) { | 987 if (should_have_render_surface) { |
| 1001 render_surface_ = base::MakeUnique<RenderSurfaceImpl>(this); | 988 render_surface_ = base::MakeUnique<RenderSurfaceImpl>(this); |
| 1002 return; | 989 return; |
| 1003 } | 990 } |
| 1004 render_surface_.reset(); | 991 render_surface_.reset(); |
| 1005 } | 992 } |
| 1006 | 993 |
| 1007 gfx::Transform LayerImpl::DrawTransform() const { | 994 gfx::Transform LayerImpl::DrawTransform() const { |
| 1008 // Only drawn layers have up-to-date draw properties. | 995 // Only drawn layers have up-to-date draw properties. |
| 1009 if (!is_drawn_render_surface_layer_list_member()) { | 996 if (!is_drawn_render_surface_layer_list_member()) { |
| 1010 if (layer_tree_impl()->property_trees()->non_root_surfaces_enabled) { | 997 if (GetPropertyTrees()->non_root_surfaces_enabled) { |
| 1011 return draw_property_utils::DrawTransform( | 998 return draw_property_utils::DrawTransform(this, GetTransformTree(), |
| 1012 this, layer_tree_impl()->property_trees()->transform_tree, | 999 GetEffectTree()); |
| 1013 layer_tree_impl()->property_trees()->effect_tree); | |
| 1014 } else { | 1000 } else { |
| 1015 return draw_property_utils::ScreenSpaceTransform( | 1001 return draw_property_utils::ScreenSpaceTransform(this, |
| 1016 this, layer_tree_impl()->property_trees()->transform_tree); | 1002 GetTransformTree()); |
| 1017 } | 1003 } |
| 1018 } | 1004 } |
| 1019 | 1005 |
| 1020 return draw_properties().target_space_transform; | 1006 return draw_properties().target_space_transform; |
| 1021 } | 1007 } |
| 1022 | 1008 |
| 1023 gfx::Transform LayerImpl::ScreenSpaceTransform() const { | 1009 gfx::Transform LayerImpl::ScreenSpaceTransform() const { |
| 1024 // Only drawn layers have up-to-date draw properties. | 1010 // Only drawn layers have up-to-date draw properties. |
| 1025 if (!is_drawn_render_surface_layer_list_member()) { | 1011 if (!is_drawn_render_surface_layer_list_member()) { |
| 1026 return draw_property_utils::ScreenSpaceTransform( | 1012 return draw_property_utils::ScreenSpaceTransform(this, GetTransformTree()); |
| 1027 this, layer_tree_impl()->property_trees()->transform_tree); | |
| 1028 } | 1013 } |
| 1029 | 1014 |
| 1030 return draw_properties().screen_space_transform; | 1015 return draw_properties().screen_space_transform; |
| 1031 } | 1016 } |
| 1032 | 1017 |
| 1033 bool LayerImpl::CanUseLCDText() const { | 1018 bool LayerImpl::CanUseLCDText() const { |
| 1034 if (layer_tree_impl()->settings().layers_always_allowed_lcd_text) | 1019 if (layer_tree_impl()->settings().layers_always_allowed_lcd_text) |
| 1035 return true; | 1020 return true; |
| 1036 if (!layer_tree_impl()->settings().can_use_lcd_text) | 1021 if (!layer_tree_impl()->settings().can_use_lcd_text) |
| 1037 return false; | 1022 return false; |
| 1038 if (!contents_opaque()) | 1023 if (!contents_opaque()) |
| 1039 return false; | 1024 return false; |
| 1040 | 1025 |
| 1041 if (layer_tree_impl() | 1026 if (GetEffectTree().Node(effect_tree_index())->screen_space_opacity != 1.f) |
| 1042 ->property_trees() | |
| 1043 ->effect_tree.Node(effect_tree_index()) | |
| 1044 ->screen_space_opacity != 1.f) | |
| 1045 return false; | 1027 return false; |
| 1046 if (!layer_tree_impl() | 1028 if (!GetTransformTree() |
| 1047 ->property_trees() | 1029 .Node(transform_tree_index()) |
| 1048 ->transform_tree.Node(transform_tree_index()) | |
| 1049 ->node_and_ancestors_have_only_integer_translation) | 1030 ->node_and_ancestors_have_only_integer_translation) |
| 1050 return false; | 1031 return false; |
| 1051 if (static_cast<int>(offset_to_transform_parent().x()) != | 1032 if (static_cast<int>(offset_to_transform_parent().x()) != |
| 1052 offset_to_transform_parent().x()) | 1033 offset_to_transform_parent().x()) |
| 1053 return false; | 1034 return false; |
| 1054 if (static_cast<int>(offset_to_transform_parent().y()) != | 1035 if (static_cast<int>(offset_to_transform_parent().y()) != |
| 1055 offset_to_transform_parent().y()) | 1036 offset_to_transform_parent().y()) |
| 1056 return false; | 1037 return false; |
| 1057 return true; | 1038 return true; |
| 1058 } | 1039 } |
| 1059 | 1040 |
| 1060 Region LayerImpl::GetInvalidationRegionForDebugging() { | 1041 Region LayerImpl::GetInvalidationRegionForDebugging() { |
| 1061 return Region(update_rect_); | 1042 return Region(update_rect_); |
| 1062 } | 1043 } |
| 1063 | 1044 |
| 1064 gfx::Rect LayerImpl::GetEnclosingRectInTargetSpace() const { | 1045 gfx::Rect LayerImpl::GetEnclosingRectInTargetSpace() const { |
| 1065 return MathUtil::MapEnclosingClippedRect(DrawTransform(), | 1046 return MathUtil::MapEnclosingClippedRect(DrawTransform(), |
| 1066 gfx::Rect(bounds())); | 1047 gfx::Rect(bounds())); |
| 1067 } | 1048 } |
| 1068 | 1049 |
| 1069 gfx::Rect LayerImpl::GetScaledEnclosingRectInTargetSpace(float scale) const { | 1050 gfx::Rect LayerImpl::GetScaledEnclosingRectInTargetSpace(float scale) const { |
| 1070 gfx::Transform scaled_draw_transform = DrawTransform(); | 1051 gfx::Transform scaled_draw_transform = DrawTransform(); |
| 1071 scaled_draw_transform.Scale(SK_MScalar1 / scale, SK_MScalar1 / scale); | 1052 scaled_draw_transform.Scale(SK_MScalar1 / scale, SK_MScalar1 / scale); |
| 1072 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(bounds(), scale); | 1053 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(bounds(), scale); |
| 1073 return MathUtil::MapEnclosingClippedRect(scaled_draw_transform, | 1054 return MathUtil::MapEnclosingClippedRect(scaled_draw_transform, |
| 1074 gfx::Rect(scaled_bounds)); | 1055 gfx::Rect(scaled_bounds)); |
| 1075 } | 1056 } |
| 1076 | 1057 |
| 1077 RenderSurfaceImpl* LayerImpl::render_target() { | 1058 RenderSurfaceImpl* LayerImpl::render_target() { |
| 1078 EffectTree& effect_tree = layer_tree_impl_->property_trees()->effect_tree; | 1059 return GetEffectTree() |
| 1079 return effect_tree.Node(render_target_effect_tree_index())->render_surface; | 1060 .Node(render_target_effect_tree_index()) |
| 1061 ->render_surface; |
| 1080 } | 1062 } |
| 1081 | 1063 |
| 1082 const RenderSurfaceImpl* LayerImpl::render_target() const { | 1064 const RenderSurfaceImpl* LayerImpl::render_target() const { |
| 1083 const EffectTree& effect_tree = | 1065 return GetEffectTree() |
| 1084 layer_tree_impl_->property_trees()->effect_tree; | 1066 .Node(render_target_effect_tree_index()) |
| 1085 return effect_tree.Node(render_target_effect_tree_index())->render_surface; | 1067 ->render_surface; |
| 1086 } | 1068 } |
| 1087 | 1069 |
| 1088 bool LayerImpl::IsHidden() const { | 1070 bool LayerImpl::IsHidden() const { |
| 1089 EffectTree& effect_tree = layer_tree_impl_->property_trees()->effect_tree; | 1071 EffectNode* node = GetEffectTree().Node(effect_tree_index_); |
| 1090 EffectNode* node = effect_tree.Node(effect_tree_index_); | |
| 1091 return node->screen_space_opacity == 0.f; | 1072 return node->screen_space_opacity == 0.f; |
| 1092 } | 1073 } |
| 1093 | 1074 |
| 1094 float LayerImpl::GetIdealContentsScale() const { | 1075 float LayerImpl::GetIdealContentsScale() const { |
| 1095 float page_scale = IsAffectedByPageScale() | 1076 float page_scale = IsAffectedByPageScale() |
| 1096 ? layer_tree_impl()->current_page_scale_factor() | 1077 ? layer_tree_impl()->current_page_scale_factor() |
| 1097 : 1.f; | 1078 : 1.f; |
| 1098 float device_scale = layer_tree_impl()->device_scale_factor(); | 1079 float device_scale = layer_tree_impl()->device_scale_factor(); |
| 1099 | 1080 |
| 1100 float default_scale = page_scale * device_scale; | 1081 float default_scale = page_scale * device_scale; |
| 1101 if (!layer_tree_impl() | 1082 if (!layer_tree_impl() |
| 1102 ->settings() | 1083 ->settings() |
| 1103 .layer_transforms_should_scale_layer_contents) { | 1084 .layer_transforms_should_scale_layer_contents) { |
| 1104 return default_scale; | 1085 return default_scale; |
| 1105 } | 1086 } |
| 1106 | 1087 |
| 1107 gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents( | 1088 gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents( |
| 1108 ScreenSpaceTransform(), default_scale); | 1089 ScreenSpaceTransform(), default_scale); |
| 1109 return std::max(transform_scales.x(), transform_scales.y()); | 1090 return std::max(transform_scales.x(), transform_scales.y()); |
| 1110 } | 1091 } |
| 1111 | 1092 |
| 1093 PropertyTrees* LayerImpl::GetPropertyTrees() const { |
| 1094 return layer_tree_impl_->property_trees(); |
| 1095 } |
| 1096 |
| 1097 EffectTree& LayerImpl::GetEffectTree() const { |
| 1098 return GetPropertyTrees()->effect_tree; |
| 1099 } |
| 1100 |
| 1101 ScrollTree& LayerImpl::GetScrollTree() const { |
| 1102 return GetPropertyTrees()->scroll_tree; |
| 1103 } |
| 1104 |
| 1105 TransformTree& LayerImpl::GetTransformTree() const { |
| 1106 return GetPropertyTrees()->transform_tree; |
| 1107 } |
| 1108 |
| 1112 } // namespace cc | 1109 } // namespace cc |
| OLD | NEW |