1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 9cb93a386Sopenharmony_ci#include "include/core/SkFont.h" 10cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 11cb93a386Sopenharmony_ci#include "include/gpu/GrDirectContext.h" 12cb93a386Sopenharmony_ci#include "include/gpu/GrRecordingContext.h" 13cb93a386Sopenharmony_ci#include "src/core/SkStrikeCache.h" 14cb93a386Sopenharmony_ci#include "src/core/SkUtils.h" 15cb93a386Sopenharmony_ci#include "src/gpu/GrRecordingContextPriv.h" 16cb93a386Sopenharmony_ci#include "src/gpu/SkGr.h" 17cb93a386Sopenharmony_ci#include "src/gpu/text/GrStrikeCache.h" 18cb93a386Sopenharmony_ci#include "src/gpu/text/GrTextBlob.h" 19cb93a386Sopenharmony_ci#include "src/utils/SkUTF.h" 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci// From Project Guttenberg. This is UTF-8 text. 22cb93a386Sopenharmony_cistatic const char* gText = 23cb93a386Sopenharmony_ci "Call me Ishmael. Some years ago--never mind how long precisely"; 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ciclass DirectMaskGlyphVertexFillBenchmark : public Benchmark { 26cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 27cb93a386Sopenharmony_ci return backend == kGPU_Backend; 28cb93a386Sopenharmony_ci } 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci const char* onGetName() override { 31cb93a386Sopenharmony_ci return "DirectMaskGlyphVertexFillBenchmark"; 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci void onPerCanvasPreDraw(SkCanvas* canvas) override { 35cb93a386Sopenharmony_ci auto typeface = SkTypeface::MakeFromName("monospace", SkFontStyle()); 36cb93a386Sopenharmony_ci SkFont font(typeface); 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci SkMatrix view = SkMatrix::I(); 39cb93a386Sopenharmony_ci size_t len = strlen(gText); 40cb93a386Sopenharmony_ci SkGlyphRunBuilder builder; 41cb93a386Sopenharmony_ci SkPaint paint; 42cb93a386Sopenharmony_ci auto glyphRunList = builder.textToGlyphRunList(font, paint, gText, len, {100, 100}); 43cb93a386Sopenharmony_ci SkASSERT(!glyphRunList.empty()); 44cb93a386Sopenharmony_ci SkSurfaceProps props; 45cb93a386Sopenharmony_ci if (canvas) { canvas->getProps(&props); } 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci auto colorSpace = SkColorSpace::MakeSRGB(); 48cb93a386Sopenharmony_ci SkGlyphRunListPainter painter{props, kUnknown_SkColorType, 49cb93a386Sopenharmony_ci colorSpace.get(), SkStrikeCache::GlobalStrikeCache()}; 50cb93a386Sopenharmony_ci SkMatrix drawMatrix = view; 51cb93a386Sopenharmony_ci const SkPoint drawOrigin = glyphRunList.origin(); 52cb93a386Sopenharmony_ci drawMatrix.preTranslate(drawOrigin.x(), drawOrigin.y()); 53cb93a386Sopenharmony_ci GrSDFTControl control{false, props.isUseDeviceIndependentFonts(), 256, 256}; 54cb93a386Sopenharmony_ci fBlob = GrTextBlob::Make(glyphRunList, paint, drawMatrix, control, &painter); 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci SkASSERT(!fBlob->subRunList().isEmpty()); 57cb93a386Sopenharmony_ci GrAtlasSubRun* subRun = fBlob->subRunList().front().testingOnly_atlasSubRun(); 58cb93a386Sopenharmony_ci SkASSERT(subRun); 59cb93a386Sopenharmony_ci subRun->testingOnly_packedGlyphIDToGrGlyph(&fCache); 60cb93a386Sopenharmony_ci fVertices.reset(new char[subRun->vertexStride(drawMatrix) * subRun->glyphCount() * 4]); 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 64cb93a386Sopenharmony_ci GrAtlasSubRun* subRun = fBlob->subRunList().front().testingOnly_atlasSubRun(); 65cb93a386Sopenharmony_ci SkASSERT(subRun); 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci SkIRect clip = SkIRect::MakeEmpty(); 68cb93a386Sopenharmony_ci SkPaint paint; 69cb93a386Sopenharmony_ci GrColor grColor = SkColorToPremulGrColor(paint.getColor()); 70cb93a386Sopenharmony_ci SkMatrix positionMatrix = SkMatrix::Translate(100, 100); 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci for (int loop = 0; loop < loops; loop++) { 73cb93a386Sopenharmony_ci subRun->fillVertexData(fVertices.get(), 0, subRun->glyphCount(), 74cb93a386Sopenharmony_ci grColor, positionMatrix, clip); 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ciprivate: 79cb93a386Sopenharmony_ci sk_sp<GrTextBlob> fBlob; 80cb93a386Sopenharmony_ci GrStrikeCache fCache; 81cb93a386Sopenharmony_ci std::unique_ptr<char[]> fVertices; 82cb93a386Sopenharmony_ci}; 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ciDEF_BENCH(return new DirectMaskGlyphVertexFillBenchmark{}); 85