Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: cc/trees/property_tree.cc

Issue 2408243002: cc : Move screen space scale factor to root transform node (Closed)
Patch Set: comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/property_tree.h ('k') | cc/trees/property_tree_builder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 gfx::Transform target_space_transform; 598 gfx::Transform target_space_transform;
599 if (node->needs_surface_contents_scale) { 599 if (node->needs_surface_contents_scale) {
600 target_space_transform.MakeIdentity(); 600 target_space_transform.MakeIdentity();
601 target_space_transform.Scale(node->surface_contents_scale.x(), 601 target_space_transform.Scale(node->surface_contents_scale.x(),
602 node->surface_contents_scale.y()); 602 node->surface_contents_scale.y());
603 } else { 603 } else {
604 // In order to include the root transform for the root surface, we walk up 604 // In order to include the root transform for the root surface, we walk up
605 // to the root of the transform tree in ComputeTransform. 605 // to the root of the transform tree in ComputeTransform.
606 int target_id = target_node->id; 606 int target_id = target_node->id;
607 ComputeTransform(node->id, target_id, &target_space_transform); 607 ComputeTransform(node->id, target_id, &target_space_transform);
608 if (target_id != kRootNodeId) { 608 target_space_transform.matrix().postScale(
609 target_space_transform.matrix().postScale( 609 target_node->surface_contents_scale.x(),
610 target_node->surface_contents_scale.x(), 610 target_node->surface_contents_scale.y(), 1.f);
611 target_node->surface_contents_scale.y(), 1.f);
612 }
613 } 611 }
614 612
615 gfx::Transform from_target; 613 gfx::Transform from_target;
616 if (!target_space_transform.GetInverse(&from_target)) 614 if (!target_space_transform.GetInverse(&from_target))
617 node->ancestors_are_invertible = false; 615 node->ancestors_are_invertible = false;
618 SetToTarget(node->id, target_space_transform); 616 SetToTarget(node->id, target_space_transform);
619 SetFromTarget(node->id, from_target); 617 SetFromTarget(node->id, from_target);
620 } 618 }
621 619
622 void TransformTree::UpdateAnimationProperties(TransformNode* node, 620 void TransformTree::UpdateAnimationProperties(TransformNode* node,
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 bool is_invertible = node->is_invertible; 694 bool is_invertible = node->is_invertible;
697 // Even when the current node's transform and the parent's screen space 695 // Even when the current node's transform and the parent's screen space
698 // transform are invertible, the current node's screen space transform can 696 // transform are invertible, the current node's screen space transform can
699 // become uninvertible due to floating-point arithmetic. 697 // become uninvertible due to floating-point arithmetic.
700 if (!node->ancestors_are_invertible && parent_node->ancestors_are_invertible) 698 if (!node->ancestors_are_invertible && parent_node->ancestors_are_invertible)
701 is_invertible = false; 699 is_invertible = false;
702 node->node_and_ancestors_are_animated_or_invertible = 700 node->node_and_ancestors_are_animated_or_invertible =
703 node->has_potential_animation || is_invertible; 701 node->has_potential_animation || is_invertible;
704 } 702 }
705 703
706 void TransformTree::SetDeviceTransform(const gfx::Transform& transform, 704 void TransformTree::SetContentsRootPostLocalTransform(
707 gfx::PointF root_position) { 705 const gfx::Transform& transform,
708 gfx::Transform root_post_local = transform; 706 gfx::PointF root_position) {
709 TransformNode* node = Node(1); 707 // The post local transform of the contents root node is set to the device
710 root_post_local.Scale(node->post_local_scale_factor, 708 // transform with scale removed and is also offset by the root layer's
711 node->post_local_scale_factor); 709 // position. The scale part of the device transform goes into the screen space
712 root_post_local.Translate(root_position.x(), root_position.y()); 710 // scale stored on the root node.
713 if (node->post_local == root_post_local) 711 gfx::Transform post_local = transform;
712 post_local.Translate(root_position.x(), root_position.y());
713
714 TransformNode* node = Node(kContentsRootNodeId);
715 if (node->post_local == post_local)
714 return; 716 return;
715 717 node->post_local = post_local;
716 node->post_local = root_post_local;
717 node->needs_local_transform_update = true; 718 node->needs_local_transform_update = true;
718 set_needs_update(true); 719 set_needs_update(true);
719 } 720 }
720 721
721 void TransformTree::SetDeviceTransformScaleFactor( 722 void TransformTree::SetScreenSpaceScaleOnRootNode(
722 const gfx::Transform& transform) { 723 gfx::Vector2dF screen_space_scale_components) {
724 TransformNode* node = Node(kRootNodeId);
725 if (node->surface_contents_scale == screen_space_scale_components)
726 return;
727 node->needs_surface_contents_scale = true;
728 node->surface_contents_scale = screen_space_scale_components;
729 gfx::Transform to_screen;
730 to_screen.Scale(node->surface_contents_scale.x(),
731 node->surface_contents_scale.y());
732 SetToScreen(node->id, to_screen);
733 gfx::Transform from_screen;
734 if (!ToScreen(node->id).GetInverse(&from_screen))
735 node->ancestors_are_invertible = false;
736 SetFromScreen(node->id, from_screen);
737 set_needs_update(true);
738 }
739
740 void TransformTree::SetRootTransformsAndScales(
741 float device_scale_factor,
742 float page_scale_factor_for_root,
743 const gfx::Transform& device_transform,
744 gfx::PointF root_position) {
723 gfx::Vector2dF device_transform_scale_components = 745 gfx::Vector2dF device_transform_scale_components =
724 MathUtil::ComputeTransform2dScaleComponents(transform, 1.f); 746 MathUtil::ComputeTransform2dScaleComponents(device_transform, 1.f);
725 747
726 // Not handling the rare case of different x and y device scale. 748 // Not handling the rare case of different x and y device scale.
727 device_transform_scale_factor_ = 749 device_transform_scale_factor_ =
728 std::max(device_transform_scale_components.x(), 750 std::max(device_transform_scale_components.x(),
729 device_transform_scale_components.y()); 751 device_transform_scale_components.y());
752 gfx::Transform device_transform_without_scale = device_transform;
753 device_transform_without_scale.matrix().postScale(
754 1.f / device_transform_scale_components.x(),
755 1.f / device_transform_scale_components.y(), 1.f);
756 SetContentsRootPostLocalTransform(device_transform_without_scale,
757 root_position);
758
759 gfx::Vector2dF screen_space_scale_components(
760 device_transform_scale_components.x() * device_scale_factor *
761 page_scale_factor_for_root,
762 device_transform_scale_components.y() * device_scale_factor *
763 page_scale_factor_for_root);
764 SetScreenSpaceScaleOnRootNode(screen_space_scale_components);
730 } 765 }
731 766
732 void TransformTree::UpdateInnerViewportContainerBoundsDelta() { 767 void TransformTree::UpdateInnerViewportContainerBoundsDelta() {
733 if (nodes_affected_by_inner_viewport_bounds_delta_.empty()) 768 if (nodes_affected_by_inner_viewport_bounds_delta_.empty())
734 return; 769 return;
735 770
736 set_needs_update(true); 771 set_needs_update(true);
737 for (int i : nodes_affected_by_inner_viewport_bounds_delta_) 772 for (int i : nodes_affected_by_inner_viewport_bounds_delta_)
738 Node(i)->needs_local_transform_update = true; 773 Node(i)->needs_local_transform_update = true;
739 } 774 }
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 transform_node->local.IsBackFaceVisible(); 1038 transform_node->local.IsBackFaceVisible();
1004 } 1039 }
1005 return; 1040 return;
1006 } 1041 }
1007 } 1042 }
1008 } 1043 }
1009 node->hidden_by_backface_visibility = false; 1044 node->hidden_by_backface_visibility = false;
1010 } 1045 }
1011 1046
1012 void EffectTree::UpdateSurfaceContentsScale(EffectNode* effect_node) { 1047 void EffectTree::UpdateSurfaceContentsScale(EffectNode* effect_node) {
1013 if (!effect_node->has_render_surface || 1048 if (!effect_node->has_render_surface) {
1014 effect_node->transform_id == kRootNodeId) {
1015 effect_node->surface_contents_scale = gfx::Vector2dF(1.0f, 1.0f); 1049 effect_node->surface_contents_scale = gfx::Vector2dF(1.0f, 1.0f);
1016 return; 1050 return;
1017 } 1051 }
1018 1052
1019 TransformTree& transform_tree = property_trees()->transform_tree; 1053 TransformTree& transform_tree = property_trees()->transform_tree;
1020 float layer_scale_factor = transform_tree.device_scale_factor() * 1054 float layer_scale_factor = transform_tree.device_scale_factor() *
1021 transform_tree.device_transform_scale_factor(); 1055 transform_tree.device_transform_scale_factor();
1022 TransformNode* transform_node = 1056 TransformNode* transform_node =
1023 transform_tree.Node(effect_node->transform_id); 1057 transform_tree.Node(effect_node->transform_id);
1024 if (transform_node->in_subtree_of_page_scale_layer) 1058 if (transform_node->in_subtree_of_page_scale_layer)
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 } else { 1158 } else {
1125 // The root surface doesn't have the notion of sub-layer scale, but 1159 // The root surface doesn't have the notion of sub-layer scale, but
1126 // instead has a similar notion of transforming from the space of the root 1160 // instead has a similar notion of transforming from the space of the root
1127 // layer to the space of the screen. 1161 // layer to the space of the screen.
1128 DCHECK_EQ(kRootNodeId, destination_id); 1162 DCHECK_EQ(kRootNodeId, destination_id);
1129 source_id = TransformTree::kContentsRootNodeId; 1163 source_id = TransformTree::kContentsRootNodeId;
1130 } 1164 }
1131 gfx::Transform transform; 1165 gfx::Transform transform;
1132 property_trees()->transform_tree.ComputeTransform(source_id, destination_id, 1166 property_trees()->transform_tree.ComputeTransform(source_id, destination_id,
1133 &transform); 1167 &transform);
1134 if (effect_node->id != kContentsRootNodeId) { 1168 transform.matrix().postScale(effect_node->surface_contents_scale.x(),
1135 transform.matrix().postScale(effect_node->surface_contents_scale.x(), 1169 effect_node->surface_contents_scale.y(), 1.f);
1136 effect_node->surface_contents_scale.y(),
1137 1.f);
1138 }
1139 it->set_area(MathUtil::MapEnclosingClippedRect(transform, it->area())); 1170 it->set_area(MathUtil::MapEnclosingClippedRect(transform, it->area()));
1140 } 1171 }
1141 } 1172 }
1142 1173
1143 bool EffectTree::HasCopyRequests() const { 1174 bool EffectTree::HasCopyRequests() const {
1144 return !copy_requests_.empty(); 1175 return !copy_requests_.empty();
1145 } 1176 }
1146 1177
1147 void EffectTree::ClearCopyRequests() { 1178 void EffectTree::ClearCopyRequests() {
1148 for (auto& node : nodes()) { 1179 for (auto& node : nodes()) {
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after
2235 gfx::Transform from_target; 2266 gfx::Transform from_target;
2236 bool already_computed_inverse = false; 2267 bool already_computed_inverse = false;
2237 if (transform_id == dest_id) { 2268 if (transform_id == dest_id) {
2238 target_space_transform.Scale(effect_node->surface_contents_scale.x(), 2269 target_space_transform.Scale(effect_node->surface_contents_scale.x(),
2239 effect_node->surface_contents_scale.y()); 2270 effect_node->surface_contents_scale.y());
2240 data.transforms.to_valid = true; 2271 data.transforms.to_valid = true;
2241 data.transforms.from_valid = false; 2272 data.transforms.from_valid = false;
2242 } else if (transform_id > dest_id) { 2273 } else if (transform_id > dest_id) {
2243 transform_tree.CombineTransformsBetween(transform_id, dest_id, 2274 transform_tree.CombineTransformsBetween(transform_id, dest_id,
2244 &target_space_transform); 2275 &target_space_transform);
2245 if (dest_id != TransformTree::kRootNodeId) 2276 target_space_transform.matrix().postScale(
2246 target_space_transform.matrix().postScale( 2277 effect_node->surface_contents_scale.x(),
2247 effect_node->surface_contents_scale.x(), 2278 effect_node->surface_contents_scale.y(), 1.f);
2248 effect_node->surface_contents_scale.y(), 1.f);
2249 data.transforms.to_valid = true; 2279 data.transforms.to_valid = true;
2250 data.transforms.from_valid = false; 2280 data.transforms.from_valid = false;
2251 data.transforms.might_be_invertible = true; 2281 data.transforms.might_be_invertible = true;
2252 } else { 2282 } else {
2253 gfx::Transform combined_transform; 2283 gfx::Transform combined_transform;
2254 transform_tree.CombineTransformsBetween(dest_id, transform_id, 2284 transform_tree.CombineTransformsBetween(dest_id, transform_id,
2255 &combined_transform); 2285 &combined_transform);
2256 if (effect_node->surface_contents_scale.x() != 0.f && 2286 if (effect_node->surface_contents_scale.x() != 0.f &&
2257 effect_node->surface_contents_scale.y() != 0.f) 2287 effect_node->surface_contents_scale.y() != 0.f)
2258 combined_transform.Scale(1.0f / effect_node->surface_contents_scale.x(), 2288 combined_transform.Scale(1.0f / effect_node->surface_contents_scale.x(),
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2332 2362
2333 const EffectNode* effect_node = effect_tree.Node(effect_id); 2363 const EffectNode* effect_node = effect_tree.Node(effect_id);
2334 2364
2335 bool success = GetFromTarget(transform_id, effect_id, transform); 2365 bool success = GetFromTarget(transform_id, effect_id, transform);
2336 transform->Scale(effect_node->surface_contents_scale.x(), 2366 transform->Scale(effect_node->surface_contents_scale.x(),
2337 effect_node->surface_contents_scale.y()); 2367 effect_node->surface_contents_scale.y());
2338 return success; 2368 return success;
2339 } 2369 }
2340 2370
2341 } // namespace cc 2371 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree.h ('k') | cc/trees/property_tree_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698