add drawString to ease the pain of converting to skfont

Bug: skia:
Change-Id: I88418f87883b66204427fbdab471e74c78835ac4
Reviewed-on: https://skia-review.googlesource.com/c/181407
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
Auto-Submit: Mike Reed <reed@google.com>
diff --git a/gm/arithmode.cpp b/gm/arithmode.cpp
index a765223..7a25c2e 100644
--- a/gm/arithmode.cpp
+++ b/gm/arithmode.cpp
@@ -149,12 +149,9 @@
                 canvas->translate(gap, 0);
 
                 // Label
-                SkPaint paint;
-                paint.setTextSize(SkIntToScalar(24));
-                paint.setAntiAlias(true);
-                sk_tool_utils::set_portable_typeface(&paint);
+                SkFont font(sk_tool_utils::create_portable_typeface(), 24);
                 SkString str(enforcePMColor ? "enforcePM" : "no enforcePM");
-                canvas->drawString(str, 0, paint.getTextSize(), paint);
+                canvas->drawString(str, 0, font.getSize(), font, SkPaint());
             }
             canvas->translate(0, HH + 12);
         }
diff --git a/gm/bitmapfilters.cpp b/gm/bitmapfilters.cpp
index 0551c02..98038ca 100644
--- a/gm/bitmapfilters.cpp
+++ b/gm/bitmapfilters.cpp
@@ -44,14 +44,15 @@
     SkAutoCanvasRestore acr(canvas, true);
 
     SkPaint paint;
+    paint.setAntiAlias(true);
+
     SkScalar x = 0;
     const int scale = 32;
 
-    paint.setAntiAlias(true);
-    sk_tool_utils::set_portable_typeface(&paint);
+    SkFont font(sk_tool_utils::create_portable_typeface());
     const char* name = sk_tool_utils::colortype_name(bm.colorType());
     canvas->drawString(name, x, SkIntToScalar(bm.height())*scale*5/8,
-                     paint);
+                       font, paint);
     canvas->translate(SkIntToScalar(48), 0);
 
     canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale));
diff --git a/gm/blurimagevmask.cpp b/gm/blurimagevmask.cpp
index 9440959..c2dd516 100644
--- a/gm/blurimagevmask.cpp
+++ b/gm/blurimagevmask.cpp
@@ -16,15 +16,12 @@
     paint.setAntiAlias(true);
     paint.setColor(SK_ColorBLACK);
 
-    SkPaint textPaint;
-    textPaint.setAntiAlias(true);
-    sk_tool_utils::set_portable_typeface(&textPaint);
-    textPaint.setTextSize(SkIntToScalar(25));
+    SkFont font(sk_tool_utils::create_portable_typeface(), 25);
 
     const double sigmas[] = {3.0, 8.0, 16.0, 24.0, 32.0};
 
-    canvas->drawString("mask blur",  285, 50, textPaint);
-    canvas->drawString("image blur", 285 + 250, 50, textPaint);
+    canvas->drawString("mask blur",  285, 50, font, paint);
+    canvas->drawString("image blur", 285 + 250, 50, font, paint);
 
 
     SkRect r = {35, 100, 135, 200};
@@ -34,7 +31,7 @@
 
         char out[100];
         sprintf(out, "Sigma: %g", sigma);
-        canvas->drawString(out, r.left(), r.bottom() + 35, textPaint);
+        canvas->drawString(out, r.left(), r.bottom() + 35, font, paint);
 
         r.offset(250, 0);
 
diff --git a/gm/blurs.cpp b/gm/blurs.cpp
index bd666bb..6892ad3 100644
--- a/gm/blurs.cpp
+++ b/gm/blurs.cpp
@@ -14,53 +14,53 @@
 #include "SkPath.h"
 
 DEF_SIMPLE_GM_BG(blurs, canvas, 700, 500, 0xFFDDDDDD) {
-        SkBlurStyle NONE = SkBlurStyle(-999);
-        const struct {
-            SkBlurStyle fStyle;
-            int         fCx, fCy;
-        } gRecs[] = {
-            { NONE,                 0,  0 },
-            { kInner_SkBlurStyle,  -1,  0 },
-            { kNormal_SkBlurStyle,  0,  1 },
-            { kSolid_SkBlurStyle,   0, -1 },
-            { kOuter_SkBlurStyle,   1,  0 },
-        };
+    SkBlurStyle NONE = SkBlurStyle(-999);
+    const struct {
+        SkBlurStyle fStyle;
+        int         fCx, fCy;
+    } gRecs[] = {
+        { NONE,                 0,  0 },
+        { kInner_SkBlurStyle,  -1,  0 },
+        { kNormal_SkBlurStyle,  0,  1 },
+        { kSolid_SkBlurStyle,   0, -1 },
+        { kOuter_SkBlurStyle,   1,  0 },
+    };
 
-        SkPaint paint;
-        paint.setAntiAlias(true);
-        sk_tool_utils::set_portable_typeface(&paint);
-        paint.setTextSize(SkIntToScalar(25));
-        canvas->translate(SkIntToScalar(-40), SkIntToScalar(0));
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(SK_ColorBLUE);
 
-        paint.setColor(SK_ColorBLUE);
-        for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
-            if (gRecs[i].fStyle != NONE) {
-                paint.setMaskFilter(SkMaskFilter::MakeBlur(gRecs[i].fStyle,
-                                       SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20))));
-            } else {
-                paint.setMaskFilter(nullptr);
-            }
-            canvas->drawCircle(SkIntToScalar(200 + gRecs[i].fCx*100),
-                               SkIntToScalar(200 + gRecs[i].fCy*100),
-                               SkIntToScalar(50),
-                               paint);
-        }
-        // draw text
-        {
-            paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
-                                       SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4))));
-            SkScalar x = SkIntToScalar(70);
-            SkScalar y = SkIntToScalar(400);
-            paint.setColor(SK_ColorBLACK);
-            canvas->drawString("Hamburgefons Style", x, y, paint);
-            canvas->drawString("Hamburgefons Style",
-                             x, y + SkIntToScalar(50), paint);
+    canvas->translate(SkIntToScalar(-40), SkIntToScalar(0));
+
+    for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
+        if (gRecs[i].fStyle != NONE) {
+            paint.setMaskFilter(SkMaskFilter::MakeBlur(gRecs[i].fStyle,
+                                   SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20))));
+        } else {
             paint.setMaskFilter(nullptr);
-            paint.setColor(SK_ColorWHITE);
-            x -= SkIntToScalar(2);
-            y -= SkIntToScalar(2);
-            canvas->drawString("Hamburgefons Style", x, y, paint);
         }
+        canvas->drawCircle(SkIntToScalar(200 + gRecs[i].fCx*100),
+                           SkIntToScalar(200 + gRecs[i].fCy*100),
+                           SkIntToScalar(50),
+                           paint);
+    }
+    // draw text
+    {
+        SkFont font(sk_tool_utils::create_portable_typeface(), 25);
+        paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
+                                   SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4))));
+        SkScalar x = SkIntToScalar(70);
+        SkScalar y = SkIntToScalar(400);
+        paint.setColor(SK_ColorBLACK);
+        canvas->drawString("Hamburgefons Style", x, y, font, paint);
+        canvas->drawString("Hamburgefons Style",
+                         x, y + SkIntToScalar(50), font, paint);
+        paint.setMaskFilter(nullptr);
+        paint.setColor(SK_ColorWHITE);
+        x -= SkIntToScalar(2);
+        y -= SkIntToScalar(2);
+        canvas->drawString("Hamburgefons Style", x, y, font, paint);
+    }
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/gm/bmpfilterqualityrepeat.cpp b/gm/bmpfilterqualityrepeat.cpp
index 313fd93..ba41c3a 100644
--- a/gm/bmpfilterqualityrepeat.cpp
+++ b/gm/bmpfilterqualityrepeat.cpp
@@ -64,11 +64,12 @@
         lm.setTranslateY(330);
 
         SkPaint textPaint;
-        sk_tool_utils::set_portable_typeface(&textPaint);
         textPaint.setAntiAlias(true);
 
         SkPaint bmpPaint(textPaint);
 
+        SkFont font(sk_tool_utils::create_portable_typeface());
+
         SkAutoCanvasRestore acr(canvas, true);
 
         for (size_t q = 0; q < SK_ARRAY_COUNT(kQualities); ++q) {
@@ -76,7 +77,7 @@
             bmpPaint.setShader(SkShader::MakeBitmapShader(fBmp, kTM, kTM, &lm));
             bmpPaint.setFilterQuality(kQualities[q].fQuality);
             canvas->drawRect(rect, bmpPaint);
-            canvas->drawString(kQualities[q].fName, 20, 40, textPaint);
+            canvas->drawString(kQualities[q].fName, 20, 40, font, textPaint);
             canvas->translate(250, 0);
         }
 
diff --git a/gm/colorwheel.cpp b/gm/colorwheel.cpp
index e970af5..230b85c 100644
--- a/gm/colorwheel.cpp
+++ b/gm/colorwheel.cpp
@@ -40,22 +40,22 @@
 
 DEF_SIMPLE_GM(colorwheelnative, canvas, 128, 28) {
     SkPaint paint;
-    sk_tool_utils::set_portable_typeface(&paint, "sans-serif", SkFontStyle::Bold());
-    paint.setTextSize(18.0f);
+    SkFont font(sk_tool_utils::create_portable_typeface("sans-serif", SkFontStyle::Bold()), 18);
+    font.setEdging(SkFont::Edging::kAlias);
 
     canvas->clear(SK_ColorLTGRAY);
     paint.setColor(SK_ColorRED);
-    canvas->drawString("R", 8.0f, 20.0f, paint);
+    canvas->drawString("R", 8.0f, 20.0f, font, paint);
     paint.setColor(SK_ColorGREEN);
-    canvas->drawString("G", 24.0f, 20.0f, paint);
+    canvas->drawString("G", 24.0f, 20.0f, font, paint);
     paint.setColor(SK_ColorBLUE);
-    canvas->drawString("B", 40.0f, 20.0f, paint);
+    canvas->drawString("B", 40.0f, 20.0f, font, paint);
     paint.setColor(SK_ColorCYAN);
-    canvas->drawString("C", 56.0f, 20.0f, paint);
+    canvas->drawString("C", 56.0f, 20.0f, font, paint);
     paint.setColor(SK_ColorMAGENTA);
-    canvas->drawString("M", 72.0f, 20.0f, paint);
+    canvas->drawString("M", 72.0f, 20.0f, font, paint);
     paint.setColor(SK_ColorYELLOW);
-    canvas->drawString("Y", 88.0f, 20.0f, paint);
+    canvas->drawString("Y", 88.0f, 20.0f, font, paint);
     paint.setColor(SK_ColorBLACK);
-    canvas->drawString("K", 104.0f, 20.0f, paint);
+    canvas->drawString("K", 104.0f, 20.0f, font, paint);
 }
diff --git a/gm/complexclip3.cpp b/gm/complexclip3.cpp
index 421b3d8..afb5a5a 100644
--- a/gm/complexclip3.cpp
+++ b/gm/complexclip3.cpp
@@ -52,8 +52,8 @@
 
         SkPaint paint;
         paint.setAntiAlias(true);
-        sk_tool_utils::set_portable_typeface(&paint);
-        paint.setTextSize(SkIntToScalar(20));
+
+        SkFont font(sk_tool_utils::create_portable_typeface(), 20);
 
         constexpr struct {
             SkClipOp    fOp;
@@ -106,7 +106,7 @@
                                                    doAAB ? "A" : "B",
                                                    doInvB ? "I" : "N");
 
-                        canvas->drawString(str.c_str(), txtX, SkIntToScalar(130), paint);
+                        canvas->drawString(str.c_str(), txtX, SkIntToScalar(130), font, paint);
                         if (doInvB) {
                             canvas->translate(SkIntToScalar(150),0);
                         } else {
diff --git a/gm/convexpolyclip.cpp b/gm/convexpolyclip.cpp
index af073c6..2ab41ca 100644
--- a/gm/convexpolyclip.cpp
+++ b/gm/convexpolyclip.cpp
@@ -57,18 +57,19 @@
         mat.postScale(SK_Scalar1 / 3, SK_Scalar1 / 3);
     }
 
-    paint.setAntiAlias(true);
-    sk_tool_utils::set_portable_typeface(&paint);
-    paint.setTextSize(wScalar / 2.2f);
+    SkFont font(sk_tool_utils::create_portable_typeface(), wScalar / 2.2f);
+
     paint.setShader(nullptr);
     paint.setColor(SK_ColorLTGRAY);
     constexpr char kTxt[] = "Skia";
-    SkPoint texPos = { wScalar / 17, hScalar / 2 + paint.getTextSize() / 2.5f };
-    canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint);
+    SkPoint texPos = { wScalar / 17, hScalar / 2 + font.getSize() / 2.5f };
+    canvas.drawSimpleText(kTxt, SK_ARRAY_COUNT(kTxt)-1, kUTF8_SkTextEncoding,
+                          texPos.fX, texPos.fY, font, paint);
     paint.setColor(SK_ColorBLACK);
     paint.setStyle(SkPaint::kStroke_Style);
     paint.setStrokeWidth(SK_Scalar1);
-    canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint);
+    canvas.drawSimpleText(kTxt, SK_ARRAY_COUNT(kTxt)-1, kUTF8_SkTextEncoding,
+                          texPos.fX, texPos.fY, font, paint);
     return bmp;
 }
 
diff --git a/gm/dashing.cpp b/gm/dashing.cpp
index 9a52689..cacdc00 100644
--- a/gm/dashing.cpp
+++ b/gm/dashing.cpp
@@ -560,12 +560,13 @@
     p.setStrokeWidth(10);
     p.setStrokeCap(SkPaint::kRound_Cap);
     p.setStrokeJoin(SkPaint::kRound_Join);
-    p.setTextSize(100);
     p.setARGB(0xff, 0xbb, 0x00, 0x00);
-    sk_tool_utils::set_portable_typeface(&p);
+
+    SkFont font(sk_tool_utils::create_portable_typeface(), 100);
+
     const SkScalar intervals[] = { 12, 12 };
     p.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0));
-    canvas->drawString("Sausages", 10, 90, p);
+    canvas->drawString("Sausages", 10, 90, font, p);
     canvas->drawLine(8, 120, 456, 120, p);
 }
 
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
index 7b54a2b..49aff57 100644
--- a/include/core/SkCanvas.h
+++ b/include/core/SkCanvas.h
@@ -27,6 +27,10 @@
 #include "SkSurfaceProps.h"
 #include "SkVertices.h"
 
+#ifndef SK_SUPPORT_LEGACY_DRAWSTRING
+#define SK_SUPPORT_LEGACY_DRAWSTRING
+#endif
+
 class GrContext;
 class GrRenderTargetContext;
 class SkAndroidFrameworkUtils;
@@ -1870,6 +1874,7 @@
     void drawSimpleText(const void* text, size_t byteLength, SkTextEncoding encoding,
                         SkScalar x, SkScalar y, const SkFont& font, const SkPaint& paint);
 
+#ifdef SK_SUPPORT_LEGACY_DRAWSTRING
     /** Draws null terminated string, with origin at (x, y), using clip, SkMatrix, and
         SkPaint paint.
 
@@ -1920,6 +1925,18 @@
         @param paint   text size, blend, color, and so on, used to draw
     */
     void drawString(const SkString& string, SkScalar x, SkScalar y, const SkPaint& paint);
+#endif
+
+    // Experimental
+    void drawString(const char str[], SkScalar x, SkScalar y, const SkFont& font,
+                    const SkPaint& paint) {
+        this->drawSimpleText(str, strlen(str), kUTF8_SkTextEncoding, x, y, font, paint);
+    }
+    // Experimental
+    void drawString(const SkString& str, SkScalar x, SkScalar y, const SkFont& font,
+                    const SkPaint& paint) {
+        this->drawSimpleText(str.c_str(), str.size(), kUTF8_SkTextEncoding, x, y, font, paint);
+    }
 
     /** Draws SkTextBlob blob at (x, y), using clip, SkMatrix, and SkPaint paint.