void _resetLineBreaker(LineBreaker lineBreaker, int blockStart, int blockSize, int lineLimit) { lineBreaker.setLineWidth(this._width); lineBreaker.resize(blockSize); lineBreaker.setTabStops(this._tabStops); lineBreaker.setText(this._text, blockStart, blockSize); lineBreaker.lineLimit = lineLimit; }
int _computeLineBreak() { this._lineRangeCount = 0; this._lineWidthCount = 0; this._maxIntrinsicWidth = 0; int lineLimit = this._paragraphStyle.ellipsized() ? this._paragraphStyle.maxLines ?? 1 : this._paragraphStyle.maxLines ?? 0; var newLinePositions = LineBreaker.newLinePositions(this._text, out int newLineCount); var lineBreaker = LineBreaker.instance; int runIndex = 0; int countRuns = 0; for (var newlineIndex = 0; newlineIndex < newLineCount; ++newlineIndex) { if (lineLimit != 0 && this._lineRangeCount >= lineLimit) { break; } var blockStart = newlineIndex > 0 ? newLinePositions[newlineIndex - 1] + 1 : 0; var blockEnd = newLinePositions[newlineIndex]; var blockSize = blockEnd - blockStart; if (blockSize == 0) { this._addEmptyLine(blockStart, blockEnd); continue; } if (lineLimit != 0 && this._lineRangeCount >= lineLimit) { break; } this._resetLineBreaker(lineBreaker, blockStart, blockSize, lineLimit == 0 ? 0 : lineLimit - this._lineRangeCount); countRuns += this._addStyleRuns(lineBreaker, ref runIndex, blockStart, blockEnd); int breaksCount = lineBreaker.computeBreaks(); countRuns += breaksCount - 1; this._updateBreaks(lineBreaker, breaksCount, blockStart, blockEnd); lineBreaker.finish(); } return(countRuns); }
int _addStyleRuns(LineBreaker lineBreaker, ref int runIndex, int blockStart, int blockEnd) { int countRuns = 0; float lineBlockWidth = 0; while (runIndex < this._runs.size) { var run = this._runs.getRun(runIndex); if (run.start >= blockEnd) { break; } if (lineBreaker.lineLimit != 0 && lineBreaker.getBreaksCount() >= lineBreaker.lineLimit) { break; } if (run.end <= blockStart) { runIndex++; continue; } int runStart = Mathf.Max(run.start, blockStart) - blockStart; int runEnd = Mathf.Min(run.end, blockEnd) - blockStart; lineBlockWidth += lineBreaker.addStyleRun(run.style, runStart, runEnd); countRuns++; if (run.end > blockEnd) { break; } runIndex++; } this._maxIntrinsicWidth = Mathf.Max(lineBlockWidth, this._maxIntrinsicWidth); return(countRuns); }
void _updateBreaks(LineBreaker lineBreaker, int breaksCount, int blockStart, int blockEnd) { for (int i = 0; i < breaksCount; ++i) { var breakStart = i > 0 ? lineBreaker.getBreak(i - 1) : 0; var lineStart = breakStart + blockStart; var lineEnd = lineBreaker.getBreak(i) + blockStart; bool hardBreak = lineEnd == blockEnd; var lineEndIncludingNewline = hardBreak && lineEnd < this._text.Length ? lineEnd + 1 : lineEnd; var lineEndExcludingWhitespace = lineEnd; while (lineEndExcludingWhitespace > lineStart && LayoutUtils.isLineEndSpace(this._text[lineEndExcludingWhitespace - 1])) { lineEndExcludingWhitespace--; } this._addLineRangeAndWidth(new LineRange(lineStart, lineEnd, lineEndExcludingWhitespace, lineEndIncludingNewline, hardBreak), lineBreaker.getWidth(i)); } }