1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2019 Google LLC. 2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. 3*c8dee2aaSAndroid Build Coastguard Worker 4*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 5*c8dee2aaSAndroid Build Coastguard Worker 6*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_GOOGLE3) 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/FontCollection.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/Paragraph.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/src/ParagraphBuilderImpl.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/src/ParagraphImpl.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include <cfloat> 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPictureRecorder.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/utils/TestFontCollection.h" 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker using namespace skia::textlayout; 20*c8dee2aaSAndroid Build Coastguard Worker namespace { 21*c8dee2aaSAndroid Build Coastguard Worker struct ParagraphBench : public Benchmark { ParagraphBench__anon71eb8b5f0111::ParagraphBench22*c8dee2aaSAndroid Build Coastguard Worker ParagraphBench(SkScalar width, const char* r, const char* n) 23*c8dee2aaSAndroid Build Coastguard Worker : fResource(r), fName(n), fWidth(width) {} 24*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> fData; 25*c8dee2aaSAndroid Build Coastguard Worker const char* fResource; 26*c8dee2aaSAndroid Build Coastguard Worker const char* fName; 27*c8dee2aaSAndroid Build Coastguard Worker SkScalar fWidth; onGetName__anon71eb8b5f0111::ParagraphBench28*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { return fName; } isSuitableFor__anon71eb8b5f0111::ParagraphBench29*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override { return backend == Backend::kNonRendering; } onDelayedSetup__anon71eb8b5f0111::ParagraphBench30*c8dee2aaSAndroid Build Coastguard Worker void onDelayedSetup() override { fData = GetResourceAsData(fResource); } onDraw__anon71eb8b5f0111::ParagraphBench31*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas*) override { 32*c8dee2aaSAndroid Build Coastguard Worker if (!fData) { 33*c8dee2aaSAndroid Build Coastguard Worker return; 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker const char* text = (const char*)fData->data(); 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker auto fontCollection = sk_make_sp<FontCollection>(); 39*c8dee2aaSAndroid Build Coastguard Worker fontCollection->setDefaultFontManager(ToolUtils::TestFontMgr()); 40*c8dee2aaSAndroid Build Coastguard Worker ParagraphStyle paragraph_style; 41*c8dee2aaSAndroid Build Coastguard Worker paragraph_style.turnHintingOff(); 42*c8dee2aaSAndroid Build Coastguard Worker ParagraphBuilderImpl builder(paragraph_style, fontCollection); 43*c8dee2aaSAndroid Build Coastguard Worker builder.addText(text); 44*c8dee2aaSAndroid Build Coastguard Worker auto paragraph = builder.Build(); 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker SkPictureRecorder rec; 47*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = rec.beginRecording({0,0, 2000,3000}); 48*c8dee2aaSAndroid Build Coastguard Worker while (loops-- > 0) { 49*c8dee2aaSAndroid Build Coastguard Worker paragraph->layout(fWidth); 50*c8dee2aaSAndroid Build Coastguard Worker auto impl = static_cast<ParagraphImpl*>(paragraph.get()); 51*c8dee2aaSAndroid Build Coastguard Worker paragraph->paint(canvas, 0, 0); 52*c8dee2aaSAndroid Build Coastguard Worker paragraph->markDirty(); 53*c8dee2aaSAndroid Build Coastguard Worker impl->resetCache(); 54*c8dee2aaSAndroid Build Coastguard Worker } 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker }; 57*c8dee2aaSAndroid Build Coastguard Worker } // namespace 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker #define PARAGRAPH_BENCH(X) DEF_BENCH(return new ParagraphBench(50000, "text/" #X ".txt", "paragraph_" #X);) 60*c8dee2aaSAndroid Build Coastguard Worker //PARAGRAPH_BENCH(arabic) 61*c8dee2aaSAndroid Build Coastguard Worker //PARAGRAPH_BENCH(emoji) 62*c8dee2aaSAndroid Build Coastguard Worker PARAGRAPH_BENCH(english) 63*c8dee2aaSAndroid Build Coastguard Worker #undef PARAGRAPH_BENCH 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker #endif // !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_GOOGLE3) 66