blob: 7307a751156eda7865bcfc86616c3c6902dbba1b [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"
13#include "SkStream.h"
Herb Derby5f7b0142018-12-14 16:47:45 -050014#include "SkTextBlob.h"
Hal Canaryc640d0d2018-06-13 09:59:02 -040015#include "SkTo.h"
Jim Van Verth1b125452018-02-13 15:21:34 -050016#include "SkTypeface.h"
17
Hal Canary7db6e282018-12-17 14:21:31 -050018static sk_sp<SkTextBlob> make_hpos_test_blob_utf8(const char* text, const SkFont& font) {
19 constexpr SkTextEncoding enc = SkTextEncoding::kUTF8;
20 SkTextBlobBuilder builder;
21 size_t len = strlen(text);
22 int glyphCount = font.countText(text, len, enc);
23 const auto& buffer = builder.allocRunPosH(font, glyphCount, 0);
24 (void)font.textToGlyphs(text, len, enc, buffer.glyphs, glyphCount);
25 font.getXPos(buffer.glyphs, glyphCount, buffer.pos);
26 return builder.make();
27}
28
Jim Van Verth1b125452018-02-13 15:21:34 -050029namespace skiagm {
30
31class ScaledEmojiGM : public GM {
32public:
33 ScaledEmojiGM() { }
34
35protected:
36 struct EmojiFont {
37 sk_sp<SkTypeface> fTypeface;
38 const char* fText;
39 } fEmojiFont;
40
41 void onOnceBeforeDraw() override {
42 fEmojiFont.fTypeface = sk_tool_utils::emoji_typeface();
43 fEmojiFont.fText = sk_tool_utils::emoji_sample_text();
44 }
45
46 SkString onShortName() override {
47 SkString name("scaledemoji");
48 name.append(sk_tool_utils::platform_font_manager());
49 return name;
50 }
51
52 SkISize onISize() override { return SkISize::Make(1200, 1200); }
53
54 void onDraw(SkCanvas* canvas) override {
55
Mike Kleind46dce32018-08-16 10:17:03 -040056 canvas->drawColor(SK_ColorGRAY);
Jim Van Verth1b125452018-02-13 15:21:34 -050057
58 SkPaint paint;
Mike Reedf78b7ea2018-12-25 22:06:17 -050059 SkFont font(fEmojiFont.fTypeface);
60 font.setEdging(SkFont::Edging::kAlias);
61
Jim Van Verth1b125452018-02-13 15:21:34 -050062 const char* text = fEmojiFont.fText;
63
64 // draw text at different point sizes
65 // Testing GPU bitmap path, SDF path with no scaling,
66 // SDF path with scaling, path rendering with scaling
Mike Reedb5784ac2018-11-12 09:35:15 -050067 SkFontMetrics metrics;
Jim Van Verth1b125452018-02-13 15:21:34 -050068 SkScalar y = 0;
69 for (SkScalar textSize : { 70, 180, 270, 340 }) {
Mike Reedf78b7ea2018-12-25 22:06:17 -050070 font.setSize(textSize);
71 font.getMetrics(&metrics);
Jim Van Verth1b125452018-02-13 15:21:34 -050072 y += -metrics.fAscent;
Mike Reedf78b7ea2018-12-25 22:06:17 -050073 canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, 10, y, font, paint);
Jim Van Verth1b125452018-02-13 15:21:34 -050074 y += metrics.fDescent + metrics.fLeading;
75 }
76
77 }
78
Jim Van Verth080a9282018-03-02 10:41:43 -050079private:
80 typedef GM INHERITED;
81};
82
83class ScaledEmojiPosGM : public GM {
84public:
85 ScaledEmojiPosGM() {}
86
87protected:
88 struct EmojiFont {
89 sk_sp<SkTypeface> fTypeface;
90 const char* fText;
91 } fEmojiFont;
92
93 void onOnceBeforeDraw() override {
94 fEmojiFont.fTypeface = sk_tool_utils::emoji_typeface();
95 fEmojiFont.fText = sk_tool_utils::emoji_sample_text();
96 }
97
98 SkString onShortName() override {
99 SkString name("scaledemojipos");
100 name.append(sk_tool_utils::platform_font_manager());
101 return name;
102 }
103
104 SkISize onISize() override { return SkISize::Make(1200, 1200); }
105
106 void onDraw(SkCanvas* canvas) override {
107
Mike Kleind46dce32018-08-16 10:17:03 -0400108 canvas->drawColor(SK_ColorGRAY);
Jim Van Verth080a9282018-03-02 10:41:43 -0500109
110 SkPaint paint;
Herb Derby5f7b0142018-12-14 16:47:45 -0500111 SkFont font;
112 font.setTypeface(fEmojiFont.fTypeface);
Jim Van Verth080a9282018-03-02 10:41:43 -0500113 const char* text = fEmojiFont.fText;
114
115 // draw text at different point sizes
116 // Testing GPU bitmap path, SDF path with no scaling,
117 // SDF path with scaling, path rendering with scaling
Mike Reedb5784ac2018-11-12 09:35:15 -0500118 SkFontMetrics metrics;
Jim Van Verth080a9282018-03-02 10:41:43 -0500119 SkScalar y = 0;
120 for (SkScalar textSize : { 70, 180, 270, 340 }) {
Herb Derby5f7b0142018-12-14 16:47:45 -0500121 font.setSize(textSize);
122 font.getMetrics(&metrics);
Jim Van Verth080a9282018-03-02 10:41:43 -0500123 y += -metrics.fAscent;
124
Hal Canary7db6e282018-12-17 14:21:31 -0500125 sk_sp<SkTextBlob> blob = make_hpos_test_blob_utf8(text, font);
Herb Derby5f7b0142018-12-14 16:47:45 -0500126 // Draw with an origin.
127 canvas->drawTextBlob(blob, 10, y, paint);
128
129 // Draw with shifted canvas.
130 canvas->save();
131 canvas->translate(750, 0);
132 canvas->drawTextBlob(blob, 10, y, paint);
133 canvas->restore();
134
Jim Van Verth080a9282018-03-02 10:41:43 -0500135 y += metrics.fDescent + metrics.fLeading;
136 }
137
138 }
139
140private:
Jim Van Verth1b125452018-02-13 15:21:34 -0500141 typedef GM INHERITED;
142};
143
144//////////////////////////////////////////////////////////////////////////////
145
146DEF_GM(return new ScaledEmojiGM;)
Jim Van Verth080a9282018-03-02 10:41:43 -0500147DEF_GM(return new ScaledEmojiPosGM;)
Jim Van Verth1b125452018-02-13 15:21:34 -0500148
149}