Index: Source/core/rendering/shapes/ShapeOutsideInfo.cpp |
diff --git a/Source/core/rendering/shapes/ShapeOutsideInfo.cpp b/Source/core/rendering/shapes/ShapeOutsideInfo.cpp |
index 725a3b5aff3a8615ccbc8c79d70a7140bb570767..f269bf875874f9555f7ff4be63c404d414825454 100644 |
--- a/Source/core/rendering/shapes/ShapeOutsideInfo.cpp |
+++ b/Source/core/rendering/shapes/ShapeOutsideInfo.cpp |
@@ -274,42 +274,40 @@ bool ShapeOutsideInfo::isEnabledFor(const RenderBox& box) |
return false; |
} |
-void ShapeOutsideInfo::updateDeltasForContainingBlockLine(const RenderBlockFlow& containingBlock, const FloatingObject& floatingObject, LayoutUnit lineTop, LayoutUnit lineHeight) |
+ShapeOutsideDeltas ShapeOutsideInfo::computeDeltasForContainingBlockLine(const RenderBlockFlow& containingBlock, const FloatingObject& floatingObject, LayoutUnit lineTop, LayoutUnit lineHeight) |
{ |
ASSERT(lineHeight >= 0); |
LayoutUnit borderBoxTop = containingBlock.logicalTopForFloat(&floatingObject) + containingBlock.marginBeforeForChild(&m_renderer); |
LayoutUnit borderBoxLineTop = lineTop - borderBoxTop; |
- if (isShapeDirty() || m_borderBoxLineTop != borderBoxLineTop || m_lineHeight != lineHeight) { |
- m_borderBoxLineTop = borderBoxLineTop; |
- m_referenceBoxLineTop = borderBoxLineTop - logicalTopOffset(); |
- m_lineHeight = lineHeight; |
- |
+ if (isShapeDirty() || !m_shapeOutsideDeltas.isForLine(borderBoxLineTop, lineHeight)) { |
+ LayoutUnit referenceBoxLineTop = borderBoxLineTop - logicalTopOffset(); |
LayoutUnit floatMarginBoxWidth = containingBlock.logicalWidthForFloat(&floatingObject); |
- if (lineOverlapsShapeBounds()) { |
+ if (computedShape().lineOverlapsShapeMarginBounds(referenceBoxLineTop, lineHeight)) { |
LineSegment segment = computedShape().getExcludedInterval((borderBoxLineTop - logicalTopOffset()), std::min(lineHeight, shapeLogicalBottom() - borderBoxLineTop)); |
if (segment.isValid) { |
LayoutUnit logicalLeftMargin = containingBlock.style()->isLeftToRightDirection() ? containingBlock.marginStartForChild(&m_renderer) : containingBlock.marginEndForChild(&m_renderer); |
LayoutUnit rawLeftMarginBoxDelta = segment.logicalLeft + logicalLeftOffset() + logicalLeftMargin; |
- m_leftMarginBoxDelta = clampToLayoutUnit(rawLeftMarginBoxDelta, LayoutUnit(), floatMarginBoxWidth); |
+ LayoutUnit leftMarginBoxDelta = clampTo<LayoutUnit>(rawLeftMarginBoxDelta, LayoutUnit(), floatMarginBoxWidth); |
LayoutUnit logicalRightMargin = containingBlock.style()->isLeftToRightDirection() ? containingBlock.marginEndForChild(&m_renderer) : containingBlock.marginStartForChild(&m_renderer); |
LayoutUnit rawRightMarginBoxDelta = segment.logicalRight + logicalLeftOffset() - containingBlock.logicalWidthForChild(&m_renderer) - logicalRightMargin; |
- m_rightMarginBoxDelta = clampToLayoutUnit(rawRightMarginBoxDelta, -floatMarginBoxWidth, LayoutUnit()); |
- m_lineOverlapsShape = true; |
- return; |
+ LayoutUnit rightMarginBoxDelta = clampTo<LayoutUnit>(rawRightMarginBoxDelta, -floatMarginBoxWidth, LayoutUnit()); |
+ |
+ m_shapeOutsideDeltas = ShapeOutsideDeltas(leftMarginBoxDelta, rightMarginBoxDelta, true, borderBoxLineTop, lineHeight); |
+ return m_shapeOutsideDeltas; |
} |
} |
// Lines that do not overlap the shape should act as if the float |
// wasn't there for layout purposes. So we set the deltas to remove the |
// entire width of the float. |
- m_leftMarginBoxDelta = floatMarginBoxWidth; |
- m_rightMarginBoxDelta = -floatMarginBoxWidth; |
- m_lineOverlapsShape = false; |
+ m_shapeOutsideDeltas = ShapeOutsideDeltas(floatMarginBoxWidth, -floatMarginBoxWidth, false, borderBoxLineTop, lineHeight); |
} |
+ |
+ return m_shapeOutsideDeltas; |
} |
LayoutRect ShapeOutsideInfo::computedShapePhysicalBoundingBox() const |