use drawSimpleText

Bug: skia:
Change-Id: I4aa6190e66478595a409f93a406fd42f19394302
Reviewed-on: https://skia-review.googlesource.com/c/180927
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
Auto-Submit: Mike Reed <reed@google.com>
diff --git a/bench/DisplacementBench.cpp b/bench/DisplacementBench.cpp
index 3dd7965..37d53d1 100644
--- a/bench/DisplacementBench.cpp
+++ b/bench/DisplacementBench.cpp
@@ -7,6 +7,7 @@
 
 #include "Benchmark.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkDisplacementMapEffect.h"
 #include "SkImageSource.h"
 #include "SkSurface.h"
@@ -36,11 +37,11 @@
         SkCanvas canvas(fBitmap);
         canvas.clear(0x00000000);
         SkPaint paint;
-        paint.setAntiAlias(true);
         paint.setColor(0xFF884422);
-        paint.setTextSize(SkIntToScalar(96));
-        const char* str = "g";
-        canvas.drawString(str, SkIntToScalar(15), SkIntToScalar(55), paint);
+
+        SkFont font;
+        font.setSize(SkIntToScalar(96));
+        canvas.drawSimpleText("g", 1, kUTF8_SkTextEncoding, SkIntToScalar(15), SkIntToScalar(55), font, paint);
     }
 
     void makeCheckerboard() {
diff --git a/bench/FontScalerBench.cpp b/bench/FontScalerBench.cpp
deleted file mode 100644
index 366c54c..0000000
--- a/bench/FontScalerBench.cpp
+++ /dev/null
@@ -1,52 +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 "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkGraphics.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkString.h"
-
-class FontScalerBench : public Benchmark {
-    SkString fName;
-    SkString fText;
-    bool     fDoLCD;
-public:
-    FontScalerBench(bool doLCD)  {
-        fName.printf("fontscaler_%s", doLCD ? "lcd" : "aa");
-        fText.set("abcdefghijklmnopqrstuvwxyz01234567890");
-        fDoLCD = doLCD;
-    }
-
-protected:
-    virtual const char* onGetName() { return fName.c_str(); }
-    virtual void onDraw(int loops, SkCanvas* canvas) {
-        SkPaint paint;
-        this->setupPaint(&paint);
-        paint.setLCDRenderText(fDoLCD);
-
-        for (int i = 0; i < loops; i++) {
-            // this is critical - we want to time the creation process, so we
-            // explicitly flush our cache before each run
-            SkGraphics::PurgeFontCache();
-
-            for (int ps = 9; ps <= 24; ps += 2) {
-                paint.setTextSize(SkIntToScalar(ps));
-                canvas->drawString(fText,
-                        0, SkIntToScalar(20), paint);
-            }
-        }
-    }
-private:
-    typedef Benchmark INHERITED;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-DEF_BENCH(return new FontScalerBench(false);)
-DEF_BENCH(return new FontScalerBench(true);)
diff --git a/bench/MergeBench.cpp b/bench/MergeBench.cpp
index 10aa8b8..dd0e07c 100644
--- a/bench/MergeBench.cpp
+++ b/bench/MergeBench.cpp
@@ -7,6 +7,7 @@
 
 #include "Benchmark.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkImageSource.h"
 #include "SkMergeImageFilter.h"
 #include "SkSurface.h"
@@ -20,11 +21,10 @@
     sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(80, 80));
     surface->getCanvas()->clear(0x00000000);
     SkPaint paint;
-    paint.setAntiAlias(true);
     paint.setColor(0xFF884422);
-    paint.setTextSize(SkIntToScalar(96));
-    const char* str = "g";
-    surface->getCanvas()->drawString(str, 15, 55, paint);
+    SkFont font;
+    font.setSize(SkIntToScalar(96));
+    surface->getCanvas()->drawSimpleText("g", 1, kUTF8_SkTextEncoding, 15, 55, font, paint);
     return surface->makeImageSnapshot();
 }
 
diff --git a/bench/ShaderMaskBench.cpp b/bench/ShaderMaskBench.cpp
deleted file mode 100644
index 1cc2347..0000000
--- a/bench/ShaderMaskBench.cpp
+++ /dev/null
@@ -1,97 +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 "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
-#include "SkTemplates.h"
-
-#define STR     "Hamburgefons"
-
-enum FontQuality {
-    kBW,
-    kAA,
-    kLCD
-};
-
-static const char* fontQualityName(const SkPaint& paint) {
-    if (!paint.isAntiAlias()) {
-        return "BW";
-    }
-    if (paint.isLCDRenderText()) {
-        return "LCD";
-    }
-    return "AA";
-}
-
-class ShaderMaskBench : public Benchmark {
-    SkPaint     fPaint;
-    SkString    fText;
-    SkString    fName;
-    FontQuality fFQ;
-public:
-    ShaderMaskBench(bool isOpaque, FontQuality fq)  {
-        fFQ = fq;
-        fText.set(STR);
-
-        fPaint.setAntiAlias(kBW != fq);
-        fPaint.setLCDRenderText(kLCD == fq);
-        fPaint.setShader(SkShader::MakeColorShader(isOpaque ? 0xFFFFFFFF : 0x80808080));
-    }
-
-protected:
-    virtual const char* onGetName() {
-        fName.printf("shadermask");
-        fName.appendf("_%s", fontQualityName(fPaint));
-        fName.appendf("_%02X", fPaint.getAlpha());
-        return fName.c_str();
-    }
-
-    virtual void onDraw(int loops, SkCanvas* canvas) {
-        const SkIPoint dim = this->getSize();
-        SkRandom rand;
-
-        SkPaint paint(fPaint);
-        this->setupPaint(&paint);
-        // explicitly need these
-        paint.setAlpha(fPaint.getAlpha());
-        paint.setAntiAlias(kBW != fFQ);
-        paint.setLCDRenderText(kLCD == fFQ);
-
-        const SkScalar x0 = SkIntToScalar(-10);
-        const SkScalar y0 = SkIntToScalar(-10);
-
-        paint.setTextSize(SkIntToScalar(12));
-        for (int i = 0; i < loops; i++) {
-            SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
-            SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
-            canvas->drawString(fText, x, y, paint);
-        }
-
-        paint.setTextSize(SkIntToScalar(48));
-        for (int i = 0; i < loops / 4 ; i++) {
-            SkScalar x = x0 + rand.nextUScalar1() * dim.fX;
-            SkScalar y = y0 + rand.nextUScalar1() * dim.fY;
-            canvas->drawString(fText, x, y, paint);
-        }
-    }
-
-private:
-    typedef Benchmark INHERITED;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-DEF_BENCH( return new ShaderMaskBench(true,  kBW); )
-DEF_BENCH( return new ShaderMaskBench(false, kBW); )
-DEF_BENCH( return new ShaderMaskBench(true,  kAA); )
-DEF_BENCH( return new ShaderMaskBench(false, kAA); )
-DEF_BENCH( return new ShaderMaskBench(true,  kLCD); )
-DEF_BENCH( return new ShaderMaskBench(false, kLCD); )
diff --git a/gn/bench.gni b/gn/bench.gni
index 206ad77..91391f8 100644
--- a/gn/bench.gni
+++ b/gn/bench.gni
@@ -46,7 +46,6 @@
   "$_bench/DrawLatticeBench.cpp",
   "$_bench/EncodeBench.cpp",
   "$_bench/FontCacheBench.cpp",
-  "$_bench/FontScalerBench.cpp",
   "$_bench/FSRectBench.cpp",
   "$_bench/GameBench.cpp",
   "$_bench/GeometryBench.cpp",
@@ -105,7 +104,6 @@
   "$_bench/RotatedRectBench.cpp",
   "$_bench/RTreeBench.cpp",
   "$_bench/ScalarBench.cpp",
-  "$_bench/ShaderMaskBench.cpp",
   "$_bench/ShaderMaskFilterBench.cpp",
   "$_bench/ShadowBench.cpp",
   "$_bench/ShapesBench.cpp",
diff --git a/gn/samples.gni b/gn/samples.gni
index b7435e0..7fed925 100644
--- a/gn/samples.gni
+++ b/gn/samples.gni
@@ -24,7 +24,6 @@
   "$_samplecode/SampleBigBlur.cpp",
   "$_samplecode/SampleBigGradient.cpp",
   "$_samplecode/SampleBitmapRect.cpp",
-  "$_samplecode/SampleBlur.cpp",
   "$_samplecode/SampleCCPRGeometry.cpp",
   "$_samplecode/SampleCamera.cpp",
   "$_samplecode/SampleChart.cpp",
diff --git a/samplecode/SampleAAGeometry.cpp b/samplecode/SampleAAGeometry.cpp
index 9e60891..397ba5f 100644
--- a/samplecode/SampleAAGeometry.cpp
+++ b/samplecode/SampleAAGeometry.cpp
@@ -564,6 +564,9 @@
     SkPaint fLabel;
     SkPaint fValue;
 
+    SkFont fLabelFont;
+    SkFont fValueFont;
+
     ControlPaints() {
         fOutline.setAntiAlias(true);
         fOutline.setStyle(SkPaint::kStroke_Style);
@@ -572,9 +575,9 @@
         fFill.setAntiAlias(true);
         fFill.setColor(0x7fff0000);
         fLabel.setAntiAlias(true);
-        fLabel.setTextSize(13.0f);
+        fLabelFont.setSize(13.0f);
         fValue.setAntiAlias(true);
-        fValue.setTextSize(11.0f);
+        fValueFont.setSize(11.0f);
     }
 };
 
@@ -610,9 +613,10 @@
         canvas->drawLine(fBounds.fLeft - 5, fYLo, fBounds.fRight + 5, fYLo, paints.fIndicator);
         SkString label;
         label.printf("%0.3g", fValLo);
-        canvas->drawString(label, fBounds.fLeft + 5, fYLo - 5, paints.fValue);
-        canvas->drawString(fName, fBounds.fLeft, fBounds.bottom() + 11,
-                paints.fLabel);
+        canvas->drawSimpleText(label.c_str(), label.size(), kUTF8_SkTextEncoding,
+                               fBounds.fLeft + 5, fYLo - 5, paints.fValueFont, paints.fValue);
+        canvas->drawSimpleText(fName.c_str(), fName.size(), kUTF8_SkTextEncoding,
+                               fBounds.fLeft, fBounds.bottom() + 11, paints.fLabelFont, paints.fLabel);
     }
 };
 
diff --git a/samplecode/SampleBlur.cpp b/samplecode/SampleBlur.cpp
deleted file mode 100644
index 6b5481e..0000000
--- a/samplecode/SampleBlur.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 "SkBitmap.h"
-#include "SkBlurMask.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkGradientShader.h"
-#include "SkMaskFilter.h"
-#include "SkUTF.h"
-
-class BlurView : public Sample {
-    SkBitmap    fBM;
-public:
-    BlurView() {}
-
-protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Blur");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
-
-    void drawBG(SkCanvas* canvas) {
-        canvas->drawColor(0xFFDDDDDD);
-    }
-
-    virtual void onDrawContent(SkCanvas* canvas) {
-        drawBG(canvas);
-
-        SkBlurStyle NONE = SkBlurStyle(-999);
-        static 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);
-        paint.setTextSize(25);
-        canvas->translate(-40, 0);
-
-        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(200 + gRecs[i].fCx*100.f,
-                               200 + gRecs[i].fCy*100.f, 50, paint);
-        }
-        // draw text
-        {
-            paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
-                                                       SkBlurMask::ConvertRadiusToSigma(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);
-            paint.setMaskFilter(nullptr);
-            paint.setColor(SK_ColorWHITE);
-            x -= SkIntToScalar(2);
-            y -= SkIntToScalar(2);
-            canvas->drawString("Hamburgefons Style", x, y, paint);
-        }
-    }
-
-private:
-    typedef Sample INHERITED;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-DEF_SAMPLE( return new BlurView(); )
diff --git a/samplecode/SampleComplexClip.cpp b/samplecode/SampleComplexClip.cpp
index 897b045..f4da38c 100644
--- a/samplecode/SampleComplexClip.cpp
+++ b/samplecode/SampleComplexClip.cpp
@@ -129,7 +129,7 @@
                 SkScalar txtX = SkIntToScalar(55);
                 paint.setColor(colorA);
                 const char* aTxt = invA ? "InverseA " : "A ";
-                canvas->drawString(aTxt, txtX, SkIntToScalar(220), paint);
+                canvas->drawSimpleText(aTxt, strlen(aTxt), kUTF8_SkTextEncoding, txtX, SkIntToScalar(220), font, paint);
                 txtX += font.measureText(aTxt, strlen(aTxt), kUTF8_SkTextEncoding);
                 paint.setColor(SK_ColorBLACK);
                 canvas->drawSimpleText(gOps[op].fName, strlen(gOps[op].fName), kUTF8_SkTextEncoding,
diff --git a/samplecode/SampleCusp.cpp b/samplecode/SampleCusp.cpp
index 7eb85f1..32ba90d 100644
--- a/samplecode/SampleCusp.cpp
+++ b/samplecode/SampleCusp.cpp
@@ -4,9 +4,11 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
+
 #include "Sample.h"
 #include "SkAnimTimer.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkGeometry.h"
 #include "SkPath.h"
 #include <string>
@@ -165,7 +167,7 @@
         canvas->drawPath(path, p);
         // draw time to make it easier to guess when the bad cubic was drawn
         std::string timeStr = std::to_string((float) (curTime - start) / 1000.f);
-        canvas->drawString(timeStr.c_str(), 20, 20, SkPaint());
+        canvas->drawSimpleText(timeStr.c_str(), timeStr.size(), kUTF8_SkTextEncoding, 20, 20, SkFont(), SkPaint());
         SkDebugf("");
     }
 
diff --git a/samplecode/SampleDegenerateTwoPtRadials.cpp b/samplecode/SampleDegenerateTwoPtRadials.cpp
index b9044c1..32c5fec 100644
--- a/samplecode/SampleDegenerateTwoPtRadials.cpp
+++ b/samplecode/SampleDegenerateTwoPtRadials.cpp
@@ -8,6 +8,7 @@
 #include "Sample.h"
 #include "SkAnimTimer.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkGradientShader.h"
 #include "SkString.h"
 
@@ -68,10 +69,8 @@
         draw_gradient2(canvas, SkRect::MakeXYWH(l, t, w, h), delta);
         SkString txt;
         txt.appendf("gap at \"tangent\" pt = %f", SkScalarToFloat(delta));
-        SkPaint paint;
-        paint.setAntiAlias(true);
-        paint.setColor(SK_ColorBLACK);
-        canvas->drawString(txt, l + w/2 + w*DELTA_SCALE*delta, t + h + SK_Scalar1 * 10, paint);
+        canvas->drawSimpleText(txt.c_str(), txt.size(), kUTF8_SkTextEncoding,
+                               l + w/2 + w*DELTA_SCALE*delta, t + h + SK_Scalar1 * 10, SkFont(), SkPaint());
     }
 
     bool onAnimate(const SkAnimTimer& timer) override {
diff --git a/samplecode/SampleRectanizer.cpp b/samplecode/SampleRectanizer.cpp
index 317d24c..10fc2e8 100644
--- a/samplecode/SampleRectanizer.cpp
+++ b/samplecode/SampleRectanizer.cpp
@@ -7,6 +7,7 @@
 
 #include "Sample.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkRandom.h"
 #include "SkPaint.h"
 #include "SkUTF.h"
@@ -88,8 +89,8 @@
             }
         }
 
-        SkPaint blackBigFont;
-        blackBigFont.setTextSize(20);
+        SkFont blackBigFont;
+        blackBigFont.setSize(20);
         SkPaint blackStroke;
         blackStroke.setStyle(SkPaint::kStroke_Style);
         SkPaint redFill;
@@ -121,13 +122,16 @@
                    100.0f * totArea / ((float)kWidth*kHeight),
                    fCurRandRect,
                    kNumRandRects);
-        canvas->drawString(str, 50, kHeight + 50, blackBigFont);
+        canvas->drawSimpleText(str.c_str(), str.size(), kUTF8_SkTextEncoding,
+                               50, kHeight + 50, blackBigFont, SkPaint());
 
         str.printf("Press \'j\' to toggle rectanizer");
-        canvas->drawString(str, 50, kHeight + 100, blackBigFont);
+        canvas->drawSimpleText(str.c_str(), str.size(), kUTF8_SkTextEncoding,
+                               50, kHeight + 100, blackBigFont, SkPaint());
 
         str.printf("Press \'h\' to toggle rects");
-        canvas->drawString(str, 50, kHeight + 150, blackBigFont);
+        canvas->drawSimpleText(str.c_str(), str.size(), kUTF8_SkTextEncoding,
+                               50, kHeight + 150, blackBigFont, SkPaint());
     }
 
 private:
diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp
index 409222e..2ae5f87 100644
--- a/samplecode/SampleRegion.cpp
+++ b/samplecode/SampleRegion.cpp
@@ -185,10 +185,10 @@
     static void drawstr(SkCanvas* canvas, const char text[], const SkPoint& loc,
                         bool hilite) {
         SkPaint paint;
-        paint.setAntiAlias(true);
-        paint.setTextSize(SkIntToScalar(20));
         paint.setColor(hilite ? SK_ColorRED : 0x40FF0000);
-        canvas->drawString(text, loc.fX, loc.fY, paint);
+        SkFont font;
+        font.setSize(SkIntToScalar(20));
+        canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, loc.fX, loc.fY, font, paint);
     }
 
     void drawPredicates(SkCanvas* canvas, const SkPoint pts[]) {
@@ -303,9 +303,8 @@
             { SK_ColorBLUE,     "XOR",          SkRegion::kXOR_Op           }
         };
 
-        SkPaint textPaint;
-        textPaint.setAntiAlias(true);
-        textPaint.setTextSize(SK_Scalar1*24);
+        SkFont font;
+        font.setSize(SK_Scalar1*24);
 
         this->drawOrig(canvas, false);
         canvas->save();
@@ -316,7 +315,8 @@
         canvas->translate(0, SkIntToScalar(200));
 
         for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) {
-            canvas->drawString(gOps[op].fName, SkIntToScalar(75), SkIntToScalar(50), textPaint);
+            canvas->drawSimpleText(gOps[op].fName, strlen(gOps[op].fName), kUTF8_SkTextEncoding,
+                                   SkIntToScalar(75), SkIntToScalar(50), font, SkPaint());
 
             this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor);
 
diff --git a/samplecode/SampleShip.cpp b/samplecode/SampleShip.cpp
index a4871fa..feca632 100644
--- a/samplecode/SampleShip.cpp
+++ b/samplecode/SampleShip.cpp
@@ -9,6 +9,7 @@
 #include "Resources.h"
 #include "SkAnimTimer.h"
 #include "SkCanvas.h"
+#include "SkFont.h"
 #include "SkRSXform.h"
 #include "SkSurface.h"
 #include "Timer.h"
@@ -106,7 +107,9 @@
         SkPaint paint;
         paint.setFilterQuality(kLow_SkFilterQuality);
         paint.setColor(SK_ColorWHITE);
-        paint.setTextSize(15.0f);
+
+        SkFont font;
+        font.setSize(15.0f);
 
         fTimer.end();
 
@@ -148,7 +151,7 @@
         paint.setColor(SK_ColorBLACK);
         canvas->drawRect(SkRect::MakeXYWH(0, 0, 200, 24), paint);
         paint.setColor(SK_ColorWHITE);
-        canvas->drawString(outString, 5, 15, paint);
+        canvas->drawSimpleText(outString.c_str(), outString.size(), kUTF8_SkTextEncoding, 5, 15, font, paint);
     }
 
 #if 0
diff --git a/tools/sk_tool_utils.cpp b/tools/sk_tool_utils.cpp
index b899271..374d00f 100644
--- a/tools/sk_tool_utils.cpp
+++ b/tools/sk_tool_utils.cpp
@@ -120,13 +120,13 @@
     SkCanvas canvas(bitmap);
 
     SkPaint paint;
-    paint.setAntiAlias(true);
-    sk_tool_utils::set_portable_typeface(&paint);
     paint.setColor(c);
-    paint.setTextSize(SkIntToScalar(textSize));
+
+    SkFont font(sk_tool_utils::create_portable_typeface(), textSize);
 
     canvas.clear(0x00000000);
-    canvas.drawString(str, SkIntToScalar(x), SkIntToScalar(y), paint);
+    canvas.drawSimpleText(str, strlen(str), kUTF8_SkTextEncoding,
+                          SkIntToScalar(x), SkIntToScalar(y), font, paint);
 
     // Tag data as sRGB (without doing any color space conversion). Color-space aware configs
     // will process this correctly but legacy configs will render as if this returned N32.