static size_t linebreak(const char text[], const char stop[], const SkPaint& paint, SkScalar margin) { const char* start = text; SkAutoGlyphCache ac(paint, NULL); SkGlyphCache* cache = ac.getCache(); SkFixed w = 0; SkFixed limit = SkScalarToFixed(margin); SkAutoKern autokern; const char* word_start = text; int prevWS = true; while (text < stop) { const char* prevText = text; SkUnichar uni = SkUTF8_NextUnichar(&text); int currWS = is_ws(uni); const SkGlyph& glyph = cache->getUnicharMetrics(uni); if (!currWS && prevWS) word_start = prevText; prevWS = currWS; w += autokern.adjust(glyph) + glyph.fAdvanceX; if (w > limit) { if (currWS) // eat the rest of the whitespace { while (text < stop && is_ws(SkUTF8_ToUnichar(text))) text += SkUTF8_CountUTF8Bytes(text); } else // backup until a whitespace (or 1 char) { if (word_start == start) { if (prevText > start) text = prevText; } else text = word_start; } break; } } return text - start; }
static size_t linebreak(const char text[], const char stop[], const SkPaint& paint, SkScalar margin, size_t* trailing = nullptr) { size_t lengthBreak = paint.breakText(text, stop - text, margin); //Check for white space or line breakers before the lengthBreak const char* start = text; const char* word_start = text; int prevWS = true; if (trailing) { *trailing = 0; } while (text < stop) { const char* prevText = text; SkUnichar uni = SkUTF8_NextUnichar(&text); int currWS = is_ws(uni); if (!currWS && prevWS) { word_start = prevText; } prevWS = currWS; if (text > start + lengthBreak) { if (currWS) { // eat the rest of the whitespace while (text < stop && is_ws(SkUTF8_ToUnichar(text))) { text += SkUTF8_CountUTF8Bytes(text); } if (trailing) { *trailing = text - prevText; } } else { // backup until a whitespace (or 1 char) if (word_start == start) { if (prevText > start) { text = prevText; } } else { text = word_start; } } break; } if ('\n' == uni) { size_t ret = text - start; size_t lineBreakSize = 1; if (text < stop) { uni = SkUTF8_NextUnichar(&text); if ('\r' == uni) { ret = text - start; ++lineBreakSize; } } if (trailing) { *trailing = lineBreakSize; } return ret; } if ('\r' == uni) { size_t ret = text - start; size_t lineBreakSize = 1; if (text < stop) { uni = SkUTF8_NextUnichar(&text); if ('\n' == uni) { ret = text - start; ++lineBreakSize; } } if (trailing) { *trailing = lineBreakSize; } return ret; } } return text - start; }