drawText Cleanup

Change-Id: Ibe1ac895f0347faf44820aa70350e7020807cb85
Reviewed-on: https://skia-review.googlesource.com/c/182080
Commit-Queue: Hal Canary <halcanary@google.com>
Reviewed-by: Mike Reed <reed@google.com>
diff --git a/gm/drawquadset.cpp b/gm/drawquadset.cpp
index 9c3c6f0..f6aaa88 100644
--- a/gm/drawquadset.cpp
+++ b/gm/drawquadset.cpp
@@ -21,12 +21,7 @@
 static constexpr int kColCount = 3;
 
 static void draw_text(SkCanvas* canvas, const char* text) {
-    SkPaint paint;
-    paint.setColor(SK_ColorBLACK);
-    paint.setTextSize(12.0f);
-    paint.setAntiAlias(true);
-
-    canvas->drawString(text, 0, 0, paint);
+    canvas->drawString(text, 0, 0, SkFont(nullptr, 12), SkPaint());
 }
 
 static void draw_gradient_tiles(GrRenderTargetContext* rtc, const SkMatrix& view,
diff --git a/gm/dstreadshuffle.cpp b/gm/dstreadshuffle.cpp
index c4c19fc..68dcfc4 100644
--- a/gm/dstreadshuffle.cpp
+++ b/gm/dstreadshuffle.cpp
@@ -82,10 +82,9 @@
                 break;
             case kText_ShapeType: {
                 const char* text = "N";
-                paint->setTextSize(100.f);
-                paint->setFakeBoldText(true);
-                sk_tool_utils::set_portable_typeface(paint);
-                canvas->drawString(text, 0.f, 100.f, *paint);
+                SkFont font(sk_tool_utils::create_portable_typeface(), 100);
+                font.setEmbolden(true);
+                canvas->drawString(text, 0.f, 100.f, font, *paint);
             }
             default:
                 break;
diff --git a/gm/emboss.cpp b/gm/emboss.cpp
index a8483d0..2a96247 100644
--- a/gm/emboss.cpp
+++ b/gm/emboss.cpp
@@ -6,10 +6,12 @@
  */
 
 #include "gm.h"
+
 #include "SkBlurMask.h"
 #include "SkCanvas.h"
 #include "SkColorFilter.h"
 #include "SkEmbossMaskFilter.h"
+#include "SkFont.h"
 
 static SkBitmap make_bm() {
     SkBitmap bm;
@@ -69,8 +71,7 @@
         canvas->translate(SkIntToScalar(100), 0);
 
         paint.setStyle(SkPaint::kFill_Style);
-        paint.setTextSize(50);
-        canvas->drawText("Hello", 5, 0, 50, paint);
+        canvas->drawString("Hello", 0, 50, SkFont(nullptr, 50), paint);
     }
 
 private:
diff --git a/gm/emptypath.cpp b/gm/emptypath.cpp
index 67da93f..1c77580 100644
--- a/gm/emptypath.cpp
+++ b/gm/emptypath.cpp
@@ -61,17 +61,10 @@
             {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
         };
 
-        SkPaint titlePaint;
-        titlePaint.setColor(SK_ColorBLACK);
-        titlePaint.setAntiAlias(true);
-        sk_tool_utils::set_portable_typeface(&titlePaint);
-        titlePaint.setTextSize(15 * SK_Scalar1);
+        SkFont font(sk_tool_utils::create_portable_typeface(), 15);
         const char title[] = "Empty Paths Drawn Into Rectangle Clips With "
                              "Indicated Style and Fill";
-        canvas->drawString(title,
-                           20 * SK_Scalar1,
-                           20 * SK_Scalar1,
-                           titlePaint);
+        canvas->drawString(title, 20.0f, 20.0f, font, SkPaint());
 
         SkRandom rand;
         SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
@@ -106,15 +99,11 @@
 
                 SkPaint labelPaint;
                 labelPaint.setColor(color);
-                labelPaint.setAntiAlias(true);
-                sk_tool_utils::set_portable_typeface(&labelPaint);
-                labelPaint.setTextSize(12 * SK_Scalar1);
-                canvas->drawString(gStyles[style].fName,
-                                   0, rect.height() + 15 * SK_Scalar1,
-                                   labelPaint);
-                canvas->drawString(gFills[fill].fName,
-                                   0, rect.height() + 28 * SK_Scalar1,
-                                   labelPaint);
+                SkFont labelFont(sk_tool_utils::create_portable_typeface(), 12);
+                canvas->drawString(gStyles[style].fName, 0, rect.height() + 15.0f,
+                                   labelFont, labelPaint);
+                canvas->drawString(gFills[fill].fName, 0, rect.height() + 28.0f,
+                                   labelFont, labelPaint);
             }
         }
         canvas->restore();
diff --git a/gm/gammatext.cpp b/gm/gammatext.cpp
index e248f58..1d944de 100644
--- a/gm/gammatext.cpp
+++ b/gm/gammatext.cpp
@@ -61,12 +61,10 @@
         };
 
         const char* text = "Hamburgefons";
-        size_t len = strlen(text);
 
         SkPaint paint;
-        paint.setTextSize(SkIntToScalar(16));
-        paint.setAntiAlias(true);
-        paint.setLCDRenderText(true);
+        SkFont font(nullptr, 16);
+        font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
 
         SkScalar x = SkIntToScalar(10);
         for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) {
@@ -75,8 +73,8 @@
             SkScalar y = SkIntToScalar(40);
             SkScalar stopy = SkIntToScalar(HEIGHT);
             while (y < stopy) {
-                canvas->drawText(text, len, x, y, paint);
-                y += paint.getTextSize() * 2;
+                canvas->drawString(text, x, y, font, paint);
+                y += font.getSize() * 2;
             }
             x += SkIntToScalar(1024) / SK_ARRAY_COUNT(fg);
         }
@@ -98,20 +96,16 @@
     return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
 }
 
-static void set_face(SkPaint* paint) {
-    paint->setTypeface(SkTypeface::MakeFromName("serif", SkFontStyle::Italic()));
-}
-
-static void draw_pair(SkCanvas* canvas, SkPaint* paint, const sk_sp<SkShader>& shader) {
-    const char text[] = "Now is the time for all good";
-    const size_t len = strlen(text);
-
-    paint->setShader(nullptr);
-    canvas->drawText(text, len, 10, 20, *paint);
-    paint->setShader(SkShader::MakeColorShader(paint->getColor()));
-    canvas->drawText(text, len, 10, 40, *paint);
-    paint->setShader(shader);
-    canvas->drawText(text, len, 10, 60, *paint);
+static void draw_pair(SkCanvas* canvas, const SkFont& font, SkColor color,
+                      const sk_sp<SkShader>& shader) {
+    static const char text[] = "Now is the time for all good";
+    SkPaint paint;
+    paint.setColor(color);
+    canvas->drawString(text, 10, 20, font, paint);
+    paint.setShader(SkShader::MakeColorShader(paint.getColor()));
+    canvas->drawString(text, 10, 40, font, paint);
+    paint.setShader(shader);
+    canvas->drawString(text, 10, 60, font, paint);
 }
 
 class GammaShaderTextGM : public skiagm::GM {
@@ -143,14 +137,11 @@
 
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
-        paint.setAntiAlias(true);
-        paint.setLCDRenderText(true);
-        paint.setTextSize(18);
-        set_face(&paint);
+        SkFont font(SkTypeface::MakeFromName("serif", SkFontStyle::Italic()), 18);
+        font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
 
         for (size_t i = 0; i < SK_ARRAY_COUNT(fShaders); ++i) {
-            paint.setColor(fColors[i]);
-            draw_pair(canvas, &paint, fShaders[i]);
+            draw_pair(canvas, font, fColors[i], fShaders[i]);
             canvas->translate(0, 80);
         }
     }
diff --git a/gm/gm.cpp b/gm/gm.cpp
index a9cc3bc..8deba84 100644
--- a/gm/gm.cpp
+++ b/gm/gm.cpp
@@ -81,13 +81,10 @@
     bmp.allocN32Pixels(128, 64);
     SkCanvas bmpCanvas(bmp);
     bmpCanvas.drawColor(SK_ColorWHITE);
+    SkFont font(sk_tool_utils::create_portable_typeface(), 20);
     SkPaint paint;
-    paint.setAntiAlias(true);
-    paint.setTextSize(20);
     paint.setColor(SK_ColorRED);
-    sk_tool_utils::set_portable_typeface(&paint);
-    constexpr char kTxt[] = "GPU Only";
-    bmpCanvas.drawString(kTxt, 20, 40, paint);
+    bmpCanvas.drawString("GPU Only", 20, 40, font, paint);
     SkMatrix localM;
     localM.setRotate(35.f);
     localM.postTranslate(10.f, 0.f);
diff --git a/gm/gradtext.cpp b/gm/gradtext.cpp
index 7bece02..b9cdb12 100644
--- a/gm/gradtext.cpp
+++ b/gm/gradtext.cpp
@@ -95,74 +95,39 @@
     typedef GM INHERITED;
 };
 
-
-
-class GradTextGM : public GM {
-public:
-    GradTextGM () {}
-
-protected:
-    SkString onShortName() override {
-        return SkString("gradtext");
-    }
-
-    SkISize onISize() override { return SkISize::Make(500, 480); }
-
-    static void draw_text(SkCanvas* canvas, const SkPaint& paint) {
-        const char* text = "When in the course of human events";
-        size_t len = strlen(text);
-        canvas->drawText(text, len, 0, 0, paint);
-    }
-
-    static void draw_text3(SkCanvas* canvas, const SkPaint& paint) {
-        SkPaint p(paint);
-
-        p.setAntiAlias(false);
-        draw_text(canvas, p);
-        p.setAntiAlias(true);
-        canvas->translate(0, paint.getTextSize() * 4/3);
-        draw_text(canvas, p);
-        p.setLCDRenderText(true);
-        canvas->translate(0, paint.getTextSize() * 4/3);
-        draw_text(canvas, p);
-    }
-
-    void onDraw(SkCanvas* canvas) override {
-        SkPaint paint;
-        sk_tool_utils::set_portable_typeface(&paint);
-        paint.setTextSize(SkIntToScalar(26));
-
-        const SkISize& size = this->getISize();
-        SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()),
-                                  SkIntToScalar(size.height()) / 2);
-        canvas->drawRect(r, paint);
-
-        canvas->translate(SkIntToScalar(20), paint.getTextSize());
-
-        for (int i = 0; i < 2; ++i) {
-            paint.setShader(make_grad(SkIntToScalar(80)));
-            draw_text3(canvas, paint);
-
-            canvas->translate(0, paint.getTextSize() * 2);
-
-            paint.setShader(make_grad2(SkIntToScalar(80)));
-            draw_text3(canvas, paint);
-
-            canvas->translate(0, paint.getTextSize() * 2);
-        }
-    }
-
-private:
-    typedef GM INHERITED;
-};
-
 //////////////////////////////////////////////////////////////////////////////
 
-static GM* MyFactory(void*) { return new GradTextGM; }
 static GM* CMyFactory(void*) { return new ChromeGradTextGM1; }
 static GM* CMyFactory2(void*) { return new ChromeGradTextGM2; }
 
-static GMRegistry reg(MyFactory);
 static GMRegistry Creg(CMyFactory);
 static GMRegistry Creg2(CMyFactory2);
 }
+
+DEF_SIMPLE_GM(gradtext, canvas, 500, 480) {
+    static constexpr float kTextSize = 26.0f;
+    SkFont font(sk_tool_utils::create_portable_typeface(), kTextSize);
+
+    canvas->drawRect({0, 0, 500, 240}, SkPaint());
+    canvas->translate(20.0f, kTextSize);
+
+    SkPaint paints[2];
+    paints[0].setShader(make_grad(80.0f));
+    paints[1].setShader(make_grad2(80.0f));
+
+    static const SkFont::Edging edgings[3] = {
+        SkFont::Edging::kAlias,
+        SkFont::Edging::kAntiAlias,
+        SkFont::Edging::kSubpixelAntiAlias,
+    };
+    for (int i = 0; i < 2; ++i) {
+        for (const SkPaint& paint : paints) {
+            for (SkFont::Edging edging : edgings) {
+                font.setEdging(edging);
+                canvas->drawString("When in the course of human events", 0, 0, font, paint);
+                canvas->translate(0, kTextSize * 4/3);
+            }
+            canvas->translate(0, kTextSize * 2/3);
+        }
+    }
+}
diff --git a/gm/image.cpp b/gm/image.cpp
index 13ba101..f1afa94 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -113,34 +113,19 @@
     void onDraw(SkCanvas* canvas) override {
         canvas->scale(2, 2);
 
-        const char* kLabel1 = "Original Img";
-        const char* kLabel2 = "Modified Img";
-        const char* kLabel3 = "Cur Surface";
-        const char* kLabel4 = "Full Crop";
-        const char* kLabel5 = "Over-crop";
-        const char* kLabel6 = "Upper-left";
-        const char* kLabel7 = "No Crop";
+        SkFont font(sk_tool_utils::create_portable_typeface(), 8);
 
-        const char* kLabel8 = "Pre-Alloc Img";
-        const char* kLabel9 = "New Alloc Img";
-        const char* kLabel10 = "GPU";
+        canvas->drawString("Original Img",  10,  60, font, SkPaint());
+        canvas->drawString("Modified Img",  10, 140, font, SkPaint());
+        canvas->drawString("Cur Surface",   10, 220, font, SkPaint());
+        canvas->drawString("Full Crop",     10, 300, font, SkPaint());
+        canvas->drawString("Over-crop",     10, 380, font, SkPaint());
+        canvas->drawString("Upper-left",    10, 460, font, SkPaint());
+        canvas->drawString("No Crop",       10, 540, font, SkPaint());
 
-        SkPaint textPaint;
-        textPaint.setAntiAlias(true);
-        sk_tool_utils::set_portable_typeface(&textPaint);
-        textPaint.setTextSize(8);
-
-        canvas->drawString(kLabel1, 10,  60, textPaint);
-        canvas->drawString(kLabel2, 10, 140, textPaint);
-        canvas->drawString(kLabel3, 10, 220, textPaint);
-        canvas->drawString(kLabel4, 10, 300, textPaint);
-        canvas->drawString(kLabel5, 10, 380, textPaint);
-        canvas->drawString(kLabel6, 10, 460, textPaint);
-        canvas->drawString(kLabel7, 10, 540, textPaint);
-
-        canvas->drawString(kLabel8, 80, 10, textPaint);
-        canvas->drawString(kLabel9, 160, 10, textPaint);
-        canvas->drawString(kLabel10, 265, 10, textPaint);
+        canvas->drawString("Pre-Alloc Img", 80,  10, font, SkPaint());
+        canvas->drawString("New Alloc Img", 160, 10, font, SkPaint());
+        canvas->drawString( "GPU",          265, 10, font, SkPaint());
 
         canvas->translate(80, 20);
 
diff --git a/gm/imageblur2.cpp b/gm/imageblur2.cpp
index b6f9ff5..4cb94c9 100644
--- a/gm/imageblur2.cpp
+++ b/gm/imageblur2.cpp
@@ -12,82 +12,48 @@
 
 // TODO deprecate imageblur
 
-#define WIDTH 500
-#define HEIGHT 500
+constexpr int kWidth  = 500;
+constexpr int kHeight = 500;
 
-constexpr float kBlurSigmas[] = {
-        0.0, 0.3f, 0.5f, 2.0f, 32.0f, 80.0f };
-
-const char* kTestStrings[] = {
+DEF_SIMPLE_GM(imageblur2, canvas, kWidth, kHeight) {
+    constexpr float kBlurSigmas[] = { 0.0, 0.3f, 0.5f, 2.0f, 32.0f, 80.0f };
+    const char* kTestStrings[] = {
         "The quick`~",
         "brown fox[]",
         "jumped over",
         "the lazy@#$",
         "dog.{}!%^&",
         "*()+=-\\'\"/",
-};
+    };
+    constexpr int sigmaCount = SK_ARRAY_COUNT(kBlurSigmas);
+    constexpr int testStringCount = SK_ARRAY_COUNT(kTestStrings);
+    constexpr SkScalar dx = kWidth / sigmaCount;
+    constexpr SkScalar dy = kHeight / sigmaCount;
+    constexpr SkScalar textSize = 12;
 
-namespace skiagm {
+    SkFont font(sk_tool_utils::create_portable_typeface(), textSize);
+    font.setEdging(SkFont::Edging::kAlias);
 
-class BlurImageFilter : public GM {
-public:
-    BlurImageFilter() {
-        this->setBGColor(0xFFFFFFFF);
-        fName.printf("imageblur2");
-    }
+    for (int x = 0; x < sigmaCount; x++) {
+        SkScalar sigmaX = kBlurSigmas[x];
+        for (int y = 0; y < sigmaCount; y++) {
+            SkScalar sigmaY = kBlurSigmas[y];
 
-protected:
+            SkPaint paint;
+            paint.setImageFilter(SkBlurImageFilter::Make(sigmaX, sigmaY, nullptr));
+            canvas->saveLayer(nullptr, &paint);
 
-    SkString onShortName() override {
-        return fName;
-    }
-
-    SkISize onISize() override {
-        return SkISize::Make(WIDTH, HEIGHT);
-    }
-
-    void onDraw(SkCanvas* canvas) override {
-        const int sigmaCount = SK_ARRAY_COUNT(kBlurSigmas);
-        const int testStringCount = SK_ARRAY_COUNT(kTestStrings);
-        SkScalar dx = WIDTH / sigmaCount;
-        SkScalar dy = HEIGHT / sigmaCount;
-        const SkScalar textSize = 12;
-
-        for (int x = 0; x < sigmaCount; x++) {
-            SkScalar sigmaX = kBlurSigmas[x];
-            for (int y = 0; y < sigmaCount; y++) {
-                SkScalar sigmaY = kBlurSigmas[y];
-
-                SkPaint paint;
-                paint.setImageFilter(SkBlurImageFilter::Make(sigmaX, sigmaY, nullptr));
-                canvas->saveLayer(nullptr, &paint);
-
-                SkRandom rand;
-                SkPaint textPaint;
-                textPaint.setAntiAlias(false);
-                textPaint.setColor(sk_tool_utils::color_to_565(rand.nextBits(24) | 0xFF000000));
-                sk_tool_utils::set_portable_typeface(&textPaint);
-                textPaint.setTextSize(textSize);
-
-                for (int i = 0; i < testStringCount; i++) {
-                    canvas->drawString(kTestStrings[i],
-                                       SkIntToScalar(x * dx),
-                                       SkIntToScalar(y * dy + textSize * i + textSize),
-                                       textPaint);
-                }
-                canvas->restore();
+            SkRandom rand;
+            SkPaint textPaint;
+            textPaint.setColor(sk_tool_utils::color_to_565(rand.nextBits(24) | 0xFF000000));
+            for (int i = 0; i < testStringCount; i++) {
+                canvas->drawString(kTestStrings[i],
+                                   SkIntToScalar(x * dx),
+                                   SkIntToScalar(y * dy + textSize * i + textSize),
+                                   font,
+                                   textPaint);
             }
+            canvas->restore();
         }
     }
-
-private:
-    SkString fName;
-
-    typedef GM INHERITED;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-DEF_GM(return new BlurImageFilter;)
-
 }
diff --git a/gm/imagefiltersbase.cpp b/gm/imagefiltersbase.cpp
index dad869e..40bb810 100644
--- a/gm/imagefiltersbase.cpp
+++ b/gm/imagefiltersbase.cpp
@@ -235,20 +235,18 @@
 
     SkISize onISize() override { return SkISize::Make(512, 342); }
 
-    void drawWaterfall(SkCanvas* canvas, const SkPaint& origPaint) {
-        const uint32_t flags[] = {
-            0,
-            SkPaint::kAntiAlias_Flag,
-            SkPaint::kAntiAlias_Flag | SkPaint::kLCDRenderText_Flag,
+    void drawWaterfall(SkCanvas* canvas, const SkPaint& paint) {
+        static const SkFont::Edging kEdgings[3] = {
+            SkFont::Edging::kAlias,
+            SkFont::Edging::kAntiAlias,
+            SkFont::Edging::kSubpixelAntiAlias,
         };
-        SkPaint paint(origPaint);
-        sk_tool_utils::set_portable_typeface(&paint);
-        paint.setTextSize(30);
+        SkFont font(sk_tool_utils::create_portable_typeface(), 30);
 
         SkAutoCanvasRestore acr(canvas, true);
-        for (size_t i = 0; i < SK_ARRAY_COUNT(flags); ++i) {
-            paint.setFlags(flags[i]);
-            canvas->drawString("Hamburgefon", 0, 0, paint);
+        for (SkFont::Edging edging : kEdgings) {
+            font.setEdging(edging);
+            canvas->drawString("Hamburgefon", 0, 0, font, paint);
             canvas->translate(0, 40);
         }
     }
diff --git a/gm/imagemagnifier.cpp b/gm/imagemagnifier.cpp
index 2585ea7..8fbc58d 100644
--- a/gm/imagemagnifier.cpp
+++ b/gm/imagemagnifier.cpp
@@ -27,16 +27,14 @@
         canvas->saveLayer(nullptr, &filterPaint);
         const char* str = "The quick brown fox jumped over the lazy dog.";
         SkRandom rand;
+        SkFont font(sk_tool_utils::create_portable_typeface());
         for (int i = 0; i < 25; ++i) {
             int x = rand.nextULessThan(WIDTH);
             int y = rand.nextULessThan(HEIGHT);
             SkPaint paint;
-            sk_tool_utils::set_portable_typeface(&paint);
             paint.setColor(sk_tool_utils::color_to_565(rand.nextBits(24) | 0xFF000000));
-            paint.setTextSize(rand.nextRangeScalar(0, 300));
-            paint.setAntiAlias(true);
-            canvas->drawString(str, SkIntToScalar(x),
-                             SkIntToScalar(y), paint);
+            font.setSize(rand.nextRangeScalar(0, 300));
+            canvas->drawString(str, SkIntToScalar(x), SkIntToScalar(y), font, paint);
         }
         canvas->restore();
 }
diff --git a/gm/imageresizetiled.cpp b/gm/imageresizetiled.cpp
index 257e0b2..c242cc5 100644
--- a/gm/imageresizetiled.cpp
+++ b/gm/imageresizetiled.cpp
@@ -22,6 +22,8 @@
         paint.setImageFilter(SkImageFilter::MakeMatrixFilter(matrix,
                                                              kNone_SkFilterQuality,
                                                              nullptr));
+
+        SkFont font(sk_tool_utils::create_portable_typeface(), 100);
         const SkScalar tile_size = SkIntToScalar(100);
         for (SkScalar y = 0; y < HEIGHT; y += tile_size) {
             for (SkScalar x = 0; x < WIDTH; x += tile_size) {
@@ -36,15 +38,10 @@
                     "jumped over",
                     "the lazy dog.",
                 };
-                SkPaint textPaint;
-                textPaint.setAntiAlias(true);
-                sk_tool_utils::set_portable_typeface(&textPaint);
-                textPaint.setTextSize(SkIntToScalar(100));
-                int posY = 0;
+                float posY = 0;
                 for (unsigned i = 0; i < SK_ARRAY_COUNT(str); i++) {
-                    posY += 100;
-                    canvas->drawString(str[i], SkIntToScalar(0),
-                                     SkIntToScalar(posY), textPaint);
+                    posY += 100.0f;
+                    canvas->drawString(str[i], 0.0f, posY, font, SkPaint());
                 }
                 canvas->restore();
                 canvas->restore();
diff --git a/gm/lcdtext.cpp b/gm/lcdtext.cpp
index a5e6d69..e605ac0 100644
--- a/gm/lcdtext.cpp
+++ b/gm/lcdtext.cpp
@@ -53,12 +53,14 @@
         SkPaint paint;
         paint.setColor(SK_ColorBLACK);
         paint.setDither(true);
-        paint.setAntiAlias(true);
-        paint.setSubpixelText(subpixelTextEnabled);
-        paint.setLCDRenderText(lcdRenderTextEnabled);
-        paint.setTextSize(textHeight);
-
-        canvas->drawString(string, 0, y, paint);
+        SkFont font(nullptr, textHeight);
+        if (subpixelTextEnabled) {
+            font.setSubpixel(true);
+        }
+        if (lcdRenderTextEnabled) {
+            font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
+        }
+        canvas->drawString(string, 0, y, font, paint);
         y += textHeight;
     }
 
@@ -98,10 +100,6 @@
         const char* lcd_text = "LCD";
         const char* gray_text = "GRAY";
 
-        SkPaint paint;
-        paint.setAntiAlias(true);
-        paint.setLCDRenderText(true);
-
         const struct {
             SkPoint     fLoc;
             SkScalar    fTextSize;
@@ -118,9 +116,11 @@
             const SkPoint loc = rec[i].fLoc;
             SkAutoCanvasRestore acr(canvas, true);
 
-            paint.setTextSize(rec[i].fTextSize);
+            SkFont font(nullptr, rec[i].fTextSize);
+            font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
+
             ScaleAbout(canvas, rec[i].fScale, rec[i].fScale, loc.x(), loc.y());
-            canvas->drawString(rec[i].fText, loc.x(), loc.y(), paint);
+            canvas->drawString(rec[i].fText, loc.x(), loc.y(), font, SkPaint());
         }
     }
 
diff --git a/gm/lightingshader2.cpp b/gm/lightingshader2.cpp
index 982e46a..62d9c2a 100644
--- a/gm/lightingshader2.cpp
+++ b/gm/lightingshader2.cpp
@@ -143,9 +143,8 @@
 
     void onDraw(SkCanvas* canvas) override {
         SkPaint labelPaint;
-        labelPaint.setTypeface(sk_tool_utils::create_portable_typeface("sans-serif",SkFontStyle()));
-        labelPaint.setAntiAlias(true);
-        labelPaint.setTextSize(kLabelSize);
+        SkFont font(
+                sk_tool_utils::create_portable_typeface("sans-serif", SkFontStyle()), kLabelSize);
 
         int gridNum = 0;
 
@@ -170,25 +169,25 @@
                             canvas->translate(0.0f, kLabelSize);
                             SkString label;
                             label.appendf("useNormalSource: %d", useNormalSource);
-                            canvas->drawString(label, 0.0f, 0.0f, labelPaint);
+                            canvas->drawString(label, 0.0f, 0.0f, font, labelPaint);
                         }
                         {
                             canvas->translate(0.0f, kLabelSize);
                             SkString label;
                             label.appendf("useDiffuseShader: %d", useDiffuseShader);
-                            canvas->drawString(label, 0.0f, 0.0f, labelPaint);
+                            canvas->drawString(label, 0.0f, 0.0f, font, labelPaint);
                         }
                         {
                             canvas->translate(0.0f, kLabelSize);
                             SkString label;
                             label.appendf("useTranslucentPaint: %d", useTranslucentPaint);
-                            canvas->drawString(label, 0.0f, 0.0f, labelPaint);
+                            canvas->drawString(label, 0.0f, 0.0f, font, labelPaint);
                         }
                         {
                             canvas->translate(0.0f, kLabelSize);
                             SkString label;
                             label.appendf("useTranslucentShader: %d", useTranslucentShader);
-                            canvas->drawString(label, 0.0f, 0.0f, labelPaint);
+                            canvas->drawString(label, 0.0f, 0.0f, font, labelPaint);
                         }
 
                         canvas->restore();