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 "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |