/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "gm/gm.h" #include "include/core/SkCanvas.h" #include "include/core/SkColor.h" #include "include/core/SkFont.h" #include "include/core/SkFontMetrics.h" #include "include/core/SkFontStyle.h" #include "include/core/SkFontTypes.h" #include "include/core/SkPaint.h" #include "include/core/SkRefCnt.h" #include "include/core/SkScalar.h" #include "include/core/SkSize.h" #include "include/core/SkString.h" #include "include/core/SkTypeface.h" #include "src/core/SkEnumerate.h" #include "tools/Resources.h" #include "tools/ToolUtils.h" #include "tools/fonts/FontToolUtils.h" #include #include namespace skiagm { class ScaledEmojiRenderingGM : public GM { public: ScaledEmojiRenderingGM() {} protected: static constexpr ToolUtils::EmojiFontFormat formatsToTest[] = { ToolUtils::EmojiFontFormat::ColrV0, ToolUtils::EmojiFontFormat::Sbix, ToolUtils::EmojiFontFormat::Cbdt, ToolUtils::EmojiFontFormat::Test, ToolUtils::EmojiFontFormat::Svg, }; ToolUtils::EmojiTestSample fontSamples[std::size(formatsToTest)]; void onOnceBeforeDraw() override { for (auto&& [i, format] : SkMakeEnumerate(formatsToTest)) { fontSamples[i] = ToolUtils::EmojiSample(format); if (!fontSamples[i].typeface) { fontSamples[i].typeface = ToolUtils::DefaultTypeface(); } } } SkString getName() const override { return SkString("scaledemoji_rendering"); } SkISize getISize() override { return SkISize::Make(1200, 1200); } void onDraw(SkCanvas* canvas) override { canvas->drawColor(SK_ColorGRAY); SkPaint textPaint; textPaint.setColor(SK_ColorCYAN); SkPaint boundsPaint; boundsPaint.setStrokeWidth(2); boundsPaint.setStyle(SkPaint::kStroke_Style); boundsPaint.setColor(SK_ColorGREEN); SkPaint advancePaint; advancePaint.setColor(SK_ColorRED); SkScalar y = 0; for (auto& sample : fontSamples) { SkFont font(sample.typeface); font.setEdging(SkFont::Edging::kAlias); const char* text = sample.sampleText; SkFontMetrics metrics; for (SkScalar textSize : { 70, 150 }) { font.setSize(textSize); font.getMetrics(&metrics); // All typefaces should support subpixel mode font.setSubpixel(true); y += -metrics.fAscent; SkScalar x = 0; for (bool fakeBold : { false, true }) { font.setEmbolden(fakeBold); SkRect bounds; SkScalar advance = font.measureText(text, strlen(text), SkTextEncoding::kUTF8, &bounds, &textPaint); canvas->drawSimpleText(text, strlen(text), SkTextEncoding::kUTF8, x, y, font, textPaint); if ((false)) { bounds.offset(x, y); canvas->drawRect(bounds, boundsPaint); SkRect advanceRect = SkRect::MakeLTRB(x, y + 2, x + advance, y + 4); canvas->drawRect(advanceRect, advancePaint); } x += bounds.width() * 1.2; } y += metrics.fDescent + metrics.fLeading; x = 0; } } } private: using INHERITED = GM; }; ////////////////////////////////////////////////////////////////////////////// DEF_GM(return new ScaledEmojiRenderingGM;) } // namespace skiagm