use font instead of paint for text

Bug: skia:
Change-Id: I508ecbd6c4dad41f67f5f2ce6da6c0065dacba6c
Reviewed-on: https://skia-review.googlesource.com/c/180365
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
Auto-Submit: Mike Reed <reed@google.com>
diff --git a/samplecode/SampleAnimatedImage.cpp b/samplecode/SampleAnimatedImage.cpp
index 0d9adad..8f73935 100644
--- a/samplecode/SampleAnimatedImage.cpp
+++ b/samplecode/SampleAnimatedImage.cpp
@@ -9,6 +9,7 @@
 #include "SkAnimatedImage.h"
 #include "SkAnimTimer.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkPaint.h"
 #include "SkPictureRecorder.h"
 #include "SkRect.h"
@@ -30,19 +31,17 @@
 
 protected:
     void onDrawBackground(SkCanvas* canvas) override {
-        SkPaint paint;
-        paint.setAntiAlias(true);
-        constexpr SkScalar kTextSize = 20;
-        paint.setTextSize(kTextSize);
+        SkFont font;
+        font.setSize(20);
 
         SkString str = SkStringPrintf("Press '%c' to start/pause; '%c' to reset.",
                 kPauseKey, kResetKey);
         const char* text = str.c_str();
         SkRect bounds;
-        paint.measureText(text, strlen(text), &bounds);
+        font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds);
         fYOffset = bounds.height();
 
-        canvas->drawText(text, strlen(text), 5, fYOffset, paint);
+        canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, 5, fYOffset, font, SkPaint());
         fYOffset *= 2;
     }
 
diff --git a/samplecode/SampleBitmapRect.cpp b/samplecode/SampleBitmapRect.cpp
index 61f3361..9dcf98c 100644
--- a/samplecode/SampleBitmapRect.cpp
+++ b/samplecode/SampleBitmapRect.cpp
@@ -9,6 +9,7 @@
 #include "SkAnimTimer.h"
 #include "SkBitmap.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkGradientShader.h"
 #include "SkGraphics.h"
 #include "SkPath.h"
@@ -160,18 +161,17 @@
 
     const int BIG_H = 120;
 
-    SkPaint paint;
-    paint.setAntiAlias(true);
-    paint.setTextSize(SkIntToScalar(BIG_H));
+    SkFont font;
+    font.setSize(SkIntToScalar(BIG_H));
 
-    const int BIG_W = SkScalarRoundToInt(paint.measureText(gText, strlen(gText)));
+    const int BIG_W = SkScalarRoundToInt(font.measureText(gText, strlen(gText), kUTF8_SkTextEncoding));
 
     bm->allocN32Pixels(BIG_W, BIG_H);
     bm->eraseColor(SK_ColorWHITE);
 
     SkCanvas canvas(*bm);
 
-    canvas.drawString(gText, 0, paint.getTextSize()*4/5, paint);
+    canvas.drawSimpleText(gText, strlen(gText), kUTF8_SkTextEncoding, 0, font.getSize()*4/5, font, SkPaint());
 }
 
 class BitmapRectView2 : public Sample {
diff --git a/samplecode/SampleComplexClip.cpp b/samplecode/SampleComplexClip.cpp
index fea5dd1..897b045 100644
--- a/samplecode/SampleComplexClip.cpp
+++ b/samplecode/SampleComplexClip.cpp
@@ -7,6 +7,7 @@
 
 #include "Sample.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkPath.h"
 #include "SkClipOpPriv.h"
 
@@ -65,6 +66,9 @@
         clipB.close();
         SkColor colorB = SK_ColorRED;
 
+        SkFont font;
+        font.setSize(20);
+
         SkPaint paint;
         paint.setAntiAlias(true);
 
@@ -122,19 +126,17 @@
                 paint.setColor(colorB);
                 canvas->drawPath(clipB, paint);
 
-                paint.setTextSize(SkIntToScalar(20));
-
                 SkScalar txtX = SkIntToScalar(55);
                 paint.setColor(colorA);
                 const char* aTxt = invA ? "InverseA " : "A ";
                 canvas->drawString(aTxt, txtX, SkIntToScalar(220), paint);
-                txtX += paint.measureText(aTxt, strlen(aTxt));
+                txtX += font.measureText(aTxt, strlen(aTxt), kUTF8_SkTextEncoding);
                 paint.setColor(SK_ColorBLACK);
-                canvas->drawString(gOps[op].fName,
-                                    txtX, SkIntToScalar(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(colorB);
-                canvas->drawString("B", txtX, SkIntToScalar(220), paint);
+                canvas->drawSimpleText("B", 1, kUTF8_SkTextEncoding, txtX, 220, font, paint);
 
                 canvas->translate(SkIntToScalar(250),0);
             }
diff --git a/samplecode/SampleGlyphTransform.cpp b/samplecode/SampleGlyphTransform.cpp
index e8567d1..ff42251 100644
--- a/samplecode/SampleGlyphTransform.cpp
+++ b/samplecode/SampleGlyphTransform.cpp
@@ -40,7 +40,8 @@
 
     void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
-        paint.setTypeface(fEmojiFont.fTypeface);
+
+        SkFont font(fEmojiFont.fTypeface);
         const char* text = fEmojiFont.fText;
 
         double baseline = this->height() / 2;
@@ -54,8 +55,9 @@
 
         // d3 by default anchors text around the middle
         SkRect bounds;
-        paint.measureText(text, strlen(text), &bounds);
-        canvas->drawString(text, -bounds.centerX(), -bounds.centerY(), paint);
+        font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds);
+        canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, -bounds.centerX(), -bounds.centerY(),
+                               font, paint);
     }
 
     bool onAnimate(const SkAnimTimer& timer) override {
diff --git a/samplecode/SampleLCD.cpp b/samplecode/SampleLCD.cpp
index 22aaba6..f209e97 100644
--- a/samplecode/SampleLCD.cpp
+++ b/samplecode/SampleLCD.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 "Sample.h"
 #include "SkCanvas.h"
 #include "SkPaint.h"
@@ -30,7 +31,6 @@
         this->drawBG(canvas);
 
         SkPaint paint;
-        paint.setAntiAlias(true);
 
         SkScalar textSize = SkIntToScalar(6);
         SkScalar delta = SK_Scalar1;
@@ -40,16 +40,17 @@
         SkScalar x1 = SkIntToScalar(310);
         SkScalar y = SkIntToScalar(20);
 
+        SkFont font;
         for (int i = 0; i < 20; i++) {
-            paint.setTextSize(textSize);
+            font.setSize(textSize);
             textSize += delta;
 
-            paint.setLCDRenderText(false);
-            canvas->drawText(text, len, x0, y, paint);
-            paint.setLCDRenderText(true);
-            canvas->drawText(text, len, x1, y, paint);
+            font.setEdging(SkFont::Edging::kAntiAlias);
+            canvas->drawSimpleText(text, len, kUTF8_SkTextEncoding, x0, y, font, paint);
+            font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
+            canvas->drawSimpleText(text, len, kUTF8_SkTextEncoding, x1, y, font, paint);
 
-            y += paint.getFontSpacing();
+            y += font.getSpacing();
         }
     }
 
diff --git a/samplecode/SampleMeasure.cpp b/samplecode/SampleMeasure.cpp
deleted file mode 100644
index 2a4817e..0000000
--- a/samplecode/SampleMeasure.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include "Sample.h"
-#include "SkCanvas.h"
-#include "SkGradientShader.h"
-#include "SkPath.h"
-#include "SkRegion.h"
-#include "SkShader.h"
-#include "SkUTF.h"
-#include "Sk1DPathEffect.h"
-#include "SkCornerPathEffect.h"
-#include "SkPathMeasure.h"
-#include "SkRandom.h"
-#include "SkColorPriv.h"
-#include "SkColorFilter.h"
-
-// exercise scale/linear
-struct Setting {
-    bool        fLinearText;
-};
-
-static const Setting gSettings[] = {
-    { false },
-    { true  },
-};
-
-static void doMeasure(SkCanvas* canvas, const SkPaint& paint, const char text[]) {
-    SkScalar    dy = paint.getFontMetrics(nullptr);
-
-    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);
-
-        int n = p.getTextWidths(text, len, widths, rects);
-        SkScalar w = p.measureText(text, len, &bounds);
-
-        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);
-    }
-}
-
-class MeasureView : public Sample {
-public:
-    SkPaint fPaint;
-
-    MeasureView() {
-        fPaint.setAntiAlias(true);
-        fPaint.setTextSize(SkIntToScalar(64));
-        this->setBGColor(0xFFDDDDDD);
-    }
-
-protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Measure");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
-
-    virtual void onDrawContent(SkCanvas* canvas) {
-        canvas->translate(fPaint.getTextSize(), fPaint.getTextSize());
-        doMeasure(canvas, fPaint, "Hamburgefons");
-    }
-
-private:
-    typedef Sample INHERITED;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-DEF_SAMPLE( return new MeasureView(); )
diff --git a/samplecode/SamplePolyToPoly.cpp b/samplecode/SamplePolyToPoly.cpp
index 24c8b80..0e25e3c 100644
--- a/samplecode/SamplePolyToPoly.cpp
+++ b/samplecode/SamplePolyToPoly.cpp
@@ -75,7 +75,7 @@
         return this->INHERITED::onQuery(evt);
     }
 
-    static void doDraw(SkCanvas* canvas, SkPaint* paint, const int isrc[],
+    static void doDraw(SkCanvas* canvas, SkPaint* paint, const SkFont& font, const int isrc[],
                        const int idst[], int count) {
         SkMatrix matrix;
         SkPoint src[4], dst[4];
@@ -97,14 +97,14 @@
         canvas->drawLine(0, D, D, 0, *paint);
 
         SkFontMetrics fm;
-        paint->getFontMetrics(&fm);
+        font.getMetrics(&fm);
         paint->setColor(SK_ColorRED);
         paint->setStyle(SkPaint::kFill_Style);
         SkScalar x = D/2;
         float y = D/2 - (fm.fAscent + fm.fDescent)/2;
         SkString str;
         str.appendS32(count);
-        SkTextUtils::DrawString(canvas, str, x, y, *paint, SkTextUtils::kCenter_Align);
+        SkTextUtils::DrawString(canvas, str.c_str(), x, y, font, *paint, SkTextUtils::kCenter_Align);
 
         canvas->restore();
     }
@@ -113,14 +113,16 @@
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStrokeWidth(SkIntToScalar(4));
-        paint.setTextSize(SkIntToScalar(40));
+
+        SkFont font;
+        font.setSize(40);
 
         canvas->save();
         canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
         // translate (1 point)
         const int src1[] = { 0, 0 };
         const int dst1[] = { 5, 5 };
-        doDraw(canvas, &paint, src1, dst1, 1);
+        doDraw(canvas, &paint, font, src1, dst1, 1);
         canvas->restore();
 
         canvas->save();
@@ -128,7 +130,7 @@
         // rotate/uniform-scale (2 points)
         const int src2[] = { 32, 32, 64, 32 };
         const int dst2[] = { 32, 32, 64, 48 };
-        doDraw(canvas, &paint, src2, dst2, 2);
+        doDraw(canvas, &paint, font, src2, dst2, 2);
         canvas->restore();
 
         canvas->save();
@@ -136,7 +138,7 @@
         // rotate/skew (3 points)
         const int src3[] = { 0, 0, 64, 0, 0, 64 };
         const int dst3[] = { 0, 0, 96, 0, 24, 64 };
-        doDraw(canvas, &paint, src3, dst3, 3);
+        doDraw(canvas, &paint, font, src3, dst3, 3);
         canvas->restore();
 
         canvas->save();
@@ -144,7 +146,7 @@
         // perspective (4 points)
         const int src4[] = { 0, 0, 64, 0, 64, 64, 0, 64 };
         const int dst4[] = { 0, 0, 96, 0, 64, 96, 0, 64 };
-        doDraw(canvas, &paint, src4, dst4, 4);
+        doDraw(canvas, &paint, font, src4, dst4, 4);
         canvas->restore();
     }
 
diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp
index a9526fa..409222e 100644
--- a/samplecode/SampleRegion.cpp
+++ b/samplecode/SampleRegion.cpp
@@ -8,6 +8,7 @@
 #include "Sample.h"
 #include "SkBitmap.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkGradientShader.h"
 #include "SkPath.h"
 #include "SkRegion.h"
@@ -53,20 +54,20 @@
 
 static void drawFadingText(SkCanvas* canvas,
                            const char* text, size_t len, SkScalar x, SkScalar y,
-                           const SkPaint& paint) {
+                           const SkFont& font, const SkPaint& paint) {
     // Need a bounds for the text
     SkRect bounds;
     SkFontMetrics fm;
 
-    paint.getFontMetrics(&fm);
-    bounds.set(x, y + fm.fTop, x + paint.measureText(text, len), y + fm.fBottom);
+    font.getMetrics(&fm);
+    bounds.set(x, y + fm.fTop, x + font.measureText(text, len, kUTF8_SkTextEncoding), y + fm.fBottom);
 
     // may need to outset bounds a little, to account for hinting and/or
     // antialiasing
     bounds.inset(-SkIntToScalar(2), -SkIntToScalar(2));
 
     canvas->saveLayer(&bounds, nullptr);
-    canvas->drawText(text, len, x, y, paint);
+    canvas->drawSimpleText(text, len, kUTF8_SkTextEncoding, x, y, font, paint);
 
     const SkPoint pts[] = {
         { bounds.fLeft, y },
@@ -89,28 +90,30 @@
 static void test_text(SkCanvas* canvas) {
     SkPaint paint;
     paint.setAntiAlias(true);
-    paint.setTextSize(20);
+
+    SkFont font;
+    font.setSize(20);
 
     const char* str = "Hamburgefons";
     size_t len = strlen(str);
     SkScalar x = 20;
     SkScalar y = 20;
 
-    canvas->drawText(str, len, x, y, paint);
+    canvas->drawSimpleText(str, len, kUTF8_SkTextEncoding, x, y, font, paint);
 
     y += 20;
 
-    const SkPoint pts[] = { { x, y }, { x + paint.measureText(str, len), y } };
+    const SkPoint pts[] = { { x, y }, { x + font.measureText(str, len, kUTF8_SkTextEncoding), y } };
     const SkColor colors[] = { SK_ColorBLACK, SK_ColorBLACK, 0 };
     const SkScalar pos[] = { 0, 0.9f, 1 };
     paint.setShader(SkGradientShader::MakeLinear(pts, colors, pos,
                                                  SK_ARRAY_COUNT(colors),
                                                  SkShader::kClamp_TileMode));
-    canvas->drawText(str, len, x, y, paint);
+    canvas->drawSimpleText(str, len, kUTF8_SkTextEncoding, x, y, font, paint);
 
     y += 20;
     paint.setShader(nullptr);
-    drawFadingText(canvas, str, len, x, y, paint);
+    drawFadingText(canvas, str, len, x, y, font, paint);
 }
 
 static void scale_rect(SkIRect* dst, const SkIRect& src, float scale) {
diff --git a/samplecode/SampleTextAlpha.cpp b/samplecode/SampleTextAlpha.cpp
deleted file mode 100644
index 14885e8..0000000
--- a/samplecode/SampleTextAlpha.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "Sample.h"
-#include "SkBlurMask.h"
-#include "SkCanvas.h"
-#include "SkGradientShader.h"
-#include "SkGraphics.h"
-#include "SkMaskFilter.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-#include "SkRegion.h"
-#include "SkShader.h"
-#include "SkUTF.h"
-#include "SkColorPriv.h"
-#include "SkColorFilter.h"
-#include "SkTime.h"
-#include "SkTypeface.h"
-
-#include "SkOSFile.h"
-#include "SkStream.h"
-
-class TextAlphaView : public Sample {
-public:
-    TextAlphaView() {
-        fByte = 0xFF;
-    }
-
-protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "TextAlpha");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
-
-    void onDrawContent(SkCanvas* canvas) override {
-        const char* str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-        SkPaint paint;
-        SkScalar    x = SkIntToScalar(10);
-        SkScalar    y = SkIntToScalar(20);
-
-        paint.setFlags(0x105);
-
-        paint.setARGB(fByte, 0xFF, 0xFF, 0xFF);
-
-        paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
-                                                   SkBlurMask::ConvertRadiusToSigma(3)));
-
-        SkRandom rand;
-
-        for (int ps = 6; ps <= 35; ps++) {
-            paint.setColor(rand.nextU() | (0xFF << 24));
-            paint.setTextSize(SkIntToScalar(ps));
-            paint.setTextSize(SkIntToScalar(24));
-            canvas->drawString(str, x, y, paint);
-            y += paint.getFontMetrics(nullptr);
-        }
-    }
-
-    Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
-        return new Click(this);
-    }
-
-    bool onClick(Click* click) override {
-        int y = click->fICurr.fY;
-        if (y < 0) {
-            y = 0;
-        } else if (y > 255) {
-            y = 255;
-        }
-        fByte = y;
-        return true;
-    }
-
-private:
-    int fByte;
-
-    typedef Sample INHERITED;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-DEF_SAMPLE( return new TextAlphaView(); )
diff --git a/samplecode/SampleUnpremul.cpp b/samplecode/SampleUnpremul.cpp
index 3e670be..981ec9d 100644
--- a/samplecode/SampleUnpremul.cpp
+++ b/samplecode/SampleUnpremul.cpp
@@ -75,12 +75,14 @@
     void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
-        paint.setTextSize(SkIntToScalar(24));
+
+        SkFont font;
+        font.setSize(24);
         auto looper(
             SkBlurDrawLooper::Make(SK_ColorBLUE, SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(2)),
                                    0, 0));
         paint.setLooper(looper);
-        SkScalar height = paint.getFontMetrics(nullptr);
+        SkScalar height = font.getMetrics(nullptr);
         if (!fDecodeSucceeded) {
             SkString failure;
             if (fResPath.size() == 0) {
@@ -88,7 +90,7 @@
             } else {
                 failure.printf("Failed to decode %s", fCurrFile.c_str());
             }
-            canvas->drawString(failure, 0, height, paint);
+            canvas->drawSimpleText(failure.c_str(), failure.size(), kUTF8_SkTextEncoding, 0, height, font, paint);
             return;
         }
 
@@ -96,16 +98,16 @@
         SkString header(SkOSPath::Basename(fCurrFile.c_str()));
         header.appendf("     [%dx%d]     %s", fBitmap.width(), fBitmap.height(),
                        (fPremul ? "premultiplied" : "unpremultiplied"));
-        canvas->drawString(header, 0, height, paint);
+        canvas->drawSimpleText(header.c_str(), header.size(), kUTF8_SkTextEncoding, 0, height, font, paint);
         canvas->translate(0, height);
 
         // Help messages
         header.printf("Press '%c' to move to the next image.'", fNextImageChar);
-        canvas->drawString(header, 0, height, paint);
+        canvas->drawSimpleText(header.c_str(), header.size(), kUTF8_SkTextEncoding, 0, height, font, paint);
         canvas->translate(0, height);
 
         header.printf("Press '%c' to toggle premultiplied decode.", fTogglePremulChar);
-        canvas->drawString(header, 0, height, paint);
+        canvas->drawSimpleText(header.c_str(), header.size(), kUTF8_SkTextEncoding, 0, height, font, paint);
 
         // Now draw the image itself.
         canvas->translate(height * 2, height * 2);