| Index: Source/core/rendering/RenderBlockLineLayout.cpp
|
| diff --git a/Source/core/rendering/RenderBlockLineLayout.cpp b/Source/core/rendering/RenderBlockLineLayout.cpp
|
| index 6a5513ad5235bfc1ad578bf525f2a28f73d89448..e7c4dc18426c68a029560e6e2916a61363586045 100644
|
| --- a/Source/core/rendering/RenderBlockLineLayout.cpp
|
| +++ b/Source/core/rendering/RenderBlockLineLayout.cpp
|
| @@ -610,35 +610,6 @@ void RenderBlockFlow::computeInlineDirectionPositionsForLine(RootInlineBox* line
|
| float availableLogicalWidth;
|
| updateLogicalInlinePositions(this, lineLogicalLeft, lineLogicalRight, availableLogicalWidth, isFirstLine, shouldIndentText, 0);
|
| bool needsWordSpacing;
|
| - ShapeInsideInfo* shapeInsideInfo = layoutShapeInsideInfo();
|
| - if (shapeInsideInfo && shapeInsideInfo->hasSegments()) {
|
| - BidiRun* segmentStart = firstRun;
|
| - const SegmentList& segments = shapeInsideInfo->segments();
|
| - float logicalLeft = max<float>(segments[0].logicalLeft, lineLogicalLeft);
|
| - float logicalRight = min<float>(segments[0].logicalRight, lineLogicalRight);
|
| - float startLogicalLeft = logicalLeft;
|
| - float endLogicalRight = logicalLeft;
|
| - float minLogicalLeft = logicalLeft;
|
| - float maxLogicalRight = logicalLeft;
|
| - lineBox->beginPlacingBoxRangesInInlineDirection(logicalLeft);
|
| - for (size_t i = 0; i < segments.size(); i++) {
|
| - if (i) {
|
| - logicalLeft = max<float>(segments[i].logicalLeft, lineLogicalLeft);
|
| - logicalRight = min<float>(segments[i].logicalRight, lineLogicalRight);
|
| - }
|
| - availableLogicalWidth = logicalRight - logicalLeft;
|
| - BidiRun* newSegmentStart = computeInlineDirectionPositionsForSegment(lineBox, lineInfo, textAlign, logicalLeft, availableLogicalWidth, segmentStart, trailingSpaceRun, textBoxDataMap, verticalPositionCache, wordMeasurements);
|
| - needsWordSpacing = false;
|
| - endLogicalRight = lineBox->placeBoxRangeInInlineDirection(segmentStart->m_box, newSegmentStart ? newSegmentStart->m_box : 0, logicalLeft, minLogicalLeft, maxLogicalRight, needsWordSpacing, textBoxDataMap);
|
| - if (!newSegmentStart || !newSegmentStart->next())
|
| - break;
|
| - ASSERT(newSegmentStart->m_startsSegment);
|
| - // Discard the empty segment start marker bidi runs
|
| - segmentStart = newSegmentStart->next();
|
| - }
|
| - lineBox->endPlacingBoxRangesInInlineDirection(startLogicalLeft, endLogicalRight, minLogicalLeft, maxLogicalRight);
|
| - return;
|
| - }
|
|
|
| if (firstRun && firstRun->m_object->isReplaced()) {
|
| RenderBox* renderBox = toRenderBox(firstRun->m_object);
|
| @@ -786,14 +757,14 @@ static void restoreIsolatedMidpointStates(InlineBidiResolver& topResolver, Inlin
|
| }
|
|
|
| // FIXME: BidiResolver should have this logic.
|
| -static inline void constructBidiRunsForSegment(InlineBidiResolver& topResolver, BidiRunList<BidiRun>& bidiRuns, const InlineIterator& endOfRuns, VisualDirectionOverride override, bool previousLineBrokeCleanly, bool isNewUBAParagraph)
|
| +static inline void constructBidiRunsForLine(const RenderBlockFlow* block, InlineBidiResolver& topResolver, BidiRunList<BidiRun>& bidiRuns, const InlineIterator& endOfLine, VisualDirectionOverride override, bool previousLineBrokeCleanly, bool isNewUBAParagraph)
|
| {
|
| // FIXME: We should pass a BidiRunList into createBidiRunsForLine instead
|
| // of the resolver owning the runs.
|
| ASSERT(&topResolver.runs() == &bidiRuns);
|
| - ASSERT(topResolver.position() != endOfRuns);
|
| + ASSERT(topResolver.position() != endOfLine);
|
| RenderObject* currentRoot = topResolver.position().root();
|
| - topResolver.createBidiRunsForLine(endOfRuns, override, previousLineBrokeCleanly);
|
| + topResolver.createBidiRunsForLine(endOfLine, override, previousLineBrokeCleanly);
|
|
|
| while (!topResolver.isolatedRuns().isEmpty()) {
|
| // It does not matter which order we resolve the runs as long as we resolve them all.
|
| @@ -836,7 +807,7 @@ static inline void constructBidiRunsForSegment(InlineBidiResolver& topResolver,
|
| // We stop at the next end of line; we may re-enter this isolate in the next call to constructBidiRuns().
|
| // FIXME: What should end and previousLineBrokeCleanly be?
|
| // rniwa says previousLineBrokeCleanly is just a WinIE hack and could always be false here?
|
| - isolatedResolver.createBidiRunsForLine(endOfRuns, NoVisualOverride, previousLineBrokeCleanly);
|
| + isolatedResolver.createBidiRunsForLine(endOfLine, NoVisualOverride, previousLineBrokeCleanly);
|
|
|
| ASSERT(isolatedResolver.runs().runCount());
|
| if (isolatedResolver.runs().runCount())
|
| @@ -852,42 +823,6 @@ static inline void constructBidiRunsForSegment(InlineBidiResolver& topResolver,
|
| }
|
| }
|
|
|
| -static inline bool segmentIsEmpty(const InlineIterator& segmentStart, const InlineIterator& segmentEnd)
|
| -{
|
| - return segmentStart == segmentEnd;
|
| -}
|
| -
|
| -static inline void constructBidiRunsForLine(const RenderBlockFlow* block, InlineBidiResolver& topResolver, BidiRunList<BidiRun>& bidiRuns, const InlineIterator& endOfLine, VisualDirectionOverride override, bool previousLineBrokeCleanly, bool isNewUBAParagraph)
|
| -{
|
| - ShapeInsideInfo* shapeInsideInfo = block->layoutShapeInsideInfo();
|
| - if (!shapeInsideInfo || !shapeInsideInfo->hasSegments()) {
|
| - constructBidiRunsForSegment(topResolver, bidiRuns, endOfLine, override, previousLineBrokeCleanly, isNewUBAParagraph);
|
| - return;
|
| - }
|
| -
|
| - const SegmentRangeList& segmentRanges = shapeInsideInfo->segmentRanges();
|
| - ASSERT(segmentRanges.size());
|
| -
|
| - for (size_t i = 0; i < segmentRanges.size(); i++) {
|
| - LineSegmentIterator iterator = segmentRanges[i].start;
|
| - InlineIterator segmentStart(iterator.root, iterator.object, iterator.offset);
|
| - iterator = segmentRanges[i].end;
|
| - InlineIterator segmentEnd(iterator.root, iterator.object, iterator.offset);
|
| - if (i) {
|
| - ASSERT(segmentStart.object());
|
| - BidiRun* segmentMarker = createRun(segmentStart.offset(), segmentStart.offset(), segmentStart.object(), topResolver);
|
| - segmentMarker->m_startsSegment = true;
|
| - bidiRuns.addRun(segmentMarker);
|
| - // Do not collapse midpoints between segments
|
| - topResolver.midpointState().setBetweenMidpoints(false);
|
| - }
|
| - if (!segmentIsEmpty(segmentStart, segmentEnd)) {
|
| - topResolver.setPosition(segmentStart, numberOfIsolateAncestors(segmentStart));
|
| - constructBidiRunsForSegment(topResolver, bidiRuns, segmentEnd, override, previousLineBrokeCleanly, isNewUBAParagraph);
|
| - }
|
| - }
|
| -}
|
| -
|
| // This function constructs line boxes for all of the text runs in the resolver and computes their position.
|
| RootInlineBox* RenderBlockFlow::createLineBoxesFromBidiRuns(unsigned bidiLevel, BidiRunList<BidiRun>& bidiRuns, const InlineIterator& end, LineInfo& lineInfo, VerticalPositionCache& verticalPositionCache, BidiRun* trailingSpaceRun, WordMeasurements& wordMeasurements)
|
| {
|
| @@ -1012,165 +947,6 @@ inline const InlineIterator& RenderBlockFlow::restartLayoutRunsAndFloatsInRange(
|
| return oldEnd;
|
| }
|
|
|
| -static inline LayoutUnit adjustLogicalLineTop(ShapeInsideInfo* shapeInsideInfo, InlineIterator start, InlineIterator end, const WordMeasurements& wordMeasurements)
|
| -{
|
| - if (!shapeInsideInfo || end != start)
|
| - return 0;
|
| -
|
| - float minWidth = firstPositiveWidth(wordMeasurements);
|
| - ASSERT(minWidth || wordMeasurements.isEmpty());
|
| - if (minWidth > 0 && shapeInsideInfo->adjustLogicalLineTop(minWidth))
|
| - return shapeInsideInfo->logicalLineTop();
|
| -
|
| - return shapeInsideInfo->shapeLogicalBottom();
|
| -}
|
| -
|
| -static inline void pushShapeContentOverflowBelowTheContentBox(RenderBlockFlow* block, ShapeInsideInfo* shapeInsideInfo, LayoutUnit lineTop, LayoutUnit lineHeight)
|
| -{
|
| - ASSERT(shapeInsideInfo);
|
| -
|
| - LayoutUnit logicalLineBottom = lineTop + lineHeight;
|
| - LayoutUnit shapeLogicalBottom = shapeInsideInfo->shapeLogicalBottom();
|
| - LayoutUnit shapeContainingBlockHeight = shapeInsideInfo->shapeContainingBlockHeight();
|
| -
|
| - bool isOverflowPositionedAlready = (shapeContainingBlockHeight - shapeInsideInfo->owner().borderAndPaddingAfter() + lineHeight) <= lineTop;
|
| -
|
| - // If the last line overlaps with the shape, we don't need the segments anymore
|
| - if (lineTop < shapeLogicalBottom && shapeLogicalBottom < logicalLineBottom)
|
| - shapeInsideInfo->clearSegments();
|
| - if (logicalLineBottom <= shapeLogicalBottom || !shapeContainingBlockHeight || isOverflowPositionedAlready)
|
| - return;
|
| -
|
| - LayoutUnit newLogicalHeight = block->logicalHeight() + (shapeContainingBlockHeight - (lineTop + shapeInsideInfo->owner().borderAndPaddingAfter()));
|
| - block->setLogicalHeight(newLogicalHeight);
|
| -}
|
| -
|
| -void RenderBlockFlow::updateShapeAndSegmentsForCurrentLine(ShapeInsideInfo*& shapeInsideInfo, const LayoutSize& logicalOffsetFromShapeContainer, LineLayoutState& layoutState)
|
| -{
|
| - if (layoutState.flowThread())
|
| - return updateShapeAndSegmentsForCurrentLineInFlowThread(shapeInsideInfo, layoutState);
|
| -
|
| - if (!shapeInsideInfo)
|
| - return;
|
| -
|
| - LayoutUnit lineTop = logicalHeight() + logicalOffsetFromShapeContainer.height();
|
| - LayoutUnit lineLeft = logicalOffsetFromShapeContainer.width();
|
| - LayoutUnit lineHeight = this->lineHeight(layoutState.lineInfo().isFirstLine(), isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes);
|
| -
|
| - // FIXME: Bug 95361: It is possible for a line to grow beyond lineHeight, in which case these segments may be incorrect.
|
| - shapeInsideInfo->updateSegmentsForLine(LayoutSize(lineLeft, lineTop), lineHeight);
|
| -
|
| - pushShapeContentOverflowBelowTheContentBox(this, shapeInsideInfo, lineTop, lineHeight);
|
| -}
|
| -
|
| -void RenderBlockFlow::updateShapeAndSegmentsForCurrentLineInFlowThread(ShapeInsideInfo*& shapeInsideInfo, LineLayoutState& layoutState)
|
| -{
|
| - ASSERT(layoutState.flowThread());
|
| -
|
| - RenderRegion* currentRegion = regionAtBlockOffset(logicalHeight());
|
| - if (!currentRegion || !currentRegion->logicalHeight())
|
| - return;
|
| -
|
| - shapeInsideInfo = currentRegion->shapeInsideInfo();
|
| -
|
| - RenderRegion* nextRegion = 0;
|
| - if (!currentRegion->isLastRegion()) {
|
| - RenderRegionList regionList = layoutState.flowThread()->renderRegionList();
|
| - RenderRegionList::const_iterator it = regionList.find(currentRegion);
|
| - nextRegion = *(++it);
|
| - }
|
| -
|
| - // We only want to deal regions with shapes, so we check if the next region has a shape
|
| - if (!shapeInsideInfo && nextRegion && !nextRegion->shapeInsideInfo())
|
| - return;
|
| -
|
| - LayoutUnit lineHeight = this->lineHeight(layoutState.lineInfo().isFirstLine(), isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes);
|
| - LayoutUnit logicalLineTopInFlowThread = logicalHeight() + offsetFromLogicalTopOfFirstPage();
|
| - LayoutUnit logicalLineBottomInFlowThread = logicalLineTopInFlowThread + lineHeight;
|
| - LayoutUnit logicalRegionTopInFlowThread = currentRegion->logicalTopForFlowThreadContent();
|
| - LayoutUnit logicalRegionBottomInFlowThread = logicalRegionTopInFlowThread + currentRegion->logicalHeight() - currentRegion->borderAndPaddingBefore() - currentRegion->borderAndPaddingAfter();
|
| -
|
| - LayoutUnit shapeBottomInFlowThread = LayoutUnit::max();
|
| - if (shapeInsideInfo)
|
| - shapeBottomInFlowThread = shapeInsideInfo->shapeLogicalBottom() + currentRegion->logicalTopForFlowThreadContent();
|
| -
|
| - bool lineOverLapsWithShapeBottom = shapeBottomInFlowThread < logicalLineBottomInFlowThread;
|
| - bool lineTopAdjustedIntoNextRegion = layoutState.adjustedLogicalLineTop() >= currentRegion->logicalHeight();
|
| - bool lineOverLapsWithRegionBottom = logicalLineBottomInFlowThread > logicalRegionBottomInFlowThread || lineTopAdjustedIntoNextRegion;
|
| - bool overFlowsToNextRegion = nextRegion && (lineOverLapsWithShapeBottom || lineOverLapsWithRegionBottom);
|
| -
|
| - // If the line is between two shapes/regions we position the line to the top of the next shape/region
|
| - if (overFlowsToNextRegion) {
|
| - ASSERT(currentRegion != nextRegion);
|
| - LayoutUnit deltaToNextRegion = logicalRegionBottomInFlowThread - logicalLineTopInFlowThread;
|
| - setLogicalHeight(logicalHeight() + deltaToNextRegion);
|
| -
|
| - currentRegion = nextRegion;
|
| - shapeInsideInfo = currentRegion->shapeInsideInfo();
|
| -
|
| - logicalLineTopInFlowThread = logicalHeight() + offsetFromLogicalTopOfFirstPage();
|
| - logicalLineBottomInFlowThread = logicalLineTopInFlowThread + lineHeight;
|
| - logicalRegionTopInFlowThread = currentRegion->logicalTopForFlowThreadContent();
|
| - logicalRegionBottomInFlowThread = logicalRegionTopInFlowThread + currentRegion->logicalHeight() - currentRegion->borderAndPaddingBefore() - currentRegion->borderAndPaddingAfter();
|
| -
|
| - if (lineTopAdjustedIntoNextRegion)
|
| - layoutState.setAdjustedLogicalLineTop(0);
|
| - }
|
| -
|
| - if (!shapeInsideInfo)
|
| - return;
|
| -
|
| - bool isFirstLineInRegion = logicalLineBottomInFlowThread <= (logicalRegionTopInFlowThread + lineHeight);
|
| - bool isFirstLineAdjusted = (logicalLineTopInFlowThread - logicalRegionTopInFlowThread) < (layoutState.adjustedLogicalLineTop() - currentRegion->borderAndPaddingBefore());
|
| - // We position the first line to the top of the shape in the region or to the previously adjusted position in the shape
|
| - if (isFirstLineInRegion || isFirstLineAdjusted) {
|
| - LayoutUnit shapeTopOffset = layoutState.adjustedLogicalLineTop();
|
| - if (!shapeTopOffset && (shapeInsideInfo->shapeLogicalTop() > 0))
|
| - shapeTopOffset = shapeInsideInfo->shapeLogicalTop();
|
| -
|
| - LayoutUnit shapePositionInFlowThread = currentRegion->logicalTopForFlowThreadContent() + shapeTopOffset;
|
| - LayoutUnit shapeTopLineTopDelta = shapePositionInFlowThread - logicalLineTopInFlowThread - currentRegion->borderAndPaddingBefore();
|
| -
|
| - setLogicalHeight(logicalHeight() + shapeTopLineTopDelta);
|
| - logicalLineTopInFlowThread += shapeTopLineTopDelta;
|
| - layoutState.setAdjustedLogicalLineTop(0);
|
| - }
|
| -
|
| - LayoutUnit lineTop = logicalLineTopInFlowThread - currentRegion->logicalTopForFlowThreadContent() + currentRegion->borderAndPaddingBefore();
|
| - // FIXME: Shape inside on a region does not yet take into account its padding for nested flow blocks
|
| - shapeInsideInfo->updateSegmentsForLine(LayoutSize(0, lineTop), lineHeight);
|
| -
|
| - if (currentRegion->isLastRegion())
|
| - pushShapeContentOverflowBelowTheContentBox(this, shapeInsideInfo, lineTop, lineHeight);
|
| -}
|
| -
|
| -bool RenderBlockFlow::adjustLogicalLineTopAndLogicalHeightIfNeeded(ShapeInsideInfo* shapeInsideInfo, LayoutUnit absoluteLogicalTop, LineLayoutState& layoutState, InlineBidiResolver& resolver, FloatingObject* lastFloatFromPreviousLine, InlineIterator& end, WordMeasurements& wordMeasurements)
|
| -{
|
| - LayoutUnit adjustedLogicalLineTop = adjustLogicalLineTop(shapeInsideInfo, resolver.position(), end, wordMeasurements);
|
| -
|
| - if (shapeInsideInfo && containsFloats()) {
|
| - lastFloatFromPreviousLine = m_floatingObjects->set().last();
|
| - if (!wordMeasurements.size()) {
|
| - LayoutUnit floatLogicalTopOffset = shapeInsideInfo->computeFirstFitPositionForFloat(logicalSizeForFloat(lastFloatFromPreviousLine));
|
| - if (logicalHeight() < floatLogicalTopOffset)
|
| - adjustedLogicalLineTop = floatLogicalTopOffset;
|
| - }
|
| - }
|
| -
|
| - if (!adjustedLogicalLineTop)
|
| - return false;
|
| -
|
| - LayoutUnit newLogicalHeight = adjustedLogicalLineTop - absoluteLogicalTop;
|
| -
|
| - if (layoutState.flowThread()) {
|
| - layoutState.setAdjustedLogicalLineTop(adjustedLogicalLineTop);
|
| - newLogicalHeight = logicalHeight();
|
| - }
|
| -
|
| - end = restartLayoutRunsAndFloatsInRange(logicalHeight(), newLogicalHeight, lastFloatFromPreviousLine, resolver, end);
|
| - return true;
|
| -}
|
| -
|
| void RenderBlockFlow::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, InlineBidiResolver& resolver, const InlineIterator& cleanLineStart, const BidiStatus& cleanLineBidiStatus, unsigned consecutiveHyphenatedLines)
|
| {
|
| RenderStyle* styleToUse = style();
|
| @@ -1184,22 +960,6 @@ void RenderBlockFlow::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, I
|
| LineBreaker lineBreaker(this);
|
|
|
| LayoutSize logicalOffsetFromShapeContainer;
|
| - ShapeInsideInfo* shapeInsideInfo = layoutShapeInsideInfo();
|
| - if (shapeInsideInfo) {
|
| - ASSERT(&shapeInsideInfo->owner() == this || allowsShapeInsideInfoSharing(&shapeInsideInfo->owner()));
|
| - if (shapeInsideInfo != this->shapeInsideInfo()) {
|
| - // FIXME Bug 100284: If subsequent LayoutStates are pushed, we will have to add
|
| - // their offsets from the original shape-inside container.
|
| - logicalOffsetFromShapeContainer = logicalOffsetFromShapeAncestorContainer(&shapeInsideInfo->owner());
|
| - }
|
| - // Begin layout at the logical top of our shape inside.
|
| - if (logicalHeight() + logicalOffsetFromShapeContainer.height() < shapeInsideInfo->shapeLogicalTop()) {
|
| - LayoutUnit logicalHeight = shapeInsideInfo->shapeLogicalTop() - logicalOffsetFromShapeContainer.height();
|
| - if (layoutState.flowThread())
|
| - logicalHeight -= shapeInsideInfo->owner().borderAndPaddingBefore();
|
| - setLogicalHeight(logicalHeight);
|
| - }
|
| - }
|
|
|
| while (!endOfLine.atEnd()) {
|
| // FIXME: Is this check necessary before the first iteration or can it be moved to the end?
|
| @@ -1220,8 +980,6 @@ void RenderBlockFlow::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, I
|
| bool isNewUBAParagraph = layoutState.lineInfo().previousLineBrokeCleanly();
|
| FloatingObject* lastFloatFromPreviousLine = (containsFloats()) ? m_floatingObjects->set().last() : 0;
|
|
|
| - updateShapeAndSegmentsForCurrentLine(shapeInsideInfo, logicalOffsetFromShapeContainer, layoutState);
|
| -
|
| WordMeasurements wordMeasurements;
|
| endOfLine = lineBreaker.nextLineBreak(resolver, layoutState.lineInfo(), renderTextInfo, lastFloatFromPreviousLine, consecutiveHyphenatedLines, wordMeasurements);
|
| renderTextInfo.m_lineBreakIterator.resetPriorContext();
|
| @@ -1235,9 +993,6 @@ void RenderBlockFlow::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, I
|
| break;
|
| }
|
|
|
| - if (adjustLogicalLineTopAndLogicalHeightIfNeeded(shapeInsideInfo, logicalOffsetFromShapeContainer.height(), layoutState, resolver, lastFloatFromPreviousLine, endOfLine, wordMeasurements))
|
| - continue;
|
| -
|
| ASSERT(endOfLine != resolver.position());
|
|
|
| // This is a short-cut for empty lines.
|
|
|