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 <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 bool is_invertible = node->is_invertible; | 661 bool is_invertible = node->is_invertible; |
662 // Even when the current node's transform and the parent's screen space | 662 // Even when the current node's transform and the parent's screen space |
663 // transform are invertible, the current node's screen space transform can | 663 // transform are invertible, the current node's screen space transform can |
664 // become uninvertible due to floating-point arithmetic. | 664 // become uninvertible due to floating-point arithmetic. |
665 if (!node->ancestors_are_invertible && parent_node->ancestors_are_invertible) | 665 if (!node->ancestors_are_invertible && parent_node->ancestors_are_invertible) |
666 is_invertible = false; | 666 is_invertible = false; |
667 node->node_and_ancestors_are_animated_or_invertible = | 667 node->node_and_ancestors_are_animated_or_invertible = |
668 node->has_potential_animation || is_invertible; | 668 node->has_potential_animation || is_invertible; |
669 } | 669 } |
670 | 670 |
671 void TransformTree::SetContentsRootPostLocalTransform( | 671 void TransformTree::SetDeviceTransform(const gfx::Transform& transform, |
672 const gfx::Transform& transform, | 672 gfx::PointF root_position) { |
673 gfx::PointF root_position) { | 673 gfx::Transform root_post_local = transform; |
674 // The post local transform of the contents root node is set to the device | 674 TransformNode* node = Node(1); |
675 // transform with scale removed and is also offset by the root layer's | 675 root_post_local.Scale(node->post_local_scale_factor, |
676 // position. The scale part of the device transform goes into the screen space | 676 node->post_local_scale_factor); |
677 // scale stored on the root node. | 677 root_post_local.Translate(root_position.x(), root_position.y()); |
678 gfx::Transform post_local = transform; | 678 if (node->post_local == root_post_local) |
679 post_local.Translate(root_position.x(), root_position.y()); | 679 return; |
680 | 680 |
681 TransformNode* node = Node(kContentsRootNodeId); | 681 node->post_local = root_post_local; |
682 if (node->post_local == post_local) | |
683 return; | |
684 node->post_local = post_local; | |
685 node->needs_local_transform_update = true; | 682 node->needs_local_transform_update = true; |
686 set_needs_update(true); | 683 set_needs_update(true); |
687 } | 684 } |
688 | 685 |
689 void TransformTree::SetScreenSpaceScaleOnRootNode( | 686 void TransformTree::SetDeviceTransformScaleFactor( |
690 gfx::Vector2dF screen_space_scale_components) { | 687 const gfx::Transform& transform) { |
691 TransformNode* node = Node(kRootNodeId); | |
692 gfx::Transform to_screen; | |
693 to_screen.Scale(screen_space_scale_components.x(), | |
694 screen_space_scale_components.y()); | |
695 if (ToScreen(node->id) == to_screen) | |
696 return; | |
697 SetToScreen(node->id, to_screen); | |
698 gfx::Transform from_screen; | |
699 if (!ToScreen(node->id).GetInverse(&from_screen)) | |
700 node->ancestors_are_invertible = false; | |
701 SetFromScreen(node->id, from_screen); | |
702 set_needs_update(true); | |
703 } | |
704 | |
705 void TransformTree::SetRootTransformsAndScales( | |
706 float device_scale_factor, | |
707 float page_scale_factor_for_root, | |
708 const gfx::Transform& device_transform, | |
709 gfx::PointF root_position) { | |
710 gfx::Vector2dF device_transform_scale_components = | 688 gfx::Vector2dF device_transform_scale_components = |
711 MathUtil::ComputeTransform2dScaleComponents(device_transform, 1.f); | 689 MathUtil::ComputeTransform2dScaleComponents(transform, 1.f); |
712 | 690 |
713 // Not handling the rare case of different x and y device scale. | 691 // Not handling the rare case of different x and y device scale. |
714 device_transform_scale_factor_ = | 692 device_transform_scale_factor_ = |
715 std::max(device_transform_scale_components.x(), | 693 std::max(device_transform_scale_components.x(), |
716 device_transform_scale_components.y()); | 694 device_transform_scale_components.y()); |
717 gfx::Transform device_transform_without_scale = device_transform; | |
718 device_transform_without_scale.matrix().postScale( | |
719 1.f / device_transform_scale_components.x(), | |
720 1.f / device_transform_scale_components.y(), 1.f); | |
721 SetContentsRootPostLocalTransform(device_transform_without_scale, | |
722 root_position); | |
723 | |
724 gfx::Vector2dF screen_space_scale_components( | |
725 device_transform_scale_components.x() * device_scale_factor * | |
726 page_scale_factor_for_root, | |
727 device_transform_scale_components.y() * device_scale_factor * | |
728 page_scale_factor_for_root); | |
729 SetScreenSpaceScaleOnRootNode(screen_space_scale_components); | |
730 } | 695 } |
731 | 696 |
732 void TransformTree::UpdateInnerViewportContainerBoundsDelta() { | 697 void TransformTree::UpdateInnerViewportContainerBoundsDelta() { |
733 if (nodes_affected_by_inner_viewport_bounds_delta_.empty()) | 698 if (nodes_affected_by_inner_viewport_bounds_delta_.empty()) |
734 return; | 699 return; |
735 | 700 |
736 set_needs_update(true); | 701 set_needs_update(true); |
737 for (int i : nodes_affected_by_inner_viewport_bounds_delta_) | 702 for (int i : nodes_affected_by_inner_viewport_bounds_delta_) |
738 Node(i)->needs_local_transform_update = true; | 703 Node(i)->needs_local_transform_update = true; |
739 } | 704 } |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
980 transform_node->local.IsBackFaceVisible(); | 945 transform_node->local.IsBackFaceVisible(); |
981 } | 946 } |
982 return; | 947 return; |
983 } | 948 } |
984 } | 949 } |
985 } | 950 } |
986 node->hidden_by_backface_visibility = false; | 951 node->hidden_by_backface_visibility = false; |
987 } | 952 } |
988 | 953 |
989 void EffectTree::UpdateSurfaceContentsScale(EffectNode* effect_node) { | 954 void EffectTree::UpdateSurfaceContentsScale(EffectNode* effect_node) { |
990 if (!effect_node->has_render_surface) { | 955 if (!effect_node->has_render_surface || |
| 956 effect_node->transform_id == kRootNodeId) { |
991 effect_node->surface_contents_scale = gfx::Vector2dF(1.0f, 1.0f); | 957 effect_node->surface_contents_scale = gfx::Vector2dF(1.0f, 1.0f); |
992 return; | 958 return; |
993 } | 959 } |
994 | 960 |
995 TransformTree& transform_tree = property_trees()->transform_tree; | 961 TransformTree& transform_tree = property_trees()->transform_tree; |
996 float layer_scale_factor = transform_tree.device_scale_factor() * | 962 float layer_scale_factor = transform_tree.device_scale_factor() * |
997 transform_tree.device_transform_scale_factor(); | 963 transform_tree.device_transform_scale_factor(); |
998 TransformNode* transform_node = | 964 TransformNode* transform_node = |
999 transform_tree.Node(effect_node->transform_id); | 965 transform_tree.Node(effect_node->transform_id); |
1000 if (transform_node->in_subtree_of_page_scale_layer) | 966 if (transform_node->in_subtree_of_page_scale_layer) |
(...skipping 1204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2205 gfx::Transform from_target; | 2171 gfx::Transform from_target; |
2206 bool already_computed_inverse = false; | 2172 bool already_computed_inverse = false; |
2207 if (transform_id == dest_id) { | 2173 if (transform_id == dest_id) { |
2208 target_space_transform.Scale(effect_node->surface_contents_scale.x(), | 2174 target_space_transform.Scale(effect_node->surface_contents_scale.x(), |
2209 effect_node->surface_contents_scale.y()); | 2175 effect_node->surface_contents_scale.y()); |
2210 data.transforms.to_valid = true; | 2176 data.transforms.to_valid = true; |
2211 data.transforms.from_valid = false; | 2177 data.transforms.from_valid = false; |
2212 } else if (transform_id > dest_id) { | 2178 } else if (transform_id > dest_id) { |
2213 transform_tree.CombineTransformsBetween(transform_id, dest_id, | 2179 transform_tree.CombineTransformsBetween(transform_id, dest_id, |
2214 &target_space_transform); | 2180 &target_space_transform); |
2215 target_space_transform.matrix().postScale( | 2181 if (dest_id != TransformTree::kRootNodeId) |
2216 effect_node->surface_contents_scale.x(), | 2182 target_space_transform.matrix().postScale( |
2217 effect_node->surface_contents_scale.y(), 1.f); | 2183 effect_node->surface_contents_scale.x(), |
| 2184 effect_node->surface_contents_scale.y(), 1.f); |
2218 data.transforms.to_valid = true; | 2185 data.transforms.to_valid = true; |
2219 data.transforms.from_valid = false; | 2186 data.transforms.from_valid = false; |
2220 data.transforms.might_be_invertible = true; | 2187 data.transforms.might_be_invertible = true; |
2221 } else { | 2188 } else { |
2222 gfx::Transform combined_transform; | 2189 gfx::Transform combined_transform; |
2223 transform_tree.CombineTransformsBetween(dest_id, transform_id, | 2190 transform_tree.CombineTransformsBetween(dest_id, transform_id, |
2224 &combined_transform); | 2191 &combined_transform); |
2225 if (effect_node->surface_contents_scale.x() != 0.f && | 2192 if (effect_node->surface_contents_scale.x() != 0.f && |
2226 effect_node->surface_contents_scale.y() != 0.f) | 2193 effect_node->surface_contents_scale.y() != 0.f) |
2227 combined_transform.Scale(1.0f / effect_node->surface_contents_scale.x(), | 2194 combined_transform.Scale(1.0f / effect_node->surface_contents_scale.x(), |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2282 | 2249 |
2283 const EffectNode* effect_node = effect_tree.Node(effect_id); | 2250 const EffectNode* effect_node = effect_tree.Node(effect_id); |
2284 | 2251 |
2285 bool success = GetFromTarget(transform_id, effect_id, transform); | 2252 bool success = GetFromTarget(transform_id, effect_id, transform); |
2286 transform->Scale(effect_node->surface_contents_scale.x(), | 2253 transform->Scale(effect_node->surface_contents_scale.x(), |
2287 effect_node->surface_contents_scale.y()); | 2254 effect_node->surface_contents_scale.y()); |
2288 return success; | 2255 return success; |
2289 } | 2256 } |
2290 | 2257 |
2291 } // namespace cc | 2258 } // namespace cc |
OLD | NEW |