1 /*
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 "SkFontMetrics.h"
14 #include "SkStream.h"
15 #include "SkTextBlob.h"
16 #include "SkTo.h"
17 #include "SkTypeface.h"
18
make_hpos_test_blob_utf8(const char * text,const SkFont & font)19 static 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
30 namespace skiagm {
31
32 class ScaledEmojiGM : public GM {
33 public:
ScaledEmojiGM()34 ScaledEmojiGM() { }
35
36 protected:
37 struct EmojiFont {
38 sk_sp<SkTypeface> fTypeface;
39 const char* fText;
40 } fEmojiFont;
41
onOnceBeforeDraw()42 void onOnceBeforeDraw() override {
43 fEmojiFont.fTypeface = sk_tool_utils::emoji_typeface();
44 fEmojiFont.fText = sk_tool_utils::emoji_sample_text();
45 }
46
onShortName()47 SkString onShortName() override {
48 SkString name("scaledemoji");
49 name.append(sk_tool_utils::platform_font_manager());
50 return name;
51 }
52
onISize()53 SkISize onISize() override { return SkISize::Make(1200, 1200); }
54
onDraw(SkCanvas * canvas)55 void onDraw(SkCanvas* canvas) override {
56
57 canvas->drawColor(SK_ColorGRAY);
58
59 SkPaint paint;
60 SkFont font(fEmojiFont.fTypeface);
61 font.setEdging(SkFont::Edging::kAlias);
62
63 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
68 SkFontMetrics metrics;
69 SkScalar y = 0;
70 for (SkScalar textSize : { 70, 180, 270, 340 }) {
71 font.setSize(textSize);
72 font.getMetrics(&metrics);
73 y += -metrics.fAscent;
74 canvas->drawSimpleText(text, strlen(text), kUTF8_SkTextEncoding, 10, y, font, paint);
75 y += metrics.fDescent + metrics.fLeading;
76 }
77
78 }
79
80 private:
81 typedef GM INHERITED;
82 };
83
84 class ScaledEmojiPosGM : public GM {
85 public:
ScaledEmojiPosGM()86 ScaledEmojiPosGM() {}
87
88 protected:
89 struct EmojiFont {
90 sk_sp<SkTypeface> fTypeface;
91 const char* fText;
92 } fEmojiFont;
93
onOnceBeforeDraw()94 void onOnceBeforeDraw() override {
95 fEmojiFont.fTypeface = sk_tool_utils::emoji_typeface();
96 fEmojiFont.fText = sk_tool_utils::emoji_sample_text();
97 }
98
onShortName()99 SkString onShortName() override {
100 SkString name("scaledemojipos");
101 name.append(sk_tool_utils::platform_font_manager());
102 return name;
103 }
104
onISize()105 SkISize onISize() override { return SkISize::Make(1200, 1200); }
106
onDraw(SkCanvas * canvas)107 void onDraw(SkCanvas* canvas) override {
108
109 canvas->drawColor(SK_ColorGRAY);
110
111 SkPaint paint;
112 SkFont font;
113 font.setTypeface(fEmojiFont.fTypeface);
114 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
119 SkFontMetrics metrics;
120 SkScalar y = 0;
121 for (SkScalar textSize : { 70, 180, 270, 340 }) {
122 font.setSize(textSize);
123 font.getMetrics(&metrics);
124 y += -metrics.fAscent;
125
126 sk_sp<SkTextBlob> blob = make_hpos_test_blob_utf8(text, font);
127 // 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
136 y += metrics.fDescent + metrics.fLeading;
137 }
138
139 }
140
141 private:
142 typedef GM INHERITED;
143 };
144
145 //////////////////////////////////////////////////////////////////////////////
146
147 DEF_GM(return new ScaledEmojiGM;)
148 DEF_GM(return new ScaledEmojiPosGM;)
149
150 }
151