summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderInline.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/RenderInline.cpp')
-rw-r--r--Source/WebCore/rendering/RenderInline.cpp39
1 files changed, 38 insertions, 1 deletions
diff --git a/Source/WebCore/rendering/RenderInline.cpp b/Source/WebCore/rendering/RenderInline.cpp
index 0c88749f7..b8928161e 100644
--- a/Source/WebCore/rendering/RenderInline.cpp
+++ b/Source/WebCore/rendering/RenderInline.cpp
@@ -32,6 +32,7 @@
#include "RenderArena.h"
#include "RenderBlock.h"
#include "RenderFlowThread.h"
+#include "RenderGeometryMap.h"
#include "RenderLayer.h"
#include "RenderTheme.h"
#include "RenderView.h"
@@ -1065,7 +1066,7 @@ void RenderInline::computeRectForRepaint(RenderBoxModelObject* repaintContainer,
o->computeRectForRepaint(repaintContainer, rect, fixed);
}
-LayoutSize RenderInline::offsetFromContainer(RenderObject* container, const LayoutPoint& point) const
+LayoutSize RenderInline::offsetFromContainer(RenderObject* container, const LayoutPoint& point, bool* offsetDependsOnPoint) const
{
ASSERT(container == this->container());
@@ -1078,6 +1079,9 @@ LayoutSize RenderInline::offsetFromContainer(RenderObject* container, const Layo
if (container->hasOverflowClip())
offset -= toRenderBox(container)->scrolledContentOffset();
+ if (offsetDependsOnPoint)
+ *offsetDependsOnPoint = container->hasColumns() || (container->isBox() && container->style()->isFlippedBlocksWritingMode());
+
return offset;
}
@@ -1129,6 +1133,39 @@ void RenderInline::mapLocalToContainer(RenderBoxModelObject* repaintContainer, b
o->mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState, applyContainerFlip, wasFixed);
}
+const RenderObject* RenderInline::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const
+{
+ ASSERT(ancestorToStopAt != this);
+
+ bool ancestorSkipped;
+ RenderObject* container = this->container(ancestorToStopAt, &ancestorSkipped);
+ if (!container)
+ return 0;
+
+ 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);
+
+ bool preserve3D = container->style()->preserves3D() || style()->preserves3D();
+ if (shouldUseTransformFromContainer(container)) {
+ TransformationMatrix t;
+ getTransformFromContainer(container, containerOffset, t);
+ t.translateRight(adjustmentForSkippedAncestor.width(), adjustmentForSkippedAncestor.height()); // FIXME: right?
+ geometryMap.push(this, t, preserve3D, offsetDependsOnPoint);
+ } else {
+ containerOffset += adjustmentForSkippedAncestor;
+ geometryMap.push(this, containerOffset, preserve3D, offsetDependsOnPoint);
+ }
+
+ return ancestorSkipped ? ancestorToStopAt : container;
+}
+
void RenderInline::updateDragState(bool dragOn)
{
RenderBoxModelObject::updateDragState(dragOn);