Index: Source/core/rendering/RenderBlockLineLayout.cpp |
diff --git a/Source/core/rendering/RenderBlockLineLayout.cpp b/Source/core/rendering/RenderBlockLineLayout.cpp |
index f2b9bed38c58a47b8d2f2f54c48d1012b9e967fa..22ff931054e2311b6c02e5e986a49d12769b2540 100644 |
--- a/Source/core/rendering/RenderBlockLineLayout.cpp |
+++ b/Source/core/rendering/RenderBlockLineLayout.cpp |
@@ -35,6 +35,7 @@ |
#include "core/rendering/VerticalPositionCache.h" |
#include "core/rendering/line/BreakingContextInlineHeaders.h" |
#include "core/rendering/line/LineLayoutState.h" |
+#include "core/rendering/line/LineWidth.h" |
#include "core/rendering/svg/SVGRootInlineBox.h" |
#include "platform/text/BidiResolver.h" |
#include "wtf/RefCountedLeakCounter.h" |
@@ -47,42 +48,6 @@ namespace WebCore { |
using namespace std; |
using namespace WTF::Unicode; |
-static IndentTextOrNot requiresIndent(bool isFirstLine, bool isAfterHardLineBreak, RenderStyle* style) |
-{ |
- if (isFirstLine) |
- return IndentText; |
- if (isAfterHardLineBreak && style->textIndentLine() == TextIndentEachLine) |
- return IndentText; |
- |
- return DoNotIndentText; |
-} |
- |
-class LineBreaker { |
-public: |
- friend class BreakingContext; |
- LineBreaker(RenderBlockFlow* block) |
- : m_block(block) |
- { |
- reset(); |
- } |
- |
- InlineIterator nextLineBreak(InlineBidiResolver&, LineInfo&, RenderTextInfo&, FloatingObject* lastFloatFromPreviousLine, unsigned consecutiveHyphenatedLines, WordMeasurements&); |
- |
- bool lineWasHyphenated() { return m_hyphenated; } |
- const Vector<RenderBox*>& positionedObjects() { return m_positionedObjects; } |
- EClear clear() { return m_clear; } |
-private: |
- void reset(); |
- |
- InlineIterator nextSegmentBreak(InlineBidiResolver&, LineInfo&, RenderTextInfo&, FloatingObject* lastFloatFromPreviousLine, unsigned consecutiveHyphenatedLines, WordMeasurements&); |
- void skipLeadingWhitespace(InlineBidiResolver&, LineInfo&, FloatingObject* lastFloatFromPreviousLine, LineWidth&); |
- |
- RenderBlockFlow* m_block; |
- bool m_hyphenated; |
- EClear m_clear; |
- Vector<RenderBox*> m_positionedObjects; |
-}; |
- |
static RenderObject* firstRenderObjectForDirectionalityDetermination(RenderObject* root, RenderObject* current = 0) |
{ |
RenderObject* next = current; |
@@ -1938,139 +1903,6 @@ bool RenderBlockFlow::generatesLineBoxesForInlineChild(RenderObject* inlineObj) |
return !it.atEnd(); |
} |
-void LineBreaker::skipLeadingWhitespace(InlineBidiResolver& resolver, LineInfo& lineInfo, |
- FloatingObject* lastFloatFromPreviousLine, LineWidth& width) |
-{ |
- while (!resolver.position().atEnd() && !requiresLineBox(resolver.position(), lineInfo, LeadingWhitespace)) { |
- RenderObject* object = resolver.position().object(); |
- if (object->isOutOfFlowPositioned()) { |
- setStaticPositions(m_block, toRenderBox(object)); |
- if (object->style()->isOriginalDisplayInlineType()) { |
- resolver.runs().addRun(createRun(0, 1, object, resolver)); |
- lineInfo.incrementRunsFromLeadingWhitespace(); |
- } |
- } else if (object->isFloating()) |
- m_block->positionNewFloatOnLine(m_block->insertFloatingObject(toRenderBox(object)), lastFloatFromPreviousLine, lineInfo, width); |
- else if (object->isText() && object->style()->hasTextCombine() && object->isCombineText() && !toRenderCombineText(object)->isCombined()) { |
- toRenderCombineText(object)->combineText(); |
- if (toRenderCombineText(object)->isCombined()) |
- continue; |
- } |
- resolver.position().increment(&resolver); |
- } |
- resolver.commitExplicitEmbedding(); |
-} |
- |
-void LineBreaker::reset() |
-{ |
- m_positionedObjects.clear(); |
- m_hyphenated = false; |
- m_clear = CNONE; |
-} |
- |
-InlineIterator LineBreaker::nextLineBreak(InlineBidiResolver& resolver, LineInfo& lineInfo, RenderTextInfo& renderTextInfo, FloatingObject* lastFloatFromPreviousLine, unsigned consecutiveHyphenatedLines, WordMeasurements& wordMeasurements) |
-{ |
- ShapeInsideInfo* shapeInsideInfo = m_block->layoutShapeInsideInfo(); |
- |
- if (!shapeInsideInfo || !shapeInsideInfo->lineOverlapsShapeBounds()) |
- return nextSegmentBreak(resolver, lineInfo, renderTextInfo, lastFloatFromPreviousLine, consecutiveHyphenatedLines, wordMeasurements); |
- |
- InlineIterator end = resolver.position(); |
- InlineIterator oldEnd = end; |
- |
- if (!shapeInsideInfo->hasSegments()) { |
- end = nextSegmentBreak(resolver, lineInfo, renderTextInfo, lastFloatFromPreviousLine, consecutiveHyphenatedLines, wordMeasurements); |
- resolver.setPositionIgnoringNestedIsolates(oldEnd); |
- return oldEnd; |
- } |
- |
- const SegmentList& segments = shapeInsideInfo->segments(); |
- SegmentRangeList& segmentRanges = shapeInsideInfo->segmentRanges(); |
- |
- for (unsigned i = 0; i < segments.size() && !end.atEnd(); i++) { |
- const InlineIterator segmentStart = resolver.position(); |
- end = nextSegmentBreak(resolver, lineInfo, renderTextInfo, lastFloatFromPreviousLine, consecutiveHyphenatedLines, wordMeasurements); |
- |
- ASSERT(segmentRanges.size() == i); |
- if (resolver.position().atEnd()) { |
- segmentRanges.append(LineSegmentRange(segmentStart, end)); |
- break; |
- } |
- if (resolver.position() == end) { |
- // Nothing fit this segment |
- end = segmentStart; |
- segmentRanges.append(LineSegmentRange(segmentStart, segmentStart)); |
- resolver.setPositionIgnoringNestedIsolates(segmentStart); |
- } else { |
- // Note that resolver.position is already skipping some of the white space at the beginning of the line, |
- // so that's why segmentStart might be different than resolver.position(). |
- LineSegmentRange range(resolver.position(), end); |
- segmentRanges.append(range); |
- resolver.setPosition(end, numberOfIsolateAncestors(end)); |
- |
- if (lineInfo.previousLineBrokeCleanly()) { |
- // If we hit a new line break, just stop adding anything to this line. |
- break; |
- } |
- } |
- } |
- resolver.setPositionIgnoringNestedIsolates(oldEnd); |
- return end; |
-} |
- |
-InlineIterator LineBreaker::nextSegmentBreak(InlineBidiResolver& resolver, LineInfo& lineInfo, RenderTextInfo& renderTextInfo, FloatingObject* lastFloatFromPreviousLine, unsigned consecutiveHyphenatedLines, WordMeasurements& wordMeasurements) |
-{ |
- reset(); |
- |
- ASSERT(resolver.position().root() == m_block); |
- |
- bool appliedStartWidth = resolver.position().offset() > 0; |
- |
- LineWidth width(*m_block, lineInfo.isFirstLine(), requiresIndent(lineInfo.isFirstLine(), lineInfo.previousLineBrokeCleanly(), m_block->style())); |
- |
- skipLeadingWhitespace(resolver, lineInfo, lastFloatFromPreviousLine, width); |
- |
- if (resolver.position().atEnd()) |
- return resolver.position(); |
- |
- BreakingContext context(resolver, lineInfo, width, renderTextInfo, lastFloatFromPreviousLine, appliedStartWidth, m_block); |
- |
- while (context.currentObject()) { |
- context.initializeForCurrentObject(); |
- if (context.currentObject()->isBR()) { |
- context.handleBR(m_clear); |
- } else if (context.currentObject()->isOutOfFlowPositioned()) { |
- context.handleOutOfFlowPositioned(m_positionedObjects); |
- } else if (context.currentObject()->isFloating()) { |
- context.handleFloat(); |
- } else if (context.currentObject()->isRenderInline()) { |
- context.handleEmptyInline(); |
- } else if (context.currentObject()->isReplaced()) { |
- context.handleReplaced(); |
- } else if (context.currentObject()->isText()) { |
- if (context.handleText(wordMeasurements, m_hyphenated)) { |
- // We've hit a hard text line break. Our line break iterator is updated, so go ahead and early return. |
- return context.lineBreak(); |
- } |
- } else { |
- ASSERT_NOT_REACHED(); |
- } |
- |
- if (context.atEnd()) |
- return context.handleEndOfLine(); |
- |
- context.commitAndUpdateLineBreakIfNeeded(); |
- |
- if (context.atEnd()) |
- return context.handleEndOfLine(); |
- |
- context.increment(); |
- } |
- |
- context.clearLineBreakIfFitsOnLine(); |
- |
- return context.handleEndOfLine(); |
-} |
void RenderBlockFlow::addOverflowFromInlineChildren() |
{ |