Index: third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp |
index 5e552c2b831d41bcbec65d4804ad153d25362798..1e955955282fb9d1c35a009164d3c44b621af452 100644 |
--- a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp |
@@ -122,14 +122,19 @@ static gfx::Transform transformToTransformSpace(const TransformPaintPropertyNode |
TransformationMatrix localMatrix = currentSpace->matrix(); |
localMatrix.applyTransformOrigin(currentSpace->origin()); |
matrix = localMatrix * matrix; |
- currentSpace = currentSpace->parent(); |
+ currentSpace = currentSpace->nonIsolationParent(); |
} |
return gfx::Transform(TransformationMatrix::toSkMatrix44(matrix)); |
} |
const TransformPaintPropertyNode* localTransformSpace(const ClipPaintPropertyNode* clip) |
{ |
- return clip ? clip->localTransformSpace() : nullptr; |
+ if (!clip) |
+ return nullptr; |
+ DCHECK(!clip->isIsolationNode()); |
+ if (const TransformPaintPropertyNode* transform = clip->localTransformSpace()) |
+ return transform->nonIsolationNode(); |
+ return nullptr; |
} |
scoped_refptr<cc::Layer> createClipLayer(const ClipPaintPropertyNode* node) |
@@ -144,11 +149,12 @@ scoped_refptr<cc::Layer> createClipLayer(const ClipPaintPropertyNode* node) |
// TODO(jbroman): This assumes that the transform space of this node's |
// parent is an ancestor of this node's transform space. That's not |
// necessarily true, and this should be fixed. crbug.com/597156 |
- gfx::Transform transform = transformToTransformSpace(localTransformSpace(node), localTransformSpace(node->parent())); |
+ const ClipPaintPropertyNode* parentClip = node->nonIsolationParent(); |
+ gfx::Transform transform = transformToTransformSpace(localTransformSpace(node), localTransformSpace(parentClip)); |
gfx::Vector2dF offset = clipRect.OffsetFromOrigin(); |
transform.Translate(offset.x(), offset.y()); |
- if (node->parent()) { |
- FloatPoint offsetDueToParentClipOffset = node->parent()->clipRect().rect().location(); |
+ if (parentClip) { |
+ FloatPoint offsetDueToParentClipOffset = parentClip->clipRect().rect().location(); |
gfx::Transform undoClipOffset; |
undoClipOffset.Translate(-offsetDueToParentClipOffset.x(), -offsetDueToParentClipOffset.y()); |
transform.ConcatTransform(undoClipOffset); |
@@ -192,7 +198,7 @@ public: |
if (childLayer) |
clipLayer->AddChild(std::move(childLayer)); |
childLayer = std::move(clipLayer); |
- clip = clip->parent(); |
+ clip = clip->nonIsolationParent(); |
} while (ancestor != clip); |
ancestorClipLayer->AddChild(std::move(childLayer)); |
@@ -288,17 +294,18 @@ void PaintArtifactCompositor::update(const PaintArtifact& paintArtifact) |
m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); |
ClipLayerManager clipLayerManager(m_rootLayer.get()); |
for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { |
- cc::Layer* parent = clipLayerManager.switchToNewClipLayer(paintChunk.properties.clip.get()); |
+ const ClipPaintPropertyNode* clip = paintChunk.properties.clip->nonIsolationNode(); |
+ cc::Layer* parent = clipLayerManager.switchToNewClipLayer(clip); |
gfx::Vector2dF layerOffset; |
scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paintChunk, layerOffset); |
// TODO(jbroman): Same as above. This assumes the transform space of the current clip is |
// an ancestor of the chunk. It is not necessarily true. crbug.com/597156 |
- gfx::Transform transform = transformToTransformSpace(paintChunk.properties.transform.get(), localTransformSpace(paintChunk.properties.clip.get())); |
+ gfx::Transform transform = transformToTransformSpace(paintChunk.properties.transform->nonIsolationNode(), localTransformSpace(clip)); |
transform.Translate(layerOffset.x(), layerOffset.y()); |
// If a clip was applied, its origin needs to be cancelled out in |
// this transform. |
- if (const auto* clip = paintChunk.properties.clip.get()) { |
+ if (clip) { |
FloatPoint offsetDueToClipOffset = clip->clipRect().rect().location(); |
gfx::Transform undoClipOffset; |
undoClipOffset.Translate(-offsetDueToClipOffset.x(), -offsetDueToClipOffset.y()); |
@@ -400,7 +407,7 @@ int PropertyTreeManager::compositorIdForTransformNode(const TransformPaintProper |
return it->value; |
scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); |
- int parentId = compositorIdForTransformNode(transformNode->parent()); |
+ int parentId = compositorIdForTransformNode(transformNode->nonIsolationParent()); |
int id = transformTree().Insert(cc::TransformNode(), parentId); |
cc::TransformNode& compositorNode = *transformTree().Node(id); |
@@ -439,7 +446,7 @@ int PropertyTreeManager::compositorIdForClipNode(const ClipPaintPropertyNode* cl |
return it->value; |
scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); |
- int parentId = compositorIdForClipNode(clipNode->parent()); |
+ int parentId = compositorIdForClipNode(clipNode->nonIsolationParent()); |
int id = clipTree().Insert(cc::ClipNode(), parentId); |
cc::ClipNode& compositorNode = *clipTree().Node(id); |
@@ -447,7 +454,7 @@ int PropertyTreeManager::compositorIdForClipNode(const ClipPaintPropertyNode* cl |
// TODO(jbroman): Don't discard rounded corners. |
compositorNode.clip = clipNode->clipRect().rect(); |
- compositorNode.transform_id = compositorIdForTransformNode(clipNode->localTransformSpace()); |
+ compositorNode.transform_id = compositorIdForTransformNode(localTransformSpace(clipNode)); |
compositorNode.target_transform_id = kRealRootNodeId; |
compositorNode.applies_local_clip = true; |
compositorNode.layers_are_clipped = true; |
@@ -494,7 +501,7 @@ const EffectPaintPropertyNode* lowestCommonAncestor(const EffectPaintPropertyNod |
nodeA = nodeA->parent(); |
nodeB = nodeB->parent(); |
} |
- return nodeA; |
+ return nodeA ? nodeA->nonIsolationNode() : nullptr; |
} |
int PropertyTreeManager::switchToEffectNode(const EffectPaintPropertyNode& nextEffect) |
@@ -518,8 +525,8 @@ void PropertyTreeManager::buildEffectNodesRecursively(const EffectPaintPropertyN |
return; |
DCHECK(nextEffect); |
- buildEffectNodesRecursively(nextEffect->parent()); |
- DCHECK_EQ(nextEffect->parent(), currentEffectNode()); |
+ buildEffectNodesRecursively(nextEffect->nonIsolationParent()); |
+ DCHECK_EQ(nextEffect->nonIsolationParent(), currentEffectNode()); |
#if DCHECK_IS_ON() |
DCHECK(!m_effectNodesConverted.contains(nextEffect)) << "Malformed paint artifact. Paint chunks under the same effect should be contiguous."; |
@@ -572,9 +579,9 @@ void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr |
gfx::Vector2dF layerOffset; |
scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paintChunk, layerOffset); |
- int transformId = propertyTreeManager.compositorIdForTransformNode(paintChunk.properties.transform.get()); |
- int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.properties.clip.get()); |
- int effectId = propertyTreeManager.switchToEffectNode(*paintChunk.properties.effect.get()); |
+ int transformId = propertyTreeManager.compositorIdForTransformNode(paintChunk.properties.transform->nonIsolationNode()); |
+ int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.properties.clip->nonIsolationNode()); |
+ int effectId = propertyTreeManager.switchToEffectNode(*paintChunk.properties.effect->nonIsolationNode()); |
layer->set_offset_to_transform_parent(layerOffset); |