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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 // corresponding pending layer. | 155 // corresponding pending layer. |
152 if (LayerById(layer_id)) { | 156 if (LayerById(layer_id)) { |
153 transform_id = LayerById(layer_id)->transform_tree_index(); | 157 transform_id = LayerById(layer_id)->transform_tree_index(); |
154 } else { | 158 } else { |
155 DCHECK(!IsActiveTree()); | 159 DCHECK(!IsActiveTree()); |
156 return; | 160 return; |
157 } | 161 } |
158 | 162 |
159 if (transform_id != -1) { | 163 if (transform_id != -1) { |
160 TransformNode* node = transform_tree.Node(transform_id); | 164 TransformNode* node = transform_tree.Node(transform_id); |
161 if (node->data.scroll_offset != | 165 if (node->scroll_offset != scroll_tree.current_scroll_offset(layer_id)) { |
162 scroll_tree.current_scroll_offset(layer_id)) { | 166 node->scroll_offset = scroll_tree.current_scroll_offset(layer_id); |
163 node->data.scroll_offset = scroll_tree.current_scroll_offset(layer_id); | 167 node->needs_local_transform_update = true; |
164 node->data.needs_local_transform_update = true; | |
165 transform_tree.set_needs_update(true); | 168 transform_tree.set_needs_update(true); |
166 } | 169 } |
167 node->data.transform_changed = true; | 170 node->transform_changed = true; |
168 property_trees()->changed = true; | 171 property_trees()->changed = true; |
169 set_needs_update_draw_properties(); | 172 set_needs_update_draw_properties(); |
170 } | 173 } |
171 | 174 |
172 if (IsActiveTree() && layer_tree_host_impl_->pending_tree()) | 175 if (IsActiveTree() && layer_tree_host_impl_->pending_tree()) |
173 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id, | 176 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id, |
174 transform_id); | 177 transform_id); |
175 } | 178 } |
176 | 179 |
177 void LayerTreeImpl::DidUpdateScrollState(int layer_id) { | 180 void LayerTreeImpl::DidUpdateScrollState(int layer_id) { |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 return ret; | 353 return ret; |
351 } | 354 } |
352 | 355 |
353 static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer, | 356 static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer, |
354 ClipTree* clip_tree) { | 357 ClipTree* clip_tree) { |
355 if (layer && layer->masks_to_bounds()) { | 358 if (layer && layer->masks_to_bounds()) { |
356 ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index()); | 359 ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index()); |
357 if (clip_node) { | 360 if (clip_node) { |
358 DCHECK_EQ(layer->id(), clip_node->owner_id); | 361 DCHECK_EQ(layer->id(), clip_node->owner_id); |
359 gfx::SizeF bounds = gfx::SizeF(layer->bounds()); | 362 gfx::SizeF bounds = gfx::SizeF(layer->bounds()); |
360 if (clip_node->data.clip.size() != bounds) { | 363 if (clip_node->clip.size() != bounds) { |
361 clip_node->data.clip.set_size(bounds); | 364 clip_node->clip.set_size(bounds); |
362 clip_tree->set_needs_update(true); | 365 clip_tree->set_needs_update(true); |
363 } | 366 } |
364 } | 367 } |
365 } | 368 } |
366 } | 369 } |
367 | 370 |
368 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { | 371 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { |
369 property_trees_ = *property_trees; | 372 property_trees_ = *property_trees; |
370 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); | 373 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); |
371 property_trees_.is_main_thread = false; | 374 property_trees_.is_main_thread = false; |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 // updates from scrolling deltas on the compositor thread that have occurred | 615 // updates from scrolling deltas on the compositor thread that have occurred |
613 // after begin frame and updates from animations that have ticked since begin | 616 // after begin frame and updates from animations that have ticked since begin |
614 // frame to a newly-committed property tree. | 617 // frame to a newly-committed property tree. |
615 if (layer_list_.empty()) | 618 if (layer_list_.empty()) |
616 return; | 619 return; |
617 for (auto& layer_id_to_opacity : opacity_animations_map_) { | 620 for (auto& layer_id_to_opacity : opacity_animations_map_) { |
618 const int id = layer_id_to_opacity.first; | 621 const int id = layer_id_to_opacity.first; |
619 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id)) { | 622 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id)) { |
620 EffectNode* node = property_trees_.effect_tree.Node( | 623 EffectNode* node = property_trees_.effect_tree.Node( |
621 property_trees_.effect_id_to_index_map[id]); | 624 property_trees_.effect_id_to_index_map[id]); |
622 if (!node->data.is_currently_animating_opacity || | 625 if (!node->is_currently_animating_opacity || |
623 node->data.opacity == layer_id_to_opacity.second) | 626 node->opacity == layer_id_to_opacity.second) |
624 continue; | 627 continue; |
625 node->data.opacity = layer_id_to_opacity.second; | 628 node->opacity = layer_id_to_opacity.second; |
626 property_trees_.effect_tree.set_needs_update(true); | 629 property_trees_.effect_tree.set_needs_update(true); |
627 } | 630 } |
628 } | 631 } |
629 opacity_animations_map_.clear(); | 632 opacity_animations_map_.clear(); |
630 | 633 |
631 for (auto& layer_id_to_transform : transform_animations_map_) { | 634 for (auto& layer_id_to_transform : transform_animations_map_) { |
632 const int id = layer_id_to_transform.first; | 635 const int id = layer_id_to_transform.first; |
633 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 636 if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
634 id)) { | 637 id)) { |
635 TransformNode* node = property_trees_.transform_tree.Node( | 638 TransformNode* node = property_trees_.transform_tree.Node( |
636 property_trees_.transform_id_to_index_map[id]); | 639 property_trees_.transform_id_to_index_map[id]); |
637 if (!node->data.is_currently_animating || | 640 if (!node->is_currently_animating || |
638 node->data.local == layer_id_to_transform.second) | 641 node->local == layer_id_to_transform.second) |
639 continue; | 642 continue; |
640 node->data.local = layer_id_to_transform.second; | 643 node->local = layer_id_to_transform.second; |
641 node->data.needs_local_transform_update = true; | 644 node->needs_local_transform_update = true; |
642 property_trees_.transform_tree.set_needs_update(true); | 645 property_trees_.transform_tree.set_needs_update(true); |
643 } | 646 } |
644 } | 647 } |
645 transform_animations_map_.clear(); | 648 transform_animations_map_.clear(); |
646 | 649 |
647 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { | 650 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { |
648 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); | 651 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); |
649 }); | 652 }); |
650 } | 653 } |
651 | 654 |
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1653 // We need to visit all ancestor clip nodes to check this. Checking with just | 1656 // We need to visit all ancestor clip nodes to check this. Checking with just |
1654 // the combined clip stored at a clip node is not enough because parent | 1657 // the combined clip stored at a clip node is not enough because parent |
1655 // combined clip can sometimes be smaller than current combined clip. This can | 1658 // combined clip can sometimes be smaller than current combined clip. This can |
1656 // happen when we have transforms like rotation that inflate the combined | 1659 // happen when we have transforms like rotation that inflate the combined |
1657 // clip's bounds. Also, the point can be clipped by the content rect of an | 1660 // clip's bounds. Also, the point can be clipped by the content rect of an |
1658 // ancestor render surface. | 1661 // ancestor render surface. |
1659 | 1662 |
1660 // We first check if the point is clipped by viewport. | 1663 // We first check if the point is clipped by viewport. |
1661 const ClipNode* clip_node = clip_tree.Node(1); | 1664 const ClipNode* clip_node = clip_tree.Node(1); |
1662 gfx::Rect combined_clip_in_target_space = | 1665 gfx::Rect combined_clip_in_target_space = |
1663 gfx::ToEnclosingRect(clip_node->data.combined_clip_in_target_space); | 1666 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space); |
1664 if (!PointHitsRect(screen_space_point, gfx::Transform(), | 1667 if (!PointHitsRect(screen_space_point, gfx::Transform(), |
1665 combined_clip_in_target_space, NULL)) | 1668 combined_clip_in_target_space, NULL)) |
1666 return true; | 1669 return true; |
1667 | 1670 |
1668 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); | 1671 for (const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); |
1669 clip_node->id > 1; clip_node = clip_tree.parent(clip_node)) { | 1672 clip_node->id > 1; clip_node = clip_tree.parent(clip_node)) { |
1670 if (clip_node->data.applies_local_clip) { | 1673 if (clip_node->applies_local_clip) { |
1671 const TransformNode* transform_node = | 1674 const TransformNode* transform_node = |
1672 transform_tree.Node(clip_node->data.target_id); | 1675 transform_tree.Node(clip_node->target_id); |
1673 gfx::Rect combined_clip_in_target_space = | 1676 gfx::Rect combined_clip_in_target_space = |
1674 gfx::ToEnclosingRect(clip_node->data.combined_clip_in_target_space); | 1677 gfx::ToEnclosingRect(clip_node->combined_clip_in_target_space); |
1675 | 1678 |
1676 const LayerImpl* target_layer = | 1679 const LayerImpl* target_layer = |
1677 layer->layer_tree_impl()->LayerById(transform_node->owner_id); | 1680 layer->layer_tree_impl()->LayerById(transform_node->owner_id); |
1678 DCHECK(transform_node->id == 0 || target_layer->render_surface() || | 1681 DCHECK(transform_node->id == 0 || target_layer->render_surface() || |
1679 layer->layer_tree_impl()->is_in_resourceless_software_draw_mode()); | 1682 layer->layer_tree_impl()->is_in_resourceless_software_draw_mode()); |
1680 gfx::Transform surface_screen_space_transform = | 1683 gfx::Transform surface_screen_space_transform = |
1681 transform_node->id == 0 || | 1684 transform_node->id == 0 || |
1682 (layer->layer_tree_impl() | 1685 (layer->layer_tree_impl() |
1683 ->is_in_resourceless_software_draw_mode()) | 1686 ->is_in_resourceless_software_draw_mode()) |
1684 ? gfx::Transform() | 1687 ? gfx::Transform() |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2105 | 2108 |
2106 void LayerTreeImpl::ResetAllChangeTracking() { | 2109 void LayerTreeImpl::ResetAllChangeTracking() { |
2107 layers_that_should_push_properties_.clear(); | 2110 layers_that_should_push_properties_.clear(); |
2108 // Iterate over all layers, including masks and replicas. | 2111 // Iterate over all layers, including masks and replicas. |
2109 for (auto& layer : *layers_) | 2112 for (auto& layer : *layers_) |
2110 layer->ResetChangeTracking(); | 2113 layer->ResetChangeTracking(); |
2111 property_trees_.ResetAllChangeTracking(); | 2114 property_trees_.ResetAllChangeTracking(); |
2112 } | 2115 } |
2113 | 2116 |
2114 } // namespace cc | 2117 } // namespace cc |
OLD | NEW |