| 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/draw_property_utils.h" | 5 #include "cc/trees/draw_property_utils.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 const typename LayerType::LayerListType& visible_layer_list, | 366 const typename LayerType::LayerListType& visible_layer_list, |
| 367 const ClipTree& clip_tree, | 367 const ClipTree& clip_tree, |
| 368 const TransformTree& transform_tree, | 368 const TransformTree& transform_tree, |
| 369 const EffectTree& effect_tree, | 369 const EffectTree& effect_tree, |
| 370 bool non_root_surfaces_enabled) { | 370 bool non_root_surfaces_enabled) { |
| 371 for (auto& layer : visible_layer_list) { | 371 for (auto& layer : visible_layer_list) { |
| 372 gfx::Size layer_bounds = layer->bounds(); | 372 gfx::Size layer_bounds = layer->bounds(); |
| 373 | 373 |
| 374 int effect_ancestor_with_copy_request = | 374 int effect_ancestor_with_copy_request = |
| 375 effect_tree.ClosestAncestorWithCopyRequest(layer->effect_tree_index()); | 375 effect_tree.ClosestAncestorWithCopyRequest(layer->effect_tree_index()); |
| 376 if (effect_ancestor_with_copy_request > 1) { | 376 if (effect_ancestor_with_copy_request > EffectTree::kRootNodeId) { |
| 377 // Non root copy request. | 377 // Non root copy request. |
| 378 ConditionalClip accumulated_clip_rect = ComputeAccumulatedClip( | 378 ConditionalClip accumulated_clip_rect = ComputeAccumulatedClip( |
| 379 clip_tree, layer->clip_tree_index(), effect_tree, | 379 clip_tree, layer->clip_tree_index(), effect_tree, |
| 380 effect_ancestor_with_copy_request, transform_tree); | 380 effect_ancestor_with_copy_request, transform_tree); |
| 381 if (!accumulated_clip_rect.is_clipped) { | 381 if (!accumulated_clip_rect.is_clipped) { |
| 382 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); | 382 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); |
| 383 continue; | 383 continue; |
| 384 } | 384 } |
| 385 | 385 |
| 386 gfx::RectF accumulated_clip_in_copy_request_space = | 386 gfx::RectF accumulated_clip_in_copy_request_space = |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 std::isnan(rect->right()) || std::isnan(rect->bottom())) | 714 std::isnan(rect->right()) || std::isnan(rect->bottom())) |
| 715 *rect = gfx::RectF(); | 715 *rect = gfx::RectF(); |
| 716 } | 716 } |
| 717 | 717 |
| 718 void ComputeClips(ClipTree* clip_tree, | 718 void ComputeClips(ClipTree* clip_tree, |
| 719 const TransformTree& transform_tree, | 719 const TransformTree& transform_tree, |
| 720 const EffectTree& effect_tree, | 720 const EffectTree& effect_tree, |
| 721 bool non_root_surfaces_enabled) { | 721 bool non_root_surfaces_enabled) { |
| 722 if (!clip_tree->needs_update()) | 722 if (!clip_tree->needs_update()) |
| 723 return; | 723 return; |
| 724 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { | 724 for (int i = ClipTree::kRootNodeId; i < static_cast<int>(clip_tree->size()); |
| 725 ++i) { |
| 725 ClipNode* clip_node = clip_tree->Node(i); | 726 ClipNode* clip_node = clip_tree->Node(i); |
| 726 | 727 |
| 727 if (clip_node->id == 1) { | 728 if (clip_node->id == ClipTree::kRootNodeId) { |
| 728 ResetIfHasNanCoordinate(&clip_node->clip); | 729 ResetIfHasNanCoordinate(&clip_node->clip); |
| 729 clip_node->clip_in_target_space = clip_node->clip; | 730 clip_node->clip_in_target_space = clip_node->clip; |
| 730 clip_node->combined_clip_in_target_space = clip_node->clip; | 731 clip_node->combined_clip_in_target_space = clip_node->clip; |
| 731 continue; | 732 continue; |
| 732 } | 733 } |
| 733 const TransformNode* transform_node = | 734 const TransformNode* transform_node = |
| 734 transform_tree.Node(clip_node->transform_id); | 735 transform_tree.Node(clip_node->transform_id); |
| 735 ClipNode* parent_clip_node = clip_tree->parent(clip_node); | 736 ClipNode* parent_clip_node = clip_tree->parent(clip_node); |
| 736 | 737 |
| 737 gfx::Transform parent_to_current; | 738 gfx::Transform parent_to_current; |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 870 } | 871 } |
| 871 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space); | 872 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space); |
| 872 ResetIfHasNanCoordinate(&clip_node->combined_clip_in_target_space); | 873 ResetIfHasNanCoordinate(&clip_node->combined_clip_in_target_space); |
| 873 } | 874 } |
| 874 clip_tree->set_needs_update(false); | 875 clip_tree->set_needs_update(false); |
| 875 } | 876 } |
| 876 | 877 |
| 877 void ComputeTransforms(TransformTree* transform_tree) { | 878 void ComputeTransforms(TransformTree* transform_tree) { |
| 878 if (!transform_tree->needs_update()) | 879 if (!transform_tree->needs_update()) |
| 879 return; | 880 return; |
| 880 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i) | 881 for (int i = TransformTree::kRootNodeId; |
| 882 i < static_cast<int>(transform_tree->size()); ++i) |
| 881 transform_tree->UpdateTransforms(i); | 883 transform_tree->UpdateTransforms(i); |
| 882 transform_tree->set_needs_update(false); | 884 transform_tree->set_needs_update(false); |
| 883 } | 885 } |
| 884 | 886 |
| 885 void UpdateRenderTarget(EffectTree* effect_tree, | 887 void UpdateRenderTarget(EffectTree* effect_tree, |
| 886 bool can_render_to_separate_surface) { | 888 bool can_render_to_separate_surface) { |
| 887 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) { | 889 for (int i = EffectTree::kRootNodeId; |
| 890 i < static_cast<int>(effect_tree->size()); ++i) { |
| 888 EffectNode* node = effect_tree->Node(i); | 891 EffectNode* node = effect_tree->Node(i); |
| 889 if (i == 1) { | 892 if (i == EffectTree::kRootNodeId) { |
| 890 // Render target on the first effect node is root. | 893 // Render target on the first effect node is root. |
| 891 node->target_id = 0; | 894 node->target_id = EffectTree::kRootNodeId; |
| 892 } else if (!can_render_to_separate_surface) { | 895 } else if (!can_render_to_separate_surface) { |
| 893 node->target_id = 1; | 896 node->target_id = EffectTree::kRootNodeId; |
| 894 } else if (effect_tree->parent(node)->has_render_surface) { | 897 } else if (effect_tree->parent(node)->has_render_surface) { |
| 895 node->target_id = node->parent_id; | 898 node->target_id = node->parent_id; |
| 896 } else { | 899 } else { |
| 897 node->target_id = effect_tree->parent(node)->target_id; | 900 node->target_id = effect_tree->parent(node)->target_id; |
| 898 } | 901 } |
| 899 } | 902 } |
| 900 } | 903 } |
| 901 | 904 |
| 902 void ComputeEffects(EffectTree* effect_tree) { | 905 void ComputeEffects(EffectTree* effect_tree) { |
| 903 if (!effect_tree->needs_update()) | 906 if (!effect_tree->needs_update()) |
| 904 return; | 907 return; |
| 905 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) | 908 for (int i = EffectTree::kRootNodeId; |
| 909 i < static_cast<int>(effect_tree->size()); ++i) |
| 906 effect_tree->UpdateEffects(i); | 910 effect_tree->UpdateEffects(i); |
| 907 effect_tree->set_needs_update(false); | 911 effect_tree->set_needs_update(false); |
| 908 } | 912 } |
| 909 | 913 |
| 910 static void ComputeClipsWithEffectTree(PropertyTrees* property_trees) { | 914 static void ComputeClipsWithEffectTree(PropertyTrees* property_trees) { |
| 911 EffectTree* effect_tree = &property_trees->effect_tree; | 915 EffectTree* effect_tree = &property_trees->effect_tree; |
| 912 const ClipTree* clip_tree = &property_trees->clip_tree; | 916 const ClipTree* clip_tree = &property_trees->clip_tree; |
| 913 const TransformTree* transform_tree = &property_trees->transform_tree; | 917 const TransformTree* transform_tree = &property_trees->transform_tree; |
| 914 EffectNode* root_effect_node = effect_tree->Node(1); | 918 EffectNode* root_effect_node = effect_tree->Node(EffectTree::kRootNodeId); |
| 915 const RenderSurfaceImpl* root_render_surface = | 919 const RenderSurfaceImpl* root_render_surface = |
| 916 root_effect_node->render_surface; | 920 root_effect_node->render_surface; |
| 917 gfx::Rect root_clip = | 921 gfx::Rect root_clip = |
| 918 gfx::ToEnclosingRect(clip_tree->Node(root_effect_node->clip_id)->clip); | 922 gfx::ToEnclosingRect(clip_tree->Node(root_effect_node->clip_id)->clip); |
| 919 if (root_render_surface->is_clipped()) | 923 if (root_render_surface->is_clipped()) |
| 920 DCHECK(root_clip == root_render_surface->clip_rect()) | 924 DCHECK(root_clip == root_render_surface->clip_rect()) |
| 921 << "clip on root render surface: " | 925 << "clip on root render surface: " |
| 922 << root_render_surface->clip_rect().ToString() | 926 << root_render_surface->clip_rect().ToString() |
| 923 << " v.s. root effect node's clip: " << root_clip.ToString(); | 927 << " v.s. root effect node's clip: " << root_clip.ToString(); |
| 924 for (int i = 2; i < static_cast<int>(effect_tree->size()); ++i) { | 928 for (int i = 2; i < static_cast<int>(effect_tree->size()); ++i) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 946 const ClipTree* clip_tree = &property_trees->clip_tree; | 950 const ClipTree* clip_tree = &property_trees->clip_tree; |
| 947 const TransformTree* transform_tree = &property_trees->transform_tree; | 951 const TransformTree* transform_tree = &property_trees->transform_tree; |
| 948 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index()); | 952 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index()); |
| 949 const EffectNode* target_node = | 953 const EffectNode* target_node = |
| 950 effect_node->has_render_surface | 954 effect_node->has_render_surface |
| 951 ? effect_node | 955 ? effect_node |
| 952 : effect_tree->Node(effect_node->target_id); | 956 : effect_tree->Node(effect_node->target_id); |
| 953 // TODO(weiliangc): When effect node has up to date render surface info on | 957 // TODO(weiliangc): When effect node has up to date render surface info on |
| 954 // compositor thread, no need to check for resourceless draw mode | 958 // compositor thread, no need to check for resourceless draw mode |
| 955 if (!property_trees->non_root_surfaces_enabled) { | 959 if (!property_trees->non_root_surfaces_enabled) { |
| 956 target_node = effect_tree->Node(1); | 960 target_node = effect_tree->Node(EffectTree::kRootNodeId); |
| 957 } | 961 } |
| 958 | 962 |
| 959 ConditionalClip accumulated_clip_rect = | 963 ConditionalClip accumulated_clip_rect = |
| 960 ComputeAccumulatedClip(*clip_tree, layer->clip_tree_index(), *effect_tree, | 964 ComputeAccumulatedClip(*clip_tree, layer->clip_tree_index(), *effect_tree, |
| 961 target_node->id, *transform_tree); | 965 target_node->id, *transform_tree); |
| 962 | 966 |
| 963 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect; | 967 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect; |
| 964 | 968 |
| 965 if ((!property_trees->non_root_surfaces_enabled && | 969 if ((!property_trees->non_root_surfaces_enabled && |
| 966 clip_tree->Node(layer->clip_tree_index()) | 970 clip_tree->Node(layer->clip_tree_index()) |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1175 } | 1179 } |
| 1176 | 1180 |
| 1177 static void SetSurfaceDrawTransform(const TransformTree& transform_tree, | 1181 static void SetSurfaceDrawTransform(const TransformTree& transform_tree, |
| 1178 const EffectTree& effect_tree, | 1182 const EffectTree& effect_tree, |
| 1179 RenderSurfaceImpl* render_surface) { | 1183 RenderSurfaceImpl* render_surface) { |
| 1180 const TransformNode* transform_node = | 1184 const TransformNode* transform_node = |
| 1181 transform_tree.Node(render_surface->TransformTreeIndex()); | 1185 transform_tree.Node(render_surface->TransformTreeIndex()); |
| 1182 const EffectNode* effect_node = | 1186 const EffectNode* effect_node = |
| 1183 effect_tree.Node(render_surface->EffectTreeIndex()); | 1187 effect_tree.Node(render_surface->EffectTreeIndex()); |
| 1184 // The draw transform of root render surface is identity tranform. | 1188 // The draw transform of root render surface is identity tranform. |
| 1185 if (transform_node->id == 1) { | 1189 if (transform_node->id == TransformTree::kRootNodeId) { |
| 1186 render_surface->SetDrawTransform(gfx::Transform()); | 1190 render_surface->SetDrawTransform(gfx::Transform()); |
| 1187 return; | 1191 return; |
| 1188 } | 1192 } |
| 1189 | 1193 |
| 1190 gfx::Transform render_surface_transform; | 1194 gfx::Transform render_surface_transform; |
| 1191 const TransformNode* target_transform_node = | 1195 const TransformNode* target_transform_node = |
| 1192 transform_tree.Node(transform_tree.TargetId(transform_node->id)); | 1196 transform_tree.Node(transform_tree.TargetId(transform_node->id)); |
| 1193 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id, | 1197 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id, |
| 1194 &render_surface_transform); | 1198 &render_surface_transform); |
| 1195 // We don't have to apply sublayer scale when target is root. | 1199 // We don't have to apply sublayer scale when target is root. |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1527 void UpdateElasticOverscroll(PropertyTrees* property_trees, | 1531 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
| 1528 const Layer* overscroll_elasticity_layer, | 1532 const Layer* overscroll_elasticity_layer, |
| 1529 const gfx::Vector2dF& elastic_overscroll) { | 1533 const gfx::Vector2dF& elastic_overscroll) { |
| 1530 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1534 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
| 1531 elastic_overscroll); | 1535 elastic_overscroll); |
| 1532 } | 1536 } |
| 1533 | 1537 |
| 1534 } // namespace draw_property_utils | 1538 } // namespace draw_property_utils |
| 1535 | 1539 |
| 1536 } // namespace cc | 1540 } // namespace cc |
| OLD | NEW |