use font for measuring
Bug: skia:
Change-Id: I451c61d5b98cb42440a4eaa889d9404638a72f5c
Reviewed-on: https://skia-review.googlesource.com/c/179980
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/gm/gamma.cpp b/gm/gamma.cpp
index c1afc69..6c854ae 100644
--- a/gm/gamma.cpp
+++ b/gm/gamma.cpp
@@ -49,10 +49,11 @@
mipmapPixels[0] = mipmapPixels[3] = SkPackARGB32(0xFF, s25, s25, s25);
mipmapPixels[1] = mipmapPixels[2] = SkPackARGB32(0xFF, s75, s75, s75);
+ SkFont font(sk_tool_utils::create_portable_typeface());
+
SkPaint textPaint;
textPaint.setAntiAlias(true);
textPaint.setColor(SK_ColorWHITE);
- sk_tool_utils::set_portable_typeface(&textPaint);
// Helpers:
auto advance = [&]() {
@@ -60,19 +61,22 @@
p.reset();
};
+ auto drawString = [&](const char str[], SkScalar x, SkScalar y) {
+ canvas->drawSimpleText(str, strlen(str), kUTF8_SkTextEncoding, x, y, font, textPaint);
+ };
+
auto nextRect = [&](const char* label, const char* label2) {
canvas->drawRect(r, p);
- canvas->drawString(label, 0, sz + textPaint.getFontSpacing(), textPaint);
+ drawString(label, 0, sz + font.getSpacing());
if (label2) {
- canvas->drawString(label2, 0, sz + 2 * textPaint.getFontSpacing(),
- textPaint);
+ drawString(label2, 0, sz + 2 * font.getSpacing());
}
advance();
};
auto nextBitmap = [&](const SkBitmap& bmp, const char* label) {
canvas->drawBitmap(bmp, 0, 0);
- canvas->drawString(label, 0, sz + textPaint.getFontSpacing(), textPaint);
+ drawString(label, 0, sz + font.getSpacing());
advance();
};
@@ -85,13 +89,10 @@
SkString srcText = SkStringPrintf("%08X", srcColor);
SkString dstText = SkStringPrintf("%08X", dstColor);
- canvas->drawString(srcText, 0, sz + textPaint.getFontSpacing(),
- textPaint);
+ drawString(srcText.c_str(), 0, sz + font.getSpacing());
const char* modeName = SkBlendMode_Name(mode);
- canvas->drawString(modeName, 0, sz + 2 * textPaint.getFontSpacing(),
- textPaint);
- canvas->drawString(dstText, 0, sz + 3 * textPaint.getFontSpacing(),
- textPaint);
+ drawString(modeName, 0, sz + 2 * font.getSpacing());
+ drawString(dstText.c_str(), 0, sz + 3 * font.getSpacing());
advance();
};
diff --git a/gm/lumafilter.cpp b/gm/lumafilter.cpp
index 07e9b99..82cb1a0 100644
--- a/gm/lumafilter.cpp
+++ b/gm/lumafilter.cpp
@@ -19,13 +19,14 @@
static void draw_label(SkCanvas* canvas, const char* label,
const SkPoint& offset) {
- SkPaint paint;
- sk_tool_utils::set_portable_typeface(&paint);
+ SkFont font(sk_tool_utils::create_portable_typeface());
+ font.setEdging(SkFont::Edging::kAlias);
+
size_t len = strlen(label);
- SkScalar width = paint.measureText(label, len);
- canvas->drawText(label, len, offset.x() - width / 2, offset.y(),
- paint);
+ SkScalar width = font.measureText(label, len, kUTF8_SkTextEncoding);
+ canvas->drawSimpleText(label, len, kUTF8_SkTextEncoding, offset.x() - width / 2, offset.y(),
+ font, SkPaint());
}
static void draw_scene(SkCanvas* canvas, const sk_sp<SkColorFilter>& filter, SkBlendMode mode,
diff --git a/gm/mixedtextblobs.cpp b/gm/mixedtextblobs.cpp
index a7a9f81..afdd736 100644
--- a/gm/mixedtextblobs.cpp
+++ b/gm/mixedtextblobs.cpp
@@ -48,16 +48,15 @@
// make textblob
// Text so large we draw as paths
- SkPaint paint;
- paint.setTextSize(385);
+ SkFont font(sk_tool_utils::create_portable_typeface(), 385);
+ font.setEdging(SkFont::Edging::kAlias);
const char* text = "O";
- sk_tool_utils::set_portable_typeface(&paint);
SkRect bounds;
- paint.measureText(text, strlen(text), &bounds);
+ font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds);
SkScalar yOffset = bounds.height();
- sk_tool_utils::add_to_text_blob(&builder, text, paint, 10, yOffset);
+ sk_tool_utils::add_to_text_blob(&builder, text, font, 10, yOffset);
SkScalar corruptedAx = bounds.width();
SkScalar corruptedAy = yOffset;
@@ -68,33 +67,31 @@
yOffset = boundsHalfHeight;
// LCD
- paint.setTextSize(32);
+ font.setSize(32);
+ font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
+ font.setSubpixel(true);
text = "LCD!!!!!";
- paint.setAntiAlias(true);
- paint.setSubpixelText(true);
- paint.setLCDRenderText(true);
- paint.measureText(text, strlen(text), &bounds);
- sk_tool_utils::add_to_text_blob(&builder, text, paint, xOffset - bounds.width() * 0.25f,
+ font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds);
+ sk_tool_utils::add_to_text_blob(&builder, text, font, xOffset - bounds.width() * 0.25f,
yOffset - bounds.height() * 0.5f);
yOffset += bounds.height();
// color emoji
if (fEmojiTypeface) {
- paint.setAntiAlias(false);
- paint.setSubpixelText(false);
- paint.setLCDRenderText(false);
- paint.setTypeface(fEmojiTypeface);
+ font.setEdging(SkFont::Edging::kAlias);
+ font.setSubpixel(false);
+ font.setTypeface(fEmojiTypeface);
text = fEmojiText;
- paint.measureText(text, strlen(text), &bounds);
- sk_tool_utils::add_to_text_blob(&builder, text, paint, xOffset - bounds.width() * 0.3f,
+ font.measureText(text, strlen(text), kUTF8_SkTextEncoding, &bounds);
+ sk_tool_utils::add_to_text_blob(&builder, text, font, xOffset - bounds.width() * 0.3f,
yOffset);
}
// Corrupted font
- paint.setTextSize(12);
+ font.setSize(12);
text = "aA";
- paint.setTypeface(fReallyBigATypeface);
- sk_tool_utils::add_to_text_blob(&builder, text, paint, corruptedAx, corruptedAy);
+ font.setTypeface(fReallyBigATypeface);
+ sk_tool_utils::add_to_text_blob(&builder, text, font, corruptedAx, corruptedAy);
fBlob = builder.make();
}
diff --git a/samplecode/SampleAnimatedText.cpp b/samplecode/SampleAnimatedText.cpp
index 1aa50e2..a7e86d6 100644
--- a/samplecode/SampleAnimatedText.cpp
+++ b/samplecode/SampleAnimatedText.cpp
@@ -24,11 +24,10 @@
SkRandom gRand;
static void DrawTheText(SkCanvas* canvas, const char text[], size_t length, SkScalar x, SkScalar y,
- const SkPaint& paint) {
- SkPaint p(paint);
-
- p.setSubpixelText(true);
- canvas->drawText(text, length, x, y, p);
+ const SkFont& font, const SkPaint& paint) {
+ SkFont f(font);
+ f.setSubpixel(true);
+ canvas->drawSimpleText(text, length, kUTF8_SkTextEncoding, x, y, f, paint);
}
// This sample demonstrates the cache behavior of bitmap vs. distance field text
@@ -69,8 +68,9 @@
}
void onDrawContent(SkCanvas* canvas) override {
+ SkFont font(SkTypeface::MakeFromFile("/skimages/samplefont.ttf"));
+
SkPaint paint;
- paint.setTypeface(SkTypeface::MakeFromFile("/skimages/samplefont.ttf"));
paint.setAntiAlias(true);
paint.setFilterQuality(kMedium_SkFilterQuality);
@@ -118,15 +118,16 @@
SkScalar y = SkIntToScalar(0);
for (int i = 12; i <= 26; i++) {
- paint.setTextSize(SkIntToScalar(i*fSizeScale));
- y += paint.getFontSpacing();
- DrawTheText(canvas, text, length, SkIntToScalar(110), y, paint);
+ font.setSize(SkIntToScalar(i*fSizeScale));
+ y += font.getSpacing();
+ DrawTheText(canvas, text, length, SkIntToScalar(110), y, font, paint);
}
canvas->restore();
- paint.setTextSize(16);
+ font.setSize(16);
// canvas->drawString(outString, 512.f, 540.f, paint);
- canvas->drawString(modeString, 768.f, 540.f, paint);
+ canvas->drawSimpleText(modeString.c_str(), modeString.size(), kUTF8_SkTextEncoding,
+ 768.f, 540.f, font, paint);
}
bool onAnimate(const SkAnimTimer& timer) override {
diff --git a/samplecode/SampleChineseFling.cpp b/samplecode/SampleChineseFling.cpp
index b8110f3..3b73bb2 100644
--- a/samplecode/SampleChineseFling.cpp
+++ b/samplecode/SampleChineseFling.cpp
@@ -20,16 +20,6 @@
#include "GrContextPriv.h"
#endif
-static void make_paint(SkPaint* paint, sk_sp<SkTypeface> typeface) {
- static const int kTextSize = 56;
-
- paint->setAntiAlias(true);
- paint->setColor(0xDE000000);
- paint->setTypeface(typeface);
- paint->setTextSize(kTextSize);
- paint->setTextEncoding(kUTF32_SkTextEncoding);
-}
-
static sk_sp<SkTypeface> chinese_typeface() {
#ifdef SK_BUILD_FOR_ANDROID
return MakeResourceAsTypeface("fonts/NotoSansCJK-Regular.ttc");
@@ -68,7 +58,7 @@
canvas->clear(0xFFDDDDDD);
SkPaint paint;
- make_paint(&paint, fTypeface);
+ paint.setColor(0xDE000000);
// draw a consistent run of the 'words' - one word per line
int index = fIndex;
@@ -93,10 +83,8 @@
void init() {
fTypeface = chinese_typeface();
- SkPaint paint;
- make_paint(&paint, fTypeface);
-
- paint.getFontMetrics(&fMetrics);
+ SkFont font(fTypeface, 56);
+ font.getMetrics(&fMetrics);
SkUnichar glyphs[kWordLength];
for (int32_t i = 0; i < kNumBlobs; ++i) {
@@ -104,7 +92,7 @@
SkTextBlobBuilder builder;
sk_tool_utils::add_to_text_blob_w_len(&builder, (const char*) glyphs, kWordLength*4,
- paint, 0, 0);
+ kUTF32_SkTextEncoding, font, 0, 0);
fBlobs.emplace_back(builder.make());
}
@@ -215,14 +203,11 @@
void init() {
fTypeface = chinese_typeface();
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setColor(0xDE000000);
- paint.setTypeface(fTypeface);
- paint.setTextSize(11);
- paint.setTextEncoding(kUTF32_SkTextEncoding);
+ SkFont font(fTypeface, 11);
+ font.getMetrics(&fMetrics);
- paint.getFontMetrics(&fMetrics);
+ SkPaint paint;
+ paint.setColor(0xDE000000);
SkUnichar glyphs[45];
for (int32_t i = 0; i < kNumBlobs; ++i) {
@@ -234,7 +219,8 @@
this->createRandomLine(glyphs, currentLineLength);
sk_tool_utils::add_to_text_blob_w_len(&builder, (const char*) glyphs,
- currentLineLength*4, paint, 0, y);
+ currentLineLength*4, kUTF32_SkTextEncoding,
+ font, 0, y);
y += fMetrics.fDescent - fMetrics.fAscent + fMetrics.fLeading;
paragraphLength -= 45;
}
diff --git a/tools/sk_tool_utils.cpp b/tools/sk_tool_utils.cpp
index 74aa1a5..b899271 100644
--- a/tools/sk_tool_utils.cpp
+++ b/tools/sk_tool_utils.cpp
@@ -137,21 +137,15 @@
}
void add_to_text_blob_w_len(SkTextBlobBuilder* builder, const char* text, size_t len,
- const SkPaint& paint, SkScalar x, SkScalar y) {
- SkFont font = SkFont::LEGACY_ExtractFromPaint(paint);
- SkTDArray<uint16_t> glyphs;
-
- glyphs.append(font.countText(text, len, paint.getTextEncoding()));
- font.textToGlyphs(text, len, paint.getTextEncoding(), glyphs.begin(), glyphs.count());
-
- const SkTextBlobBuilder::RunBuffer& run = builder->allocRun(font, glyphs.count(), x, y,
- nullptr);
- memcpy(run.glyphs, glyphs.begin(), glyphs.count() * sizeof(uint16_t));
+ SkTextEncoding encoding, const SkFont& font, SkScalar x, SkScalar y) {
+ int count = font.countText(text, len, encoding);
+ auto run = builder->allocRun(font, count, x, y);
+ font.textToGlyphs(text, len, encoding, run.glyphs, count);
}
-void add_to_text_blob(SkTextBlobBuilder* builder, const char* text,
- const SkPaint& origPaint, SkScalar x, SkScalar y) {
- add_to_text_blob_w_len(builder, text, strlen(text), origPaint, x, y);
+void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const SkFont& font,
+ SkScalar x, SkScalar y) {
+ add_to_text_blob_w_len(builder, text, strlen(text), kUTF8_SkTextEncoding, font, x, y);
}
void get_text_path(const SkFont& font, const void* text, size_t length, SkTextEncoding encoding,
diff --git a/tools/sk_tool_utils.h b/tools/sk_tool_utils.h
index 645ac5d..01ad89c 100644
--- a/tools/sk_tool_utils.h
+++ b/tools/sk_tool_utils.h
@@ -11,6 +11,7 @@
#include "SkColor.h"
#include "SkData.h"
#include "SkEncodedImageFormat.h"
+#include "SkFont.h"
#include "SkFontStyle.h"
#include "SkFontTypes.h"
#include "SkImageEncoder.h"
@@ -27,7 +28,6 @@
class SkBitmap;
class SkCanvas;
-class SkFont;
class SkFontStyle;
class SkImage;
class SkPaint;
@@ -126,11 +126,16 @@
sk_sp<SkSurface> makeSurface(SkCanvas*, const SkImageInfo&, const SkSurfaceProps* = nullptr);
// A helper for inserting a drawtext call into a SkTextBlobBuilder
- void add_to_text_blob_w_len(SkTextBlobBuilder* builder, const char* text, size_t len,
- const SkPaint& origPaint, SkScalar x, SkScalar y);
+ void add_to_text_blob_w_len(SkTextBlobBuilder*, const char* text, size_t len, SkTextEncoding,
+ const SkFont&, SkScalar x, SkScalar y);
- void add_to_text_blob(SkTextBlobBuilder* builder, const char* text,
- const SkPaint& origPaint, SkScalar x, SkScalar y);
+ void add_to_text_blob(SkTextBlobBuilder*, const char* text, const SkFont&,
+ SkScalar x, SkScalar y);
+
+ static inline void add_to_text_blob(SkTextBlobBuilder* builder, const char* text,
+ const SkPaint& paint, SkScalar x, SkScalar y) {
+ add_to_text_blob(builder, text, SkFont::LEGACY_ExtractFromPaint(paint), x, y);
+ }
// Constructs a star by walking a 'numPts'-sided regular polygon with even/odd fill:
//