static int dotextwidths(JNIEnv* env, SkPaint* paint, const jchar text[], int count, jfloatArray widths) { AutoJavaFloatArray autoWidths(env, widths, count); jfloat* widthsArray = autoWidths.ptr(); SkScalar* scalarArray = (SkScalar*)widthsArray; count = paint->getTextWidths(text, count << 1, scalarArray); for (int i = 0; i < count; i++) { widthsArray[i] = SkScalarToFloat(scalarArray[i]); } return count; }
static void doMeasure(SkCanvas* canvas, const SkPaint& paint, const char text[]) { SkScalar dy = paint.getFontMetrics(NULL); size_t len = strlen(text); SkAutoTMalloc<SkScalar> autoWidths(len); SkScalar* widths = autoWidths.get(); SkAutoTMalloc<SkRect> autoRects(len); SkRect* rects = autoRects.get(); SkRect bounds; SkPaint p(paint); for (size_t i = 0; i < SK_ARRAY_COUNT(gSettings); i++) { p.setLinearText(gSettings[i].fLinearText); p.setDevKernText(gSettings[i].fDevKernText); SkScalar scale = gSettings[i].fScale; int n = p.getTextWidths(text, len, widths, rects); SkScalar w = p.measureText(text, len, &bounds, scale); p.setStyle(SkPaint::kFill_Style); p.setColor(0x8888FF88); canvas->drawRect(bounds, p); p.setColor(0xFF000000); canvas->drawText(text, len, 0, 0, p); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(0); p.setColor(0xFFFF0000); SkScalar x = 0; for (int j = 0; j < n; j++) { SkRect r = rects[j]; r.offset(x, 0); canvas->drawRect(r, p); x += widths[j]; } p.setColor(0xFF0000FF); canvas->drawLine(0, 0, w, 0, p); p.setStrokeWidth(SkIntToScalar(4)); canvas->drawPoint(x, 0, p); canvas->translate(0, dy); } }