Index: Source/core/rendering/RenderBoxModelObject.cpp |
diff --git a/Source/core/rendering/RenderBoxModelObject.cpp b/Source/core/rendering/RenderBoxModelObject.cpp |
index caef81861c47db979ac5417313a251fb3679192e..6d61f12ed719cfa21322d258cc432b77a597d5c8 100644 |
--- a/Source/core/rendering/RenderBoxModelObject.cpp |
+++ b/Source/core/rendering/RenderBoxModelObject.cpp |
@@ -730,7 +730,7 @@ void RenderBoxModelObject::paintFillLayerExtended(const PaintInfo& paintInfo, co |
// no progressive loading of the background image |
if (shouldPaintBackgroundImage) { |
BackgroundImageGeometry geometry; |
- calculateBackgroundImageGeometry(bgLayer, scrolledPaintRect, geometry, backgroundObject); |
+ calculateBackgroundImageGeometry(paintInfo.paintContainer(), bgLayer, scrolledPaintRect, geometry, backgroundObject); |
geometry.clip(paintInfo.rect); |
if (!geometry.destRect().isEmpty()) { |
CompositeOperator compositeOp = op == CompositeSourceOver ? bgLayer->composite() : op; |
@@ -996,8 +996,8 @@ static inline int getSpace(int areaSize, int tileSize) |
return space; |
} |
-void RenderBoxModelObject::calculateBackgroundImageGeometry(const FillLayer* fillLayer, const LayoutRect& paintRect, |
- BackgroundImageGeometry& geometry, RenderObject* backgroundObject) |
+void RenderBoxModelObject::calculateBackgroundImageGeometry(const RenderLayerModelObject* paintContainer, const FillLayer* fillLayer, const LayoutRect& paintRect, |
+ BackgroundImageGeometry& geometry, RenderObject* backgroundObject) const |
{ |
LayoutUnit left = 0; |
LayoutUnit top = 0; |
@@ -1006,6 +1006,7 @@ void RenderBoxModelObject::calculateBackgroundImageGeometry(const FillLayer* fil |
// Determine the background positioning area and set destRect to the background painting area. |
// destRect will be adjusted later if the background is non-repeating. |
+ // FIXME: transforms spec says that fixed backgrounds behave like scroll inside transforms. |
bool fixedAttachment = fillLayer->attachment() == FixedBackgroundAttachment; |
#if ENABLE(FAST_MOBILE_SCROLLING) |
@@ -1047,17 +1048,24 @@ void RenderBoxModelObject::calculateBackgroundImageGeometry(const FillLayer* fil |
} else |
positioningAreaSize = pixelSnappedIntSize(paintRect.size() - LayoutSize(left + right, top + bottom), paintRect.location()); |
} else { |
+ geometry.setHasNonLocalGeometry(); |
+ |
IntRect viewportRect = pixelSnappedIntRect(viewRect()); |
if (fixedBackgroundPaintsInLocalCoordinates()) |
viewportRect.setLocation(IntPoint()); |
else if (FrameView* frameView = view()->frameView()) |
viewportRect.setLocation(IntPoint(frameView->scrollOffsetForFixedPosition())); |
+ if (paintContainer) { |
+ IntPoint absoluteContainerOffset = roundedIntPoint(paintContainer->localToAbsolute(FloatPoint())); |
+ viewportRect.moveBy(-absoluteContainerOffset); |
+ } |
+ |
geometry.setDestRect(pixelSnappedIntRect(viewportRect)); |
positioningAreaSize = geometry.destRect().size(); |
} |
- RenderObject* clientForBackgroundImage = backgroundObject ? backgroundObject : this; |
+ const RenderObject* clientForBackgroundImage = backgroundObject ? backgroundObject : this; |
IntSize fillTileSize = calculateFillTileSize(fillLayer, positioningAreaSize); |
fillLayer->image()->setContainerSizeForRenderer(clientForBackgroundImage, fillTileSize, style()->effectiveZoom()); |
geometry.setTileSize(fillTileSize); |