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);