• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 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/SkFontMgr.h"
14 #include "include/core/SkPaint.h"
15 #include "include/core/SkRefCnt.h"
16 #include "include/core/SkScalar.h"
17 #include "include/core/SkSize.h"
18 #include "include/core/SkString.h"
19 #include "include/core/SkTypeface.h"
20 #include "include/core/SkTypes.h"
21 #include "tools/Resources.h"
22 #include "tools/ToolUtils.h"
23 
24 #include <string.h>
25 
26 namespace skiagm {
27 
28 namespace {
29 const char kColrCpalTestFontPath[] = "fonts/more_samples-glyf_colr_1.ttf";
30 
31 constexpr SkFontArguments::Palette::Override kColorOverridesAll[] = {
32         // A gradient of dark to light purple for the circle palette test glyph.
33         // Randomly ordered with `shuf`.
34         // Add a repeat (later overrides override earlier overrides).
35         // Add three out of bounds entries (font has 12 palette entries).
36         { 6, 0xffffff00},
37         { 2, 0xff76078f},
38         { 4, 0xffb404c4},
39         { 1, 0xff510970},
40         { 6, 0xfffa00ff},
41         { 8, 0xff888888},
42         {10, 0xff888888},
43         { 9, 0xff888888},
44         { 7, 0xff888888},
45         {11, 0xff888888},
46         { 0, 0xff310b55},
47         { 3, 0xff9606aa},
48         { 5, 0xffd802e2},
49         {13, 0xff00ffff},
50         {12, 0xff00ffff},
51         {-1, 0xff00ff00},
52 };
53 
54 constexpr SkFontArguments::Palette::Override kColorOverridesOne[] = {
55         {2, 0xff02dfe2},
56 };
57 
58 constexpr SkFontArguments::Palette kLightPaletteOverride{2, nullptr, 0};
59 constexpr SkFontArguments::Palette kDarkPaletteOverride{1, nullptr, 0};
60 constexpr SkFontArguments::Palette kOnePaletteOverride{
61         0, kColorOverridesOne, SK_ARRAY_COUNT(kColorOverridesOne)};
62 constexpr SkFontArguments::Palette kAllPaletteOverride{
63         0, kColorOverridesAll, SK_ARRAY_COUNT(kColorOverridesAll)};
64 
65 constexpr uint16_t kTestGlyphs[] = {56, 57};
66 
67 }  // namespace
68 
69 class FontPaletteGM : public GM {
70 public:
FontPaletteGM(const char * test_name,const SkFontArguments::Palette & paletteOverride)71     FontPaletteGM(const char* test_name,
72                   const SkFontArguments::Palette& paletteOverride)
73             : fName(test_name), fPalette(paletteOverride) {}
74 
75 protected:
76     sk_sp<SkTypeface> fTypefaceDefault;
77     sk_sp<SkTypeface> fTypefaceFromStream;
78     sk_sp<SkTypeface> fTypefaceCloned;
79 
onOnceBeforeDraw()80     void onOnceBeforeDraw() override {
81         SkFontArguments paletteArguments;
82         paletteArguments.setPalette(fPalette);
83 
84         fTypefaceDefault = MakeResourceAsTypeface(kColrCpalTestFontPath);
85         fTypefaceCloned =
86                 fTypefaceDefault ? fTypefaceDefault->makeClone(paletteArguments) : nullptr;
87 
88         fTypefaceFromStream = SkFontMgr::RefDefault()->makeFromStream(
89                 GetResourceAsStream(kColrCpalTestFontPath), paletteArguments);
90     }
91 
onShortName()92     SkString onShortName() override {
93         SkString gm_name = SkStringPrintf("font_palette_%s", fName.c_str());
94         return gm_name;
95     }
96 
onISize()97     SkISize onISize() override { return SkISize::Make(1000, 400); }
98 
onDraw(SkCanvas * canvas,SkString * errorMsg)99     DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override {
100         canvas->drawColor(SK_ColorWHITE);
101         SkPaint paint;
102 
103         canvas->translate(10, 20);
104 
105         if (!fTypefaceCloned || !fTypefaceFromStream) {
106             *errorMsg = "Did not recognize COLR v1 test font format.";
107             return DrawResult::kSkip;
108         }
109 
110         SkFontMetrics metrics;
111         SkScalar y = 0;
112         SkScalar textSize = 200;
113         for (auto& typeface : { fTypefaceFromStream, fTypefaceCloned} ) {
114             SkFont defaultFont(fTypefaceDefault);
115             SkFont paletteFont(typeface);
116             defaultFont.setSize(textSize);
117             paletteFont.setSize(textSize);
118 
119             defaultFont.getMetrics(&metrics);
120             y += -metrics.fAscent;
121             // Set a recognizable foreground color which is not to be overriden.
122             paint.setColor(SK_ColorGRAY);
123             // Draw the default palette on the left, for COLRv0 and COLRv1.
124             canvas->drawSimpleText(kTestGlyphs,
125                                    SK_ARRAY_COUNT(kTestGlyphs) * sizeof(uint16_t),
126                                    SkTextEncoding::kGlyphID,
127                                    0,
128                                    y,
129                                    defaultFont,
130                                    paint);
131             // Draw the overriden palette on the right.
132             canvas->drawSimpleText(kTestGlyphs,
133                                    SK_ARRAY_COUNT(kTestGlyphs) * sizeof(uint16_t),
134                                    SkTextEncoding::kGlyphID,
135                                    440,
136                                    y,
137                                    paletteFont,
138                                    paint);
139             y += metrics.fDescent + metrics.fLeading;
140         }
141         return DrawResult::kOk;
142     }
143 
144 private:
145     using INHERITED = GM;
146     SkString fName;
147     SkFontArguments::Palette fPalette;
148 };
149 
150 DEF_GM(return new FontPaletteGM("default", SkFontArguments::Palette()));
151 DEF_GM(return new FontPaletteGM("light", kLightPaletteOverride));
152 DEF_GM(return new FontPaletteGM("dark", kDarkPaletteOverride));
153 DEF_GM(return new FontPaletteGM("one", kOnePaletteOverride));
154 DEF_GM(return new FontPaletteGM("all", kAllPaletteOverride));
155 
156 }  // namespace skiagm
157