private static int LineBreak(string textInput, int textIndex, int stop, SKPaint paint, float maxWidth, out int trailingCount) { int lengthBreak; if (maxWidth == -1) { lengthBreak = stop - textIndex; } else { float measuredWidth; string subText = textInput.Substring(textIndex, stop - textIndex); lengthBreak = (int)paint.BreakText(subText, maxWidth, out measuredWidth) / 2; } //Check for white space or line breakers before the lengthBreak int startIndex = textIndex; int index = textIndex; int word_start = textIndex; bool prevBreak = true; trailingCount = 0; while (index < stop) { int prevText = index; char currChar = textInput[index++]; bool currBreak = IsBreakChar(currChar); if (!currBreak && prevBreak) { word_start = prevText; } prevBreak = currBreak; if (index > startIndex + lengthBreak) { if (currBreak) { // eat the rest of the whitespace while (index < stop && IsBreakChar(textInput[index])) { index++; } trailingCount = index - prevText; } else { // backup until a whitespace (or 1 char) if (word_start == startIndex) { if (prevText > startIndex) { index = prevText; } } else { index = word_start; } } break; } if ('\n' == currChar) { int ret = index - startIndex; int lineBreakSize = 1; if (index < stop) { currChar = textInput[index++]; if ('\r' == currChar) { ret = index - startIndex; ++lineBreakSize; } } trailingCount = lineBreakSize; return ret; } if ('\r' == currChar) { int ret = index - startIndex; int lineBreakSize = 1; if (index < stop) { currChar = textInput[index++]; if ('\n' == currChar) { ret = index - startIndex; ++lineBreakSize; } } trailingCount = lineBreakSize; return ret; } } return index - startIndex; }