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 |