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