blob: 25b86688043d6cbd655bd8e92b85858a8e39c40d [file] [log] [blame]
Mike Reedfc324052021-03-17 13:00:08 -04001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "bench/Benchmark.h"
9#include "include/core/SkCanvas.h"
10#include "include/core/SkFontMgr.h"
11#include "include/core/SkPaint.h"
12#include "include/core/SkString.h"
13#include "tools/Resources.h"
14
15#include "modules/skparagraph/include/FontCollection.h"
16#include "modules/skparagraph/include/ParagraphBuilder.h"
17#include "modules/skparagraph/include/ParagraphStyle.h"
18
Herb Derby3401d5e2021-03-18 15:12:45 -040019class ParagraphBench final : public Benchmark {
Mike Reedfc324052021-03-17 13:00:08 -040020 SkString fName;
21 sk_sp<skia::textlayout::FontCollection> fFontCollection;
22 skia::textlayout::TextStyle fTStyle;
23 std::unique_ptr<skia::textlayout::Paragraph> fParagraph;
24
25public:
26 ParagraphBench() {
27 fName.printf("skparagraph");
28 }
29
30protected:
31 const char* onGetName() override {
32 return fName.c_str();
33 }
34
35 bool isSuitableFor(Backend backend) override {
36 // fParagraph might have failed to be created in onDelayedSetup()
37 return backend == kNonRendering_Backend && !!fParagraph;
38 }
39
40 void onDelayedSetup() override {
41 fFontCollection = sk_make_sp<skia::textlayout::FontCollection>();
42 fFontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
43
44 fTStyle.setFontFamilies({SkString("Roboto")});
45 fTStyle.setColor(SK_ColorBLACK);
46
47 const char* text =
48 "This is a very long sentence to test if the text will properly wrap "
49 "around and go to the next line. Sometimes, short sentence. Longer "
50 "sentences are okay too because they are necessary. Very short. "
51 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
52 "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
53 "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
54 "commodo consequat. Duis aute irure dolor in reprehenderit in voluptate "
55 "velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint "
56 "occaecat cupidatat non proident, sunt in culpa qui officia deserunt "
57 "mollit anim id est laborum. "
58 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
59 "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
60 "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
61 "commodo consequat. Duis aute irure dolor in reprehenderit in voluptate "
62 "velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint "
63 "occaecat cupidatat non proident, sunt in culpa qui officia deserunt "
64 "mollit anim id est laborum.";
65 skia::textlayout::ParagraphStyle paragraph_style;
66 auto builder =
67 skia::textlayout::ParagraphBuilder::make(paragraph_style, fFontCollection);
68 if (!builder) {
69 return;
70 }
71
72 builder->pushStyle(fTStyle);
73 builder->addText(text);
74 builder->pop();
75 fParagraph = builder->Build();
Herb Derby3401d5e2021-03-18 15:12:45 -040076
77 // Call onDraw once to warm up the glyph cache otherwise nanobench will mis-calculate the
78 // loop count.
79 SkCanvas canvas;
80 this->onDraw(1, &canvas);
Mike Reedfc324052021-03-17 13:00:08 -040081 }
82
83 void onDraw(int loops, SkCanvas* canvas) override {
84 for (int i = 0; i < loops; ++i) {
85 fParagraph->markDirty();
86 fParagraph->layout(300);
87 }
88 }
89
90private:
91 using INHERITED = Benchmark;
92};
93
94DEF_BENCH( return new ParagraphBench; )