| Index: Source/core/rendering/RenderBlock.cpp
|
| diff --git a/Source/core/rendering/RenderBlock.cpp b/Source/core/rendering/RenderBlock.cpp
|
| index 92ef57b1ee851d04adedf0d906ba19a80274d3cd..3a6ef48ea03a44f52ca2b28f2bc953c745d616ac 100644
|
| --- a/Source/core/rendering/RenderBlock.cpp
|
| +++ b/Source/core/rendering/RenderBlock.cpp
|
| @@ -4008,10 +4008,10 @@ LayoutPoint RenderBlock::computeLogicalLocationForFloat(const FloatingObject* fl
|
| if (childBox->style()->floating() == LeftFloat) {
|
| LayoutUnit heightRemainingLeft = 1;
|
| LayoutUnit heightRemainingRight = 1;
|
| - floatLogicalLeft = logicalLeftOffsetForLine(logicalTopOffset, logicalLeftOffset, false, &heightRemainingLeft);
|
| - while (logicalRightOffsetForLine(logicalTopOffset, logicalRightOffset, false, &heightRemainingRight) - floatLogicalLeft < floatLogicalWidth) {
|
| + floatLogicalLeft = logicalLeftOffsetForLineUsingFloatBoundingBox(logicalTopOffset, logicalLeftOffset, false, &heightRemainingLeft);
|
| + while (logicalRightOffsetForLineUsingFloatBoundingBox(logicalTopOffset, logicalRightOffset, false, &heightRemainingRight) - floatLogicalLeft < floatLogicalWidth) {
|
| logicalTopOffset += min(heightRemainingLeft, heightRemainingRight);
|
| - floatLogicalLeft = logicalLeftOffsetForLine(logicalTopOffset, logicalLeftOffset, false, &heightRemainingLeft);
|
| + floatLogicalLeft = logicalLeftOffsetForLineUsingFloatBoundingBox(logicalTopOffset, logicalLeftOffset, false, &heightRemainingLeft);
|
| if (insideFlowThread) {
|
| // Have to re-evaluate all of our offsets, since they may have changed.
|
| logicalRightOffset = logicalRightOffsetForContent(logicalTopOffset); // Constant part of right offset.
|
| @@ -4023,10 +4023,10 @@ LayoutPoint RenderBlock::computeLogicalLocationForFloat(const FloatingObject* fl
|
| } else {
|
| LayoutUnit heightRemainingLeft = 1;
|
| LayoutUnit heightRemainingRight = 1;
|
| - floatLogicalLeft = logicalRightOffsetForLine(logicalTopOffset, logicalRightOffset, false, &heightRemainingRight);
|
| - while (floatLogicalLeft - logicalLeftOffsetForLine(logicalTopOffset, logicalLeftOffset, false, &heightRemainingLeft) < floatLogicalWidth) {
|
| + floatLogicalLeft = logicalRightOffsetForLineUsingFloatBoundingBox(logicalTopOffset, logicalRightOffset, false, &heightRemainingRight);
|
| + while (floatLogicalLeft - logicalLeftOffsetForLineUsingFloatBoundingBox(logicalTopOffset, logicalLeftOffset, false, &heightRemainingLeft) < floatLogicalWidth) {
|
| logicalTopOffset += min(heightRemainingLeft, heightRemainingRight);
|
| - floatLogicalLeft = logicalRightOffsetForLine(logicalTopOffset, logicalRightOffset, false, &heightRemainingRight);
|
| + floatLogicalLeft = logicalRightOffsetForLineUsingFloatBoundingBox(logicalTopOffset, logicalRightOffset, false, &heightRemainingRight);
|
| if (insideFlowThread) {
|
| // Have to re-evaluate all of our offsets, since they may have changed.
|
| logicalRightOffset = logicalRightOffsetForContent(logicalTopOffset); // Constant part of right offset.
|
| @@ -4311,7 +4311,7 @@ LayoutUnit RenderBlock::logicalRightOffsetForContent(RenderRegion* region, Layou
|
| return logicalRightOffset - (logicalWidth() - (isHorizontalWritingMode() ? boxRect.maxX() : boxRect.maxY()));
|
| }
|
|
|
| -LayoutUnit RenderBlock::logicalLeftOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, bool applyTextIndent, LayoutUnit* heightRemaining, LayoutUnit logicalHeight) const
|
| +LayoutUnit RenderBlock::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, ShapeOutsideFloatOffsetMode offsetMode) const
|
| {
|
| LayoutUnit left = fixedOffset;
|
| if (m_floatingObjects && m_floatingObjects->hasLeftObjects()) {
|
| @@ -4321,7 +4321,8 @@ LayoutUnit RenderBlock::logicalLeftOffsetForLine(LayoutUnit logicalTop, LayoutUn
|
| FloatIntervalSearchAdapter<FloatingObject::FloatLeft> adapter(this, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), left, heightRemaining);
|
| m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
|
|
|
| - if (const FloatingObject* lastFloat = adapter.lastFloat()) {
|
| + const FloatingObject* lastFloat = adapter.lastFloat();
|
| + if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) {
|
| if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOutsideInfo()) {
|
| shapeOutside->computeSegmentsForLine(logicalTop - logicalTopForFloat(lastFloat) + shapeOutside->shapeLogicalTop(), logicalHeight);
|
| left += shapeOutside->rightSegmentShapeBoundingBoxDelta();
|
| @@ -4329,6 +4330,13 @@ LayoutUnit RenderBlock::logicalLeftOffsetForLine(LayoutUnit logicalTop, LayoutUn
|
| }
|
| }
|
|
|
| + return left;
|
| +}
|
| +
|
| +LayoutUnit RenderBlock::adjustLogicalLeftOffsetForLine(LayoutUnit offsetFromFloats, bool applyTextIndent) const
|
| +{
|
| + LayoutUnit left = offsetFromFloats;
|
| +
|
| if (applyTextIndent && style()->isLeftToRightDirection())
|
| left += textIndentOffset();
|
|
|
| @@ -4363,7 +4371,7 @@ LayoutUnit RenderBlock::logicalLeftOffsetForLine(LayoutUnit logicalTop, LayoutUn
|
| return left;
|
| }
|
|
|
| -LayoutUnit RenderBlock::logicalRightOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, bool applyTextIndent, LayoutUnit* heightRemaining, LayoutUnit logicalHeight) const
|
| +LayoutUnit RenderBlock::logicalRightFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, ShapeOutsideFloatOffsetMode offsetMode) const
|
| {
|
| LayoutUnit right = fixedOffset;
|
| if (m_floatingObjects && m_floatingObjects->hasRightObjects()) {
|
| @@ -4374,7 +4382,8 @@ LayoutUnit RenderBlock::logicalRightOffsetForLine(LayoutUnit logicalTop, LayoutU
|
| FloatIntervalSearchAdapter<FloatingObject::FloatRight> adapter(this, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), rightFloatOffset, heightRemaining);
|
| m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
|
|
|
| - if (const FloatingObject* lastFloat = adapter.lastFloat()) {
|
| + const FloatingObject* lastFloat = adapter.lastFloat();
|
| + if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) {
|
| if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOutsideInfo()) {
|
| shapeOutside->computeSegmentsForLine(logicalTop - logicalTopForFloat(lastFloat) + shapeOutside->shapeLogicalTop(), logicalHeight);
|
| rightFloatOffset += shapeOutside->leftSegmentShapeBoundingBoxDelta();
|
| @@ -4383,7 +4392,13 @@ LayoutUnit RenderBlock::logicalRightOffsetForLine(LayoutUnit logicalTop, LayoutU
|
|
|
| right = min(right, rightFloatOffset);
|
| }
|
| + return right;
|
| +}
|
|
|
| +LayoutUnit RenderBlock::adjustLogicalRightOffsetForLine(LayoutUnit offsetFromFloats, bool applyTextIndent) const
|
| +{
|
| + LayoutUnit right = offsetFromFloats;
|
| +
|
| if (applyTextIndent && !style()->isLeftToRightDirection())
|
| right -= textIndentOffset();
|
|
|
|
|