static void test_breakText() { SkPaint paint; const char* text = "sdfkljAKLDFJKEWkldfjlk#$%&sdfs.dsj"; size_t length = strlen(text); SkScalar width = paint.measureText(text, length); SkScalar mm = 0; SkScalar nn = 0; for (SkScalar w = 0; w <= width; w += SK_Scalar1) { SkScalar m; size_t n = paint.breakText(text, length, w, &m, SkPaint::kBackward_TextBufferDirection); SkASSERT(n <= length); SkASSERT(m <= width); if (n == 0) { SkASSERT(m == 0); } else { // now assert that we're monotonic if (n == nn) { SkASSERT(m == mm); } else { SkASSERT(n > nn); SkASSERT(m > mm); } } nn = SkIntToScalar(n); mm = m; } SkDEBUGCODE(size_t length2 =) paint.breakText(text, length, width, &mm); SkASSERT(length2 == length); SkASSERT(mm == width); }
static void test_break(SkCanvas* canvas, const char text[], size_t length, SkScalar x, SkScalar y, const SkPaint& paint, SkScalar clickX) { SkPaint linePaint; linePaint.setAntiAlias(true); SkScalar measured; if (paint.breakText(text, length, clickX - x, &measured, SkPaint::kForward_TextBufferDirection)) { linePaint.setColor(SK_ColorRED); canvas->drawLine(x, y, x + measured, y, linePaint); } x += paint.measureText(text, length); if (paint.breakText(text, length, x - clickX, &measured, SkPaint::kBackward_TextBufferDirection)) { linePaint.setColor(SK_ColorBLUE); canvas->drawLine(x - measured, y, x, y, linePaint); } }
static int breakText(JNIEnv* env, const SkPaint& paint, const jchar text[], int count, float maxWidth, jfloatArray jmeasured, SkPaint::TextBufferDirection tbd) { SkASSERT(paint.getTextEncoding() == SkPaint::kUTF16_TextEncoding); SkScalar measured; size_t bytes = paint.breakText(text, count << 1, SkFloatToScalar(maxWidth), &measured, tbd); SkASSERT((bytes & 1) == 0); if (jmeasured && env->GetArrayLength(jmeasured) > 0) { AutoJavaFloatArray autoMeasured(env, jmeasured, 1); jfloat* array = autoMeasured.ptr(); array[0] = SkScalarToFloat(measured); } return bytes >> 1; }
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; }