use font instead of paint

Bug: skia:
Change-Id: I82b0b37c8e7b295df62cefb4053dcfeba1521e27
Reviewed-on: https://skia-review.googlesource.com/c/177803
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/gm/coloremoji.cpp b/gm/coloremoji.cpp
index 290c747..513d2c5 100644
--- a/gm/coloremoji.cpp
+++ b/gm/coloremoji.cpp
@@ -13,6 +13,7 @@
 #include "SkCanvas.h"
 #include "SkColorFilterImageFilter.h"
 #include "SkColorMatrixFilter.h"
+#include "SkFont.h"
 #include "SkGradientShader.h"
 #include "SkStream.h"
 #include "SkTypeface.h"
@@ -76,8 +77,7 @@
 
         canvas->drawColor(SK_ColorGRAY);
 
-        SkPaint paint;
-        paint.setTypeface(emojiFont.typeface);
+        SkFont font(emojiFont.typeface);
         const char* text = emojiFont.text;
 
         // draw text at different point sizes
@@ -85,12 +85,12 @@
         SkFontMetrics metrics;
         SkScalar y = 0;
         for (const bool& fakeBold : { false, true }) {
-            paint.setFakeBoldText(fakeBold);
+            font.setEmbolden(fakeBold);
             for (const SkScalar& textSize : textSizes) {
-                paint.setTextSize(textSize);
-                paint.getFontMetrics(&metrics);
+                font.setSize(textSize);
+                font.getMetrics(&metrics);
                 y += -metrics.fAscent;
-                canvas->drawString(text, 10, y, paint);
+                canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, 10, y, font, SkPaint());
                 y += metrics.fDescent + metrics.fLeading;
             }
         }
@@ -103,8 +103,8 @@
                 for (int makeGray = 0; makeGray < 2; makeGray++) {
                     for (int makeMode = 0; makeMode < 2; ++makeMode) {
                         for (int alpha = 0; alpha < 2; ++alpha) {
+                            SkFont shaderFont(font.refTypeface());
                             SkPaint shaderPaint;
-                            shaderPaint.setTypeface(sk_ref_sp(paint.getTypeface()));
                             if (SkToBool(makeLinear)) {
                                 shaderPaint.setShader(MakeLinear());
                             }
@@ -124,10 +124,11 @@
                             if (alpha) {
                                 shaderPaint.setAlpha(0x80);
                             }
-                            shaderPaint.setTextSize(30);
-                            shaderPaint.getFontMetrics(&metrics);
+                            shaderFont.setSize(30);
+                            shaderFont.getMetrics(&metrics);
                             y += -metrics.fAscent;
-                            canvas->drawString(text, 380, y, shaderPaint);
+                            canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, 380, y,
+                                                   shaderFont, shaderPaint);
                             y += metrics.fDescent + metrics.fLeading;
                         }
                     }
@@ -136,11 +137,11 @@
         }
         // setup work needed to draw text with different clips
         canvas->translate(10, savedY);
-        paint.setTextSize(40);
+        font.setSize(40);
 
         // compute the bounds of the text
         SkRect bounds;
-        paint.measureText(text, strlen(text), &bounds);
+        font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds);
 
         const SkScalar boundsHalfWidth = bounds.width() * SK_ScalarHalf;
         const SkScalar boundsHalfHeight = bounds.height() * SK_ScalarHalf;
@@ -160,15 +161,16 @@
         clipHairline.setColor(SK_ColorWHITE);
         clipHairline.setStyle(SkPaint::kStroke_Style);
 
+        SkPaint paint;
         for (const SkRect& clipRect : clipRects) {
             canvas->translate(0, bounds.height());
             canvas->save();
             canvas->drawRect(clipRect, clipHairline);
             paint.setAlpha(0x20);
-            canvas->drawString(text, 0, 0, paint);
+            canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, 0, 0, font, paint);
             canvas->clipRect(clipRect);
             paint.setAlpha(0xFF);
-            canvas->drawString(text, 0, 0, paint);
+            canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, 0, 0, font, paint);
             canvas->restore();
             canvas->translate(0, SkIntToScalar(25));
         }
diff --git a/gm/complexclip.cpp b/gm/complexclip.cpp
index 1d3359f..415151f 100644
--- a/gm/complexclip.cpp
+++ b/gm/complexclip.cpp
@@ -8,6 +8,7 @@
 #include "gm.h"
 #include "sk_tool_utils.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkPath.h"
 
 namespace skiagm {
@@ -68,10 +69,7 @@
         SkPath clipB;
         clipB.addPoly({{40,  10}, {190, 15}, {195, 190}, {40,  185}, {155, 100}}, false).close();
 
-        SkPaint paint;
-        paint.setAntiAlias(true);
-        sk_tool_utils::set_portable_typeface(&paint);
-        paint.setTextSize(20);
+        SkFont font(sk_tool_utils::create_portable_typeface(), 20);
 
         constexpr struct {
             SkClipOp fOp;
@@ -137,17 +135,19 @@
                 canvas->restore();
 
 
+                SkPaint paint;
                 SkScalar txtX = 45;
                 paint.setColor(gClipAColor);
                 const char* aTxt = doInvA ? "InvA " : "A ";
-                canvas->drawString(aTxt, txtX, 220, paint);
-                txtX += paint.measureText(aTxt, strlen(aTxt));
+                canvas->drawSimpleText(aTxt, strlen(aTxt), kUTF8_SkTextEncoding, txtX, 220, font, paint);
+                txtX += font.measureText(aTxt, strlen(aTxt), kUTF8_SkTextEncoding);
                 paint.setColor(SK_ColorBLACK);
-                canvas->drawString(gOps[op].fName, txtX, 220, paint);
-                txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName));
+                canvas->drawSimpleText(gOps[op].fName, strlen(gOps[op].fName), kUTF8_SkTextEncoding, txtX, 220,
+                                       font, paint);
+                txtX += font.measureText(gOps[op].fName, strlen(gOps[op].fName), kUTF8_SkTextEncoding);
                 paint.setColor(gClipBColor);
                 const char* bTxt = doInvB ? "InvB " : "B ";
-                canvas->drawString(bTxt, txtX, 220, paint);
+                canvas->drawSimpleText(bTxt, strlen(bTxt), kUTF8_SkTextEncoding, txtX, 220, font, paint);
 
                 canvas->translate(250,0);
             }
diff --git a/gm/convexpolyclip.cpp b/gm/convexpolyclip.cpp
index 3cc64dc..af073c6 100644
--- a/gm/convexpolyclip.cpp
+++ b/gm/convexpolyclip.cpp
@@ -9,6 +9,7 @@
 #include "sk_tool_utils.h"
 
 #include "SkBitmap.h"
+#include "SkFont.h"
 #include "SkGradientShader.h"
 #include "SkPath.h"
 #include "SkTLList.h"
@@ -148,12 +149,10 @@
         canvas->drawBitmapRect(fBmp, SkRect::MakeIWH(size.fWidth, size.fHeight), &bgPaint);
 
         constexpr char kTxt[] = "Clip Me!";
+        SkFont font(sk_tool_utils::create_portable_typeface(), 23);
+        SkScalar textW = font.measureText(kTxt, SK_ARRAY_COUNT(kTxt)-1, kUTF8_SkTextEncoding);
         SkPaint txtPaint;
-        txtPaint.setTextSize(23.f);
-        txtPaint.setAntiAlias(true);
-        sk_tool_utils::set_portable_typeface(&txtPaint);
         txtPaint.setColor(SK_ColorDKGRAY);
-        SkScalar textW = txtPaint.measureText(kTxt, SK_ARRAY_COUNT(kTxt)-1);
 
         SkScalar startX = 0;
         int testLayers = kBench_Mode != this->getMode();
@@ -202,9 +201,8 @@
                     canvas->drawPath(closedClipPath, clipOutlinePaint);
                     clip->setOnCanvas(canvas, kIntersect_SkClipOp, SkToBool(aa));
                     canvas->scale(1.f, 1.8f);
-                    canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1,
-                                     0, 1.5f * txtPaint.getTextSize(),
-                                     txtPaint);
+                    canvas->drawSimpleText(kTxt, SK_ARRAY_COUNT(kTxt)-1, kUTF8_SkTextEncoding,
+                                     0, 1.5f * font.getSize(), font, txtPaint);
                     canvas->restore();
                     x += textW + 2 * kMargin;
                 }
diff --git a/gm/fontscaler.cpp b/gm/fontscaler.cpp
index 14f6138..72071cb 100644
--- a/gm/fontscaler.cpp
+++ b/gm/fontscaler.cpp
@@ -4,6 +4,7 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
+#include <SkFont.h>
 #include "gm.h"
 #include "sk_tool_utils.h"
 #include "SkTypeface.h"
@@ -29,13 +30,11 @@
     }
 
     void onDraw(SkCanvas* canvas) override {
-        SkPaint paint;
-
-        paint.setAntiAlias(true);
-        paint.setLCDRenderText(true);
+        SkFont font;
+        font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
         //With freetype the default (normal hinting) can be really ugly.
         //Most distros now set slight (vertical hinting only) in any event.
-        paint.setHinting(kSlight_SkFontHinting);
+        font.setHinting(kSlight_SkFontHinting);
 
         const char* text = "Hamburgefons ooo mmm";
         const size_t textLen = strlen(text);
@@ -61,13 +60,13 @@
                 }
 
                 for (int ps = 6; ps <= 22; ps++) {
-                    paint.setTextSize(SkIntToScalar(ps));
-                    canvas->drawText(text, textLen, x, y, paint);
-                    y += paint.getFontMetrics(nullptr);
+                    font.setSize(SkIntToScalar(ps));
+                    canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, x, y, font, SkPaint());
+                    y += font.getMetrics(nullptr);
                 }
             }
             canvas->translate(0, SkIntToScalar(360));
-            paint.setSubpixelText(true);
+            font.setSubpixel(true);
         }
     }
 
diff --git a/gm/fontscalerdistortable.cpp b/gm/fontscalerdistortable.cpp
index 432fca8..0d2dc2d 100644
--- a/gm/fontscalerdistortable.cpp
+++ b/gm/fontscalerdistortable.cpp
@@ -4,6 +4,7 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
+#include <SkFont.h>
 #include "gm.h"
 #include "Resources.h"
 #include "SkFixed.h"
@@ -32,7 +33,8 @@
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
-        paint.setLCDRenderText(true);
+        SkFont font;
+        font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
         sk_sp<SkFontMgr> fontMgr(SkFontMgr::RefDefault());
 
         std::unique_ptr<SkStreamAsset> distortableStream(GetResourceAsStream("fonts/Distortable.ttf"));
@@ -55,11 +57,11 @@
                 SkFontArguments::VariationPosition position =
                         { coordinates, SK_ARRAY_COUNT(coordinates) };
                 if (j == 0 && distortable) {
-                    paint.setTypeface(sk_sp<SkTypeface>(
+                    font.setTypeface(sk_sp<SkTypeface>(
                         distortable->makeClone(
                             SkFontArguments().setVariationDesignPosition(position))));
                 } else {
-                    paint.setTypeface(sk_sp<SkTypeface>(fontMgr->makeFromStream(
+                    font.setTypeface(sk_sp<SkTypeface>(fontMgr->makeFromStream(
                         distortableStream->duplicate(),
                         SkFontArguments().setVariationDesignPosition(position))));
                 }
@@ -78,13 +80,13 @@
                 }
 
                 for (int ps = 6; ps <= 22; ps++) {
-                    paint.setTextSize(SkIntToScalar(ps));
-                    canvas->drawText(text, textLen, x, y, paint);
-                    y += paint.getFontMetrics(nullptr);
+                    font.setSize(SkIntToScalar(ps));
+                    canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, x, y, font, paint);
+                    y += font.getMetrics(nullptr);
                 }
             }
             canvas->translate(0, SkIntToScalar(360));
-            paint.setSubpixelText(true);
+            font.setSubpixel(true);
         }
     }
 
diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp
index 36eea35..2b79722 100644
--- a/tests/PaintTest.cpp
+++ b/tests/PaintTest.cpp
@@ -263,14 +263,14 @@
 // found and fixed for android: not initializing rect for string's of length 0
 DEF_TEST(Paint_regression_measureText, reporter) {
 
-    SkPaint paint;
-    paint.setTextSize(12.0f);
+    SkFont font;
+    font.setSize(12.0f);
 
     SkRect r;
     r.setLTRB(SK_ScalarNaN, SK_ScalarNaN, SK_ScalarNaN, SK_ScalarNaN);
 
     // test that the rect was reset
-    paint.measureText("", 0, &r);
+    font.measureText("", 0, kUTF8_SkTextEncoding, &r);
     REPORTER_ASSERT(reporter, r.isEmpty());
 }
 
diff --git a/tests/UnicodeTest.cpp b/tests/UnicodeTest.cpp
index fac3eb9..ee39e57 100644
--- a/tests/UnicodeTest.cpp
+++ b/tests/UnicodeTest.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "SkFont.h"
 #include "SkPaint.h"
 #include "SkUTF.h"
 #include "Test.h"
@@ -29,16 +30,11 @@
     uint16_t glyphs16[sizeof(text8)];
     uint16_t glyphs32[sizeof(text8)];
 
-    SkPaint paint;
+    SkFont font;
 
-    paint.setTextEncoding(kUTF8_SkTextEncoding);
-    int count8  = paint.textToGlyphs(text8,  len8,  glyphs8);
-
-    paint.setTextEncoding(kUTF16_SkTextEncoding);
-    int count16 = paint.textToGlyphs(text16, len16, glyphs16);
-
-    paint.setTextEncoding(kUTF32_SkTextEncoding);
-    int count32 = paint.textToGlyphs(text32, len32, glyphs32);
+    int count8  = font.textToGlyphs(text8,  len8,  kUTF8_SkTextEncoding,  glyphs8,  SK_ARRAY_COUNT(glyphs8));
+    int count16 = font.textToGlyphs(text16, len16, kUTF16_SkTextEncoding, glyphs16, SK_ARRAY_COUNT(glyphs16));
+    int count32 = font.textToGlyphs(text32, len32, kUTF32_SkTextEncoding, glyphs32, SK_ARRAY_COUNT(glyphs32));
 
     REPORTER_ASSERT(reporter, (int)len8 == count8);
     REPORTER_ASSERT(reporter, (int)len8 == count16);