OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/layer_tree_impl.h" | 5 #include "cc/trees/layer_tree_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 15 matching lines...) Expand all Loading... |
26 #include "cc/input/scrollbar_animation_controller.h" | 26 #include "cc/input/scrollbar_animation_controller.h" |
27 #include "cc/input/scrollbar_animation_controller_linear_fade.h" | 27 #include "cc/input/scrollbar_animation_controller_linear_fade.h" |
28 #include "cc/input/scrollbar_animation_controller_thinning.h" | 28 #include "cc/input/scrollbar_animation_controller_thinning.h" |
29 #include "cc/layers/heads_up_display_layer_impl.h" | 29 #include "cc/layers/heads_up_display_layer_impl.h" |
30 #include "cc/layers/layer.h" | 30 #include "cc/layers/layer.h" |
31 #include "cc/layers/layer_iterator.h" | 31 #include "cc/layers/layer_iterator.h" |
32 #include "cc/layers/layer_list_iterator.h" | 32 #include "cc/layers/layer_list_iterator.h" |
33 #include "cc/layers/render_surface_impl.h" | 33 #include "cc/layers/render_surface_impl.h" |
34 #include "cc/layers/scrollbar_layer_impl_base.h" | 34 #include "cc/layers/scrollbar_layer_impl_base.h" |
35 #include "cc/resources/ui_resource_request.h" | 35 #include "cc/resources/ui_resource_request.h" |
| 36 #include "cc/trees/clip_node.h" |
36 #include "cc/trees/draw_property_utils.h" | 37 #include "cc/trees/draw_property_utils.h" |
| 38 #include "cc/trees/effect_node.h" |
37 #include "cc/trees/layer_tree_host_common.h" | 39 #include "cc/trees/layer_tree_host_common.h" |
38 #include "cc/trees/layer_tree_host_impl.h" | 40 #include "cc/trees/layer_tree_host_impl.h" |
39 #include "cc/trees/occlusion_tracker.h" | 41 #include "cc/trees/occlusion_tracker.h" |
40 #include "cc/trees/property_tree.h" | 42 #include "cc/trees/property_tree.h" |
41 #include "cc/trees/property_tree_builder.h" | 43 #include "cc/trees/property_tree_builder.h" |
| 44 #include "cc/trees/scroll_node.h" |
| 45 #include "cc/trees/transform_node.h" |
42 #include "ui/gfx/geometry/box_f.h" | 46 #include "ui/gfx/geometry/box_f.h" |
43 #include "ui/gfx/geometry/point_conversions.h" | 47 #include "ui/gfx/geometry/point_conversions.h" |
44 #include "ui/gfx/geometry/rect_conversions.h" | 48 #include "ui/gfx/geometry/rect_conversions.h" |
45 #include "ui/gfx/geometry/size_conversions.h" | 49 #include "ui/gfx/geometry/size_conversions.h" |
46 #include "ui/gfx/geometry/vector2d_conversions.h" | 50 #include "ui/gfx/geometry/vector2d_conversions.h" |
47 | 51 |
48 namespace cc { | 52 namespace cc { |
49 | 53 |
50 LayerTreeImpl::LayerTreeImpl( | 54 LayerTreeImpl::LayerTreeImpl( |
51 LayerTreeHostImpl* layer_tree_host_impl, | 55 LayerTreeHostImpl* layer_tree_host_impl, |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 // corresponding pending layer. | 144 // corresponding pending layer. |
141 if (LayerById(layer_id)) { | 145 if (LayerById(layer_id)) { |
142 transform_id = LayerById(layer_id)->transform_tree_index(); | 146 transform_id = LayerById(layer_id)->transform_tree_index(); |
143 } else { | 147 } else { |
144 DCHECK(!IsActiveTree()); | 148 DCHECK(!IsActiveTree()); |
145 return; | 149 return; |
146 } | 150 } |
147 | 151 |
148 if (transform_id != -1) { | 152 if (transform_id != -1) { |
149 TransformNode* node = transform_tree.Node(transform_id); | 153 TransformNode* node = transform_tree.Node(transform_id); |
150 if (node->data.scroll_offset != | 154 if (node->scroll_offset != scroll_tree.current_scroll_offset(layer_id)) { |
151 scroll_tree.current_scroll_offset(layer_id)) { | 155 node->scroll_offset = scroll_tree.current_scroll_offset(layer_id); |
152 node->data.scroll_offset = scroll_tree.current_scroll_offset(layer_id); | 156 node->needs_local_transform_update = true; |
153 node->data.needs_local_transform_update = true; | |
154 transform_tree.set_needs_update(true); | 157 transform_tree.set_needs_update(true); |
155 } | 158 } |
156 node->data.transform_changed = true; | 159 node->transform_changed = true; |
157 property_trees()->changed = true; | 160 property_trees()->changed = true; |
158 set_needs_update_draw_properties(); | 161 set_needs_update_draw_properties(); |
159 } | 162 } |
160 | 163 |
161 if (IsActiveTree() && layer_tree_host_impl_->pending_tree()) | 164 if (IsActiveTree() && layer_tree_host_impl_->pending_tree()) |
162 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id, | 165 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id, |
163 transform_id); | 166 transform_id); |
164 } | 167 } |
165 | 168 |
166 void LayerTreeImpl::DidUpdateScrollState(int layer_id) { | 169 void LayerTreeImpl::DidUpdateScrollState(int layer_id) { |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 return ret; | 346 return ret; |
344 } | 347 } |
345 | 348 |
346 static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer, | 349 static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer, |
347 ClipTree* clip_tree) { | 350 ClipTree* clip_tree) { |
348 if (layer && layer->masks_to_bounds()) { | 351 if (layer && layer->masks_to_bounds()) { |
349 ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index()); | 352 ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index()); |
350 if (clip_node) { | 353 if (clip_node) { |
351 DCHECK_EQ(layer->id(), clip_node->owner_id); | 354 DCHECK_EQ(layer->id(), clip_node->owner_id); |
352 gfx::SizeF bounds = gfx::SizeF(layer->bounds()); | 355 gfx::SizeF bounds = gfx::SizeF(layer->bounds()); |
353 if (clip_node->data.clip.size() != bounds) { | 356 if (clip_node->clip.size() != bounds) { |
354 clip_node->data.clip.set_size(bounds); | 357 clip_node->clip.set_size(bounds); |
355 clip_tree->set_needs_update(true); | 358 clip_tree->set_needs_update(true); |
356 } | 359 } |
357 } | 360 } |
358 } | 361 } |
359 } | 362 } |
360 | 363 |
361 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { | 364 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { |
362 property_trees_ = *property_trees; | 365 property_trees_ = *property_trees; |
363 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); | 366 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); |
364 property_trees_.is_main_thread = false; | 367 property_trees_.is_main_thread = false; |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 // updates from scrolling deltas on the compositor thread that have occurred | 608 // updates from scrolling deltas on the compositor thread that have occurred |
606 // after begin frame and updates from animations that have ticked since begin | 609 // after begin frame and updates from animations that have ticked since begin |
607 // frame to a newly-committed property tree. | 610 // frame to a newly-committed property tree. |
608 if (layer_list_.empty()) | 611 if (layer_list_.empty()) |
609 return; | 612 return; |
610 for (auto& layer_id_to_opacity : opacity_animations_map_) { | 613 for (auto& layer_id_to_opacity : opacity_animations_map_) { |
611 const int id = layer_id_to_opacity.first; | 614 const int id = layer_id_to_opacity.first; |
612 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id)) { | 615 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id)) { |
613 EffectNode* node = property_trees_.effect_tree.Node( | 616 EffectNode* node = property_trees_.effect_tree.Node( |
614 property_trees_.effect_id_to_index_map[id]); | 617 property_trees_.effect_id_to_index_map[id]); |
615 if (!node->data.is_currently_animating_opacity || | 618 if (!node->is_currently_animating_opacity || |
616 node->data.opacity == layer_id_to_opacity.second) | 619 node->opacity == layer_id_to_opacity.second) |
617 continue; | 620 continue; |
618 node->data.opacity = layer_id_to_opacity.second; | 621 node->opacity = layer_id_to_opacity.second; |
619 property_trees_.effect_tree.set_needs_update(true); | 622 property_trees_.effect_tree.set_needs_update(true); |
620 } | 623 } |
621 } | 624 } |
622 opacity_animations_map_.clear(); | 625 opacity_animations_map_.clear(); |
623 | 626 |
624 for (auto& layer_id_to_transform : transform_animations_map_) { | 627 for (auto& layer_id_to_transform : transform_animations_map_) { |
625 const int id = layer_id_to_transform.first; | 628 const int id = layer_id_to_transform.first; |
626 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 629 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
627 id)) { | 630 id)) { |
628 TransformNode* node = property_trees_.transform_tree.Node( | 631 TransformNode* node = property_trees_.transform_tree.Node( |
629 property_trees_.transform_id_to_index_map[id]); | 632 property_trees_.transform_id_to_index_map[id]); |
630 if (!node->data.is_currently_animating || | 633 if (!node->is_currently_animating || |
631 node->data.local == layer_id_to_transform.second) | 634 node->local == layer_id_to_transform.second) |
632 continue; | 635 continue; |
633 node->data.local = layer_id_to_transform.second; | 636 node->local = layer_id_to_transform.second; |
634 node->data.needs_local_transform_update = true; | 637 node->needs_local_transform_update = true; |
635 property_trees_.transform_tree.set_needs_update(true); | 638 property_trees_.transform_tree.set_needs_update(true); |
636 } | 639 } |
637 } | 640 } |
638 transform_animations_map_.clear(); | 641 transform_animations_map_.clear(); |
639 | 642 |
640 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { | 643 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { |
641 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); | 644 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); |
642 }); | 645 }); |
643 } | 646 } |
644 | 647 |
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1646 // We need to visit all ancestor clip nodes to check this. Checking with just | 1649 // We need to visit all ancestor clip nodes to check this. Checking with just |
1647 // the combined clip stored at a clip node is not enough because parent | 1650 // the combined clip stored at a clip node is not enough because parent |
1648 // combined clip can sometimes be smaller than current combined clip. This can | 1651 // combined clip can sometimes be smaller than current combined clip. This can |
1649 // happen when we have transforms like rotation that inflate the combined | 1652 // happen when we have transforms like rotation that inflate the combined |
1650 // clip's bounds. Also, the point can be clipped by the content rect of an | 1653 // clip's bounds. Also, the point can be clipped by the content rect of an |
1651 // ancestor render surface. | 1654 // ancestor render surface. |
1652 | 1655 |
1653 // We first check if the point is clipped by viewport. | 1656 // We first check if the point is clipped by viewport. |
1654 const ClipNode* clip_node = clip_tree.Node(1); | 1657 const ClipNode* clip_node = clip_tree.Node(1); |
1655 gfx::Rect combined_clip_in_target_space = | 1658 gfx::Rect combined_clip_in_target_space = |
1656 gfx::ToEnclosingRect(clip_node->data.combined_clip_in_target_space); | 1659 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space); |
1657 if (!PointHitsRect(screen_space_point, gfx::Transform(), | 1660 if (!PointHitsRect(screen_space_point, gfx::Transform(), |
1658 combined_clip_in_target_space, NULL)) | 1661 combined_clip_in_target_space, NULL)) |
1659 return true; | 1662 return true; |
1660 | 1663 |
1661 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); | 1664 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); |
1662 clip_node->id > 1; clip_node = clip_tree.parent(clip_node)) { | 1665 clip_node->id > 1; clip_node = clip_tree.parent(clip_node)) { |
1663 if (clip_node->data.applies_local_clip) { | 1666 if (clip_node->applies_local_clip) { |
1664 const TransformNode* transform_node = | 1667 const TransformNode* transform_node = |
1665 transform_tree.Node(clip_node->data.target_id); | 1668 transform_tree.Node(clip_node->target_id); |
1666 gfx::Rect combined_clip_in_target_space = | 1669 gfx::Rect combined_clip_in_target_space = |
1667 gfx::ToEnclosingRect(clip_node->data.combined_clip_in_target_space); | 1670 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space); |
1668 | 1671 |
1669 const LayerImpl* target_layer = | 1672 const LayerImpl* target_layer = |
1670 layer->layer_tree_impl()->LayerById(transform_node->owner_id); | 1673 layer->layer_tree_impl()->LayerById(transform_node->owner_id); |
1671 DCHECK(transform_node->id == 0 || target_layer->render_surface() || | 1674 DCHECK(transform_node->id == 0 || target_layer->render_surface() || |
1672 layer->layer_tree_impl()->is_in_resourceless_software_draw_mode()); | 1675 layer->layer_tree_impl()->is_in_resourceless_software_draw_mode()); |
1673 gfx::Transform surface_screen_space_transform = | 1676 gfx::Transform surface_screen_space_transform = |
1674 transform_node->id == 0 || | 1677 transform_node->id == 0 || |
1675 (layer->layer_tree_impl() | 1678 (layer->layer_tree_impl() |
1676 ->is_in_resourceless_software_draw_mode()) | 1679 ->is_in_resourceless_software_draw_mode()) |
1677 ? gfx::Transform() | 1680 ? gfx::Transform() |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2098 | 2101 |
2099 void LayerTreeImpl::ResetAllChangeTracking() { | 2102 void LayerTreeImpl::ResetAllChangeTracking() { |
2100 layers_that_should_push_properties_.clear(); | 2103 layers_that_should_push_properties_.clear(); |
2101 // Iterate over all layers, including masks and replicas. | 2104 // Iterate over all layers, including masks and replicas. |
2102 for (auto& layer : *layers_) | 2105 for (auto& layer : *layers_) |
2103 layer->ResetChangeTracking(); | 2106 layer->ResetChangeTracking(); |
2104 property_trees_.ResetAllChangeTracking(); | 2107 property_trees_.ResetAllChangeTracking(); |
2105 } | 2108 } |
2106 | 2109 |
2107 } // namespace cc | 2110 } // namespace cc |
OLD | NEW |