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

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

Issue 1139573004: Reset property tree indices when layer is removed from layer tree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use sequence numbers to invalidate property tree indices. Created 5 years, 7 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') | no next file » | 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 20 matching lines...) Expand all
31 int clip_tree_parent; 31 int clip_tree_parent;
32 int opacity_tree_parent; 32 int opacity_tree_parent;
33 const LayerType* page_scale_layer; 33 const LayerType* page_scale_layer;
34 float page_scale_factor; 34 float page_scale_factor;
35 float device_scale_factor; 35 float device_scale_factor;
36 bool in_subtree_of_page_scale_application_layer; 36 bool in_subtree_of_page_scale_application_layer;
37 bool should_flatten; 37 bool should_flatten;
38 bool ancestor_clips_subtree; 38 bool ancestor_clips_subtree;
39 const gfx::Transform* device_transform; 39 const gfx::Transform* device_transform;
40 gfx::Vector2dF scroll_compensation_adjustment; 40 gfx::Vector2dF scroll_compensation_adjustment;
41 int sequence_number;
41 }; 42 };
42 43
43 template <typename LayerType> 44 template <typename LayerType>
44 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, 45 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data,
45 LayerType* layer) { 46 LayerType* layer) {
46 return layer->position_constraint().is_fixed_position() 47 return layer->position_constraint().is_fixed_position()
47 ? data.transform_fixed_parent 48 ? data.transform_fixed_parent
48 : data.transform_tree_parent; 49 : data.transform_tree_parent;
49 } 50 }
50 51
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 gfx::PointF() + layer->offset_to_transform_parent(), layer->bounds()); 142 gfx::PointF() + layer->offset_to_transform_parent(), layer->bounds());
142 node.data.transform_id = transform_parent->transform_tree_index(); 143 node.data.transform_id = transform_parent->transform_tree_index();
143 node.data.target_id = 144 node.data.target_id =
144 data_for_children->render_target->transform_tree_index(); 145 data_for_children->render_target->transform_tree_index();
145 node.owner_id = layer->id(); 146 node.owner_id = layer->id();
146 147
147 data_for_children->clip_tree_parent = 148 data_for_children->clip_tree_parent =
148 data_for_children->clip_tree->Insert(node, parent_id); 149 data_for_children->clip_tree->Insert(node, parent_id);
149 } 150 }
150 151
151 layer->set_clip_tree_index( 152 layer->SetClipTreeIndex(
152 has_unclipped_surface ? 0 : data_for_children->clip_tree_parent); 153 has_unclipped_surface ? 0 : data_for_children->clip_tree_parent);
153 154
154 // TODO(awoloszyn): Right now when we hit a node with a replica, we reset the 155 // TODO(awoloszyn): Right now when we hit a node with a replica, we reset the
155 // clip for all children since we may need to draw. We need to figure out a 156 // clip for all children since we may need to draw. We need to figure out a
156 // better way, since we will need both the clipped and unclipped versions. 157 // better way, since we will need both the clipped and unclipped versions.
157 } 158 }
158 159
159 template <typename LayerType> 160 template <typename LayerType>
160 bool AddTransformNodeIfNeeded( 161 bool AddTransformNodeIfNeeded(
161 const DataForRecursion<LayerType>& data_from_ancestor, 162 const DataForRecursion<LayerType>& data_from_ancestor,
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 if (source_index != parent_index) { 227 if (source_index != parent_index) {
227 gfx::Transform to_parent; 228 gfx::Transform to_parent;
228 data_from_ancestor.transform_tree->ComputeTransform( 229 data_from_ancestor.transform_tree->ComputeTransform(
229 source_index, parent_index, &to_parent); 230 source_index, parent_index, &to_parent);
230 source_to_parent = to_parent.To2dTranslation(); 231 source_to_parent = to_parent.To2dTranslation();
231 } 232 }
232 layer->set_offset_to_transform_parent(source_offset + source_to_parent + 233 layer->set_offset_to_transform_parent(source_offset + source_to_parent +
233 local_offset); 234 local_offset);
234 layer->set_should_flatten_transform_from_property_tree( 235 layer->set_should_flatten_transform_from_property_tree(
235 data_from_ancestor.should_flatten); 236 data_from_ancestor.should_flatten);
236 layer->set_transform_tree_index(parent_index); 237 layer->SetTransformTreeIndex(parent_index);
237 return false; 238 return false;
238 } 239 }
239 240
240 data_for_children->transform_tree->Insert(TransformNode(), parent_index); 241 data_for_children->transform_tree->Insert(TransformNode(), parent_index);
241 242
242 TransformNode* node = data_for_children->transform_tree->back(); 243 TransformNode* node = data_for_children->transform_tree->back();
243 layer->set_transform_tree_index(node->id); 244 layer->SetTransformTreeIndex(node->id);
244 245
245 node->data.scrolls = is_scrollable; 246 node->data.scrolls = is_scrollable;
246 node->data.flattens_inherited_transform = data_for_children->should_flatten; 247 node->data.flattens_inherited_transform = data_for_children->should_flatten;
247 248
248 // Surfaces inherently flatten transforms. 249 // Surfaces inherently flatten transforms.
249 data_for_children->should_flatten = 250 data_for_children->should_flatten =
250 layer->should_flatten_transform() || has_surface; 251 layer->should_flatten_transform() || has_surface;
251 node->data.target_id = 252 node->data.target_id =
252 data_from_ancestor.render_target->transform_tree_index(); 253 data_from_ancestor.render_target->transform_tree_index();
253 node->data.content_target_id = 254 node->data.content_target_id =
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 LayerType* layer, 320 LayerType* layer,
320 DataForRecursion<LayerType>* data_for_children) { 321 DataForRecursion<LayerType>* data_for_children) {
321 const bool is_root = !layer->parent(); 322 const bool is_root = !layer->parent();
322 const bool has_transparency = layer->opacity() != 1.f; 323 const bool has_transparency = layer->opacity() != 1.f;
323 const bool has_animated_opacity = IsAnimatingOpacity(layer); 324 const bool has_animated_opacity = IsAnimatingOpacity(layer);
324 bool requires_node = is_root || has_transparency || has_animated_opacity; 325 bool requires_node = is_root || has_transparency || has_animated_opacity;
325 326
326 int parent_id = data_from_ancestor.opacity_tree_parent; 327 int parent_id = data_from_ancestor.opacity_tree_parent;
327 328
328 if (!requires_node) { 329 if (!requires_node) {
329 layer->set_opacity_tree_index(parent_id); 330 layer->SetOpacityTreeIndex(parent_id);
330 data_for_children->opacity_tree_parent = parent_id; 331 data_for_children->opacity_tree_parent = parent_id;
331 return; 332 return;
332 } 333 }
333 334
334 OpacityNode node; 335 OpacityNode node;
335 node.owner_id = layer->id(); 336 node.owner_id = layer->id();
336 node.data = layer->opacity(); 337 node.data = layer->opacity();
337 data_for_children->opacity_tree_parent = 338 data_for_children->opacity_tree_parent =
338 data_for_children->opacity_tree->Insert(node, parent_id); 339 data_for_children->opacity_tree->Insert(node, parent_id);
339 layer->set_opacity_tree_index(data_for_children->opacity_tree_parent); 340 layer->SetOpacityTreeIndex(data_for_children->opacity_tree_parent);
340 } 341 }
341 342
342 template <typename LayerType> 343 template <typename LayerType>
343 void BuildPropertyTreesInternal( 344 void BuildPropertyTreesInternal(
344 LayerType* layer, 345 LayerType* layer,
345 const DataForRecursion<LayerType>& data_from_parent) { 346 const DataForRecursion<LayerType>& data_from_parent) {
347 layer->set_property_tree_sequence_number(data_from_parent.sequence_number);
346 DataForRecursion<LayerType> data_for_children(data_from_parent); 348 DataForRecursion<LayerType> data_for_children(data_from_parent);
347 if (layer->render_surface()) 349 if (layer->render_surface())
348 data_for_children.render_target = layer; 350 data_for_children.render_target = layer;
349 351
350 bool created_transform_node = 352 bool created_transform_node =
351 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children); 353 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children);
352 AddClipNodeIfNeeded(data_from_parent, layer, created_transform_node, 354 AddClipNodeIfNeeded(data_from_parent, layer, created_transform_node,
353 &data_for_children); 355 &data_for_children);
354 356
355 if (data_from_parent.opacity_tree) 357 if (data_from_parent.opacity_tree)
(...skipping 20 matching lines...) Expand all
376 } // namespace 378 } // namespace
377 379
378 template <typename LayerType> 380 template <typename LayerType>
379 void BuildPropertyTreesTopLevelInternal(LayerType* root_layer, 381 void BuildPropertyTreesTopLevelInternal(LayerType* root_layer,
380 const LayerType* page_scale_layer, 382 const LayerType* page_scale_layer,
381 float page_scale_factor, 383 float page_scale_factor,
382 float device_scale_factor, 384 float device_scale_factor,
383 const gfx::Rect& viewport, 385 const gfx::Rect& viewport,
384 const gfx::Transform& device_transform, 386 const gfx::Transform& device_transform,
385 PropertyTrees* property_trees) { 387 PropertyTrees* property_trees) {
388 property_trees->sequence_number++;
389
386 DataForRecursion<LayerType> data_for_recursion; 390 DataForRecursion<LayerType> data_for_recursion;
387 data_for_recursion.transform_tree = &property_trees->transform_tree; 391 data_for_recursion.transform_tree = &property_trees->transform_tree;
388 data_for_recursion.clip_tree = &property_trees->clip_tree; 392 data_for_recursion.clip_tree = &property_trees->clip_tree;
389 data_for_recursion.opacity_tree = &property_trees->opacity_tree; 393 data_for_recursion.opacity_tree = &property_trees->opacity_tree;
390 data_for_recursion.transform_tree_parent = nullptr; 394 data_for_recursion.transform_tree_parent = nullptr;
391 data_for_recursion.transform_fixed_parent = nullptr; 395 data_for_recursion.transform_fixed_parent = nullptr;
392 data_for_recursion.render_target = root_layer; 396 data_for_recursion.render_target = root_layer;
393 data_for_recursion.clip_tree_parent = 0; 397 data_for_recursion.clip_tree_parent = 0;
394 data_for_recursion.opacity_tree_parent = -1; 398 data_for_recursion.opacity_tree_parent = -1;
395 data_for_recursion.page_scale_layer = page_scale_layer; 399 data_for_recursion.page_scale_layer = page_scale_layer;
396 data_for_recursion.page_scale_factor = page_scale_factor; 400 data_for_recursion.page_scale_factor = page_scale_factor;
397 data_for_recursion.device_scale_factor = device_scale_factor; 401 data_for_recursion.device_scale_factor = device_scale_factor;
398 data_for_recursion.in_subtree_of_page_scale_application_layer = false; 402 data_for_recursion.in_subtree_of_page_scale_application_layer = false;
399 data_for_recursion.should_flatten = false; 403 data_for_recursion.should_flatten = false;
400 data_for_recursion.ancestor_clips_subtree = true; 404 data_for_recursion.ancestor_clips_subtree = true;
401 data_for_recursion.device_transform = &device_transform; 405 data_for_recursion.device_transform = &device_transform;
402 406
403 data_for_recursion.transform_tree->clear(); 407 data_for_recursion.transform_tree->clear();
404 data_for_recursion.clip_tree->clear(); 408 data_for_recursion.clip_tree->clear();
405 data_for_recursion.opacity_tree->clear(); 409 data_for_recursion.opacity_tree->clear();
410 data_for_recursion.sequence_number = property_trees->sequence_number;
406 411
407 ClipNode root_clip; 412 ClipNode root_clip;
408 root_clip.data.clip = viewport; 413 root_clip.data.clip = viewport;
409 root_clip.data.transform_id = 0; 414 root_clip.data.transform_id = 0;
410 data_for_recursion.clip_tree_parent = 415 data_for_recursion.clip_tree_parent =
411 data_for_recursion.clip_tree->Insert(root_clip, 0); 416 data_for_recursion.clip_tree->Insert(root_clip, 0);
412 BuildPropertyTreesInternal(root_layer, data_for_recursion); 417 BuildPropertyTreesInternal(root_layer, data_for_recursion);
413 property_trees->needs_rebuild = false; 418 property_trees->needs_rebuild = false;
414 419
415 // The transform tree is kept up-to-date as it is built, but the 420 // The transform tree is kept up-to-date as it is built, but the
(...skipping 27 matching lines...) Expand all
443 float device_scale_factor, 448 float device_scale_factor,
444 const gfx::Rect& viewport, 449 const gfx::Rect& viewport,
445 const gfx::Transform& device_transform, 450 const gfx::Transform& device_transform,
446 PropertyTrees* property_trees) { 451 PropertyTrees* property_trees) {
447 BuildPropertyTreesTopLevelInternal( 452 BuildPropertyTreesTopLevelInternal(
448 root_layer, page_scale_layer, page_scale_factor, device_scale_factor, 453 root_layer, page_scale_layer, page_scale_factor, device_scale_factor,
449 viewport, device_transform, property_trees); 454 viewport, device_transform, property_trees);
450 } 455 }
451 456
452 } // namespace cc 457 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698