示例#1
0
 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;
 }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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));
            }
        }