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 <set> | 5 #include <set> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "cc/base/math_util.h" | 9 #include "cc/base/math_util.h" |
10 #include "cc/trees/property_tree.h" | 10 #include "cc/trees/property_tree.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 back()->parent_id = -1; | 41 back()->parent_id = -1; |
42 } | 42 } |
43 | 43 |
44 template class PropertyTree<TransformNode>; | 44 template class PropertyTree<TransformNode>; |
45 template class PropertyTree<ClipNode>; | 45 template class PropertyTree<ClipNode>; |
46 template class PropertyTree<OpacityNode>; | 46 template class PropertyTree<OpacityNode>; |
47 | 47 |
48 TransformNodeData::TransformNodeData() | 48 TransformNodeData::TransformNodeData() |
49 : target_id(-1), | 49 : target_id(-1), |
50 content_target_id(-1), | 50 content_target_id(-1), |
| 51 source_node_id(-1), |
51 needs_local_transform_update(true), | 52 needs_local_transform_update(true), |
52 is_invertible(true), | 53 is_invertible(true), |
53 ancestors_are_invertible(true), | 54 ancestors_are_invertible(true), |
54 is_animated(false), | 55 is_animated(false), |
55 to_screen_is_animated(false), | 56 to_screen_is_animated(false), |
56 flattens_inherited_transform(false), | 57 flattens_inherited_transform(false), |
57 node_and_ancestors_are_flat(true), | 58 node_and_ancestors_are_flat(true), |
58 scrolls(false), | 59 scrolls(false), |
59 needs_sublayer_scale(false), | 60 needs_sublayer_scale(false), |
60 layer_scale_factor(1.0f) { | 61 layer_scale_factor(1.0f) { |
61 } | 62 } |
62 | 63 |
63 TransformNodeData::~TransformNodeData() { | 64 TransformNodeData::~TransformNodeData() { |
64 } | 65 } |
65 | 66 |
66 void TransformNodeData::update_pre_local_transform( | 67 void TransformNodeData::update_pre_local_transform( |
67 const gfx::Point3F& transform_origin) { | 68 const gfx::Point3F& transform_origin) { |
68 pre_local.MakeIdentity(); | 69 pre_local.MakeIdentity(); |
69 pre_local.Translate3d(-transform_origin.x(), -transform_origin.y(), | 70 pre_local.Translate3d(-transform_origin.x(), -transform_origin.y(), |
70 -transform_origin.z()); | 71 -transform_origin.z()); |
71 } | 72 } |
72 | 73 |
73 void TransformNodeData::update_post_local_transform( | 74 void TransformNodeData::update_post_local_transform( |
74 const gfx::PointF& position, | 75 const gfx::PointF& position, |
75 const gfx::Point3F& transform_origin) { | 76 const gfx::Point3F& transform_origin) { |
76 post_local.MakeIdentity(); | 77 post_local.MakeIdentity(); |
77 post_local.Scale(post_local_scale_factor, post_local_scale_factor); | 78 post_local.Scale(post_local_scale_factor, post_local_scale_factor); |
78 post_local.Translate3d( | 79 post_local.Translate3d( |
79 position.x() + parent_offset.x() + transform_origin.x(), | 80 position.x() + source_offset.x() + transform_origin.x(), |
80 position.y() + parent_offset.y() + transform_origin.y(), | 81 position.y() + source_offset.y() + transform_origin.y(), |
81 transform_origin.z()); | 82 transform_origin.z()); |
82 } | 83 } |
83 | 84 |
84 ClipNodeData::ClipNodeData() : transform_id(-1), target_id(-1) { | 85 ClipNodeData::ClipNodeData() : transform_id(-1), target_id(-1) { |
85 } | 86 } |
86 | 87 |
87 bool TransformTree::ComputeTransform(int source_id, | 88 bool TransformTree::ComputeTransform(int source_id, |
88 int dest_id, | 89 int dest_id, |
89 gfx::Transform* transform) const { | 90 gfx::Transform* transform) const { |
90 transform->MakeIdentity(); | 91 transform->MakeIdentity(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 bool TransformTree::Are2DAxisAligned(int source_id, int dest_id) const { | 135 bool TransformTree::Are2DAxisAligned(int source_id, int dest_id) const { |
135 gfx::Transform transform; | 136 gfx::Transform transform; |
136 return ComputeTransform(source_id, dest_id, &transform) && | 137 return ComputeTransform(source_id, dest_id, &transform) && |
137 transform.Preserves2dAxisAlignment(); | 138 transform.Preserves2dAxisAlignment(); |
138 } | 139 } |
139 | 140 |
140 void TransformTree::UpdateTransforms(int id) { | 141 void TransformTree::UpdateTransforms(int id) { |
141 TransformNode* node = Node(id); | 142 TransformNode* node = Node(id); |
142 TransformNode* parent_node = parent(node); | 143 TransformNode* parent_node = parent(node); |
143 TransformNode* target_node = Node(node->data.target_id); | 144 TransformNode* target_node = Node(node->data.target_id); |
144 if (node->data.needs_local_transform_update) | 145 if (node->data.needs_local_transform_update || |
| 146 node->parent_id != node->data.source_node_id) |
145 UpdateLocalTransform(node); | 147 UpdateLocalTransform(node); |
146 UpdateScreenSpaceTransform(node, parent_node, target_node); | 148 UpdateScreenSpaceTransform(node, parent_node, target_node); |
147 UpdateSublayerScale(node); | 149 UpdateSublayerScale(node); |
148 UpdateTargetSpaceTransform(node, target_node); | 150 UpdateTargetSpaceTransform(node, target_node); |
149 UpdateIsAnimated(node, parent_node); | 151 UpdateIsAnimated(node, parent_node); |
150 UpdateSnapping(node); | 152 UpdateSnapping(node); |
151 } | 153 } |
152 | 154 |
153 bool TransformTree::IsDescendant(int desc_id, int source_id) const { | 155 bool TransformTree::IsDescendant(int desc_id, int source_id) const { |
154 while (desc_id != source_id) { | 156 while (desc_id != source_id) { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 gfx::Transform dest_to_source; | 244 gfx::Transform dest_to_source; |
243 CombineTransformsBetween(dest_id, source_id, &dest_to_source); | 245 CombineTransformsBetween(dest_id, source_id, &dest_to_source); |
244 gfx::Transform source_to_dest; | 246 gfx::Transform source_to_dest; |
245 bool all_are_invertible = dest_to_source.GetInverse(&source_to_dest); | 247 bool all_are_invertible = dest_to_source.GetInverse(&source_to_dest); |
246 transform->PreconcatTransform(source_to_dest); | 248 transform->PreconcatTransform(source_to_dest); |
247 return all_are_invertible; | 249 return all_are_invertible; |
248 } | 250 } |
249 | 251 |
250 void TransformTree::UpdateLocalTransform(TransformNode* node) { | 252 void TransformTree::UpdateLocalTransform(TransformNode* node) { |
251 gfx::Transform transform = node->data.post_local; | 253 gfx::Transform transform = node->data.post_local; |
252 transform.Translate(-node->data.scroll_offset.x(), | 254 gfx::Vector2dF source_to_parent; |
253 -node->data.scroll_offset.y()); | 255 if (node->parent_id != node->data.source_node_id) { |
| 256 gfx::Transform to_parent; |
| 257 ComputeTransform(node->data.source_node_id, node->parent_id, &to_parent); |
| 258 source_to_parent = to_parent.To2dTranslation(); |
| 259 } |
| 260 transform.Translate(source_to_parent.x() - node->data.scroll_offset.x(), |
| 261 source_to_parent.y() - node->data.scroll_offset.y()); |
254 transform.PreconcatTransform(node->data.local); | 262 transform.PreconcatTransform(node->data.local); |
255 transform.PreconcatTransform(node->data.pre_local); | 263 transform.PreconcatTransform(node->data.pre_local); |
256 node->data.set_to_parent(transform); | 264 node->data.set_to_parent(transform); |
257 node->data.needs_local_transform_update = false; | 265 node->data.needs_local_transform_update = false; |
258 } | 266 } |
259 | 267 |
260 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node, | 268 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node, |
261 TransformNode* parent_node, | 269 TransformNode* parent_node, |
262 TransformNode* target_node) { | 270 TransformNode* target_node) { |
263 if (!parent_node) { | 271 if (!parent_node) { |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 node->data.from_screen.matrix().postTranslate(-translation.x(), | 357 node->data.from_screen.matrix().postTranslate(-translation.x(), |
350 -translation.y(), 0); | 358 -translation.y(), 0); |
351 | 359 |
352 node->data.scroll_snap = translation; | 360 node->data.scroll_snap = translation; |
353 } | 361 } |
354 | 362 |
355 PropertyTrees::PropertyTrees() : needs_rebuild(true) { | 363 PropertyTrees::PropertyTrees() : needs_rebuild(true) { |
356 } | 364 } |
357 | 365 |
358 } // namespace cc | 366 } // namespace cc |
OLD | NEW |