| 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 |