Chromium Code Reviews| 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 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 501 if (std::isnan(rect->x()) || std::isnan(rect->y()) || | 501 if (std::isnan(rect->x()) || std::isnan(rect->y()) || |
| 502 std::isnan(rect->right()) || std::isnan(rect->bottom())) | 502 std::isnan(rect->right()) || std::isnan(rect->bottom())) |
| 503 *rect = gfx::RectF(); | 503 *rect = gfx::RectF(); |
| 504 } | 504 } |
| 505 | 505 |
| 506 void ComputeClips(ClipTree* clip_tree, | 506 void ComputeClips(ClipTree* clip_tree, |
| 507 const TransformTree& transform_tree, | 507 const TransformTree& transform_tree, |
| 508 bool non_root_surfaces_enabled) { | 508 bool non_root_surfaces_enabled) { |
| 509 if (!clip_tree->needs_update()) | 509 if (!clip_tree->needs_update()) |
| 510 return; | 510 return; |
| 511 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { | 511 for (int i = ClipTree::kRootNodeId; i < static_cast<int>(clip_tree->size()); |
| 512 ++i) { | |
| 512 ClipNode* clip_node = clip_tree->Node(i); | 513 ClipNode* clip_node = clip_tree->Node(i); |
| 513 | 514 |
| 514 if (clip_node->id == 1) { | 515 if (clip_node->id == ClipTree::kRootNodeId) { |
| 515 ResetIfHasNanCoordinate(&clip_node->data.clip); | 516 ResetIfHasNanCoordinate(&clip_node->data.clip); |
| 516 clip_node->data.clip_in_target_space = clip_node->data.clip; | 517 clip_node->data.clip_in_target_space = clip_node->data.clip; |
| 517 clip_node->data.combined_clip_in_target_space = clip_node->data.clip; | 518 clip_node->data.combined_clip_in_target_space = clip_node->data.clip; |
| 518 continue; | 519 continue; |
| 519 } | 520 } |
| 520 const TransformNode* transform_node = | 521 const TransformNode* transform_node = |
| 521 transform_tree.Node(clip_node->data.transform_id); | 522 transform_tree.Node(clip_node->data.transform_id); |
| 522 ClipNode* parent_clip_node = clip_tree->parent(clip_node); | 523 ClipNode* parent_clip_node = clip_tree->parent(clip_node); |
| 523 | 524 |
| 524 gfx::Transform parent_to_current; | 525 gfx::Transform parent_to_current; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 641 } | 642 } |
| 642 ResetIfHasNanCoordinate(&clip_node->data.clip_in_target_space); | 643 ResetIfHasNanCoordinate(&clip_node->data.clip_in_target_space); |
| 643 ResetIfHasNanCoordinate(&clip_node->data.combined_clip_in_target_space); | 644 ResetIfHasNanCoordinate(&clip_node->data.combined_clip_in_target_space); |
| 644 } | 645 } |
| 645 clip_tree->set_needs_update(false); | 646 clip_tree->set_needs_update(false); |
| 646 } | 647 } |
| 647 | 648 |
| 648 void ComputeTransforms(TransformTree* transform_tree) { | 649 void ComputeTransforms(TransformTree* transform_tree) { |
| 649 if (!transform_tree->needs_update()) | 650 if (!transform_tree->needs_update()) |
| 650 return; | 651 return; |
| 651 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i) | 652 for (int i = TransformTree::kRootNodeId; |
| 653 i < static_cast<int>(transform_tree->size()); ++i) | |
| 652 transform_tree->UpdateTransforms(i); | 654 transform_tree->UpdateTransforms(i); |
| 653 transform_tree->set_needs_update(false); | 655 transform_tree->set_needs_update(false); |
| 654 } | 656 } |
| 655 | 657 |
| 656 void UpdateRenderTarget(EffectTree* effect_tree, | 658 void UpdateRenderTarget(EffectTree* effect_tree, |
| 657 bool can_render_to_separate_surface) { | 659 bool can_render_to_separate_surface) { |
| 658 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) { | 660 for (int i = EffectTree::kRootNodeId; |
| 661 i < static_cast<int>(effect_tree->size()); ++i) { | |
| 659 EffectNode* node = effect_tree->Node(i); | 662 EffectNode* node = effect_tree->Node(i); |
| 660 if (i == 1) { | 663 if (i == EffectTree::kRootNodeId) { |
| 661 // Render target on the first effect node is root. | 664 // Render target on the first effect node is root. |
| 662 node->data.target_id = 0; | 665 node->data.target_id = EffectTree::kRootNodeId; |
| 663 } else if (!can_render_to_separate_surface) { | 666 } else if (!can_render_to_separate_surface) { |
|
ajuma
2016/06/22 13:29:50
This can be combined with the previous condition n
| |
| 664 node->data.target_id = 1; | 667 node->data.target_id = EffectTree::kRootNodeId; |
| 665 } else if (effect_tree->parent(node)->data.has_render_surface) { | 668 } else if (effect_tree->parent(node)->data.has_render_surface) { |
| 666 node->data.target_id = node->parent_id; | 669 node->data.target_id = node->parent_id; |
| 667 } else { | 670 } else { |
| 668 node->data.target_id = effect_tree->parent(node)->data.target_id; | 671 node->data.target_id = effect_tree->parent(node)->data.target_id; |
| 669 } | 672 } |
| 670 } | 673 } |
| 671 } | 674 } |
| 672 | 675 |
| 673 void ComputeEffects(EffectTree* effect_tree) { | 676 void ComputeEffects(EffectTree* effect_tree) { |
| 674 if (!effect_tree->needs_update()) | 677 if (!effect_tree->needs_update()) |
| 675 return; | 678 return; |
| 676 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) | 679 for (int i = EffectTree::kRootNodeId; |
| 680 i < static_cast<int>(effect_tree->size()); ++i) | |
| 677 effect_tree->UpdateEffects(i); | 681 effect_tree->UpdateEffects(i); |
| 678 effect_tree->set_needs_update(false); | 682 effect_tree->set_needs_update(false); |
| 679 } | 683 } |
| 680 | 684 |
| 681 static gfx::RectF ComputeCurrentClip(const ClipNode* clip_node, | 685 static gfx::RectF ComputeCurrentClip(const ClipNode* clip_node, |
| 682 const TransformTree& transform_tree, | 686 const TransformTree& transform_tree, |
| 683 int target_transform_id) { | 687 int target_transform_id) { |
| 684 if (clip_node->data.transform_id != target_transform_id) { | 688 if (clip_node->data.transform_id != target_transform_id) { |
| 685 gfx::Transform current_to_target; | 689 gfx::Transform current_to_target; |
| 686 if (!transform_tree.ComputeTransformWithDestinationSublayerScale( | 690 if (!transform_tree.ComputeTransformWithDestinationSublayerScale( |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 763 accumulated_clip = gfx::IntersectRects(accumulated_clip, current_clip); | 767 accumulated_clip = gfx::IntersectRects(accumulated_clip, current_clip); |
| 764 } | 768 } |
| 765 | 769 |
| 766 return accumulated_clip.IsEmpty() ? gfx::RectF() : accumulated_clip; | 770 return accumulated_clip.IsEmpty() ? gfx::RectF() : accumulated_clip; |
| 767 } | 771 } |
| 768 | 772 |
| 769 static void ComputeClipsWithEffectTree(PropertyTrees* property_trees) { | 773 static void ComputeClipsWithEffectTree(PropertyTrees* property_trees) { |
| 770 EffectTree* effect_tree = &property_trees->effect_tree; | 774 EffectTree* effect_tree = &property_trees->effect_tree; |
| 771 const ClipTree* clip_tree = &property_trees->clip_tree; | 775 const ClipTree* clip_tree = &property_trees->clip_tree; |
| 772 const TransformTree* transform_tree = &property_trees->transform_tree; | 776 const TransformTree* transform_tree = &property_trees->transform_tree; |
| 773 EffectNode* root_effect_node = effect_tree->Node(1); | 777 EffectNode* root_effect_node = effect_tree->Node(EffectTree::kRootNodeId); |
| 774 const RenderSurfaceImpl* root_render_surface = | 778 const RenderSurfaceImpl* root_render_surface = |
| 775 root_effect_node->data.render_surface; | 779 root_effect_node->data.render_surface; |
| 776 gfx::Rect root_clip = gfx::ToEnclosingRect( | 780 gfx::Rect root_clip = gfx::ToEnclosingRect( |
| 777 clip_tree->Node(root_effect_node->data.clip_id)->data.clip); | 781 clip_tree->Node(root_effect_node->data.clip_id)->data.clip); |
| 778 if (root_render_surface->is_clipped()) | 782 if (root_render_surface->is_clipped()) |
| 779 DCHECK(root_clip == root_render_surface->clip_rect()) | 783 DCHECK(root_clip == root_render_surface->clip_rect()) |
| 780 << "clip on root render surface: " | 784 << "clip on root render surface: " |
| 781 << root_render_surface->clip_rect().ToString() | 785 << root_render_surface->clip_rect().ToString() |
| 782 << " v.s. root effect node's clip: " << root_clip.ToString(); | 786 << " v.s. root effect node's clip: " << root_clip.ToString(); |
| 783 for (int i = 2; i < static_cast<int>(effect_tree->size()); ++i) { | 787 for (int i = 2; i < static_cast<int>(effect_tree->size()); ++i) { |
|
ajuma
2016/06/22 17:06:57
Should this be kRootNodeId+1 instead of 2?
| |
| 784 EffectNode* effect_node = effect_tree->Node(i); | 788 EffectNode* effect_node = effect_tree->Node(i); |
| 785 const EffectNode* target_node = | 789 const EffectNode* target_node = |
| 786 effect_tree->Node(effect_node->data.target_id); | 790 effect_tree->Node(effect_node->data.target_id); |
| 787 gfx::RectF accumulated_clip = | 791 gfx::RectF accumulated_clip = |
| 788 ComputeAccumulatedClip(*clip_tree, effect_node->data.clip_id, | 792 ComputeAccumulatedClip(*clip_tree, effect_node->data.clip_id, |
| 789 *effect_tree, target_node->id, *transform_tree); | 793 *effect_tree, target_node->id, *transform_tree); |
| 790 const RenderSurfaceImpl* render_surface = effect_node->data.render_surface; | 794 const RenderSurfaceImpl* render_surface = effect_node->data.render_surface; |
| 791 if (render_surface && render_surface->is_clipped()) { | 795 if (render_surface && render_surface->is_clipped()) { |
| 792 DCHECK(gfx::ToEnclosingRect(accumulated_clip) == | 796 DCHECK(gfx::ToEnclosingRect(accumulated_clip) == |
| 793 render_surface->clip_rect()) | 797 render_surface->clip_rect()) |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 805 const ClipTree* clip_tree = &property_trees->clip_tree; | 809 const ClipTree* clip_tree = &property_trees->clip_tree; |
| 806 const TransformTree* transform_tree = &property_trees->transform_tree; | 810 const TransformTree* transform_tree = &property_trees->transform_tree; |
| 807 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index()); | 811 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index()); |
| 808 const EffectNode* target_node = | 812 const EffectNode* target_node = |
| 809 effect_node->data.has_render_surface | 813 effect_node->data.has_render_surface |
| 810 ? effect_node | 814 ? effect_node |
| 811 : effect_tree->Node(effect_node->data.target_id); | 815 : effect_tree->Node(effect_node->data.target_id); |
| 812 // TODO(weiliangc): When effect node has up to date render surface info on | 816 // TODO(weiliangc): When effect node has up to date render surface info on |
| 813 // compositor thread, no need to check for resourceless draw mode | 817 // compositor thread, no need to check for resourceless draw mode |
| 814 if (!property_trees->non_root_surfaces_enabled) { | 818 if (!property_trees->non_root_surfaces_enabled) { |
| 815 target_node = effect_tree->Node(1); | 819 target_node = effect_tree->Node(EffectTree::kRootNodeId); |
| 816 } | 820 } |
| 817 | 821 |
| 818 gfx::RectF accumulated_clip = | 822 gfx::RectF accumulated_clip = |
| 819 ComputeAccumulatedClip(*clip_tree, layer->clip_tree_index(), *effect_tree, | 823 ComputeAccumulatedClip(*clip_tree, layer->clip_tree_index(), *effect_tree, |
| 820 target_node->id, *transform_tree); | 824 target_node->id, *transform_tree); |
| 821 | 825 |
| 822 if ((!property_trees->non_root_surfaces_enabled && | 826 if ((!property_trees->non_root_surfaces_enabled && |
| 823 clip_tree->Node(layer->clip_tree_index()) | 827 clip_tree->Node(layer->clip_tree_index()) |
| 824 ->data.layers_are_clipped_when_surfaces_disabled) || | 828 ->data.layers_are_clipped_when_surfaces_disabled) || |
| 825 clip_tree->Node(layer->clip_tree_index())->data.layers_are_clipped) { | 829 clip_tree->Node(layer->clip_tree_index())->data.layers_are_clipped) { |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 977 // Surfaces need to apply their sublayer scale. | 981 // Surfaces need to apply their sublayer scale. |
| 978 xform.Scale(node->data.sublayer_scale.x(), node->data.sublayer_scale.y()); | 982 xform.Scale(node->data.sublayer_scale.x(), node->data.sublayer_scale.y()); |
| 979 } | 983 } |
| 980 return xform; | 984 return xform; |
| 981 } | 985 } |
| 982 | 986 |
| 983 static void SetSurfaceDrawTransform(const TransformTree& tree, | 987 static void SetSurfaceDrawTransform(const TransformTree& tree, |
| 984 RenderSurfaceImpl* render_surface) { | 988 RenderSurfaceImpl* render_surface) { |
| 985 const TransformNode* node = tree.Node(render_surface->TransformTreeIndex()); | 989 const TransformNode* node = tree.Node(render_surface->TransformTreeIndex()); |
| 986 // The draw transform of root render surface is identity tranform. | 990 // The draw transform of root render surface is identity tranform. |
| 987 if (node->id == 1) { | 991 if (node->id == TransformTree::kRootNodeId) { |
| 988 render_surface->SetDrawTransform(gfx::Transform()); | 992 render_surface->SetDrawTransform(gfx::Transform()); |
| 989 return; | 993 return; |
| 990 } | 994 } |
| 991 | 995 |
| 992 gfx::Transform render_surface_transform; | 996 gfx::Transform render_surface_transform; |
| 993 const TransformNode* target_node = tree.Node(tree.TargetId(node->id)); | 997 const TransformNode* target_node = tree.Node(tree.TargetId(node->id)); |
| 994 tree.ComputeTransformWithDestinationSublayerScale(node->id, target_node->id, | 998 tree.ComputeTransformWithDestinationSublayerScale(node->id, target_node->id, |
| 995 &render_surface_transform); | 999 &render_surface_transform); |
| 996 if (node->data.sublayer_scale.x() != 0.0 && | 1000 if (node->data.sublayer_scale.x() != 0.0 && |
| 997 node->data.sublayer_scale.y() != 0.0) | 1001 node->data.sublayer_scale.y() != 0.0) |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1318 void UpdateElasticOverscroll(PropertyTrees* property_trees, | 1322 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
| 1319 const Layer* overscroll_elasticity_layer, | 1323 const Layer* overscroll_elasticity_layer, |
| 1320 const gfx::Vector2dF& elastic_overscroll) { | 1324 const gfx::Vector2dF& elastic_overscroll) { |
| 1321 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1325 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
| 1322 elastic_overscroll); | 1326 elastic_overscroll); |
| 1323 } | 1327 } |
| 1324 | 1328 |
| 1325 } // namespace draw_property_utils | 1329 } // namespace draw_property_utils |
| 1326 | 1330 |
| 1327 } // namespace cc | 1331 } // namespace cc |
| OLD | NEW |