diff options
Diffstat (limited to 'Source/WebCore/rendering/RenderBox.cpp')
| -rw-r--r-- | Source/WebCore/rendering/RenderBox.cpp | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/Source/WebCore/rendering/RenderBox.cpp b/Source/WebCore/rendering/RenderBox.cpp index 565e3c96b..04ff3dbe3 100644 --- a/Source/WebCore/rendering/RenderBox.cpp +++ b/Source/WebCore/rendering/RenderBox.cpp @@ -44,6 +44,7 @@ #include "RenderBoxRegionInfo.h" #include "RenderFlexibleBox.h" #include "RenderFlowThread.h" +#include "RenderGeometryMap.h" #include "RenderInline.h" #include "RenderLayer.h" #include "RenderPart.h" @@ -437,6 +438,7 @@ void RenderBox::updateLayerTransform() IntRect RenderBox::absoluteContentBox() const { + // This is wrong with transforms and flipped writing modes. IntRect rect = pixelSnappedIntRect(contentBoxRect()); FloatPoint absPos = localToAbsolute(FloatPoint()); rect.move(absPos.x(), absPos.y()); @@ -1315,6 +1317,46 @@ void RenderBox::mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool o->mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState, DoNotApplyContainerFlip, wasFixed); } +const RenderObject* RenderBox::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const +{ + ASSERT(ancestorToStopAt != this); + + bool ancestorSkipped; + RenderObject* container = this->container(ancestorToStopAt, &ancestorSkipped); + if (!container) + return 0; + + bool isFixedPos = style()->position() == FixedPosition; + bool hasTransform = hasLayer() && layer()->transform(); + + LayoutSize adjustmentForSkippedAncestor; + if (ancestorSkipped) { + // There can't be a transform between repaintContainer and o, because transforms create containers, so it should be safe + // to just subtract the delta between the ancestor and o. + adjustmentForSkippedAncestor = -ancestorToStopAt->offsetFromAncestorContainer(container); + } + + bool offsetDependsOnPoint = false; + LayoutSize containerOffset = offsetFromContainer(container, LayoutPoint(), &offsetDependsOnPoint); + + if (container->isRenderFlowThread()) + offsetDependsOnPoint = true; + + bool preserve3D = container->style()->preserves3D() || style()->preserves3D(); + if (shouldUseTransformFromContainer(container)) { + TransformationMatrix t; + getTransformFromContainer(container, containerOffset, t); + t.translateRight(adjustmentForSkippedAncestor.width(), adjustmentForSkippedAncestor.height()); + + geometryMap.push(this, t, preserve3D, offsetDependsOnPoint, isFixedPos, hasTransform); + } else { + containerOffset += adjustmentForSkippedAncestor; + geometryMap.push(this, containerOffset, preserve3D, offsetDependsOnPoint, isFixedPos, hasTransform); + } + + return ancestorSkipped ? ancestorToStopAt : container; +} + void RenderBox::mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState& transformState) const { // We don't expect absoluteToLocal() to be called during layout (yet) @@ -1332,7 +1374,7 @@ void RenderBox::mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, Transfor RenderBoxModelObject::mapAbsoluteToLocalPoint(fixed, useTransforms, transformState); } -LayoutSize RenderBox::offsetFromContainer(RenderObject* o, const LayoutPoint& point) const +LayoutSize RenderBox::offsetFromContainer(RenderObject* o, const LayoutPoint& point, bool* offsetDependsOnPoint) const { ASSERT(o == container()); @@ -1350,6 +1392,9 @@ LayoutSize RenderBox::offsetFromContainer(RenderObject* o, const LayoutPoint& po offset = toLayoutSize(block->flipForWritingModeIncludingColumns(toLayoutPoint(offset))); o->adjustForColumns(offset, columnPoint); offset = block->flipForWritingMode(offset); + + if (offsetDependsOnPoint) + *offsetDependsOnPoint = true; } else offset += topLeftLocationOffset(); } @@ -3766,7 +3811,7 @@ LayoutRect RenderBox::layoutOverflowRectForPropagation(RenderStyle* parentStyle) rect = layer()->currentTransform().mapRect(rect); if (isRelPositioned()) - rect.move(relativePositionOffsetX(), relativePositionOffsetY()); + rect.move(relativePositionOffset()); // Now we need to flip back. flipForWritingMode(rect); |
