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

Side by Side Diff: cc/trees/property_tree_builder.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.cc ('k') | cc/trees/property_tree_unittest.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 "cc/trees/property_tree_builder.h" 5 #include "cc/trees/property_tree_builder.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 9
10 #include "cc/base/math_util.h" 10 #include "cc/base/math_util.h"
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 Animation::TRANSFORM); 178 Animation::TRANSFORM);
179 179
180 const bool has_surface = !!layer->render_surface(); 180 const bool has_surface = !!layer->render_surface();
181 181
182 bool requires_node = is_root || is_scrollable || has_significant_transform || 182 bool requires_node = is_root || is_scrollable || has_significant_transform ||
183 has_potentially_animated_transform || has_surface || 183 has_potentially_animated_transform || has_surface ||
184 is_page_scale_application_layer; 184 is_page_scale_application_layer;
185 185
186 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); 186 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer);
187 187
188 gfx::Vector2dF parent_offset; 188 int parent_index = 0;
189 if (transform_parent)
190 parent_index = transform_parent->transform_tree_index();
191
192 int source_index = parent_index;
193
194 gfx::Vector2dF source_offset;
189 if (transform_parent) { 195 if (transform_parent) {
190 if (layer->scroll_parent()) { 196 if (layer->scroll_parent()) {
191 gfx::Transform to_parent;
192 LayerType* source = layer->parent(); 197 LayerType* source = layer->parent();
193 parent_offset += source->offset_to_transform_parent(); 198 source_offset += source->offset_to_transform_parent();
194 data_from_ancestor.transform_tree->ComputeTransform( 199 source_index = source->transform_tree_index();
195 source->transform_tree_index(),
196 transform_parent->transform_tree_index(), &to_parent);
197 parent_offset += to_parent.To2dTranslation();
198 } else if (!is_fixed) { 200 } else if (!is_fixed) {
199 parent_offset = transform_parent->offset_to_transform_parent(); 201 source_offset = transform_parent->offset_to_transform_parent();
200 } else { 202 } else {
201 if (data_from_ancestor.transform_tree_parent != 203 if (data_from_ancestor.transform_tree_parent !=
202 data_from_ancestor.transform_fixed_parent) { 204 data_from_ancestor.transform_fixed_parent) {
203 gfx::Vector2dF fixed_offset = data_from_ancestor.transform_tree_parent 205 source_offset = data_from_ancestor.transform_tree_parent
204 ->offset_to_transform_parent(); 206 ->offset_to_transform_parent();
205 gfx::Transform parent_to_parent; 207 source_index =
206 data_from_ancestor.transform_tree->ComputeTransform( 208 data_from_ancestor.transform_tree_parent->transform_tree_index();
207 data_from_ancestor.transform_tree_parent->transform_tree_index(),
208 data_from_ancestor.transform_fixed_parent->transform_tree_index(),
209 &parent_to_parent);
210
211 fixed_offset += parent_to_parent.To2dTranslation();
212 parent_offset += fixed_offset;
213 } 209 }
214 parent_offset += data_from_ancestor.scroll_compensation_adjustment; 210 source_offset += data_from_ancestor.scroll_compensation_adjustment;
215 } 211 }
216 } 212 }
217 213
218 if (layer->IsContainerForFixedPositionLayers() || is_root) 214 if (layer->IsContainerForFixedPositionLayers() || is_root)
219 data_for_children->transform_fixed_parent = layer; 215 data_for_children->transform_fixed_parent = layer;
220 data_for_children->transform_tree_parent = layer; 216 data_for_children->transform_tree_parent = layer;
221 217
222 if (layer->IsContainerForFixedPositionLayers() || is_fixed) 218 if (layer->IsContainerForFixedPositionLayers() || is_fixed)
223 data_for_children->scroll_compensation_adjustment = gfx::Vector2dF(); 219 data_for_children->scroll_compensation_adjustment = gfx::Vector2dF();
224 220
225 if (!requires_node) { 221 if (!requires_node) {
226 data_for_children->should_flatten |= layer->should_flatten_transform(); 222 data_for_children->should_flatten |= layer->should_flatten_transform();
227 gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() + 223 gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() +
228 layer->transform().To2dTranslation(); 224 layer->transform().To2dTranslation();
229 layer->set_offset_to_transform_parent(parent_offset + local_offset); 225 gfx::Vector2dF source_to_parent;
226 if (source_index != parent_index) {
227 gfx::Transform to_parent;
228 data_from_ancestor.transform_tree->ComputeTransform(
229 source_index, parent_index, &to_parent);
230 source_to_parent = to_parent.To2dTranslation();
231 }
232 layer->set_offset_to_transform_parent(source_offset + source_to_parent +
233 local_offset);
230 layer->set_should_flatten_transform_from_property_tree( 234 layer->set_should_flatten_transform_from_property_tree(
231 data_from_ancestor.should_flatten); 235 data_from_ancestor.should_flatten);
232 layer->set_transform_tree_index(transform_parent->transform_tree_index()); 236 layer->set_transform_tree_index(parent_index);
233 return false; 237 return false;
234 } 238 }
235 239
236 int parent_index = 0;
237 if (transform_parent)
238 parent_index = transform_parent->transform_tree_index();
239
240 data_for_children->transform_tree->Insert(TransformNode(), parent_index); 240 data_for_children->transform_tree->Insert(TransformNode(), parent_index);
241 241
242 TransformNode* node = data_for_children->transform_tree->back(); 242 TransformNode* node = data_for_children->transform_tree->back();
243 layer->set_transform_tree_index(node->id); 243 layer->set_transform_tree_index(node->id);
244 244
245 node->data.scrolls = is_scrollable; 245 node->data.scrolls = is_scrollable;
246 node->data.flattens_inherited_transform = data_for_children->should_flatten; 246 node->data.flattens_inherited_transform = data_for_children->should_flatten;
247 247
248 // Surfaces inherently flatten transforms. 248 // Surfaces inherently flatten transforms.
249 data_for_children->should_flatten = 249 data_for_children->should_flatten =
(...skipping 19 matching lines...) Expand all
269 node->data.layer_scale_factor = data_from_ancestor.device_scale_factor; 269 node->data.layer_scale_factor = data_from_ancestor.device_scale_factor;
270 if (data_from_ancestor.in_subtree_of_page_scale_application_layer) 270 if (data_from_ancestor.in_subtree_of_page_scale_application_layer)
271 node->data.layer_scale_factor *= data_from_ancestor.page_scale_factor; 271 node->data.layer_scale_factor *= data_from_ancestor.page_scale_factor;
272 } 272 }
273 273
274 if (is_root) { 274 if (is_root) {
275 node->data.post_local.Scale(post_local_scale_factor, 275 node->data.post_local.Scale(post_local_scale_factor,
276 post_local_scale_factor); 276 post_local_scale_factor);
277 } else { 277 } else {
278 node->data.post_local_scale_factor = post_local_scale_factor; 278 node->data.post_local_scale_factor = post_local_scale_factor;
279 node->data.parent_offset = parent_offset; 279 node->data.source_offset = source_offset;
280 node->data.source_node_id = source_index;
280 node->data.update_post_local_transform(layer->position(), 281 node->data.update_post_local_transform(layer->position(),
281 layer->transform_origin()); 282 layer->transform_origin());
282 } 283 }
283 284
284 if (!layer->scroll_parent()) { 285 if (!layer->scroll_parent()) {
285 node->data.scroll_offset = 286 node->data.scroll_offset =
286 gfx::ScrollOffsetToVector2dF(layer->CurrentScrollOffset()); 287 gfx::ScrollOffsetToVector2dF(layer->CurrentScrollOffset());
287 } 288 }
288 289
289 node->data.local = layer->transform(); 290 node->data.local = layer->transform();
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 float device_scale_factor, 445 float device_scale_factor,
445 const gfx::Rect& viewport, 446 const gfx::Rect& viewport,
446 const gfx::Transform& device_transform, 447 const gfx::Transform& device_transform,
447 PropertyTrees* property_trees) { 448 PropertyTrees* property_trees) {
448 BuildPropertyTreesTopLevelInternal( 449 BuildPropertyTreesTopLevelInternal(
449 root_layer, page_scale_layer, page_scale_factor, device_scale_factor, 450 root_layer, page_scale_layer, page_scale_factor, device_scale_factor,
450 viewport, device_transform, property_trees); 451 viewport, device_transform, property_trees);
451 } 452 }
452 453
453 } // namespace cc 454 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree.cc ('k') | cc/trees/property_tree_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698