1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2018 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMetrics.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontStyle.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkEnumerate.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker #include <string.h> 27*c8dee2aaSAndroid Build Coastguard Worker #include <initializer_list> 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 30*c8dee2aaSAndroid Build Coastguard Worker class ScaledEmojiRenderingGM : public GM { 31*c8dee2aaSAndroid Build Coastguard Worker public: ScaledEmojiRenderingGM()32*c8dee2aaSAndroid Build Coastguard Worker ScaledEmojiRenderingGM() {} 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker protected: 35*c8dee2aaSAndroid Build Coastguard Worker static constexpr ToolUtils::EmojiFontFormat formatsToTest[] = { 36*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::EmojiFontFormat::ColrV0, 37*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::EmojiFontFormat::Sbix, 38*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::EmojiFontFormat::Cbdt, 39*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::EmojiFontFormat::Test, 40*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::EmojiFontFormat::Svg, 41*c8dee2aaSAndroid Build Coastguard Worker }; 42*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::EmojiTestSample fontSamples[std::size(formatsToTest)]; onOnceBeforeDraw()43*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override { 44*c8dee2aaSAndroid Build Coastguard Worker for (auto&& [i, format] : SkMakeEnumerate(formatsToTest)) { 45*c8dee2aaSAndroid Build Coastguard Worker fontSamples[i] = ToolUtils::EmojiSample(format); 46*c8dee2aaSAndroid Build Coastguard Worker if (!fontSamples[i].typeface) { 47*c8dee2aaSAndroid Build Coastguard Worker fontSamples[i].typeface = ToolUtils::DefaultTypeface(); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker getName() const52*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("scaledemoji_rendering"); } 53*c8dee2aaSAndroid Build Coastguard Worker getISize()54*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(1200, 1200); } 55*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)56*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker canvas->drawColor(SK_ColorGRAY); 59*c8dee2aaSAndroid Build Coastguard Worker SkPaint textPaint; 60*c8dee2aaSAndroid Build Coastguard Worker textPaint.setColor(SK_ColorCYAN); 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker SkPaint boundsPaint; 63*c8dee2aaSAndroid Build Coastguard Worker boundsPaint.setStrokeWidth(2); 64*c8dee2aaSAndroid Build Coastguard Worker boundsPaint.setStyle(SkPaint::kStroke_Style); 65*c8dee2aaSAndroid Build Coastguard Worker boundsPaint.setColor(SK_ColorGREEN); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker SkPaint advancePaint; 68*c8dee2aaSAndroid Build Coastguard Worker advancePaint.setColor(SK_ColorRED); 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker SkScalar y = 0; 71*c8dee2aaSAndroid Build Coastguard Worker for (auto& sample : fontSamples) { 72*c8dee2aaSAndroid Build Coastguard Worker SkFont font(sample.typeface); 73*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kAlias); 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker const char* text = sample.sampleText; 76*c8dee2aaSAndroid Build Coastguard Worker SkFontMetrics metrics; 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker for (SkScalar textSize : { 70, 150 }) { 79*c8dee2aaSAndroid Build Coastguard Worker font.setSize(textSize); 80*c8dee2aaSAndroid Build Coastguard Worker font.getMetrics(&metrics); 81*c8dee2aaSAndroid Build Coastguard Worker // All typefaces should support subpixel mode 82*c8dee2aaSAndroid Build Coastguard Worker font.setSubpixel(true); 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker y += -metrics.fAscent; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker SkScalar x = 0; 87*c8dee2aaSAndroid Build Coastguard Worker for (bool fakeBold : { false, true }) { 88*c8dee2aaSAndroid Build Coastguard Worker font.setEmbolden(fakeBold); 89*c8dee2aaSAndroid Build Coastguard Worker SkRect bounds; 90*c8dee2aaSAndroid Build Coastguard Worker SkScalar advance = font.measureText(text, strlen(text), SkTextEncoding::kUTF8, 91*c8dee2aaSAndroid Build Coastguard Worker &bounds, &textPaint); 92*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, strlen(text), SkTextEncoding::kUTF8, 93*c8dee2aaSAndroid Build Coastguard Worker x, y, font, textPaint); 94*c8dee2aaSAndroid Build Coastguard Worker if ((false)) { 95*c8dee2aaSAndroid Build Coastguard Worker bounds.offset(x, y); 96*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(bounds, boundsPaint); 97*c8dee2aaSAndroid Build Coastguard Worker SkRect advanceRect = SkRect::MakeLTRB(x, y + 2, x + advance, y + 4); 98*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(advanceRect, advancePaint); 99*c8dee2aaSAndroid Build Coastguard Worker } 100*c8dee2aaSAndroid Build Coastguard Worker x += bounds.width() * 1.2; 101*c8dee2aaSAndroid Build Coastguard Worker } 102*c8dee2aaSAndroid Build Coastguard Worker y += metrics.fDescent + metrics.fLeading; 103*c8dee2aaSAndroid Build Coastguard Worker x = 0; 104*c8dee2aaSAndroid Build Coastguard Worker } 105*c8dee2aaSAndroid Build Coastguard Worker } 106*c8dee2aaSAndroid Build Coastguard Worker } 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Worker private: 109*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 110*c8dee2aaSAndroid Build Coastguard Worker }; 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new ScaledEmojiRenderingGM;) 115*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 116