summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderBox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/RenderBox.cpp')
-rw-r--r--Source/WebCore/rendering/RenderBox.cpp49
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);