| Index: Source/core/rendering/RenderBoxModelObject.cpp
|
| diff --git a/Source/core/rendering/RenderBoxModelObject.cpp b/Source/core/rendering/RenderBoxModelObject.cpp
|
| index a8ec0f988585e482f412c54dae619a0e3637073d..7bc385f24adda9e9a3622c5a908cb569a665ee54 100644
|
| --- a/Source/core/rendering/RenderBoxModelObject.cpp
|
| +++ b/Source/core/rendering/RenderBoxModelObject.cpp
|
| @@ -36,6 +36,7 @@
|
| #include "core/platform/graphics/transforms/TransformState.h"
|
| #include "core/rendering/ImageQualityController.h"
|
| #include "core/rendering/RenderBlock.h"
|
| +#include "core/rendering/RenderGeometryMap.h"
|
| #include "core/rendering/RenderInline.h"
|
| #include "core/rendering/RenderLayer.h"
|
| #include "core/rendering/RenderLayerBacking.h"
|
| @@ -2664,6 +2665,43 @@ void RenderBoxModelObject::mapAbsoluteToLocalPoint(MapCoordinatesFlags mode, Tra
|
| transformState.move(containerOffset.width(), containerOffset.height(), preserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransform);
|
| }
|
|
|
| +const RenderObject* RenderBoxModelObject::pushMappingToContainer(const RenderLayerModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const
|
| +{
|
| + ASSERT(ancestorToStopAt != this);
|
| +
|
| + bool ancestorSkipped;
|
| + RenderObject* container = this->container(ancestorToStopAt, &ancestorSkipped);
|
| + if (!container)
|
| + return 0;
|
| +
|
| + bool isInline = isRenderInline();
|
| + bool isFixedPos = !isInline && style()->position() == FixedPosition;
|
| + bool hasTransform = !isInline && 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);
|
| +
|
| + 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 RenderBoxModelObject::moveChildTo(RenderBoxModelObject* toBoxModelObject, RenderObject* child, RenderObject* beforeChild, bool fullRemoveInsert)
|
| {
|
| // We assume that callers have cleared their positioned objects list for child moves (!fullRemoveInsert) so the
|
|
|