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