• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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