static void closeLineEndingAndAdjustRuns(LineState& line, Layout::RunVector& runs, unsigned previousRunCount, unsigned& lineCount, const TextFragmentIterator& textFragmentIterator) { if (previousRunCount == runs.size()) return; ASSERT(runs.size()); removeTrailingWhitespace(line, runs, textFragmentIterator); if (!runs.size()) return; // Adjust runs' position by taking line's alignment into account. if (float lineLogicalLeft = computeLineLeft(textFragmentIterator.style().textAlign, line.availableWidth(), line.width(), line.logicalLeftOffset())) { for (unsigned i = previousRunCount; i < runs.size(); ++i) { runs[i].logicalLeft += lineLogicalLeft; runs[i].logicalRight += lineLogicalLeft; } } runs.last().isEndOfLine = true; ++lineCount; }
static void revertRuns(Layout::RunVector& runs, unsigned length, float width) { while (length) { ASSERT(runs.size()); Run& lastRun = runs.last(); unsigned lastRunLength = lastRun.end - lastRun.start; if (lastRunLength > length) { lastRun.logicalRight -= width; lastRun.end -= length; break; } length -= lastRunLength; width -= (lastRun.logicalRight - lastRun.logicalLeft); runs.removeLast(); } }
static void createTextRuns(Layout::RunVector& runs, RenderBlockFlow& flow, unsigned& lineCount) { LayoutUnit borderAndPaddingBefore = flow.borderAndPaddingBefore(); LayoutUnit lineHeight = lineHeightFromFlow(flow); LineState line; bool isEndOfContent = false; TextFragmentIterator textFragmentIterator = TextFragmentIterator(flow); do { flow.setLogicalHeight(lineHeight * lineCount + borderAndPaddingBefore); LineState previousLine = line; unsigned previousRunCount = runs.size(); line = LineState(); updateLineConstrains(flow, line, !lineCount); isEndOfContent = createLineRuns(line, previousLine, runs, textFragmentIterator); closeLineEndingAndAdjustRuns(line, runs, previousRunCount, lineCount, textFragmentIterator); } while (!isEndOfContent); }