use SkFont for text
Bug: skia:
Change-Id: I75d4f2b9e6696099ef6b221f420e766cbca8f968
Reviewed-on: https://skia-review.googlesource.com/c/177682
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/gm/dftext.cpp b/gm/dftext.cpp
index 1fbb131..d0bf1af 100644
--- a/gm/dftext.cpp
+++ b/gm/dftext.cpp
@@ -7,8 +7,10 @@
#include "Resources.h"
#include "SkCanvas.h"
+#include "SkFont.h"
#include "SkStream.h"
#include "SkSurface.h"
+#include "SkTextBlob.h"
#include "SkTo.h"
#include "SkTypeface.h"
#include "gm.h"
@@ -57,9 +59,9 @@
SkPaint paint;
paint.setAntiAlias(true);
- paint.setSubpixelText(true);
- sk_tool_utils::set_portable_typeface(&paint, "serif");
+ SkFont font(sk_tool_utils::create_portable_typeface("serif", SkFontStyle()));
+ font.setSubpixel(true);
const char* text = "Hamburgefons";
const size_t textLen = strlen(text);
@@ -71,9 +73,9 @@
SkAutoCanvasRestore acr(canvas, true);
canvas->translate(x, y);
canvas->scale(scales[i], scales[i]);
- paint.setTextSize(textSizes[i]);
- canvas->drawText(text, textLen, 0, 0, paint);
- y += paint.getFontMetrics(nullptr)*scales[i];
+ font.setSize(textSizes[i]);
+ canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, 0, 0, font, paint);
+ y += font.getMetrics(nullptr)*scales[i];
}
// check rotation
@@ -85,14 +87,14 @@
canvas->translate(SkIntToScalar(10 + i * 200), -80);
canvas->rotate(SkIntToScalar(i * 5), rotX, rotY);
for (int ps = 6; ps <= 32; ps += 3) {
- paint.setTextSize(SkIntToScalar(ps));
- canvas->drawText(text, textLen, rotX, rotY, paint);
- rotY += paint.getFontMetrics(nullptr);
+ font.setSize(SkIntToScalar(ps));
+ canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, rotX, rotY, font, paint);
+ rotY += font.getMetrics(nullptr);
}
}
// check scaling down
- paint.setLCDRenderText(true);
+ font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
x = SkIntToScalar(680);
y = SkIntToScalar(20);
size_t arraySize = SK_ARRAY_COUNT(textSizes);
@@ -101,9 +103,9 @@
canvas->translate(x, y);
SkScalar scaleFactor = SkScalarInvert(scales[arraySize - i - 1]);
canvas->scale(scaleFactor, scaleFactor);
- paint.setTextSize(textSizes[i]);
- canvas->drawText(text, textLen, 0, 0, paint);
- y += paint.getFontMetrics(nullptr)*scaleFactor;
+ font.setSize(textSizes[i]);
+ canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, 0, 0, font, paint);
+ y += font.getMetrics(nullptr)*scaleFactor;
}
// check pos text
@@ -112,20 +114,15 @@
canvas->scale(2.0f, 2.0f);
- SkAutoTArray<SkPoint> pos(SkToInt(textLen));
- SkAutoTArray<SkScalar> widths(SkToInt(textLen));
- paint.setTextSize(textSizes[0]);
+ SkAutoTArray<SkGlyphID> glyphs(SkToInt(textLen));
+ int count = font.textToGlyphs(text, textLen, kUTF8_SkTextEncoding, glyphs.get(), textLen);
+ SkAutoTArray<SkPoint> pos(count);
+ font.setSize(textSizes[0]);
+ font.getPos(glyphs.get(), count, pos.get(), {340, 75});
- paint.getTextWidths(text, textLen, &widths[0]);
-
- SkScalar x = SkIntToScalar(340);
- SkScalar y = SkIntToScalar(75);
- for (unsigned int i = 0; i < textLen; ++i) {
- pos[i].set(x, y);
- x += widths[i];
- }
-
- canvas->drawPosText(text, textLen, &pos[0], paint);
+ auto blob = SkTextBlob::MakeFromPosText(glyphs.get(), count * sizeof(SkGlyphID),
+ pos.get(), font, kGlyphID_SkTextEncoding);
+ canvas->drawTextBlob(blob, 0, 0, paint);
}
@@ -143,12 +140,12 @@
x = SkIntToScalar(680);
y = SkIntToScalar(235);
- paint.setTextSize(SkIntToScalar(19));
+ font.setSize(SkIntToScalar(19));
for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) {
paint.setColor(fg[i]);
- canvas->drawText(text, textLen, x, y, paint);
- y += paint.getFontMetrics(nullptr);
+ canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, x, y, font, paint);
+ y += font.getMetrics(nullptr);
}
paint.setColor(0xFF181C18);
@@ -157,33 +154,33 @@
x = SkIntToScalar(830);
y = SkIntToScalar(235);
- paint.setTextSize(SkIntToScalar(19));
+ font.setSize(SkIntToScalar(19));
for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) {
paint.setColor(fg[i]);
- canvas->drawText(text, textLen, x, y, paint);
- y += paint.getFontMetrics(nullptr);
+ canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, x, y, font, paint);
+ y += font.getMetrics(nullptr);
}
// check skew
{
- paint.setLCDRenderText(false);
+ font.setEdging(SkFont::Edging::kAntiAlias);
SkAutoCanvasRestore acr(canvas, true);
canvas->skew(0.0f, 0.151515f);
- paint.setTextSize(SkIntToScalar(32));
- canvas->drawText(text, textLen, 745, 70, paint);
+ font.setSize(SkIntToScalar(32));
+ canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, 745, 70, font, paint);
}
{
- paint.setLCDRenderText(true);
+ font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
SkAutoCanvasRestore acr(canvas, true);
canvas->skew(0.5f, 0.0f);
- paint.setTextSize(SkIntToScalar(32));
- canvas->drawText(text, textLen, 580, 125, paint);
+ font.setSize(SkIntToScalar(32));
+ canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, 580, 125, font, paint);
}
// check perspective
{
- paint.setLCDRenderText(false);
+ font.setEdging(SkFont::Edging::kAntiAlias);
SkAutoCanvasRestore acr(canvas, true);
SkMatrix persp;
persp.setAll(0.9839f, 0, 0,
@@ -191,12 +188,12 @@
0.0002352f, -0.0003844f, 1);
canvas->concat(persp);
canvas->translate(1100, -295);
- paint.setTextSize(37.5f);
- canvas->drawText(text, textLen, 0, 0, paint);
+ font.setSize(37.5f);
+ canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, 0, 0, font, paint);
}
{
- paint.setSubpixelText(false);
- paint.setAntiAlias(false);
+ font.setSubpixel(false);
+ font.setEdging(SkFont::Edging::kAlias);
SkAutoCanvasRestore acr(canvas, true);
SkMatrix persp;
persp.setAll(0.9839f, 0, 0,
@@ -205,18 +202,17 @@
canvas->concat(persp);
canvas->translate(1075, -245);
canvas->scale(375, 375);
- paint.setTextSize(0.1f);
- canvas->drawText(text, textLen, 0, 0, paint);
+ font.setSize(0.1f);
+ canvas->drawSimpleText(text, textLen, kUTF8_SkTextEncoding, 0, 0, font, paint);
}
// check color emoji
if (fEmojiTypeface) {
- SkPaint emojiPaint;
- emojiPaint.setSubpixelText(true);
- emojiPaint.setAntiAlias(true);
- emojiPaint.setTypeface(fEmojiTypeface);
- emojiPaint.setTextSize(SkIntToScalar(19));
- canvas->drawString(fEmojiText, 670, 90, emojiPaint);
+ SkFont emoiFont;
+ emoiFont.setSubpixel(true);
+ emoiFont.setTypeface(fEmojiTypeface);
+ emoiFont.setSize(SkIntToScalar(19));
+ canvas->drawSimpleText(fEmojiText, strlen(fEmojiText), kUTF8_SkTextEncoding, 670, 90, emoiFont, paint);
}
// render offscreen buffer
diff --git a/tests/FontObjTest.cpp b/tests/FontObjTest.cpp
index 3d0e4ce..54b91ed 100644
--- a/tests/FontObjTest.cpp
+++ b/tests/FontObjTest.cpp
@@ -69,7 +69,9 @@
};
SkPaint paint;
+#ifdef SK_SUPPORT_LEGACY_PAINT_TEXTMEASURE
char txt[] = "long .text .with .lots .of.dots.";
+#endif
unsigned mask = SkPaint::kAntiAlias_Flag |
SkPaint::kFakeBoldText_Flag |