use font for measuring

Bug: skia:
Change-Id: I451c61d5b98cb42440a4eaa889d9404638a72f5c
Reviewed-on: https://skia-review.googlesource.com/c/179980
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/gm/gamma.cpp b/gm/gamma.cpp
index c1afc69..6c854ae 100644
--- a/gm/gamma.cpp
+++ b/gm/gamma.cpp
@@ -49,10 +49,11 @@
     mipmapPixels[0] = mipmapPixels[3] = SkPackARGB32(0xFF, s25, s25, s25);
     mipmapPixels[1] = mipmapPixels[2] = SkPackARGB32(0xFF, s75, s75, s75);
 
+    SkFont font(sk_tool_utils::create_portable_typeface());
+
     SkPaint textPaint;
     textPaint.setAntiAlias(true);
     textPaint.setColor(SK_ColorWHITE);
-    sk_tool_utils::set_portable_typeface(&textPaint);
 
     // Helpers:
     auto advance = [&]() {
@@ -60,19 +61,22 @@
         p.reset();
     };
 
+    auto drawString = [&](const char str[], SkScalar x, SkScalar y) {
+        canvas->drawSimpleText(str, strlen(str), kUTF8_SkTextEncoding, x, y, font, textPaint);
+    };
+
     auto nextRect = [&](const char* label, const char* label2) {
         canvas->drawRect(r, p);
-        canvas->drawString(label, 0, sz + textPaint.getFontSpacing(), textPaint);
+        drawString(label, 0, sz + font.getSpacing());
         if (label2) {
-            canvas->drawString(label2, 0, sz + 2 * textPaint.getFontSpacing(),
-                             textPaint);
+            drawString(label2, 0, sz + 2 * font.getSpacing());
         }
         advance();
     };
 
     auto nextBitmap = [&](const SkBitmap& bmp, const char* label) {
         canvas->drawBitmap(bmp, 0, 0);
-        canvas->drawString(label, 0, sz + textPaint.getFontSpacing(), textPaint);
+        drawString(label, 0, sz + font.getSpacing());
         advance();
     };
 
@@ -85,13 +89,10 @@
 
         SkString srcText = SkStringPrintf("%08X", srcColor);
         SkString dstText = SkStringPrintf("%08X", dstColor);
-        canvas->drawString(srcText, 0, sz + textPaint.getFontSpacing(),
-                         textPaint);
+        drawString(srcText.c_str(), 0, sz + font.getSpacing());
         const char* modeName = SkBlendMode_Name(mode);
-        canvas->drawString(modeName, 0, sz + 2 * textPaint.getFontSpacing(),
-                         textPaint);
-        canvas->drawString(dstText, 0, sz + 3 * textPaint.getFontSpacing(),
-                         textPaint);
+        drawString(modeName, 0, sz + 2 * font.getSpacing());
+        drawString(dstText.c_str(), 0, sz + 3 * font.getSpacing());
         advance();
     };
 
diff --git a/gm/lumafilter.cpp b/gm/lumafilter.cpp
index 07e9b99..82cb1a0 100644
--- a/gm/lumafilter.cpp
+++ b/gm/lumafilter.cpp
@@ -19,13 +19,14 @@
 
 static void draw_label(SkCanvas* canvas, const char* label,
                        const SkPoint& offset) {
-    SkPaint paint;
-    sk_tool_utils::set_portable_typeface(&paint);
+    SkFont font(sk_tool_utils::create_portable_typeface());
+    font.setEdging(SkFont::Edging::kAlias);
+
     size_t len = strlen(label);
 
-    SkScalar width = paint.measureText(label, len);
-    canvas->drawText(label, len, offset.x() - width / 2, offset.y(),
-                     paint);
+    SkScalar width = font.measureText(label, len, kUTF8_SkTextEncoding);
+    canvas->drawSimpleText(label, len, kUTF8_SkTextEncoding, offset.x() - width / 2, offset.y(),
+                           font, SkPaint());
 }
 
 static void draw_scene(SkCanvas* canvas, const sk_sp<SkColorFilter>& filter, SkBlendMode mode,
diff --git a/gm/mixedtextblobs.cpp b/gm/mixedtextblobs.cpp
index a7a9f81..afdd736 100644
--- a/gm/mixedtextblobs.cpp
+++ b/gm/mixedtextblobs.cpp
@@ -48,16 +48,15 @@
 
         // make textblob
         // Text so large we draw as paths
-        SkPaint paint;
-        paint.setTextSize(385);
+        SkFont font(sk_tool_utils::create_portable_typeface(), 385);
+        font.setEdging(SkFont::Edging::kAlias);
         const char* text = "O";
-        sk_tool_utils::set_portable_typeface(&paint);
 
         SkRect bounds;
-        paint.measureText(text, strlen(text), &bounds);
+        font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds);
 
         SkScalar yOffset = bounds.height();
-        sk_tool_utils::add_to_text_blob(&builder, text, paint, 10, yOffset);
+        sk_tool_utils::add_to_text_blob(&builder, text, font, 10, yOffset);
         SkScalar corruptedAx = bounds.width();
         SkScalar corruptedAy = yOffset;
 
@@ -68,33 +67,31 @@
         yOffset = boundsHalfHeight;
 
         // LCD
-        paint.setTextSize(32);
+        font.setSize(32);
+        font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
+        font.setSubpixel(true);
         text = "LCD!!!!!";
-        paint.setAntiAlias(true);
-        paint.setSubpixelText(true);
-        paint.setLCDRenderText(true);
-        paint.measureText(text, strlen(text), &bounds);
-        sk_tool_utils::add_to_text_blob(&builder, text, paint, xOffset - bounds.width() * 0.25f,
+        font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds);
+        sk_tool_utils::add_to_text_blob(&builder, text, font, xOffset - bounds.width() * 0.25f,
                                         yOffset - bounds.height() * 0.5f);
         yOffset += bounds.height();
 
         // color emoji
         if (fEmojiTypeface) {
-            paint.setAntiAlias(false);
-            paint.setSubpixelText(false);
-            paint.setLCDRenderText(false);
-            paint.setTypeface(fEmojiTypeface);
+            font.setEdging(SkFont::Edging::kAlias);
+            font.setSubpixel(false);
+            font.setTypeface(fEmojiTypeface);
             text = fEmojiText;
-            paint.measureText(text, strlen(text), &bounds);
-            sk_tool_utils::add_to_text_blob(&builder, text, paint, xOffset - bounds.width() * 0.3f,
+            font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds);
+            sk_tool_utils::add_to_text_blob(&builder, text, font, xOffset - bounds.width() * 0.3f,
                                             yOffset);
         }
 
         // Corrupted font
-        paint.setTextSize(12);
+        font.setSize(12);
         text = "aA";
-        paint.setTypeface(fReallyBigATypeface);
-        sk_tool_utils::add_to_text_blob(&builder, text, paint, corruptedAx, corruptedAy);
+        font.setTypeface(fReallyBigATypeface);
+        sk_tool_utils::add_to_text_blob(&builder, text, font, corruptedAx, corruptedAy);
         fBlob = builder.make();
     }
 
diff --git a/samplecode/SampleAnimatedText.cpp b/samplecode/SampleAnimatedText.cpp
index 1aa50e2..a7e86d6 100644
--- a/samplecode/SampleAnimatedText.cpp
+++ b/samplecode/SampleAnimatedText.cpp
@@ -24,11 +24,10 @@
 SkRandom gRand;
 
 static void DrawTheText(SkCanvas* canvas, const char text[], size_t length, SkScalar x, SkScalar y,
-                        const SkPaint& paint) {
-    SkPaint p(paint);
-
-    p.setSubpixelText(true);
-    canvas->drawText(text, length, x, y, p);
+                        const SkFont& font, const SkPaint& paint) {
+    SkFont f(font);
+    f.setSubpixel(true);
+    canvas->drawSimpleText(text, length, kUTF8_SkTextEncoding, x, y, f, paint);
 }
 
 // This sample demonstrates the cache behavior of bitmap vs. distance field text
@@ -69,8 +68,9 @@
     }
 
     void onDrawContent(SkCanvas* canvas) override {
+        SkFont font(SkTypeface::MakeFromFile("/skimages/samplefont.ttf"));
+
         SkPaint paint;
-        paint.setTypeface(SkTypeface::MakeFromFile("/skimages/samplefont.ttf"));
         paint.setAntiAlias(true);
         paint.setFilterQuality(kMedium_SkFilterQuality);
 
@@ -118,15 +118,16 @@
 
         SkScalar y = SkIntToScalar(0);
         for (int i = 12; i <= 26; i++) {
-            paint.setTextSize(SkIntToScalar(i*fSizeScale));
-            y += paint.getFontSpacing();
-            DrawTheText(canvas, text, length, SkIntToScalar(110), y, paint);
+            font.setSize(SkIntToScalar(i*fSizeScale));
+            y += font.getSpacing();
+            DrawTheText(canvas, text, length, SkIntToScalar(110), y, font, paint);
         }
         canvas->restore();
 
-        paint.setTextSize(16);
+        font.setSize(16);
 //        canvas->drawString(outString, 512.f, 540.f, paint);
-        canvas->drawString(modeString, 768.f, 540.f, paint);
+        canvas->drawSimpleText(modeString.c_str(), modeString.size(), kUTF8_SkTextEncoding,
+                               768.f, 540.f, font, paint);
     }
 
     bool onAnimate(const SkAnimTimer& timer) override {
diff --git a/samplecode/SampleChineseFling.cpp b/samplecode/SampleChineseFling.cpp
index b8110f3..3b73bb2 100644
--- a/samplecode/SampleChineseFling.cpp
+++ b/samplecode/SampleChineseFling.cpp
@@ -20,16 +20,6 @@
 #include "GrContextPriv.h"
 #endif
 
-static void make_paint(SkPaint* paint, sk_sp<SkTypeface> typeface) {
-  static const int kTextSize = 56;
-
-  paint->setAntiAlias(true);
-  paint->setColor(0xDE000000);
-  paint->setTypeface(typeface);
-  paint->setTextSize(kTextSize);
-  paint->setTextEncoding(kUTF32_SkTextEncoding);
-}
-
 static sk_sp<SkTypeface> chinese_typeface() {
 #ifdef SK_BUILD_FOR_ANDROID
     return MakeResourceAsTypeface("fonts/NotoSansCJK-Regular.ttc");
@@ -68,7 +58,7 @@
         canvas->clear(0xFFDDDDDD);
 
         SkPaint paint;
-        make_paint(&paint, fTypeface);
+        paint.setColor(0xDE000000);
 
         // draw a consistent run of the 'words' - one word per line
         int index = fIndex;
@@ -93,10 +83,8 @@
     void init() {
         fTypeface = chinese_typeface();
 
-        SkPaint paint;
-        make_paint(&paint, fTypeface);
-
-        paint.getFontMetrics(&fMetrics);
+        SkFont font(fTypeface, 56);
+        font.getMetrics(&fMetrics);
 
         SkUnichar glyphs[kWordLength];
         for (int32_t i = 0; i < kNumBlobs; ++i) {
@@ -104,7 +92,7 @@
 
             SkTextBlobBuilder builder;
             sk_tool_utils::add_to_text_blob_w_len(&builder, (const char*) glyphs, kWordLength*4,
-                                                  paint, 0, 0);
+                                                  kUTF32_SkTextEncoding, font, 0, 0);
 
             fBlobs.emplace_back(builder.make());
         }
@@ -215,14 +203,11 @@
     void init() {
         fTypeface = chinese_typeface();
 
-        SkPaint paint;
-        paint.setAntiAlias(true);
-        paint.setColor(0xDE000000);
-        paint.setTypeface(fTypeface);
-        paint.setTextSize(11);
-        paint.setTextEncoding(kUTF32_SkTextEncoding);
+        SkFont font(fTypeface, 11);
+        font.getMetrics(&fMetrics);
 
-        paint.getFontMetrics(&fMetrics);
+        SkPaint paint;
+        paint.setColor(0xDE000000);
 
         SkUnichar glyphs[45];
         for (int32_t i = 0; i < kNumBlobs; ++i) {
@@ -234,7 +219,8 @@
                 this->createRandomLine(glyphs, currentLineLength);
 
                 sk_tool_utils::add_to_text_blob_w_len(&builder, (const char*) glyphs,
-                                                      currentLineLength*4, paint, 0, y);
+                                                      currentLineLength*4, kUTF32_SkTextEncoding,
+                                                      font, 0, y);
                 y += fMetrics.fDescent - fMetrics.fAscent + fMetrics.fLeading;
                 paragraphLength -= 45;
             }
diff --git a/tools/sk_tool_utils.cpp b/tools/sk_tool_utils.cpp
index 74aa1a5..b899271 100644
--- a/tools/sk_tool_utils.cpp
+++ b/tools/sk_tool_utils.cpp
@@ -137,21 +137,15 @@
 }
 
 void add_to_text_blob_w_len(SkTextBlobBuilder* builder, const char* text, size_t len,
-                            const SkPaint& paint, SkScalar x, SkScalar y) {
-    SkFont font = SkFont::LEGACY_ExtractFromPaint(paint);
-    SkTDArray<uint16_t> glyphs;
-
-    glyphs.append(font.countText(text, len, paint.getTextEncoding()));
-    font.textToGlyphs(text, len, paint.getTextEncoding(), glyphs.begin(), glyphs.count());
-
-    const SkTextBlobBuilder::RunBuffer& run = builder->allocRun(font, glyphs.count(), x, y,
-                                                                nullptr);
-    memcpy(run.glyphs, glyphs.begin(), glyphs.count() * sizeof(uint16_t));
+                            SkTextEncoding encoding, const SkFont& font, SkScalar x, SkScalar y) {
+    int count = font.countText(text, len, encoding);
+    auto run = builder->allocRun(font, count, x, y);
+    font.textToGlyphs(text, len, encoding, run.glyphs, count);
 }
 
-void add_to_text_blob(SkTextBlobBuilder* builder, const char* text,
-                      const SkPaint& origPaint, SkScalar x, SkScalar y) {
-    add_to_text_blob_w_len(builder, text, strlen(text), origPaint, x, y);
+void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const SkFont& font,
+                      SkScalar x, SkScalar y) {
+    add_to_text_blob_w_len(builder, text, strlen(text), kUTF8_SkTextEncoding, font, x, y);
 }
 
 void get_text_path(const SkFont& font, const void* text, size_t length, SkTextEncoding encoding,
diff --git a/tools/sk_tool_utils.h b/tools/sk_tool_utils.h
index 645ac5d..01ad89c 100644
--- a/tools/sk_tool_utils.h
+++ b/tools/sk_tool_utils.h
@@ -11,6 +11,7 @@
 #include "SkColor.h"
 #include "SkData.h"
 #include "SkEncodedImageFormat.h"
+#include "SkFont.h"
 #include "SkFontStyle.h"
 #include "SkFontTypes.h"
 #include "SkImageEncoder.h"
@@ -27,7 +28,6 @@
 
 class SkBitmap;
 class SkCanvas;
-class SkFont;
 class SkFontStyle;
 class SkImage;
 class SkPaint;
@@ -126,11 +126,16 @@
     sk_sp<SkSurface> makeSurface(SkCanvas*, const SkImageInfo&, const SkSurfaceProps* = nullptr);
 
     // A helper for inserting a drawtext call into a SkTextBlobBuilder
-    void add_to_text_blob_w_len(SkTextBlobBuilder* builder, const char* text, size_t len,
-                                const SkPaint& origPaint, SkScalar x, SkScalar y);
+    void add_to_text_blob_w_len(SkTextBlobBuilder*, const char* text, size_t len, SkTextEncoding,
+                                const SkFont&, SkScalar x, SkScalar y);
 
-    void add_to_text_blob(SkTextBlobBuilder* builder, const char* text,
-                          const SkPaint& origPaint, SkScalar x, SkScalar y);
+    void add_to_text_blob(SkTextBlobBuilder*, const char* text, const SkFont&,
+                          SkScalar x, SkScalar y);
+
+    static inline void add_to_text_blob(SkTextBlobBuilder* builder, const char* text,
+                                        const SkPaint& paint, SkScalar x, SkScalar y) {
+        add_to_text_blob(builder, text, SkFont::LEGACY_ExtractFromPaint(paint), x, y);
+    }
 
     // Constructs a star by walking a 'numPts'-sided regular polygon with even/odd fill:
     //