/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "bench/Benchmark.h" #include "include/core/SkFont.h" #include "include/core/SkTypeface.h" #include "include/gpu/GrDirectContext.h" #include "include/gpu/GrRecordingContext.h" #include "src/core/SkUtils.h" #include "src/gpu/GrRecordingContextPriv.h" #include "src/gpu/GrRenderTargetContext.h" #include "src/gpu/SkGr.h" #include "src/gpu/text/GrTextBlob.h" #include "src/utils/SkUTF.h" // From Project Guttenberg. This is UTF-8 text. static const char* gText = "Call me Ishmael. Some years ago--never mind how long precisely"; class DirectMaskGlyphVertexFillBenchmark : public Benchmark { bool isSuitableFor(Backend backend) override { return backend == kGPU_Backend; } const char* onGetName() override { return "DirectMaskGlyphVertexFillBenchmark"; } void onPerCanvasPreDraw(SkCanvas* canvas) override { auto typeface = SkTypeface::MakeFromName("monospace", SkFontStyle()); SkFont font(typeface); SkMatrix view = SkMatrix::I(); size_t len = strlen(gText); SkGlyphRunBuilder builder; SkPaint paint; builder.drawTextUTF8(paint, font, gText, len, {100, 100}); auto glyphRunList = builder.useGlyphRunList(); SkASSERT(!glyphRunList.empty()); fBlob = GrTextBlob::Make(glyphRunList, view); SkSurfaceProps props{SkSurfaceProps::kLegacyFontHost_InitType}; auto colorSpace = SkColorSpace::MakeSRGB(); SkGlyphRunListPainter painter{props, kUnknown_SkColorType, colorSpace.get(), SkStrikeCache::GlobalStrikeCache()}; GrSDFTOptions options{256, 256}; painter.processGlyphRunList( glyphRunList, view, props, false, options, fBlob.get()); SkASSERT(fBlob->subRunList().head() != nullptr); GrAtlasSubRun* subRun = static_cast(fBlob->subRunList().head()); subRun->testingOnly_packedGlyphIDToGrGlyph(&fCache); fVertices.reset(new char[subRun->vertexStride() * subRun->glyphCount() * 4]); } void onDraw(int loops, SkCanvas* canvas) override { GrAtlasSubRun* subRun = static_cast(fBlob->subRunList().head()); SkIRect clip = SkIRect::MakeEmpty(); SkPaint paint; GrColor grColor = SkColorToPremulGrColor(paint.getColor()); for (int loop = 0; loop < loops; loop++) { subRun->fillVertexData(fVertices.get(), 0, subRun->glyphCount(), grColor, SkMatrix::I(), {100, 100}, clip); } } private: sk_sp fBlob; GrStrikeCache fCache; std::unique_ptr fVertices; }; DEF_BENCH(return new DirectMaskGlyphVertexFillBenchmark{});