blob: 3e19803bde33ad3719051737bc9be9b5cff94e7c [file] [log] [blame]
Jim Van Verth1b125452018-02-13 15:21:34 -05001/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9#include "sk_tool_utils.h"
10
11#include "Resources.h"
12#include "SkCanvas.h"
Mike Reed9cd2a5c2019-01-22 15:17:59 -050013#include "SkFontMetrics.h"
Jim Van Verth1b125452018-02-13 15:21:34 -050014#include "SkStream.h"
Herb Derby5f7b0142018-12-14 16:47:45 -050015#include "SkTextBlob.h"
Hal Canaryc640d0d2018-06-13 09:59:02 -040016#include "SkTo.h"
Jim Van Verth1b125452018-02-13 15:21:34 -050017#include "SkTypeface.h"
18
Hal Canary7db6e282018-12-17 14:21:31 -050019static sk_sp<SkTextBlob> make_hpos_test_blob_utf8(const char* text, const SkFont& font) {
20 constexpr SkTextEncoding enc = SkTextEncoding::kUTF8;
21 SkTextBlobBuilder builder;
22 size_t len = strlen(text);
23 int glyphCount = font.countText(text, len, enc);
24 const auto& buffer = builder.allocRunPosH(font, glyphCount, 0);
25 (void)font.textToGlyphs(text, len, enc, buffer.glyphs, glyphCount);
26 font.getXPos(buffer.glyphs, glyphCount, buffer.pos);
27 return builder.make();
28}
29
Jim Van Verth1b125452018-02-13 15:21:34 -050030namespace skiagm {
31
32class ScaledEmojiGM : public GM {
33public:
34 ScaledEmojiGM() { }
35
36protected:
37 struct EmojiFont {
38 sk_sp<SkTypeface> fTypeface;
39 const char* fText;
40 } fEmojiFont;
41
42 void onOnceBeforeDraw() override {
43 fEmojiFont.fTypeface = sk_tool_utils::emoji_typeface();
44 fEmojiFont.fText = sk_tool_utils::emoji_sample_text();
45 }
46
47 SkString onShortName() override {
48 SkString name("scaledemoji");
49 name.append(sk_tool_utils::platform_font_manager());
50 return name;
51 }
52
53 SkISize onISize() override { return SkISize::Make(1200, 1200); }
54
55 void onDraw(SkCanvas* canvas) override {
56
Mike Kleind46dce32018-08-16 10:17:03 -040057 canvas->drawColor(SK_ColorGRAY);
Jim Van Verth1b125452018-02-13 15:21:34 -050058
59 SkPaint paint;
Mike Reedf78b7ea2018-12-25 22:06:17 -050060 SkFont font(fEmojiFont.fTypeface);
61 font.setEdging(SkFont::Edging::kAlias);
62
Jim Van Verth1b125452018-02-13 15:21:34 -050063 const char* text = fEmojiFont.fText;
64
65 // draw text at different point sizes
66 // Testing GPU bitmap path, SDF path with no scaling,
67 // SDF path with scaling, path rendering with scaling
Mike Reedb5784ac2018-11-12 09:35:15 -050068 SkFontMetrics metrics;
Jim Van Verth1b125452018-02-13 15:21:34 -050069 SkScalar y = 0;
70 for (SkScalar textSize : { 70, 180, 270, 340 }) {
Mike Reedf78b7ea2018-12-25 22:06:17 -050071 font.setSize(textSize);
72 font.getMetrics(&metrics);
Jim Van Verth1b125452018-02-13 15:21:34 -050073 y += -metrics.fAscent;
Mike Reedf78b7ea2018-12-25 22:06:17 -050074 canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, 10, y, font, paint);
Jim Van Verth1b125452018-02-13 15:21:34 -050075 y += metrics.fDescent + metrics.fLeading;
76 }
77
78 }
79
Jim Van Verth080a9282018-03-02 10:41:43 -050080private:
81 typedef GM INHERITED;
82};
83
84class ScaledEmojiPosGM : public GM {
85public:
86 ScaledEmojiPosGM() {}
87
88protected:
89 struct EmojiFont {
90 sk_sp<SkTypeface> fTypeface;
91 const char* fText;
92 } fEmojiFont;
93
94 void onOnceBeforeDraw() override {
95 fEmojiFont.fTypeface = sk_tool_utils::emoji_typeface();
96 fEmojiFont.fText = sk_tool_utils::emoji_sample_text();
97 }
98
99 SkString onShortName() override {
100 SkString name("scaledemojipos");
101 name.append(sk_tool_utils::platform_font_manager());
102 return name;
103 }
104
105 SkISize onISize() override { return SkISize::Make(1200, 1200); }
106
107 void onDraw(SkCanvas* canvas) override {
108
Mike Kleind46dce32018-08-16 10:17:03 -0400109 canvas->drawColor(SK_ColorGRAY);
Jim Van Verth080a9282018-03-02 10:41:43 -0500110
111 SkPaint paint;
Herb Derby5f7b0142018-12-14 16:47:45 -0500112 SkFont font;
113 font.setTypeface(fEmojiFont.fTypeface);
Jim Van Verth080a9282018-03-02 10:41:43 -0500114 const char* text = fEmojiFont.fText;
115
116 // draw text at different point sizes
117 // Testing GPU bitmap path, SDF path with no scaling,
118 // SDF path with scaling, path rendering with scaling
Mike Reedb5784ac2018-11-12 09:35:15 -0500119 SkFontMetrics metrics;
Jim Van Verth080a9282018-03-02 10:41:43 -0500120 SkScalar y = 0;
121 for (SkScalar textSize : { 70, 180, 270, 340 }) {
Herb Derby5f7b0142018-12-14 16:47:45 -0500122 font.setSize(textSize);
123 font.getMetrics(&metrics);
Jim Van Verth080a9282018-03-02 10:41:43 -0500124 y += -metrics.fAscent;
125
Hal Canary7db6e282018-12-17 14:21:31 -0500126 sk_sp<SkTextBlob> blob = make_hpos_test_blob_utf8(text, font);
Herb Derby5f7b0142018-12-14 16:47:45 -0500127 // Draw with an origin.
128 canvas->drawTextBlob(blob, 10, y, paint);
129
130 // Draw with shifted canvas.
131 canvas->save();
132 canvas->translate(750, 0);
133 canvas->drawTextBlob(blob, 10, y, paint);
134 canvas->restore();
135
Jim Van Verth080a9282018-03-02 10:41:43 -0500136 y += metrics.fDescent + metrics.fLeading;
137 }
138
139 }
140
141private:
Jim Van Verth1b125452018-02-13 15:21:34 -0500142 typedef GM INHERITED;
143};
144
145//////////////////////////////////////////////////////////////////////////////
146
147DEF_GM(return new ScaledEmojiGM;)
Jim Van Verth080a9282018-03-02 10:41:43 -0500148DEF_GM(return new ScaledEmojiPosGM;)
Jim Van Verth1b125452018-02-13 15:21:34 -0500149
150}