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

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

Issue 2609243003: [NOT FOR REVIEW]
Patch Set: Created 3 years, 11 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_builder.h ('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 <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <set> 10 #include <set>
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 data_for_children->clip_tree_parent = 449 data_for_children->clip_tree_parent =
450 data_for_children->property_trees->clip_tree.Insert(node, parent_id); 450 data_for_children->property_trees->clip_tree.Insert(node, parent_id);
451 data_for_children->property_trees->clip_id_to_index_map[layer->id()] = 451 data_for_children->property_trees->clip_id_to_index_map[layer->id()] =
452 data_for_children->clip_tree_parent; 452 data_for_children->clip_tree_parent;
453 } 453 }
454 454
455 layer->SetClipTreeIndex(data_for_children->clip_tree_parent); 455 layer->SetClipTreeIndex(data_for_children->clip_tree_parent);
456 } 456 }
457 457
458 template <typename LayerType> 458 template <typename LayerType>
459 void AddClipNodeOnlyIfLayerClipsSubtree(
460 const DataForRecursion<LayerType>& data_from_ancestor,
461 LayerType* layer,
462 bool created_render_surface,
463 bool created_transform_node,
464 DataForRecursion<LayerType>* data_for_children) {
465 const bool inherits_clip = !ClipParent(layer);
466 const int parent_id = inherits_clip ? data_from_ancestor.clip_tree_parent
467 : ClipParent(layer)->clip_tree_index();
468 ClipNode* parent =
469 data_from_ancestor.property_trees->clip_tree.Node(parent_id);
470
471 bool apply_ancestor_clip = false;
472 if (inherits_clip) {
473 apply_ancestor_clip = data_from_ancestor.apply_ancestor_clip;
474 } else {
475 const EffectNode* parent_effect_node =
476 data_from_ancestor.property_trees->effect_tree.Node(
477 ClipParent(layer)->effect_tree_index());
478 if (parent_effect_node->clip_id == parent->id) {
479 if (parent_effect_node->surface_is_clipped) {
480 // In this case, there is no clipping layer between the clip parent and
481 // its target and the target has applied the clip.
482 apply_ancestor_clip = false;
483 } else {
484 // In this case, there is no clipping layer between the clip parent and
485 // its target and the target has not applied the clip. There are two
486 // cases when a target doesn't apply clip. First, there is no ancestor
487 // clip to apply, in this case apply_ancestor_clip should be false.
488 // Second, there is a clip to apply but there are unclipped descendants,
489 // so the target cannot apply the clip. In this case,
490 // apply_ancestor_clip should be true.
491 apply_ancestor_clip = parent_effect_node->has_unclipped_descendants;
492 }
493 } else {
494 // In this case, there is a clipping layer between the clip parent and
495 // its target.
496 apply_ancestor_clip = true;
497 }
498 }
499 if (created_render_surface)
500 SetSurfaceIsClipped(data_for_children, apply_ancestor_clip, layer);
501
502 bool layer_clips_subtree = LayerClipsSubtree(layer);
503 if (layer_clips_subtree) {
504 data_for_children->apply_ancestor_clip = true;
505 }
506
507 if (!layer_clips_subtree) {
508 data_for_children->clip_tree_parent = parent_id;
509 } else {
510 LayerType* transform_parent = data_for_children->transform_tree_parent;
511 if (PositionConstraint(layer).is_fixed_position() &&
512 !created_transform_node) {
513 transform_parent = data_for_children->transform_fixed_parent;
514 }
515 ClipNode node;
516 node.clip = gfx::RectF(gfx::PointF() + layer->offset_to_transform_parent(),
517 gfx::SizeF(layer->bounds()));
518 node.transform_id = transform_parent->transform_tree_index();
519 node.owner_id = layer->id();
520 if (layer_clips_subtree)
521 node.clip_type = ClipNode::ClipType::APPLIES_LOCAL_CLIP;
522 else
523 node.clip_type = ClipNode::ClipType::NONE;
524 data_for_children->clip_tree_parent =
525 data_for_children->property_trees->clip_tree.Insert(node, parent_id);
526 data_for_children->property_trees->clip_id_to_index_map[layer->id()] =
527 data_for_children->clip_tree_parent;
528 }
529
530 layer->SetNewClipTreeIndex(data_for_children->clip_tree_parent);
531 }
532
533 template <typename LayerType>
459 static inline bool IsAtBoundaryOf3dRenderingContext(LayerType* layer) { 534 static inline bool IsAtBoundaryOf3dRenderingContext(LayerType* layer) {
460 return Parent(layer) 535 return Parent(layer)
461 ? Parent(layer)->sorting_context_id() != 536 ? Parent(layer)->sorting_context_id() !=
462 layer->sorting_context_id() 537 layer->sorting_context_id()
463 : layer->Is3dSorted(); 538 : layer->Is3dSorted();
464 } 539 }
465 540
466 static inline gfx::Point3F TransformOrigin(Layer* layer) { 541 static inline gfx::Point3F TransformOrigin(Layer* layer) {
467 return layer->transform_origin(); 542 return layer->transform_origin();
468 } 543 }
(...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after
1232 child->SetSubtreePropertyChanged(); 1307 child->SetSubtreePropertyChanged();
1233 } 1308 }
1234 1309
1235 static void SetLayerPropertyChangedForChild(LayerImpl* parent, 1310 static void SetLayerPropertyChangedForChild(LayerImpl* parent,
1236 LayerImpl* child) {} 1311 LayerImpl* child) {}
1237 1312
1238 template <typename LayerType> 1313 template <typename LayerType>
1239 void BuildPropertyTreesInternal( 1314 void BuildPropertyTreesInternal(
1240 LayerType* layer, 1315 LayerType* layer,
1241 const DataForRecursion<LayerType>& data_from_parent, 1316 const DataForRecursion<LayerType>& data_from_parent,
1242 DataForRecursionFromChild<LayerType>* data_to_parent) { 1317 DataForRecursionFromChild<LayerType>* data_to_parent,
1318 bool build_new_clip_tree) {
1243 layer->set_property_tree_sequence_number( 1319 layer->set_property_tree_sequence_number(
1244 data_from_parent.property_trees->sequence_number); 1320 data_from_parent.property_trees->sequence_number);
1245 1321
1246 DataForRecursion<LayerType> data_for_children(data_from_parent); 1322 DataForRecursion<LayerType> data_for_children(data_from_parent);
1247 1323
1248 bool created_render_surface = 1324 bool created_render_surface =
1249 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children); 1325 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children);
1250 1326
1251 if (created_render_surface) { 1327 if (created_render_surface) {
1252 data_for_children.render_target = data_for_children.effect_tree_parent; 1328 data_for_children.render_target = data_for_children.effect_tree_parent;
1253 layer->set_draw_blend_mode(SkBlendMode::kSrcOver); 1329 layer->set_draw_blend_mode(SkBlendMode::kSrcOver);
1254 } else { 1330 } else {
1255 layer->set_draw_blend_mode(BlendMode(layer)); 1331 layer->set_draw_blend_mode(BlendMode(layer));
1256 } 1332 }
1257 1333
1258 bool created_transform_node = AddTransformNodeIfNeeded( 1334 bool created_transform_node = AddTransformNodeIfNeeded(
1259 data_from_parent, layer, created_render_surface, &data_for_children); 1335 data_from_parent, layer, created_render_surface, &data_for_children);
1260 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, 1336 if (build_new_clip_tree)
1261 created_transform_node, &data_for_children); 1337 AddClipNodeOnlyIfLayerClipsSubtree(data_from_parent, layer, created_render_s urface,
1338 created_transform_node, &data_for_children);
1339 else
1340 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface,
1341 created_transform_node, &data_for_children);
1262 1342
1263 AddScrollNodeIfNeeded(data_from_parent, layer, &data_for_children); 1343 AddScrollNodeIfNeeded(data_from_parent, layer, &data_for_children);
1264 1344
1265 SetBackfaceVisibilityTransform(layer, created_transform_node); 1345 SetBackfaceVisibilityTransform(layer, created_transform_node);
1266 SetSafeOpaqueBackgroundColor(data_from_parent, layer, &data_for_children); 1346 SetSafeOpaqueBackgroundColor(data_from_parent, layer, &data_for_children);
1267 1347
1268 for (size_t i = 0; i < Children(layer).size(); ++i) { 1348 for (size_t i = 0; i < Children(layer).size(); ++i) {
1269 LayerType* current_child = ChildAt(layer, i); 1349 LayerType* current_child = ChildAt(layer, i);
1270 SetLayerPropertyChangedForChild(layer, current_child); 1350 SetLayerPropertyChangedForChild(layer, current_child);
1271 if (!ScrollParent(current_child)) { 1351 if (!ScrollParent(current_child)) {
1272 DataForRecursionFromChild<LayerType> data_from_child; 1352 DataForRecursionFromChild<LayerType> data_from_child;
1273 BuildPropertyTreesInternal(current_child, data_for_children, 1353 BuildPropertyTreesInternal(current_child, data_for_children,
1274 &data_from_child); 1354 &data_from_child, build_new_clip_tree);
1275 data_to_parent->Merge(data_from_child); 1355 data_to_parent->Merge(data_from_child);
1276 } else { 1356 } else {
1277 // The child should be included in its scroll parent's list of scroll 1357 // The child should be included in its scroll parent's list of scroll
1278 // children. 1358 // children.
1279 DCHECK(ScrollChildren(ScrollParent(current_child))->count(current_child)); 1359 DCHECK(ScrollChildren(ScrollParent(current_child))->count(current_child));
1280 } 1360 }
1281 } 1361 }
1282 1362
1283 if (ScrollChildren(layer)) { 1363 if (ScrollChildren(layer)) {
1284 for (LayerType* scroll_child : *ScrollChildren(layer)) { 1364 for (LayerType* scroll_child : *ScrollChildren(layer)) {
1285 DCHECK_EQ(ScrollParent(scroll_child), layer); 1365 DCHECK_EQ(ScrollParent(scroll_child), layer);
1286 DataForRecursionFromChild<LayerType> data_from_child; 1366 DataForRecursionFromChild<LayerType> data_from_child;
1287 DCHECK(Parent(scroll_child)); 1367 DCHECK(Parent(scroll_child));
1288 data_for_children.effect_tree_parent = 1368 data_for_children.effect_tree_parent =
1289 Parent(scroll_child)->effect_tree_index(); 1369 Parent(scroll_child)->effect_tree_index();
1290 data_for_children.render_target = 1370 data_for_children.render_target =
1291 Parent(scroll_child)->effect_tree_index(); 1371 Parent(scroll_child)->effect_tree_index();
1292 BuildPropertyTreesInternal(scroll_child, data_for_children, 1372 BuildPropertyTreesInternal(scroll_child, data_for_children,
1293 &data_from_child); 1373 &data_from_child, build_new_clip_tree);
1294 data_to_parent->Merge(data_from_child); 1374 data_to_parent->Merge(data_from_child);
1295 } 1375 }
1296 } 1376 }
1297 1377
1298 if (MaskLayer(layer)) { 1378 if (MaskLayer(layer)) {
1299 MaskLayer(layer)->set_property_tree_sequence_number( 1379 MaskLayer(layer)->set_property_tree_sequence_number(
1300 data_from_parent.property_trees->sequence_number); 1380 data_from_parent.property_trees->sequence_number);
1301 MaskLayer(layer)->set_offset_to_transform_parent( 1381 MaskLayer(layer)->set_offset_to_transform_parent(
1302 layer->offset_to_transform_parent()); 1382 layer->offset_to_transform_parent());
1303 MaskLayer(layer)->SetTransformTreeIndex(layer->transform_tree_index()); 1383 MaskLayer(layer)->SetTransformTreeIndex(layer->transform_tree_index());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1353 const LayerType* page_scale_layer, 1433 const LayerType* page_scale_layer,
1354 const LayerType* inner_viewport_scroll_layer, 1434 const LayerType* inner_viewport_scroll_layer,
1355 const LayerType* outer_viewport_scroll_layer, 1435 const LayerType* outer_viewport_scroll_layer,
1356 const LayerType* overscroll_elasticity_layer, 1436 const LayerType* overscroll_elasticity_layer,
1357 const gfx::Vector2dF& elastic_overscroll, 1437 const gfx::Vector2dF& elastic_overscroll,
1358 float page_scale_factor, 1438 float page_scale_factor,
1359 float device_scale_factor, 1439 float device_scale_factor,
1360 const gfx::Rect& viewport, 1440 const gfx::Rect& viewport,
1361 const gfx::Transform& device_transform, 1441 const gfx::Transform& device_transform,
1362 PropertyTrees* property_trees, 1442 PropertyTrees* property_trees,
1363 SkColor color) { 1443 SkColor color,
1444 bool build_new_clip_tree) {
1364 if (!property_trees->needs_rebuild) { 1445 if (!property_trees->needs_rebuild) {
1365 draw_property_utils::UpdatePageScaleFactor( 1446 draw_property_utils::UpdatePageScaleFactor(
1366 property_trees, page_scale_layer, page_scale_factor, 1447 property_trees, page_scale_layer, page_scale_factor,
1367 device_scale_factor, device_transform); 1448 device_scale_factor, device_transform);
1368 draw_property_utils::UpdateElasticOverscroll( 1449 draw_property_utils::UpdateElasticOverscroll(
1369 property_trees, overscroll_elasticity_layer, elastic_overscroll); 1450 property_trees, overscroll_elasticity_layer, elastic_overscroll);
1370 property_trees->clip_tree.SetViewportClip(gfx::RectF(viewport)); 1451 property_trees->clip_tree.SetViewportClip(gfx::RectF(viewport));
1371 float page_scale_factor_for_root = 1452 float page_scale_factor_for_root =
1372 page_scale_layer == root_layer ? page_scale_factor : 1.f; 1453 page_scale_layer == root_layer ? page_scale_factor : 1.f;
1373 property_trees->transform_tree.SetRootTransformsAndScales( 1454 property_trees->transform_tree.SetRootTransformsAndScales(
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 root_clip.resets_clip = true; 1497 root_clip.resets_clip = true;
1417 root_clip.clip_type = ClipNode::ClipType::APPLIES_LOCAL_CLIP; 1498 root_clip.clip_type = ClipNode::ClipType::APPLIES_LOCAL_CLIP;
1418 root_clip.clip = gfx::RectF(viewport); 1499 root_clip.clip = gfx::RectF(viewport);
1419 root_clip.transform_id = kRootPropertyTreeNodeId; 1500 root_clip.transform_id = kRootPropertyTreeNodeId;
1420 root_clip.target_transform_id = kRootPropertyTreeNodeId; 1501 root_clip.target_transform_id = kRootPropertyTreeNodeId;
1421 data_for_recursion.clip_tree_parent = 1502 data_for_recursion.clip_tree_parent =
1422 data_for_recursion.property_trees->clip_tree.Insert( 1503 data_for_recursion.property_trees->clip_tree.Insert(
1423 root_clip, kRootPropertyTreeNodeId); 1504 root_clip, kRootPropertyTreeNodeId);
1424 1505
1425 DataForRecursionFromChild<LayerType> data_from_child; 1506 DataForRecursionFromChild<LayerType> data_from_child;
1426 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); 1507 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child,
1508 build_new_clip_tree);
1427 property_trees->needs_rebuild = false; 1509 property_trees->needs_rebuild = false;
1428 1510
1429 // The transform tree is kept up to date as it is built, but the 1511 // The transform tree is kept up to date as it is built, but the
1430 // combined_clips stored in the clip tree and the screen_space_opacity and 1512 // combined_clips stored in the clip tree and the screen_space_opacity and
1431 // is_drawn in the effect tree aren't computed during tree building. 1513 // is_drawn in the effect tree aren't computed during tree building.
1432 property_trees->transform_tree.set_needs_update(false); 1514 property_trees->transform_tree.set_needs_update(false);
1433 property_trees->clip_tree.set_needs_update(true); 1515 property_trees->clip_tree.set_needs_update(true);
1434 property_trees->effect_tree.set_needs_update(true); 1516 property_trees->effect_tree.set_needs_update(true);
1435 property_trees->scroll_tree.set_needs_update(false); 1517 property_trees->scroll_tree.set_needs_update(false);
1436 } 1518 }
(...skipping 23 matching lines...) Expand all
1460 Layer* root_layer, 1542 Layer* root_layer,
1461 const Layer* page_scale_layer, 1543 const Layer* page_scale_layer,
1462 const Layer* inner_viewport_scroll_layer, 1544 const Layer* inner_viewport_scroll_layer,
1463 const Layer* outer_viewport_scroll_layer, 1545 const Layer* outer_viewport_scroll_layer,
1464 const Layer* overscroll_elasticity_layer, 1546 const Layer* overscroll_elasticity_layer,
1465 const gfx::Vector2dF& elastic_overscroll, 1547 const gfx::Vector2dF& elastic_overscroll,
1466 float page_scale_factor, 1548 float page_scale_factor,
1467 float device_scale_factor, 1549 float device_scale_factor,
1468 const gfx::Rect& viewport, 1550 const gfx::Rect& viewport,
1469 const gfx::Transform& device_transform, 1551 const gfx::Transform& device_transform,
1470 PropertyTrees* property_trees) { 1552 PropertyTrees* property_trees,
1553 bool build_new_clip_tree) {
1471 property_trees->is_main_thread = true; 1554 property_trees->is_main_thread = true;
1472 property_trees->is_active = false; 1555 property_trees->is_active = false;
1473 SkColor color = root_layer->GetLayerTree()->background_color(); 1556 SkColor color = root_layer->GetLayerTree()->background_color();
1474 if (SkColorGetA(color) != 255) 1557 if (SkColorGetA(color) != 255)
1475 color = SkColorSetA(color, 255); 1558 color = SkColorSetA(color, 255);
1476 BuildPropertyTreesTopLevelInternal( 1559 BuildPropertyTreesTopLevelInternal(
1477 root_layer, page_scale_layer, inner_viewport_scroll_layer, 1560 root_layer, page_scale_layer, inner_viewport_scroll_layer,
1478 outer_viewport_scroll_layer, overscroll_elasticity_layer, 1561 outer_viewport_scroll_layer, overscroll_elasticity_layer,
1479 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 1562 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
1480 device_transform, property_trees, color); 1563 device_transform, property_trees, color, build_new_clip_tree);
1481 #if DCHECK_IS_ON() 1564 #if DCHECK_IS_ON()
1482 for (auto* layer : *root_layer->GetLayerTree()) 1565 for (auto* layer : *root_layer->GetLayerTree())
1483 CheckScrollAndClipPointersForLayer(layer); 1566 CheckScrollAndClipPointersForLayer(layer);
1484 #endif 1567 #endif
1485 property_trees->ResetCachedData(); 1568 property_trees->ResetCachedData();
1486 } 1569 }
1487 1570
1488 void PropertyTreeBuilder::BuildPropertyTrees( 1571 void PropertyTreeBuilder::BuildPropertyTrees(
1489 LayerImpl* root_layer, 1572 LayerImpl* root_layer,
1490 const LayerImpl* page_scale_layer, 1573 const LayerImpl* page_scale_layer,
1491 const LayerImpl* inner_viewport_scroll_layer, 1574 const LayerImpl* inner_viewport_scroll_layer,
1492 const LayerImpl* outer_viewport_scroll_layer, 1575 const LayerImpl* outer_viewport_scroll_layer,
1493 const LayerImpl* overscroll_elasticity_layer, 1576 const LayerImpl* overscroll_elasticity_layer,
1494 const gfx::Vector2dF& elastic_overscroll, 1577 const gfx::Vector2dF& elastic_overscroll,
1495 float page_scale_factor, 1578 float page_scale_factor,
1496 float device_scale_factor, 1579 float device_scale_factor,
1497 const gfx::Rect& viewport, 1580 const gfx::Rect& viewport,
1498 const gfx::Transform& device_transform, 1581 const gfx::Transform& device_transform,
1499 PropertyTrees* property_trees) { 1582 PropertyTrees* property_trees,
1583 bool build_new_clip_tree) {
1500 property_trees->is_main_thread = false; 1584 property_trees->is_main_thread = false;
1501 property_trees->is_active = root_layer->IsActive(); 1585 property_trees->is_active = root_layer->IsActive();
1502 SkColor color = root_layer->layer_tree_impl()->background_color(); 1586 SkColor color = root_layer->layer_tree_impl()->background_color();
1503 if (SkColorGetA(color) != 255) 1587 if (SkColorGetA(color) != 255)
1504 color = SkColorSetA(color, 255); 1588 color = SkColorSetA(color, 255);
1505 BuildPropertyTreesTopLevelInternal( 1589 BuildPropertyTreesTopLevelInternal(
1506 root_layer, page_scale_layer, inner_viewport_scroll_layer, 1590 root_layer, page_scale_layer, inner_viewport_scroll_layer,
1507 outer_viewport_scroll_layer, overscroll_elasticity_layer, 1591 outer_viewport_scroll_layer, overscroll_elasticity_layer,
1508 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 1592 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
1509 device_transform, property_trees, color); 1593 device_transform, property_trees, color, build_new_clip_tree);
1510 property_trees->ResetCachedData(); 1594 property_trees->ResetCachedData();
1511 } 1595 }
1512 1596
1513 } // namespace cc 1597 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree_builder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698