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