Chromium Code Reviews| Index: Source/core/rendering/RenderBoxModelObject.cpp |
| diff --git a/Source/core/rendering/RenderBoxModelObject.cpp b/Source/core/rendering/RenderBoxModelObject.cpp |
| index a8ec0f988585e482f412c54dae619a0e3637073d..6e466961a429605ebfdf31c64d4a2f63f0366261 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,42 @@ 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 isFixedPos = !isRenderInline() && style()->position() == FixedPosition; |
|
esprehn
2013/06/17 23:56:45
isRenderInline is virtual, and now you call it twi
eae
2013/06/18 00:06:59
Both isRenderInline() and style() are marked as co
|
| + bool hasTransform = !isRenderInline() && 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 |