add fontmetrics to custom typeface
Change-Id: Ib6f468f6fd35b73e590d22a33d1322d3de48edb2
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/290645
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/gm/userfont.cpp b/gm/userfont.cpp
index b228ab1..55c9cf9 100644
--- a/gm/userfont.cpp
+++ b/gm/userfont.cpp
@@ -21,6 +21,12 @@
font.setSize(1.0f);
font.setHinting(SkFontHinting::kNone);
+ {
+ SkFontMetrics metrics;
+ font.getMetrics(&metrics);
+ builder.setMetrics(metrics);
+ }
+
// Steal the first 128 chars from the default font
for (SkGlyphID index = 0; index <= 127; ++index) {
SkGlyphID glyph = font.unicharToGlyph(index);
@@ -39,6 +45,12 @@
#include "include/core/SkTextBlob.h"
+static sk_sp<SkTypeface> round_trip(sk_sp<SkTypeface> tf) {
+ auto data = tf->serialize();
+ SkMemoryStream stream(data->data(), data->size());
+ return SkTypeface::MakeDeserialize(&stream);
+}
+
class UserFontGM : public skiagm::GM {
sk_sp<SkTypeface> fTF;
@@ -47,12 +59,15 @@
void onOnceBeforeDraw() override {
fTF = make_tf();
+ // test serialization
+ fTF = round_trip(fTF);
}
- static sk_sp<SkTextBlob> make_blob(sk_sp<SkTypeface> tf, float size) {
+ static sk_sp<SkTextBlob> make_blob(sk_sp<SkTypeface> tf, float size, float* spacing) {
SkFont font(tf);
font.setSize(size);
font.setEdging(SkFont::Edging::kAntiAlias);
+ *spacing = font.getMetrics(nullptr);
return SkTextBlob::MakeFromString("Typeface", font);
}
@@ -60,17 +75,24 @@
SkString onShortName() override { return SkString("user_typeface"); }
- SkISize onISize() override { return {810, 512}; }
+ SkISize onISize() override { return {810, 452}; }
void onDraw(SkCanvas* canvas) override {
auto waterfall = [&](sk_sp<SkTypeface> tf) {
SkPaint paint;
paint.setAntiAlias(true);
+ float spacing;
float x = 20,
y = 16;
for (float size = 9; size <= 100; size *= 1.25f) {
- auto blob = make_blob(tf, size);
+ auto blob = make_blob(tf, size, &spacing);
+
+ // shared baseline
+ if (tf == nullptr) {
+ paint.setColor(0xFFDDDDDD);
+ canvas->drawRect({0, y, 810, y+1}, paint);
+ }
paint.setColor(0xFFCCCCCC);
paint.setStyle(SkPaint::kStroke_Style);
@@ -80,7 +102,7 @@
paint.setColor(SK_ColorBLACK);
canvas->drawTextBlob(blob, x, y, paint);
- y += size * 1.5f;
+ y += SkScalarRoundToInt(spacing * 1.25f + 2);
}
};