1 2 /* 3 * Copyright 2015 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include "Benchmark.h" 10 #include "Resources.h" 11 #include "SkCanvas.h" 12 #include "SkPaint.h" 13 #include "SkRandom.h" 14 #include "SkStream.h" 15 #include "SkString.h" 16 #include "SkTemplates.h" 17 #include "SkTextBlob.h" 18 #include "SkTypeface.h" 19 20 #include "sk_tool_utils.h" 21 22 /* 23 * A trivial test which benchmarks the performance of a textblob with a single run. 24 */ 25 class TextBlobBench : public Benchmark { 26 public: 27 TextBlobBench() 28 : fTypeface(nullptr) { 29 } 30 31 protected: 32 void onDelayedSetup() override { 33 fTypeface.reset(sk_tool_utils::create_portable_typeface("serif", SkTypeface::kNormal)); 34 // make textblob 35 SkPaint paint; 36 paint.setTypeface(fTypeface); 37 const char* text = "Hello blob!"; 38 SkTDArray<uint16_t> glyphs; 39 size_t len = strlen(text); 40 glyphs.append(paint.textToGlyphs(text, len, nullptr)); 41 paint.textToGlyphs(text, len, glyphs.begin()); 42 43 SkTextBlobBuilder builder; 44 45 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 46 const SkTextBlobBuilder::RunBuffer& run = builder.allocRun(paint, glyphs.count(), 10, 10, 47 nullptr); 48 memcpy(run.glyphs, glyphs.begin(), glyphs.count() * sizeof(uint16_t)); 49 50 fBlob.reset(builder.build()); 51 } 52 53 const char* onGetName() override { 54 return "TextBlobBench"; 55 } 56 57 void onDraw(int loops, SkCanvas* canvas) override { 58 SkPaint paint; 59 60 // To ensure maximum caching, we just redraw the blob at the same place everytime 61 for (int i = 0; i < loops; i++) { 62 canvas->drawTextBlob(fBlob, 0, 0, paint); 63 } 64 } 65 66 private: 67 68 SkAutoTUnref<const SkTextBlob> fBlob; 69 SkTDArray<uint16_t> fGlyphs; 70 SkAutoTUnref<SkTypeface> fTypeface; 71 72 typedef Benchmark INHERITED; 73 }; 74 75 DEF_BENCH( return new TextBlobBench(); ) 76