| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "platform/graphics/compositing/PaintArtifactCompositor.h" | 5 #include "platform/graphics/compositing/PaintArtifactCompositor.h" |
| 6 | 6 |
| 7 #include "cc/layers/content_layer_client.h" | 7 #include "cc/layers/content_layer_client.h" |
| 8 #include "cc/layers/layer.h" | 8 #include "cc/layers/layer.h" |
| 9 #include "cc/layers/picture_layer.h" | 9 #include "cc/layers/picture_layer.h" |
| 10 #include "cc/playback/display_item_list.h" | 10 #include "cc/playback/display_item_list.h" |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 namespace { | 338 namespace { |
| 339 | 339 |
| 340 class PropertyTreeManager { | 340 class PropertyTreeManager { |
| 341 WTF_MAKE_NONCOPYABLE(PropertyTreeManager); | 341 WTF_MAKE_NONCOPYABLE(PropertyTreeManager); |
| 342 public: | 342 public: |
| 343 PropertyTreeManager(cc::PropertyTrees& propertyTrees, cc::Layer* rootLayer) | 343 PropertyTreeManager(cc::PropertyTrees& propertyTrees, cc::Layer* rootLayer) |
| 344 : m_propertyTrees(propertyTrees) | 344 : m_propertyTrees(propertyTrees) |
| 345 , m_rootLayer(rootLayer) {} | 345 , m_rootLayer(rootLayer) {} |
| 346 | 346 |
| 347 int compositorIdForTransformNode(const TransformPaintPropertyNode*); | 347 int compositorIdForTransformNode(const TransformPaintPropertyNode*); |
| 348 int compositorIdForClipNode(const ClipPaintPropertyNode*); |
| 348 | 349 |
| 349 private: | 350 private: |
| 350 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree;
} | 351 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree;
} |
| 352 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; } |
| 351 | 353 |
| 352 // Property trees which should be updated by the manager. | 354 // Property trees which should be updated by the manager. |
| 353 cc::PropertyTrees& m_propertyTrees; | 355 cc::PropertyTrees& m_propertyTrees; |
| 354 | 356 |
| 355 // Layer to which transform "owner" layers should be added. These will not | 357 // Layer to which transform "owner" layers should be added. These will not |
| 356 // have any actual children, but at present must exist in the tree. | 358 // have any actual children, but at present must exist in the tree. |
| 357 cc::Layer* m_rootLayer; | 359 cc::Layer* m_rootLayer; |
| 358 | 360 |
| 359 // Map from Blink-side transform nodes to cc transform node indices. | 361 // Maps from Blink-side property tree nodes to cc property node indices. |
| 360 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap; | 362 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap; |
| 363 HashMap<const ClipPaintPropertyNode*, int> m_clipNodeMap; |
| 361 }; | 364 }; |
| 362 | 365 |
| 363 int PropertyTreeManager::compositorIdForTransformNode(const TransformPaintProper
tyNode* transformNode) | 366 int PropertyTreeManager::compositorIdForTransformNode(const TransformPaintProper
tyNode* transformNode) |
| 364 { | 367 { |
| 365 if (!transformNode) | 368 if (!transformNode) |
| 366 return kSecondaryRootNodeId; | 369 return kSecondaryRootNodeId; |
| 367 | 370 |
| 368 auto it = m_transformNodeMap.find(transformNode); | 371 auto it = m_transformNodeMap.find(transformNode); |
| 369 if (it != m_transformNodeMap.end()) | 372 if (it != m_transformNodeMap.end()) |
| 370 return it->value; | 373 return it->value; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 392 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); | 395 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
| 393 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); | 396 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 394 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 397 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 395 | 398 |
| 396 auto result = m_transformNodeMap.set(transformNode, id); | 399 auto result = m_transformNodeMap.set(transformNode, id); |
| 397 DCHECK(result.isNewEntry); | 400 DCHECK(result.isNewEntry); |
| 398 transformTree().set_needs_update(true); | 401 transformTree().set_needs_update(true); |
| 399 return id; | 402 return id; |
| 400 } | 403 } |
| 401 | 404 |
| 405 int PropertyTreeManager::compositorIdForClipNode(const ClipPaintPropertyNode* cl
ipNode) |
| 406 { |
| 407 if (!clipNode) |
| 408 return kSecondaryRootNodeId; |
| 409 |
| 410 auto it = m_clipNodeMap.find(clipNode); |
| 411 if (it != m_clipNodeMap.end()) |
| 412 return it->value; |
| 413 |
| 414 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); |
| 415 int parentId = compositorIdForClipNode(clipNode->parent()); |
| 416 int id = clipTree().Insert(cc::ClipNode(), parentId); |
| 417 |
| 418 cc::ClipNode& compositorNode = *clipTree().Node(id); |
| 419 compositorNode.owner_id = dummyLayer->id(); |
| 420 |
| 421 // TODO(jbroman): Don't discard rounded corners. |
| 422 compositorNode.data.clip = clipNode->clipRect().rect(); |
| 423 compositorNode.data.transform_id = compositorIdForTransformNode(clipNode->lo
calTransformSpace()); |
| 424 compositorNode.data.target_id = kRealRootNodeId; |
| 425 compositorNode.data.applies_local_clip = true; |
| 426 compositorNode.data.layers_are_clipped = true; |
| 427 compositorNode.data.layers_are_clipped_when_surfaces_disabled = true; |
| 428 |
| 429 m_rootLayer->AddChild(dummyLayer); |
| 430 dummyLayer->SetTransformTreeIndex(compositorNode.data.transform_id); |
| 431 dummyLayer->SetClipTreeIndex(id); |
| 432 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
| 433 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 434 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 435 |
| 436 auto result = m_clipNodeMap.set(clipNode, id); |
| 437 DCHECK(result.isNewEntry); |
| 438 clipTree().set_needs_update(true); |
| 439 return id; |
| 440 } |
| 441 |
| 402 } // namespace | 442 } // namespace |
| 403 | 443 |
| 404 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr
tifact) | 444 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr
tifact) |
| 405 { | 445 { |
| 406 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); | 446 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); |
| 407 | 447 |
| 408 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id()); | 448 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id()); |
| 409 m_rootLayer->RemoveAllChildren(); | 449 m_rootLayer->RemoveAllChildren(); |
| 410 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 450 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 411 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); | 451 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); |
| 412 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); | 452 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); |
| 413 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); | 453 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
| 414 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId); | 454 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 415 | 455 |
| 416 PropertyTreeManager propertyTreeManager(*host->property_trees(), m_rootLayer
.get()); | 456 PropertyTreeManager propertyTreeManager(*host->property_trees(), m_rootLayer
.get()); |
| 417 m_contentLayerClients.clear(); | 457 m_contentLayerClients.clear(); |
| 418 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); | 458 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); |
| 419 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { | 459 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { |
| 420 gfx::Vector2dF layerOffset; | 460 gfx::Vector2dF layerOffset; |
| 421 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint
Chunk, layerOffset); | 461 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint
Chunk, layerOffset); |
| 422 | 462 |
| 423 int transformId = propertyTreeManager.compositorIdForTransformNode(paint
Chunk.properties.transform.get()); | 463 int transformId = propertyTreeManager.compositorIdForTransformNode(paint
Chunk.properties.transform.get()); |
| 464 int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.prop
erties.clip.get()); |
| 465 |
| 424 layer->set_offset_to_transform_parent(layerOffset); | 466 layer->set_offset_to_transform_parent(layerOffset); |
| 425 | 467 |
| 426 m_rootLayer->AddChild(layer); | 468 m_rootLayer->AddChild(layer); |
| 427 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 469 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 428 layer->SetTransformTreeIndex(transformId); | 470 layer->SetTransformTreeIndex(transformId); |
| 429 layer->SetClipTreeIndex(kSecondaryRootNodeId); | 471 layer->SetClipTreeIndex(clipId); |
| 430 layer->SetEffectTreeIndex(kSecondaryRootNodeId); | 472 layer->SetEffectTreeIndex(kSecondaryRootNodeId); |
| 431 layer->SetScrollTreeIndex(kRealRootNodeId); | 473 layer->SetScrollTreeIndex(kRealRootNodeId); |
| 432 | 474 |
| 433 if (m_extraDataForTestingEnabled) | 475 if (m_extraDataForTestingEnabled) |
| 434 m_extraDataForTesting->contentLayers.append(layer); | 476 m_extraDataForTesting->contentLayers.append(layer); |
| 435 } | 477 } |
| 436 | 478 |
| 437 // Mark the property trees as having been rebuilt. | 479 // Mark the property trees as having been rebuilt. |
| 438 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; | 480 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; |
| 439 host->property_trees()->needs_rebuild = false; | 481 host->property_trees()->needs_rebuild = false; |
| 440 } | 482 } |
| 441 | 483 |
| 442 } // namespace blink | 484 } // namespace blink |
| OLD | NEW |