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

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

Issue 1106013002: cc: Fix property tree position updates when rebuilding is skipped (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add test Created 5 years, 8 months 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 <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
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
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
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
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
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