1 /*
2  * Copyright 2020 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/gm.h"
9 #include "include/core/SkCanvas.h"
10 #include "include/core/SkColor.h"
11 #include "include/core/SkFont.h"
12 #include "include/core/SkFontMetrics.h"
13 #include "include/core/SkPaint.h"
14 #include "include/core/SkRefCnt.h"
15 #include "include/core/SkScalar.h"
16 #include "include/core/SkSize.h"
17 #include "include/core/SkString.h"
18 #include "include/core/SkTypeface.h"
19 #include "tools/Resources.h"
20 #include "tools/ToolUtils.h"
21 
22 #include <string.h>
23 #include <initializer_list>
24 
25 namespace skiagm {
26 
27 class ColrV1GM : public GM {
28 public:
ColrV1GM(SkScalar skewX,SkScalar rotateDeg)29   ColrV1GM(SkScalar skewX, SkScalar rotateDeg) : fSkewX(skewX), fRotateDeg(rotateDeg) { }
30 
31 protected:
32     struct EmojiFont {
33         sk_sp<SkTypeface> fTypeface;
34         const uint16_t fGlyphs[10] = { 19, 33, 34, 35, 20, 21, 22, 23, 24, 25 };
35         const size_t fGlyphs_bytesize =
36           SK_ARRAY_COUNT(fGlyphs) * sizeof(uint16_t);
37     } fEmojiFont;
38 
onOnceBeforeDraw()39     void onOnceBeforeDraw() override {
40         fEmojiFont.fTypeface =
41           MakeResourceAsTypeface("fonts/colrv1_samples.ttf");
42     }
43 
onShortName()44     SkString onShortName() override {
45         if (fSkewX != 0 || fRotateDeg != 0) {
46             return SkStringPrintf("colrv1_skew_%g_rotate_%g",
47                                   fSkewX,
48                                   fRotateDeg);
49         }
50         return SkString("colrv1");
51     }
52 
onISize()53     SkISize onISize() override { return SkISize::Make(1400, 600); }
54 
onDraw(SkCanvas * canvas,SkString * errorMsg)55     DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override {
56         canvas->drawColor(SK_ColorWHITE);
57         SkPaint paint;
58 
59         canvas->translate(200, 20);
60 
61         if (!fEmojiFont.fTypeface) {
62           *errorMsg = "Did not recognize COLR v1 font format.";
63           return DrawResult::kSkip;
64         }
65 
66         canvas->rotate(fRotateDeg);
67         canvas->skew(fSkewX, 0);
68 
69         SkFont font(fEmojiFont.fTypeface);
70 
71         SkFontMetrics metrics;
72         SkScalar y = 0;
73         for (SkScalar textSize : { 12, 18, 30, 120 }) {
74             font.setSize(textSize);
75             font.getMetrics(&metrics);
76             y += -metrics.fAscent;
77             canvas->drawSimpleText(fEmojiFont.fGlyphs,
78                                    fEmojiFont.fGlyphs_bytesize,
79                                    SkTextEncoding::kGlyphID,
80                                    10, y, font, paint);
81             y += metrics.fDescent + metrics.fLeading;
82         }
83         return DrawResult::kOk;
84     }
85 
86 private:
87     using INHERITED = GM;
88     SkScalar fSkewX;
89     SkScalar fRotateDeg;
90 };
91 
92 DEF_GM(return new ColrV1GM(0.f, 0.f);)
93 DEF_GM(return new ColrV1GM(-0.5f, 0.f);)
94 DEF_GM(return new ColrV1GM(0.f, 20.f);)
95 DEF_GM(return new ColrV1GM(-0.5f, 20.f);)
96 
97 }  // namespace skiagm
98