| 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);
|
|
|