Index: third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp |
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp |
index 3e2f9593c55f7ba2573bbfbb03a283ad09f74936..2349a5f4dbd2c6299cee51217c6e04e6f390714b 100644 |
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp |
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp |
@@ -805,12 +805,32 @@ static IntRect clipBox(LayoutBox& layoutObject) { |
static LayoutPoint computeOffsetFromCompositedAncestor( |
const PaintLayer* layer, |
- const PaintLayer* compositedAncestor) { |
- LayoutPoint offset = layer->visualOffsetFromAncestor(compositedAncestor); |
+ const PaintLayer* compositedAncestor, |
+ const LayoutPoint& localRepresentativePointForFragmentation) { |
+ // Add in the offset of the composited bounds from the coordinate space of |
+ // the PaintLayer, since visualOffsetFromAncestor() requires the pre-offset |
+ // input to be in the space of the PaintLayer. We also need to add in this |
+ // offset before computation of visualOffsetFromAncestor(), because it affects |
+ // fragmentation offset if compositedAncestor crosses a pagination boundary. |
+ // |
+ // Currently, visual fragmentation for composited layers is not implemented. |
+ // For fragmented contents, we paint in the logical coordinates of the flow |
+ // thread, then split the result by fragment boundary and paste each part |
+ // into each fragment's physical position. |
+ // Since composited layers don't support visual fragmentation, we have to |
+ // choose a "representative" fragment to position the painted contents. This |
+ // is where localRepresentativePointForFragmentation comes into play. |
+ // The fragment that the representative point resides in will be chosen as |
+ // the representative fragment for layer position purpose. |
+ // For layers that are not fragmented, the point doesn't affect behavior as |
+ // there is one and only one fragment. |
+ LayoutPoint offset = layer->visualOffsetFromAncestor( |
+ compositedAncestor, localRepresentativePointForFragmentation); |
if (compositedAncestor) |
offset.move(compositedAncestor->compositedLayerMapping() |
->owningLayer() |
.subpixelAccumulation()); |
+ offset.moveBy(-localRepresentativePointForFragmentation); |
return offset; |
} |
@@ -821,8 +841,8 @@ void CompositedLayerMapping::computeBoundsOfOwningLayer( |
LayoutPoint& offsetFromCompositedAncestor, |
IntPoint& snappedOffsetFromCompositedAncestor) { |
LayoutRect localRawCompositingBounds = compositedBounds(); |
- offsetFromCompositedAncestor = |
- computeOffsetFromCompositedAncestor(&m_owningLayer, compositedAncestor); |
+ offsetFromCompositedAncestor = computeOffsetFromCompositedAncestor( |
+ &m_owningLayer, compositedAncestor, localRawCompositingBounds.location()); |
snappedOffsetFromCompositedAncestor = |
IntPoint(offsetFromCompositedAncestor.x().round(), |
offsetFromCompositedAncestor.y().round()); |